Internalize interfaces that should not be public.
このコミットが含まれているのは:
コミット
bcec31a2a7
102
pub/fed.go
102
pub/fed.go
|
@ -18,108 +18,6 @@ var (
|
||||||
ErrTypeRequired = errors.New("type property required")
|
ErrTypeRequired = errors.New("type property required")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Object is the interface for ActivityPub compliant ActivityStream types.
|
|
||||||
//
|
|
||||||
// ActivityPub obects must have 'id' and 'type' properties to be spec compliant.
|
|
||||||
// This library enforces the "MUST" requirement and purposefully does NOT
|
|
||||||
// support transient objects.
|
|
||||||
//
|
|
||||||
// Furthermore, the spec extends the Object ActivityStream type to also contain
|
|
||||||
// the 'source' property, whose value appears to be an Object with only
|
|
||||||
// 'content' and 'mediaType' properties being semantically useful.
|
|
||||||
//
|
|
||||||
// TODO: Possibly delete this interface
|
|
||||||
type Object interface {
|
|
||||||
GetId() (streams.Resolution, url.URL)
|
|
||||||
SetId(url.URL)
|
|
||||||
HasId() streams.Presence
|
|
||||||
LenType() int
|
|
||||||
GetType(int) (streams.Resolution, string)
|
|
||||||
AddType(interface{})
|
|
||||||
RemoveType(int)
|
|
||||||
ResolveSource(*streams.Resolver) (streams.Resolution, error)
|
|
||||||
HasSource() streams.Presence
|
|
||||||
SetSource(vocab.ObjectType)
|
|
||||||
Serialize() (m map[string]interface{}, err error)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ Object = &streams.Object{}
|
|
||||||
|
|
||||||
// Actor is the interface for ActivityPub compliant ActivityStream types.
|
|
||||||
//
|
|
||||||
// ActivityPub actors must have a valid unique IRI as the 'id' property in
|
|
||||||
// addition to the 'type' property. Furthermore, actors must have the 'inbox'
|
|
||||||
// and 'outbox' properties to be considered actors. There are more suggested
|
|
||||||
// properties by the spec, which we include here.
|
|
||||||
//
|
|
||||||
// TODO: Possibly delete this interface
|
|
||||||
type Actor interface {
|
|
||||||
GetId() (streams.Resolution, url.URL)
|
|
||||||
SetId(url.URL)
|
|
||||||
LenType() int
|
|
||||||
GetType(int) (streams.Resolution, string)
|
|
||||||
AddType(interface{})
|
|
||||||
RemoveType(int)
|
|
||||||
GetInbox() (streams.Resolution, url.URL)
|
|
||||||
HasInbox() streams.Presence
|
|
||||||
SetInbox(url.URL)
|
|
||||||
GetOutbox() (streams.Resolution, url.URL)
|
|
||||||
HasOutbox() streams.Presence
|
|
||||||
SetOutbox(url.URL)
|
|
||||||
GetFollowing() (streams.Resolution, url.URL)
|
|
||||||
HasFollowing() streams.Presence
|
|
||||||
SetFollowing(url.URL)
|
|
||||||
GetFollowers() (streams.Resolution, url.URL)
|
|
||||||
HasFollowers() streams.Presence
|
|
||||||
SetFollowers(url.URL)
|
|
||||||
GetLiked() (streams.Resolution, url.URL)
|
|
||||||
HasLiked() streams.Presence
|
|
||||||
SetLiked(url.URL)
|
|
||||||
LenStreams() int
|
|
||||||
GetStreams(int) (streams.Resolution, url.URL)
|
|
||||||
AddStreams(vocab.CollectionType)
|
|
||||||
RemoveStreams(int)
|
|
||||||
GetPreferredUsername() (streams.Resolution, string)
|
|
||||||
HasPreferredUsername() streams.Presence
|
|
||||||
SetPreferredUsername(string)
|
|
||||||
PreferredUsernameLanguages() []string
|
|
||||||
GetPreferredUsernameForLanguage(string) string
|
|
||||||
SetPreferredUsernameForLanguage(string, string)
|
|
||||||
ResolveEndpoints(streams.Resolver) (streams.Resolution, error)
|
|
||||||
HasEndpoints() streams.Presence
|
|
||||||
SetEndpoints(vocab.ObjectType)
|
|
||||||
Serialize() (m map[string]interface{}, err error)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ Object = &streams.Object{}
|
|
||||||
|
|
||||||
// Endpoint is a logical grouping of specific properties within the ActivityPub
|
|
||||||
// specification.
|
|
||||||
//
|
|
||||||
// TODO: Possibly delete this interface
|
|
||||||
type Endpoint interface {
|
|
||||||
GetProxyUrl() (streams.Resolution, url.URL)
|
|
||||||
HasProxyUrl() streams.Presence
|
|
||||||
SetProxyUrl(url.URL)
|
|
||||||
GetOauthAuthorizationEndpoint() (streams.Resolution, url.URL)
|
|
||||||
HasOauthAuthorizationEndpoint() streams.Presence
|
|
||||||
SetOauthAuthorizationEndpoint(url.URL)
|
|
||||||
GetOauthTokenEndpoint() (streams.Resolution, url.URL)
|
|
||||||
HasOauthTokenEndpoint() streams.Presence
|
|
||||||
SetOauthTokenEndpoint(url.URL)
|
|
||||||
GetProvideClientKey() (streams.Resolution, url.URL)
|
|
||||||
HasProvideClientKey() streams.Presence
|
|
||||||
SetProvideClientKey(url.URL)
|
|
||||||
GetSignClientKey() (streams.Resolution, url.URL)
|
|
||||||
HasSignClientKey() streams.Presence
|
|
||||||
SetSignClientKey(url.URL)
|
|
||||||
GetSharedInbox() (streams.Resolution, url.URL)
|
|
||||||
HasSharedInbox() streams.Presence
|
|
||||||
SetSharedInbox(url.URL)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ Endpoint = &streams.Object{}
|
|
||||||
|
|
||||||
// TODO: Helper http Handler for serving ActivityStream objects
|
// TODO: Helper http Handler for serving ActivityStream objects
|
||||||
// TODO: Helper http Handler for serving Tombstone objects
|
// TODO: Helper http Handler for serving Tombstone objects
|
||||||
// TODO: Helper http Handler for serving deleted objects
|
// TODO: Helper http Handler for serving deleted objects
|
||||||
|
|
|
@ -17,11 +17,9 @@ import (
|
||||||
// response to send to the requester.
|
// response to send to the requester.
|
||||||
type HandlerFunc func(http.ResponseWriter, *http.Request) (bool, error)
|
type HandlerFunc func(http.ResponseWriter, *http.Request) (bool, error)
|
||||||
|
|
||||||
// ActorObject is an object that has "actor" or "attributedTo" properties,
|
// actorObject is an object that has "actor" or "attributedTo" properties,
|
||||||
// representing the author or originator of the object.
|
// representing the author or originator of the object.
|
||||||
//
|
type actorObject interface {
|
||||||
// TODO: Convert this to be an internal interface.
|
|
||||||
type ActorObject interface {
|
|
||||||
HasInbox() (ok bool)
|
HasInbox() (ok bool)
|
||||||
GetInbox() (v url.URL)
|
GetInbox() (v url.URL)
|
||||||
AttributedToLen() (l int)
|
AttributedToLen() (l int)
|
||||||
|
@ -40,12 +38,10 @@ type ActorObject interface {
|
||||||
GetActorIRI(index int) (v url.URL)
|
GetActorIRI(index int) (v url.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeliverableObject is an object that is able to be sent to recipients via the
|
// deliverableObject is an object that is able to be sent to recipients via the
|
||||||
// "to", "bto", "cc", "bcc", and "audience" objects and/or links and/or IRIs.
|
// "to", "bto", "cc", "bcc", and "audience" objects and/or links and/or IRIs.
|
||||||
//
|
type deliverableObject interface {
|
||||||
// TODO: Convert this to be an internal interface.
|
actorObject
|
||||||
type DeliverableObject interface {
|
|
||||||
ActorObject
|
|
||||||
ToLen() (l int)
|
ToLen() (l int)
|
||||||
IsToObject(index int) (ok bool)
|
IsToObject(index int) (ok bool)
|
||||||
GetToObject(index int) (v vocab.ObjectType)
|
GetToObject(index int) (v vocab.ObjectType)
|
||||||
|
|
|
@ -168,10 +168,10 @@ func (f *federator) wrapInCreate(o vocab.ObjectType, actor url.URL) *vocab.Creat
|
||||||
|
|
||||||
// TODO: (Section 7) HTTP caching mechanisms [RFC7234] SHOULD be respected when appropriate, both when receiving responses from other servers as well as sending responses to other servers.
|
// TODO: (Section 7) HTTP caching mechanisms [RFC7234] SHOULD be respected when appropriate, both when receiving responses from other servers as well as sending responses to other servers.
|
||||||
|
|
||||||
// prepare takes a DeliverableObject and returns a list of the proper recipient
|
// prepare takes a deliverableObject and returns a list of the proper recipient
|
||||||
// target URIs. Additionally, the DeliverableObject will have any hidden
|
// target URIs. Additionally, the deliverableObject will have any hidden
|
||||||
// hidden recipients ("bto" and "bcc") stripped from it.
|
// hidden recipients ("bto" and "bcc") stripped from it.
|
||||||
func (c *federator) prepare(o DeliverableObject) ([]url.URL, error) {
|
func (c *federator) prepare(o deliverableObject) ([]url.URL, error) {
|
||||||
// Get inboxes of recipients
|
// Get inboxes of recipients
|
||||||
var r []url.URL
|
var r []url.URL
|
||||||
r = append(r, getToIRIs(o)...)
|
r = append(r, getToIRIs(o)...)
|
||||||
|
@ -207,13 +207,13 @@ func (c *federator) prepare(o DeliverableObject) ([]url.URL, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// resolveInboxes takes a list of Actor id URIs and returns them as concrete
|
// resolveInboxes takes a list of Actor id URIs and returns them as concrete
|
||||||
// instances of ActorObject. It applies recursively when it encounters a target
|
// instances of actorObject. It applies recursively when it encounters a target
|
||||||
// that is a Collection or OrderedCollection.
|
// that is a Collection or OrderedCollection.
|
||||||
func (c *federator) resolveInboxes(r []url.URL, depth int, max int) ([]ActorObject, error) {
|
func (c *federator) resolveInboxes(r []url.URL, depth int, max int) ([]actorObject, error) {
|
||||||
if depth >= max {
|
if depth >= max {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
a := make([]ActorObject, 0, len(r))
|
a := make([]actorObject, 0, len(r))
|
||||||
for _, u := range r {
|
for _, u := range r {
|
||||||
// Do not retry here -- if a dereference fails, then fail the
|
// Do not retry here -- if a dereference fails, then fail the
|
||||||
// entire delivery.
|
// entire delivery.
|
||||||
|
@ -225,7 +225,7 @@ func (c *federator) resolveInboxes(r []url.URL, depth int, max int) ([]ActorObje
|
||||||
if err = json.Unmarshal(resp, &m); err != nil {
|
if err = json.Unmarshal(resp, &m); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var actor ActorObject
|
var actor actorObject
|
||||||
var co *streams.Collection
|
var co *streams.Collection
|
||||||
var oc *streams.OrderedCollection
|
var oc *streams.OrderedCollection
|
||||||
var cp *streams.CollectionPage
|
var cp *streams.CollectionPage
|
||||||
|
@ -289,7 +289,7 @@ func (c *federator) resolveInboxes(r []url.URL, depth int, max int) ([]ActorObje
|
||||||
}
|
}
|
||||||
|
|
||||||
// getInboxes extracts the 'inbox' IRIs from actors.
|
// getInboxes extracts the 'inbox' IRIs from actors.
|
||||||
func getInboxes(a []ActorObject) []url.URL {
|
func getInboxes(a []actorObject) []url.URL {
|
||||||
var u []url.URL
|
var u []url.URL
|
||||||
for _, actor := range a {
|
for _, actor := range a {
|
||||||
if actor.HasInbox() {
|
if actor.HasInbox() {
|
||||||
|
@ -301,7 +301,7 @@ func getInboxes(a []ActorObject) []url.URL {
|
||||||
|
|
||||||
// getActorAttributedToURI attempts to find the URIs for the "actor" and
|
// getActorAttributedToURI attempts to find the URIs for the "actor" and
|
||||||
// "attributedTo" originators on the object.
|
// "attributedTo" originators on the object.
|
||||||
func getActorsAttributedToURI(a ActorObject) []url.URL {
|
func getActorsAttributedToURI(a actorObject) []url.URL {
|
||||||
var u []url.URL
|
var u []url.URL
|
||||||
for i := 0; i < a.AttributedToLen(); i++ {
|
for i := 0; i < a.AttributedToLen(); i++ {
|
||||||
if a.IsAttributedToObject(i) {
|
if a.IsAttributedToObject(i) {
|
||||||
|
@ -336,10 +336,10 @@ func getActorsAttributedToURI(a ActorObject) []url.URL {
|
||||||
return u
|
return u
|
||||||
}
|
}
|
||||||
|
|
||||||
// stripHiddenRecipients removes "bto" and "bcc" from the DeliverableObject.
|
// stripHiddenRecipients removes "bto" and "bcc" from the deliverableObject.
|
||||||
// Note that this requirement of the specification is under "Section 6: Client
|
// Note that this requirement of the specification is under "Section 6: Client
|
||||||
// to Server Interactions", the Social API, and not the Federative API.
|
// to Server Interactions", the Social API, and not the Federative API.
|
||||||
func stripHiddenRecipients(o DeliverableObject) {
|
func stripHiddenRecipients(o deliverableObject) {
|
||||||
for o.BtoLen() > 0 {
|
for o.BtoLen() > 0 {
|
||||||
if o.IsBtoObject(0) {
|
if o.IsBtoObject(0) {
|
||||||
o.RemoveBtoObject(0)
|
o.RemoveBtoObject(0)
|
||||||
|
@ -432,7 +432,7 @@ func filterURLs(u []url.URL, fn func(s string) bool) []url.URL {
|
||||||
return u
|
return u
|
||||||
}
|
}
|
||||||
|
|
||||||
func getToIRIs(o DeliverableObject) []url.URL {
|
func getToIRIs(o deliverableObject) []url.URL {
|
||||||
var r []url.URL
|
var r []url.URL
|
||||||
for i := 0; i < o.ToLen(); i++ {
|
for i := 0; i < o.ToLen(); i++ {
|
||||||
if o.IsToObject(i) {
|
if o.IsToObject(i) {
|
||||||
|
@ -452,7 +452,7 @@ func getToIRIs(o DeliverableObject) []url.URL {
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func getBToIRIs(o DeliverableObject) []url.URL {
|
func getBToIRIs(o deliverableObject) []url.URL {
|
||||||
var r []url.URL
|
var r []url.URL
|
||||||
for i := 0; i < o.BtoLen(); i++ {
|
for i := 0; i < o.BtoLen(); i++ {
|
||||||
if o.IsBtoObject(i) {
|
if o.IsBtoObject(i) {
|
||||||
|
@ -472,7 +472,7 @@ func getBToIRIs(o DeliverableObject) []url.URL {
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCcIRIs(o DeliverableObject) []url.URL {
|
func getCcIRIs(o deliverableObject) []url.URL {
|
||||||
var r []url.URL
|
var r []url.URL
|
||||||
for i := 0; i < o.CcLen(); i++ {
|
for i := 0; i < o.CcLen(); i++ {
|
||||||
if o.IsCcObject(i) {
|
if o.IsCcObject(i) {
|
||||||
|
@ -492,7 +492,7 @@ func getCcIRIs(o DeliverableObject) []url.URL {
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func getBccIRIs(o DeliverableObject) []url.URL {
|
func getBccIRIs(o deliverableObject) []url.URL {
|
||||||
var r []url.URL
|
var r []url.URL
|
||||||
for i := 0; i < o.BccLen(); i++ {
|
for i := 0; i < o.BccLen(); i++ {
|
||||||
if o.IsBccObject(i) {
|
if o.IsBccObject(i) {
|
||||||
|
@ -512,7 +512,7 @@ func getBccIRIs(o DeliverableObject) []url.URL {
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func getAudienceIRIs(o DeliverableObject) []url.URL {
|
func getAudienceIRIs(o deliverableObject) []url.URL {
|
||||||
var r []url.URL
|
var r []url.URL
|
||||||
for i := 0; i < o.AudienceLen(); i++ {
|
for i := 0; i < o.AudienceLen(); i++ {
|
||||||
if o.IsAudienceObject(i) {
|
if o.IsAudienceObject(i) {
|
||||||
|
|
|
@ -7,10 +7,10 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
func toActorResolver(a *ActorObject) *streams.Resolver {
|
func toActorResolver(a *actorObject) *streams.Resolver {
|
||||||
return &streams.Resolver{
|
return &streams.Resolver{
|
||||||
AnyObjectCallback: func(i vocab.ObjectType) error {
|
AnyObjectCallback: func(i vocab.ObjectType) error {
|
||||||
if o, ok := i.(ActorObject); ok {
|
if o, ok := i.(actorObject); ok {
|
||||||
*a = o
|
*a = o
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -18,7 +18,7 @@ func toActorResolver(a *ActorObject) *streams.Resolver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func toActorCollectionResolver(a *ActorObject, c **streams.Collection, oc **streams.OrderedCollection, cp **streams.CollectionPage, ocp **streams.OrderedCollectionPage) *streams.Resolver {
|
func toActorCollectionResolver(a *actorObject, c **streams.Collection, oc **streams.OrderedCollection, cp **streams.CollectionPage, ocp **streams.OrderedCollectionPage) *streams.Resolver {
|
||||||
r := toActorResolver(a)
|
r := toActorResolver(a)
|
||||||
r.CollectionCallback = func(i *streams.Collection) error {
|
r.CollectionCallback = func(i *streams.Collection) error {
|
||||||
*c = i
|
*c = i
|
||||||
|
|
読み込み中…
新しいイシューから参照