package federation // // GangGo Federation Library // Copyright (C) 2017-2018 Lukas Matt // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // import ( "net/http" "crypto/rsa" "encoding/json" "bytes" "fmt" "git.feneas.org/ganggo/federation/helpers" ) type ActivityPubFollow struct { ActivityPubContext Actor string `json:"actor"` Object string `json:"object"` Following helpers.ReadOnlyBool } func (e *ActivityPubFollow) Author() string { return e.Actor } func (e *ActivityPubFollow) SetAuthor(author string) { username, err := helpers.ParseHandle(author) if err != nil { (*e).Actor = author } else { (*e).Actor = fmt.Sprintf(config.ApURLFormat, fmt.Sprintf("user/%s/actor", username)) } (*e).Id = e.Actor + "#follow" } func (e *ActivityPubFollow) Send(inbox string, priv *rsa.PrivateKey, pub *rsa.PublicKey) error { payload, err := e.Marshal(priv, pub) if err != nil { return err } client := (&HttpClient{}).New(e.Author() + "#main-key", priv) return client.Push(inbox, http.Header{ "Content-Type": []string{CONTENT_TYPE_JSON}, }, bytes.NewBuffer(payload)) } func (e *ActivityPubFollow) Unmarshal(b []byte) error { return json.Unmarshal(b, e) } func (e *ActivityPubFollow) Marshal(priv *rsa.PrivateKey, pub *rsa.PublicKey) ([]byte, error) { e.ActivityPubContext = ActivityPubContext{ Context: []interface{}{ACTIVITY_STREAMS}, ActivityPubBase: ActivityPubBase{ Id: e.Id, Type: ActivityTypeFollow, }, } b, err := json.MarshalIndent(e, "", " ") Log.Info("ActivityPubFollow", string(b)) return b, err } func (e *ActivityPubFollow) Type() MessageType { return MessageType{ Proto: ActivityPubProtocol, Entity: Contact, } } func (e *ActivityPubFollow) Recipient() string { return e.Object } func (e *ActivityPubFollow) SetRecipient(recipient string) { (*e).Object = recipient } func (e *ActivityPubFollow) Sharing() bool { return bool(e.Following) } func (e *ActivityPubFollow) SetSharing(sharing bool) {}