-
Notifications
You must be signed in to change notification settings - Fork 0
/
api_documentation.de.txt
190 lines (147 loc) · 7.03 KB
/
api_documentation.de.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
Der API-Wrapper unterstützt die Endpunkte:
/add: Hinzufügen von E-Mailadressen
/remove: Entfernen von E-Mailadressen
/clear: Entfernen aller E-Mailadressen
/replace: Entfernen und hinzufügen (in dieser Reihenfolge) von
E-Mailadressen
/replace_all: Entfernen aller und hinzufügen von E-Mailadressen
Jeder dieser Endpunkte erwartet zwei POST-Parameter:
data: Ein JSON-String
signature: Ein Hash der aus dem JSON-String und dem Shared-Secret
gebildet wird
Der Hash ist dabei der SHA512-Hash aus der aneinanderkettung des JSON-
String 'data' und des Shared-Secret als Hexadezimalstring. In Python:
sha512(data + secret).hexdigest()
Das JSON-Objekt muss je nach Endpunkt die folgende Struktur haben:
/add: {"mailinglist": "…", "addresses": […]}
/remove {"mailinglist": "…", "addresses": […]}
/clear {"mailinglist": "…"}
/replace {"mailinglist": "…", "add": […], "remove": […]}
/replace_all {"mailinglist": "…", "addresses": […]}
Die API gibt einen der folgenden Statuscodes zurück:
200 OK: Prinzipiell alles in Ordnung, ggf. aber
Fehler mit einzelnen oder allen Adressen
400 Bad Request: Fehler in der Struktur der POST-Daten (auch
JSON)
403 Forbidden: Ungültige Signatur
404 Not Found: URL nicht gültig
405 Method Not Allowed: Kein POST-Request
422 Unprocessable Entity: Fehler bei der Verbindung zur Mailman-API
500 Internal Server Error: Unerwarteter Fehler
Außer im Fall von 500, ist die Antwort ein JSON-Objekt, das immer ein
Feld "status" enthält mit den Werten "ok" oder "failed". Falls der
Statuscode /nicht/ 200 ist, ist "status" immer "failed":
{"status": "failed", reason: "<Begründung>", …}
Falls der Statuscode 200 ist, gibt es auf jeden Fall noch die Felder
"succeded" und "failed":
{"status": "ok", "failed": […], "succeded": […]} ODER
{"status": "failed", "reason": "<Bgr.>", "failed": […], "succeded": […]}
Insbesondere: Wenn die Liste "failed" nichtleer ist und "succeded" leer,
wird "status": "failed" und "reason": "All operations failed."
zurückgegeben:
{"status": "failed", "reason": "All operations failed.", "failed": […],
"succeded": []}
Hier ein paar Beispiele der Abfrage mit 'curl':
Erfolgreiches hinzufügen (Status 200):
$ curl localhost:8080/add -d data='{"mailinglist":"[email protected]","addresses":["[email protected]"]}' -d signature=x
{"failed": [], "succeded": [{"address": "[email protected]"}], "status": "ok"}
Erfolgreiches entfernen (Status 200):
$ curl localhost:8080/remove -d data='{"mailinglist":"[email protected]","addresses":["[email protected]"]}' -d signature=x
{"failed": [], "succeded": [{"address": "[email protected]"}], "status": "ok"}
Fehler bei Hinzufügen (Status 200):
$ curl localhost:8080/add -d data='{"mailinglist":"[email protected]","addresses":["[email protected]"]}' -d signature=x
{"failed": [{"address": "[email protected]", "reason": "HTTP Error 409: b'Member already subscribed'"}], "succeded": [], "status": "failed", "reason": "All operations failed."}
Fehler bei Entfernen (Status 200):
$ curl localhost:8080/remove -d data='{"mailinglist":"[email protected]","addresses":["[email protected]"]}' -d signature=x
{"failed": [{"address": "[email protected]", "reason": "[email protected] is not a member address of [email protected]"}], "succeded": [], "status": "failed", "reason": "All operations failed."}
Partieller Fehler (bei Hinzufügen) (Status 200):
$ curl localhost:8080/add -d data='{"mailinglist":"[email protected]","addresses":["[email protected]", "[email protected]"]}' -d signature=x
{"failed": [{"address": "[email protected]", "reason": "HTTP Error 409: b'Member already subscribed'"}], "succeded": [{"address": "[email protected]"}], "status": "ok"}
Partieller Fehler bei Ersetzen (Status 200):
$ curl localhost:8080/replace -d data='{"mailinglist":"[email protected]","add":["[email protected]", "[email protected]"],"remove":["[email protected]","[email protected]"]}' -d signature=x
{"failed": [{"address": "[email protected]", "reason": "[email protected] is not a member address of [email protected]"}, {"address": "[email protected]", "reason": "HTTP Error 409: b'Member already subscribed'"}], "succeded": [{"address": "[email protected]"}, {"address": "[email protected]"}], "status": "ok"}
Fehler: Falsches Datenformat (Status 400):
$ curl localhost:8080/add -d blub='{"mailinglist":"[email protected]","addresses":["[email protected]"]}' -d signature=x
{"reason": "Data error: b'data'", "status": "failed"}
Fehler: Mailman läuft nicht / API nicht erreichbar (Status 422):
$ curl localhost:8080/add -d data='{"mailinglist":"[email protected]","addresses":["[email protected]"]}' -d signature=x
{"status": "failed", "reason": "Mailman error ([email protected]): Could not connect to Mailman API"}
Fehler: Hash-Signatur nicht gültig (Status 403):
$ curl localhost:8080/add -d data='{"mailinglist":"[email protected]","addresses":["[email protected]"]}' -d signature=x
{"reason": "Could not verify authentication", "status": "failed"}
Fehler: Robert hat Mist gebaut (Status 500):
$ curl localhost:8080/add -d data='{"mailinglist":"[email protected]","addresses":["[email protected]"]}' -d signature=x
A server error occurred. Please contact the administrator.
Um Missverständnissen vorzubeugen, hier die Schemata der JSON-Objekte:
Schema einer Anfrage:
{
"$schema": "http://json-schema.org/draft-06/schema#",
"title": "Request",
"type": "object",
"properties": {
"mailinglist": {
"type": "string"
},
"addresses": {
"type": "array",
"items": {
"type": "string"
}
},
"add": {
"type": "array",
"items": {
"type": "string"
}
},
"remove": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": ["mailinglist"]
}
Schema einer Antwort:
{
"$schema": "http://json-schema.org/draft-06/schema#",
"title": "Response",
"type": "object",
"properties": {
"status": {
"type": "string"
},
"reason": {
"type": "string"
},
"succeded": {
"type": "array",
"items": {
"type": "object",
"properties": {
"address": {
"type": "string"
},
},
"required": ["address"]
}
},
"failed": {
"type": "array",
"items": {
"type": "object",
"properties": {
"address": {
"type": "string"
},
"reason": {
"type": "string"
},
},
"required": ["address", "reason"]
}
},
},
"required": ["status"]
}