( req *http.Request, userInteractiveAuth *auth.UserInteractive, keyserverAPI api.ClientKeyAPI, device *userapi.Device, accountAPI userapi.ClientUserAPI, cfg *config.ClientAPI, )
| 33 | } |
| 34 | |
| 35 | func UploadCrossSigningDeviceKeys( |
| 36 | req *http.Request, userInteractiveAuth *auth.UserInteractive, |
| 37 | keyserverAPI api.ClientKeyAPI, device *userapi.Device, |
| 38 | accountAPI userapi.ClientUserAPI, cfg *config.ClientAPI, |
| 39 | ) util.JSONResponse { |
| 40 | uploadReq := &crossSigningRequest{} |
| 41 | uploadRes := &api.PerformUploadDeviceKeysResponse{} |
| 42 | |
| 43 | resErr := httputil.UnmarshalJSONRequest(req, &uploadReq) |
| 44 | if resErr != nil { |
| 45 | return *resErr |
| 46 | } |
| 47 | sessionID := uploadReq.Auth.Session |
| 48 | if sessionID == "" { |
| 49 | sessionID = util.RandomString(sessionIDLength) |
| 50 | } |
| 51 | if uploadReq.Auth.Type != authtypes.LoginTypePassword { |
| 52 | return util.JSONResponse{ |
| 53 | Code: http.StatusUnauthorized, |
| 54 | JSON: newUserInteractiveResponse( |
| 55 | sessionID, |
| 56 | []authtypes.Flow{ |
| 57 | { |
| 58 | Stages: []authtypes.LoginType{authtypes.LoginTypePassword}, |
| 59 | }, |
| 60 | }, |
| 61 | nil, |
| 62 | ), |
| 63 | } |
| 64 | } |
| 65 | typePassword := auth.LoginTypePassword{ |
| 66 | GetAccountByPassword: accountAPI.QueryAccountByPassword, |
| 67 | Config: cfg, |
| 68 | } |
| 69 | if _, authErr := typePassword.Login(req.Context(), &uploadReq.Auth.PasswordRequest); authErr != nil { |
| 70 | return *authErr |
| 71 | } |
| 72 | sessions.addCompletedSessionStage(sessionID, authtypes.LoginTypePassword) |
| 73 | |
| 74 | uploadReq.UserID = device.UserID |
| 75 | keyserverAPI.PerformUploadDeviceKeys(req.Context(), &uploadReq.PerformUploadDeviceKeysRequest, uploadRes) |
| 76 | |
| 77 | if err := uploadRes.Error; err != nil { |
| 78 | switch { |
| 79 | case err.IsInvalidSignature: |
| 80 | return util.JSONResponse{ |
| 81 | Code: http.StatusBadRequest, |
| 82 | JSON: jsonerror.InvalidSignature(err.Error()), |
| 83 | } |
| 84 | case err.IsMissingParam: |
| 85 | return util.JSONResponse{ |
| 86 | Code: http.StatusBadRequest, |
| 87 | JSON: jsonerror.MissingParam(err.Error()), |
| 88 | } |
| 89 | case err.IsInvalidParam: |
| 90 | return util.JSONResponse{ |
| 91 | Code: http.StatusBadRequest, |
| 92 | JSON: jsonerror.InvalidParam(err.Error()), |
no test coverage detected