Debug proxy, duck as fs
All checks were successful
/ docker (push) Successful in 4m23s

- Add proxy endpoint for proxying a message to a target's inbox
- Change duck embed to fs based to fix mk not understanding it
This commit is contained in:
Melody Becker 2025-04-23 15:11:46 +02:00
parent d70786439e
commit 415cd89792
Signed by: mstar
SSH key fingerprint: SHA256:9VAo09aaVNTWKzPW7Hq2LW+ox9OdwmTSHRoD4mlz1yI
8 changed files with 104 additions and 17 deletions

View file

@ -30,6 +30,8 @@ func New(addr string) *Server {
handler.HandleFunc("GET /import-user", issueUserImport)
handler.HandleFunc("GET /keys-for", returnKeypair)
handler.HandleFunc("GET /import-server", importServerInfo)
handler.HandleFunc("GET /request-follow", kickoffFollow)
handler.HandleFunc("POST /send-as", proxyMessageToTarget)
web := http.Server{
Addr: addr,
Handler: webutils.ChainMiddlewares(

View file

@ -6,6 +6,7 @@ import (
"encoding/json"
"encoding/pem"
"fmt"
"io"
"net/http"
"strconv"
"time"
@ -206,13 +207,78 @@ func returnKeypair(w http.ResponseWriter, r *http.Request) {
func issueUserImport(w http.ResponseWriter, r *http.Request) {
target := r.FormValue("target")
_, err := activitypub.ImportRemoteAccountByHandle(target)
hlog.FromRequest(r).Info().Err(err).Msg("Err from import request")
if err != nil {
hlog.FromRequest(r).Info().Err(err).Msg("Err from import request")
}
}
func proxyMessageToTarget(w http.ResponseWriter, r *http.Request) {
type Inbound struct {
From string `json:"from"`
Target string `json:"target"`
Message any `json:"message"`
}
log := hlog.FromRequest(r)
data := Inbound{}
dec := json.NewDecoder(r.Body)
err := dec.Decode(&data)
if err != nil {
log.Warn().Err(err).Msg("Failed to decode json body")
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
return
}
log.Debug().Any("data", data).Msg("Received message")
user, err := dbgen.User.GetByUsername(data.From)
if err != nil {
log.Error().Err(err).Msg("Failed to get user from storage")
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
return
}
targetId, err := activitypub.ImportRemoteAccountByHandle(data.Target)
if err != nil {
log.Error().Err(err).Msg("Failed to import target user")
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
return
}
target, err := dbgen.User.Where(dbgen.User.ID.Eq(targetId)).
Preload(dbgen.User.RemoteInfo).
First()
if err != nil {
log.Error().Err(err).Msg("Failed to get target user from db")
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
return
}
outBody, err := json.Marshal(data.Message)
if err != nil {
log.Error().Err(err).Msg("Failed to marshal out data")
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
return
}
log.Debug().Bytes("request-body", outBody).Msg("Body of proxied request")
response, err := webshared.RequestSignedCavage(
"POST",
target.RemoteInfo.InboxLink,
outBody,
user,
)
if err != nil {
log.Error().Err(err).Msg("Request failed")
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
return
}
defer response.Body.Close()
respBody, _ := io.ReadAll(response.Body)
log.Debug().
Int("status-code", response.StatusCode).
Bytes("body", respBody).
Msg("Response from message")
}
func kickoffFollow(w http.ResponseWriter, r *http.Request) {
type Inbound struct {
Id string
Target string
From string `json:"from"`
To string `json:"to"`
}
var data Inbound
dec := json.NewDecoder(r.Body)