You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

122 lines
3.5 KiB

package handlers
import (
"encoding/json"
"net/http"
"github.com/matrix-org/go-neb/api"
"github.com/matrix-org/go-neb/clients"
"github.com/matrix-org/util"
"maunium.net/go/mautrix/crypto"
)
// ConfigureClient represents an HTTP handler capable of processing /admin/configureClient requests.
type ConfigureClient struct {
Clients *clients.Clients
}
// OnIncomingRequest handles POST requests to /admin/configureClient. The JSON object provided
// is of type "api.ClientConfig".
//
// If a DisplayName is supplied, this request will set this client's display name
// if the old ClientConfig DisplayName differs from the new ClientConfig DisplayName.
//
// Request:
// POST /admin/configureClient
// {
// "UserID": "@my_bot:localhost",
// "HomeserverURL": "http://localhost:8008",
// "Sync": true,
// "DisplayName": "My Bot"
// }
//
// Response:
// HTTP/1.1 200 OK
// {
// "OldClient": {
// // The old api.ClientConfig
// },
// "NewClient": {
// // The new api.ClientConfig
// }
// }
func (s *ConfigureClient) OnIncomingRequest(req *http.Request) util.JSONResponse {
if req.Method != "POST" {
return util.MessageResponse(405, "Unsupported Method")
}
var body api.ClientConfig
if err := json.NewDecoder(req.Body).Decode(&body); err != nil {
return util.MessageResponse(400, "Error parsing request JSON")
}
if err := body.Check(); err != nil {
return util.MessageResponse(400, "Error parsing client config")
}
oldClient, err := s.Clients.Update(body)
if err != nil {
util.GetLogger(req.Context()).WithError(err).WithField("body", body).Error("Failed to Clients.Update")
return util.MessageResponse(500, "Error storing token")
}
return util.JSONResponse{
Code: 200,
JSON: struct {
OldClient api.ClientConfig
NewClient api.ClientConfig
}{oldClient, body},
}
}
// VerifySAS represents an HTTP handler capable of processing /verifySAS requests.
type VerifySAS struct {
Clients *clients.Clients
}
// OnIncomingRequest handles POST requests to /verifySAS. The JSON object provided
// is of type "api.IncomingDecimalSAS".
//
// The request should contain the three decimal SAS numbers as displayed on the other device that is being verified,
// as well as that device's user and device ID.
// It should also contain the user ID that Go-NEB's client is using.
//
// Request:
// POST /verifySAS
// {
// "UserID": "@my_bot:localhost", // Neb's user ID
// "OtherUserID": "@user:localhost", // User ID of device we're verifying with
// "OtherDeviceID": "ABCDEFG", // Device ID of device we're verifying with
// "SAS": [1111, 2222, 3333] // SAS displayed on device we're verifying with
// }
//
// Response:
// HTTP/1.1 200 OK
// {}
func (s *VerifySAS) OnIncomingRequest(req *http.Request) util.JSONResponse {
if req.Method != "POST" {
return util.MessageResponse(405, "Unsupported Method")
}
var body api.IncomingDecimalSAS
if err := json.NewDecoder(req.Body).Decode(&body); err != nil {
return util.MessageResponse(400, "Error parsing request JSON: "+err.Error())
}
if err := body.Check(); err != nil {
return util.MessageResponse(400, "Request error: "+err.Error())
}
client, err := s.Clients.Client(body.UserID)
if err != nil {
util.GetLogger(req.Context()).WithError(err).WithField("body", body).Error("Failed to load client")
return util.MessageResponse(500, "Error storing SAS")
}
client.SubmitDecimalSAS(body.OtherUserID, body.OtherDeviceID, crypto.DecimalSASData(body.SAS))
return util.JSONResponse{
Code: 200,
JSON: struct{}{},
}
}