- 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:
parent
d70786439e
commit
415cd89792
8 changed files with 104 additions and 17 deletions
|
@ -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(
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue