mirror of
https://github.com/hoernschen/dendrite.git
synced 2025-08-01 13:52:46 +00:00
some more stuff
This commit is contained in:
parent
77f912721a
commit
087efc0e34
5 changed files with 145 additions and 2 deletions
|
@ -2,6 +2,7 @@ package api
|
|||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
|
@ -61,6 +62,12 @@ type FederationInternalAPI interface {
|
|||
response *QueryJoinedHostServerNamesInRoomResponse,
|
||||
) error
|
||||
|
||||
QueryEventsFromFederation(
|
||||
ctx context.Context,
|
||||
request *QueryEventsFromFederationRequest,
|
||||
response *QueryEventsFromFederationResponse,
|
||||
) error
|
||||
|
||||
QueryEventAuthFromFederation(
|
||||
ctx context.Context,
|
||||
request *QueryEventAuthFromFederationRequest,
|
||||
|
@ -213,6 +220,15 @@ type QueryJoinedHostServerNamesInRoomResponse struct {
|
|||
ServerNames []gomatrixserverlib.ServerName `json:"server_names"`
|
||||
}
|
||||
|
||||
type QueryEventsFromFederationRequest struct {
|
||||
RoomID string `json:"room_id"`
|
||||
EventIDs []string `json:"event_ids"`
|
||||
}
|
||||
|
||||
type QueryEventsFromFederationResponse struct {
|
||||
Events []json.RawMessage `json:"events"`
|
||||
}
|
||||
|
||||
type QueryEventAuthFromFederationRequest struct {
|
||||
RoomID string `json:"room_id"`
|
||||
EventID string `json:"event_id"`
|
||||
|
|
|
@ -25,6 +25,47 @@ func (f *FederationInternalAPI) QueryJoinedHostServerNamesInRoom(
|
|||
return
|
||||
}
|
||||
|
||||
func (f *FederationInternalAPI) QueryEventsFromFederation(
|
||||
ctx context.Context,
|
||||
request *api.QueryEventsFromFederationRequest,
|
||||
response *api.QueryEventsFromFederationResponse,
|
||||
) error {
|
||||
joinedHosts, err := f.db.GetJoinedHostsForRooms(ctx, []string{request.RoomID})
|
||||
if err != nil {
|
||||
return fmt.Errorf("f.db.GetJoinedHostsForRooms: %w", err)
|
||||
}
|
||||
|
||||
tryHost := func(serverName gomatrixserverlib.ServerName, eventID string) error {
|
||||
reqctx, cancel := context.WithTimeout(ctx, time.Second*30)
|
||||
defer cancel()
|
||||
ires, err := f.doRequest(serverName, func() (interface{}, error) {
|
||||
return f.federation.GetEvent(
|
||||
reqctx,
|
||||
serverName,
|
||||
eventID,
|
||||
)
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("f.doRequest: %w", err)
|
||||
}
|
||||
tx := ires.(gomatrixserverlib.Transaction)
|
||||
response.Events = append(response.Events, tx.PDUs...)
|
||||
return nil
|
||||
}
|
||||
|
||||
var lasterr error
|
||||
for _, eventID := range request.EventIDs {
|
||||
for _, host := range joinedHosts {
|
||||
if lasterr = tryHost(host, eventID); lasterr != nil {
|
||||
continue
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return lasterr
|
||||
}
|
||||
|
||||
func (f *FederationInternalAPI) QueryEventAuthFromFederation(
|
||||
ctx context.Context,
|
||||
request *api.QueryEventAuthFromFederationRequest,
|
||||
|
|
|
@ -17,6 +17,7 @@ import (
|
|||
const (
|
||||
FederationAPIQueryJoinedHostServerNamesInRoomPath = "/federationapi/queryJoinedHostServerNamesInRoom"
|
||||
FederationAPIQueryServerKeysPath = "/federationapi/queryServerKeys"
|
||||
FederationAPIQueryEventsFromFederationPath = "/federationapi/queryEventsFromFederation"
|
||||
FederationAPIQueryEventAuthFromFederationPath = "/federationapi/queryEventAuthFromFederation"
|
||||
FederationAPIQueryStateIDsFromFederationPath = "/federationapi/queryStateIDsFromFederation"
|
||||
FederationAPIQueryStateFromFederationPath = "/federationapi/queryStateFromFederation"
|
||||
|
@ -123,6 +124,19 @@ func (h *httpFederationInternalAPI) QueryJoinedHostServerNamesInRoom(
|
|||
return httputil.PostJSON(ctx, span, h.httpClient, apiURL, request, response)
|
||||
}
|
||||
|
||||
// QueryEventAuthFromFederation implements FederationInternalAPI
|
||||
func (h *httpFederationInternalAPI) QueryEventsFromFederation(
|
||||
ctx context.Context,
|
||||
request *api.QueryEventsFromFederationRequest,
|
||||
response *api.QueryEventsFromFederationResponse,
|
||||
) error {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "QueryEventsFromFederation")
|
||||
defer span.Finish()
|
||||
|
||||
apiURL := h.federationAPIURL + FederationAPIQueryEventsFromFederationPath
|
||||
return httputil.PostJSON(ctx, span, h.httpClient, apiURL, request, response)
|
||||
}
|
||||
|
||||
// QueryEventAuthFromFederation implements FederationInternalAPI
|
||||
func (h *httpFederationInternalAPI) QueryEventAuthFromFederation(
|
||||
ctx context.Context,
|
||||
|
|
|
@ -27,6 +27,20 @@ func AddRoutes(intAPI api.FederationInternalAPI, internalAPIMux *mux.Router) {
|
|||
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||||
}),
|
||||
)
|
||||
internalAPIMux.Handle(
|
||||
FederationAPIQueryEventAuthFromFederationPath,
|
||||
httputil.MakeInternalAPI("QueryEventsFromFederation", func(req *http.Request) util.JSONResponse {
|
||||
var request api.QueryEventsFromFederationRequest
|
||||
var response api.QueryEventsFromFederationResponse
|
||||
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||||
return util.ErrorResponse(err)
|
||||
}
|
||||
if err := intAPI.QueryEventsFromFederation(req.Context(), &request, &response); err != nil {
|
||||
return util.ErrorResponse(err)
|
||||
}
|
||||
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||||
}),
|
||||
)
|
||||
internalAPIMux.Handle(
|
||||
FederationAPIQueryEventAuthFromFederationPath,
|
||||
httputil.MakeInternalAPI("QueryEventAuthFromFederation", func(req *http.Request) util.JSONResponse {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue