Update send_pdus endpoint to reflect msc changes
This commit is contained in:
parent
227493cc5d
commit
5930a04044
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue