Update send_pdus endpoint to reflect msc changes

This commit is contained in:
Devon Hudson 2023-11-15 14:30:54 -07:00
parent 227493cc5d
commit 5930a04044
No known key found for this signature in database
GPG key ID: CD06B18E77F6A628
2 changed files with 27 additions and 16 deletions

View file

@ -318,15 +318,21 @@ func Setup(
return CreateRoomCryptoIDs(req, device, cfg, userAPI, rsAPI, asAPI)
}),
).Methods(http.MethodPost, http.MethodOptions)
unstableMux.Handle("/org.matrix.msc_cryptoids/sendPDUs",
unstableMux.Handle("/org.matrix.msc_cryptoids/send_pdus/{txnID}",
httputil.MakeAuthAPI("send_pdus", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
logrus.Info("Processing request to /org.matrix.msc_cryptoids/sendPDUs")
if r := rateLimits.Limit(req, device); r != nil {
return *r
}
vars, err := httputil.URLDecodeMapValues(mux.Vars(req))
if err != nil {
return util.ErrorResponse(err)
}
txnID := vars["txnID"]
// NOTE: when making events such as for create_room, multiple PDUs will need to be passed between the client & server.
return SendPDUs(req, device, cfg, userAPI, rsAPI, asAPI)
return SendPDUs(req, device, cfg, userAPI, rsAPI, asAPI, &txnID)
}),
).Methods(http.MethodPost, http.MethodOptions)

View file

@ -32,11 +32,14 @@ import (
"github.com/prometheus/client_golang/prometheus"
)
type PDUInfo struct {
Version string `json:"room_version"`
ViaServer string `json:"via_server,omitempty"`
PDU json.RawMessage `json:"pdu"`
}
type sendPDUsRequest struct {
Version string `json:"room_version"`
ViaServer string `json:"via_server,omitempty"`
TxnID string `json:"txn_id,omitempty"`
PDUs []json.RawMessage `json:"pdus"`
PDUs []PDUInfo `json:"pdus"`
}
// SendPDUs implements /sendPDUs
@ -45,6 +48,7 @@ func SendPDUs(
cfg *config.ClientAPI,
profileAPI api.ClientUserAPI, rsAPI roomserverAPI.ClientRoomserverAPI,
asAPI appserviceAPI.AppServiceInternalAPI,
txnID *string,
) util.JSONResponse {
// TODO: cryptoIDs - should this include an "eventType"?
// if it's a bulk send endpoint, I don't think that makes any sense since there are multiple event types
@ -79,16 +83,10 @@ func SendPDUs(
mutex.(*sync.Mutex).Lock()
defer mutex.(*sync.Mutex).Unlock()
var txnID *roomserverAPI.TransactionID
if pdus.TxnID != "" {
txnID.TransactionID = pdus.TxnID
txnID.SessionID = device.SessionID
}
inputs := make([]roomserverAPI.InputRoomEvent, 0, len(pdus.PDUs))
for _, event := range pdus.PDUs {
// TODO: cryptoIDs - event hash check?
verImpl, err := gomatrixserverlib.GetRoomVersion(gomatrixserverlib.RoomVersion(pdus.Version))
verImpl, err := gomatrixserverlib.GetRoomVersion(gomatrixserverlib.RoomVersion(event.Version))
if err != nil {
return util.JSONResponse{
Code: http.StatusInternalServerError,
@ -108,7 +106,7 @@ func SendPDUs(
// Also - untrusted JSON seems better - except it strips off the unsigned field?
// Also - gmsl events don't store the `hashes` field... problem?
pdu, err := verImpl.NewEventFromUntrustedJSON(event)
pdu, err := verImpl.NewEventFromUntrustedJSON(event.PDU)
if err != nil {
return util.JSONResponse{
Code: http.StatusInternalServerError,
@ -179,7 +177,7 @@ func SendPDUs(
RoomID: pdu.RoomID().String(),
UserID: device.UserID,
IsGuest: device.AccountType == api.AccountTypeGuest,
ServerNames: []spec.ServerName{spec.ServerName(pdus.ViaServer)},
ServerNames: []spec.ServerName{spec.ServerName(event.ViaServer)},
JoinEvent: pdu,
}
err := rsAPI.PerformSendJoinCryptoIDs(req.Context(), &joinReq)
@ -200,6 +198,13 @@ func SendPDUs(
// We should be doing this already as part of `SendInputRoomEvents`, but how should we pass this
// failure back to the client?
var transactionID *roomserverAPI.TransactionID
if txnID != nil {
transactionID = &roomserverAPI.TransactionID{
SessionID: device.SessionID, TransactionID: *txnID,
}
}
inputs = append(inputs, roomserverAPI.InputRoomEvent{
Kind: roomserverAPI.KindNew,
Event: &types.HeaderedEvent{PDU: pdu},
@ -207,7 +212,7 @@ func SendPDUs(
// TODO: cryptoIDs - what to do with this field?
// should probably generate this based on the event type being sent?
//SendAsServer: roomserverAPI.DoNotSendToOtherServers,
TransactionID: txnID,
TransactionID: transactionID,
})
}