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) return CreateRoomCryptoIDs(req, device, cfg, userAPI, rsAPI, asAPI)
}), }),
).Methods(http.MethodPost, http.MethodOptions) ).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 { httputil.MakeAuthAPI("send_pdus", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
logrus.Info("Processing request to /org.matrix.msc_cryptoids/sendPDUs") logrus.Info("Processing request to /org.matrix.msc_cryptoids/sendPDUs")
if r := rateLimits.Limit(req, device); r != nil { if r := rateLimits.Limit(req, device); r != nil {
return *r 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. // 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) ).Methods(http.MethodPost, http.MethodOptions)

View file

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