vocabulary.scm
1 | ;;;; Copyright (C) 2020 Julien Lepiller <julien@lepiller.eu> |
2 | ;;;; |
3 | ;;;; This library is free software; you can redistribute it and/or |
4 | ;;;; modify it under the terms of the GNU Lesser General Public |
5 | ;;;; License as published by the Free Software Foundation; either |
6 | ;;;; version 3 of the License, or (at your option) any later version. |
7 | ;;;; |
8 | ;;;; This library is distributed in the hope that it will be useful, |
9 | ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
11 | ;;;; Lesser General Public License for more details. |
12 | ;;;; |
13 | ;;;; You should have received a copy of the GNU Lesser General Public |
14 | ;;;; License along with this library; if not, write to the Free Software |
15 | ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
16 | ;;;; |
17 | ;;;; |
18 | ;;;; |
19 | ;;;; Note that most of this file is a direct translation of the activitystreams |
20 | ;;;; vocabulary specification (esp. comments in type and property) which |
21 | ;;;; is under these terms: |
22 | ;;;; |
23 | ;;;; Copyright © 2017 Activity Streams Working Group, IBM & W3C® (MIT, |
24 | ;;;; ERCIM, Keio, Beihang). W3C liability, trademark and permissive |
25 | ;;;; document license rules apply. |
26 | ;;;; |
27 | ;;;; You should have received a copy of the Permissive Document License along |
28 | ;;;; with this library; if not, that document license is accessible online at: |
29 | ;;;; https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document |
30 | ;;;; |
31 | ;;;; The origin document used to develop this can be found at: |
32 | ;;;; https://www.w3.org/TR/activitystreams-vocabulary |
33 | |
34 | (define-module (activitypub vocabulary) |
35 | #:use-module ((activitystreams vocabulary) #:prefix as:) |
36 | #:use-module (activitystreams ontology) |
37 | #:use-module (activitystreams predicates) |
38 | #:use-module (ice-9 match) |
39 | #:use-module (jsonld json) |
40 | #:use-module (web uri) |
41 | #:export (activitypub-ontology)) |
42 | |
43 | (define-public source |
44 | (build-as-property |
45 | "source" as:Object json-object? |
46 | #:comment |
47 | "The source property is intended to convey some sort of source from which |
48 | the content markup was derived, as a form of provenance, or to support future |
49 | editing by clients. In general, clients do the conversion from source to |
50 | content, not the other way around.")) |
51 | |
52 | (define-public content |
53 | (build-as-property |
54 | "content" source string-or-lang-string?)) |
55 | |
56 | (define-public mediaType |
57 | (build-as-property |
58 | "mediaType" source mime-type?)) |
59 | |
60 | (define-public inbox |
61 | (build-as-property |
62 | "inbox" as:Object as:OrderedCollection |
63 | #:comment "The inbox stream contains all activities received by the actor. |
64 | The server should filter content according to the requester's permission. In |
65 | general, the owner of an inbox is likely to be able to access all of their |
66 | inbox contents. Depending on access control, some other content may be |
67 | public, whereas other content may require authentication for non-owner users, |
68 | if they can access the inbox at all.")) |
69 | |
70 | (define-public outbox |
71 | (build-as-property |
72 | "outbox" as:Object as:OrderedCollection |
73 | #:comment |
74 | "The outbox stream contains activities the user has published, subject to |
75 | the ability of the requestor to retrieve the activity (that is, the contents of |
76 | the outbox are filtered by the permissions of the person reading it). If a |
77 | user submits a request without Authorization the server should respond with all |
78 | of the Public posts. This could potentially be all relevant objects published |
79 | by the user, though the number of available items is left to the discretion of |
80 | those implementing and deploying the server.")) |
81 | |
82 | (define-public following |
83 | (build-as-property |
84 | "following" as:Object as:Collection |
85 | #:comment |
86 | "This is a list of everybody that the actor has followed, added as a side |
87 | effect. The following collection MUST be either an OrderedCollection or a |
88 | Collection and MAY be filtered on privileges of an authenticated user or as |
89 | appropriate when no authentication is given.")) |
90 | |
91 | (define-public followers |
92 | (build-as-property |
93 | "followers" as:Object as:Collection |
94 | #:comment |
95 | "This is a list of everyone who has sent a Follow activity for the actor, |
96 | added as a side effect. This is where one would find a list of all the actors |
97 | that are following the actor. The followers collection MUST be either an |
98 | OrderedCollection or a Collection and MAY be filtered on privileges of an |
99 | authenticated user or as appropriate when no authentication is given.")) |
100 | |
101 | (define-public liked |
102 | (build-as-property |
103 | "liked" as:Object as:Collection |
104 | #:comment |
105 | "This is a list of every object from all of the actor's Like activities, |
106 | added as a side effect. The liked collection MUST be either an OrderedCollection |
107 | or a Collection and MAY be filtered on privileges of an authenticated user or |
108 | as appropriate when no authentication is given.")) |
109 | |
110 | (define-public streams |
111 | (build-as-property |
112 | "streams" as:Object as:Collection |
113 | #:comment |
114 | "A list of supplementary Collections which may be of interest.")) |
115 | |
116 | (define-public preferredUsername |
117 | (build-as-property |
118 | "preferredUsername" as:Object string? |
119 | #:comment |
120 | "A short username which may be used to refer to the actor, with no |
121 | uniqueness guarantees.")) |
122 | |
123 | (define-public endpoints |
124 | (build-as-property |
125 | "endpoints" as:Object json-object? |
126 | #:comment |
127 | "A json object which maps additional (typically server/domain-wide) |
128 | endpoints which may be useful either for this actor or someone referencing this |
129 | actor. This mapping may be nested inside the actor document as the value or |
130 | may be a link to a JSON-LD document with these properties.")) |
131 | |
132 | (define-public proxyUrl |
133 | (build-as-property |
134 | "proxyUrl" endpoints uri? |
135 | #:comment |
136 | "Endpoint URI so this actor's clients may access remote ActivityStreams |
137 | objects which require authentication to access. To use this endpoint, the |
138 | client posts an x-www-form-urlencoded id parameter with the value being the id |
139 | of the requested ActivityStreams object.")) |
140 | |
141 | (define-public oauthAuthorizationEndpoint |
142 | (build-as-property |
143 | "oauthAuthorizationEndpoint" endpoints uri? |
144 | #:comment |
145 | "If OAuth 2.0 bearer tokens are being used for authenticating client to |
146 | server interactions, this endpoint specifies a URI at which a |
147 | browser-authenticated user may obtain a new authorization grant.")) |
148 | |
149 | (define-public oauthTokenEndpoint |
150 | (build-as-property |
151 | "oauthTokenEndpoint" endpoints uri? |
152 | #:comment |
153 | "If OAuth 2.0 bearer tokens are being used for authenticating client to |
154 | server interactions, this endpoint specifies a URI at which a client may |
155 | acquire an access token.")) |
156 | |
157 | (define-public provideClientKey |
158 | (build-as-property |
159 | "provideClientKey" endpoints uri? |
160 | #:comment |
161 | "If Linked Data Signatures and HTTP Signatures are being used for |
162 | authentication and authorization, this endpoint specifies a URI at which |
163 | browser-authenticated users may authorize a client's public key for client to |
164 | server interactions.")) |
165 | |
166 | (define-public signClientKey |
167 | (build-as-property |
168 | "signClientKey" endpoints uri? |
169 | #:comment |
170 | "If Linked Data Signatures and HTTP Signatures are being used for |
171 | authentication and authorization, this endpoint specifies a URI at which a |
172 | client key may be signed by the actor's key for a time window to act on behalf |
173 | of the actor in interacting with foreign servers.")) |
174 | |
175 | (define-public sharedInbox |
176 | (build-as-property |
177 | "sharedInbox" endpoints uri? |
178 | #:comment |
179 | "An optional endpoint used for wide delivery of publicly addressed |
180 | activities and activities sent to followers. sharedInbox endpoints SHOULD also |
181 | be publicly readable OrderedCollection objects containing objects addressed to |
182 | the Public special collection. Reading from the sharedInbox endpoint MUST NOT |
183 | present objects which are not addressed to the Public endpoint.")) |
184 | |
185 | (define activitypub-ontology |
186 | (merge-ontologies as:activitystreams-ontology |
187 | (make-ontology |
188 | '() |
189 | '() |
190 | (list source content mediaType inbox outbox following |
191 | followers liked streams preferredUsername |
192 | endpoints proxyUrl oauthAuthorizationEndpoint |
193 | oauthTokenEndpoint provideClientKey signClientKey |
194 | sharedInbox)))) |
195 |