Skip to content

Commit

Permalink
🚸 Update LatestKeysUploadTs on Cross Signing Keys Uploads
Browse files Browse the repository at this point in the history
  • Loading branch information
Danieloni1 committed Sep 18, 2023
1 parent b2d30a7 commit 80e6ca5
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
49 changes: 49 additions & 0 deletions clientapi/routing/key_crosssigning.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@
package routing

import (
"encoding/json"
"fmt"
"net/http"
"time"

"github.com/matrix-org/dendrite/clientapi/auth"
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
Expand Down Expand Up @@ -99,6 +102,52 @@ func UploadCrossSigningDeviceKeys(
}
}

// Following additional logic is implemented to follow the [Notion PRD](https://globekeeper.notion.site/Account-Data-State-Event-c64c8df8025a494d86d3137d4e080ece)
if device.UserID != "" {
prevAccountDataReq := api.QueryAccountDataRequest{
UserID: device.UserID,
DataType: "account_data",
RoomID: "",
}
accountDataRes := api.QueryAccountDataResponse{}
if err := accountAPI.QueryAccountData(req.Context(), &prevAccountDataReq, &accountDataRes); err != nil {
util.GetLogger(req.Context()).WithError(err).Error("userAPI.QueryAccountData failed")
return util.ErrorResponse(fmt.Errorf("userAPI.QueryAccountData: %w", err))
}
var accoundData api.AccountData
if len(accountDataRes.GlobalAccountData) != 0 {
err := json.Unmarshal(accountDataRes.GlobalAccountData["account_data"], &accoundData)
if err != nil {
return util.JSONResponse{
Code: http.StatusInternalServerError,
JSON: spec.InternalServerError{Err: err.Error()},
}
}
}
accoundData.LatestKeysUploadTs = time.Now().UnixMilli()
newAccountData, err := json.Marshal(accoundData)
if err != nil {
return util.JSONResponse{
Code: http.StatusInternalServerError,
JSON: spec.InternalServerError{Err: err.Error()},
}
}

dataReq := api.InputAccountDataRequest{
UserID: device.UserID,
DataType: "account_data",
RoomID: "",
AccountData: json.RawMessage(newAccountData),
}
dataRes := api.InputAccountDataResponse{}
if err := accountAPI.InputAccountData(req.Context(), &dataReq, &dataRes); err != nil {
util.GetLogger(req.Context()).WithError(err).Error("userAPI.InputAccountData on LatestKeysUploadTs update failed")
return util.ErrorResponse(err)
}
logger := util.GetLogger(req.Context()).WithField("user_id", device.UserID)
logger.Info("updated latestKeysUploadTs field in account data")
}

return util.JSONResponse{
Code: http.StatusOK,
JSON: struct{}{},
Expand Down
6 changes: 6 additions & 0 deletions userapi/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,12 @@ type QueryAccountDataResponse struct {
RoomAccountData map[string]map[string]json.RawMessage // room -> type -> data
}

// Custom Connnect AccountData information
type AccountData struct {
IsProfileFilled bool `json:"isProfileFilled"`
LatestKeysUploadTs int64 `json:"latestKeysUploadTs"`
}

// QueryDevicesRequest is the request for QueryDevices
type QueryDevicesRequest struct {
UserID string
Expand Down

0 comments on commit 80e6ca5

Please sign in to comment.