Skip to content

Commit 4acf46d

Browse files
committed
Verify signature on Inbox requests
1 parent f30d700 commit 4acf46d

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

activitypub.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,13 @@ func handleFetchInbox(app *app, w http.ResponseWriter, r *http.Request) error {
151151
}
152152
}
153153

154+
err = verifyRequest(app, r)
155+
if err != nil {
156+
logError("Unable to verify signature: %v", err)
157+
return err
158+
}
159+
logInfo("Signature OK")
160+
154161
dump, err := httputil.DumpRequest(r, true)
155162
if err != nil {
156163
logError("Can't dump: %v", err)

app.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ func Serve() {
8787
log.Fatal(err)
8888
}
8989

90+
initFederation(app)
9091
err = initKeys(app)
9192
if err != nil {
9293
log.Fatal(err)

data.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,18 @@ func (app *app) getPost(id int64) (*Post, error) {
223223
}
224224
return &p, err
225225
}
226+
227+
func (app *app) getActorKey(id string) ([]byte, error) {
228+
k := []byte{}
229+
230+
stmt := "SELECT public_key FROM userkeys WHERE id = ?"
231+
err := app.db.QueryRow(stmt, id).Scan(&k)
232+
switch {
233+
case err == sql.ErrNoRows:
234+
return nil, impart.HTTPError{http.StatusNotFound, "Key not found"}
235+
case err != nil:
236+
return nil, err
237+
}
238+
239+
return k, nil
240+
}

federation.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,36 @@ import (
1313
"net/http/httputil"
1414
)
1515

16+
var (
17+
verifier *httpsig.Verifier
18+
)
19+
20+
func initFederation(app *app) {
21+
verifier = httpsig.NewSigHeaderVerifier(keyGetter{app})
22+
}
23+
24+
type keyGetter struct {
25+
app *app
26+
}
27+
28+
func (kg keyGetter) GetKey(id string) interface{} {
29+
k, err := kg.app.getActorKey(id)
30+
if err != nil {
31+
logError("Unable to get key: %v", err)
32+
return nil
33+
}
34+
pubKey, err := activitypub.DecodePublicKey(k)
35+
if err != nil {
36+
logError("Unable to decode key: %v", err)
37+
return err
38+
}
39+
return pubKey
40+
}
41+
42+
func verifyRequest(app *app, r *http.Request) error {
43+
return verifier.Verify(r)
44+
}
45+
1646
func makeActivityPost(p *activitystreams.Person, url string, m interface{}) error {
1747
logInfo("POST %s", url)
1848
b, err := json.Marshal(m)

0 commit comments

Comments
 (0)