83 lines
1.7 KiB
Go
83 lines
1.7 KiB
Go
package app
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"encoders.orly/envelopes/eventenvelope"
|
|
"encoders.orly/kind"
|
|
"lol.mleku.dev/chk"
|
|
"lol.mleku.dev/log"
|
|
utils "utils.orly"
|
|
)
|
|
|
|
func (l *Listener) HandleEvent(msg []byte) (err error) {
|
|
// decode the envelope
|
|
env := eventenvelope.NewSubmission()
|
|
if msg, err = env.Unmarshal(msg); chk.E(err) {
|
|
return
|
|
}
|
|
if len(msg) > 0 {
|
|
log.I.F("extra '%s'", msg)
|
|
}
|
|
// check the event ID is correct
|
|
calculatedId := env.E.GetIDBytes()
|
|
if !utils.FastEqual(calculatedId, env.E.ID) {
|
|
if err = Ok.Invalid(
|
|
l, env, "event id is computed incorrectly, "+
|
|
"event has ID %0x, but when computed it is %0x",
|
|
env.E.ID, calculatedId,
|
|
); chk.E(err) {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
// verify the signature
|
|
var ok bool
|
|
if ok, err = env.Verify(); chk.T(err) {
|
|
if err = Ok.Error(
|
|
l, env, fmt.Sprintf(
|
|
"failed to verify signature: %s",
|
|
err.Error(),
|
|
),
|
|
); chk.E(err) {
|
|
return
|
|
}
|
|
} else if !ok {
|
|
if err = Ok.Invalid(
|
|
l, env,
|
|
"signature is invalid",
|
|
); chk.E(err) {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
// if the event is a delete, process the delete
|
|
if env.E.Kind == kind.EventDeletion.K {
|
|
l.HandleDelete(env)
|
|
} else {
|
|
// check if the event was deleted
|
|
if err = l.CheckForDeleted(env.E, l.Admins); err != nil {
|
|
if strings.HasPrefix(err.Error(), "blocked:") {
|
|
errStr := err.Error()[len("blocked: "):len(err.Error())]
|
|
if err = Ok.Error(
|
|
l, env, errStr,
|
|
); chk.E(err) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// store the event
|
|
if _, _, err = l.SaveEvent(l.Ctx, env.E); chk.E(err) {
|
|
return
|
|
}
|
|
l.publishers.Deliver(env.E)
|
|
// Send a success response storing
|
|
if err = Ok.Ok(l, env, ""); chk.E(err) {
|
|
return
|
|
}
|
|
log.D.F("saved event %0x", env.E.ID)
|
|
return
|
|
}
|