From aa36166766cb896840d4ab9c2c4080b413bb4214 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Thu, 5 Oct 2017 15:47:29 +0100 Subject: [PATCH] Generate new devices for each new /login --- .../matrix-org/dendrite/clientapi/auth/auth.go | 12 ++++++++++++ .../matrix-org/dendrite/clientapi/readers/login.go | 12 +++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/github.com/matrix-org/dendrite/clientapi/auth/auth.go b/src/github.com/matrix-org/dendrite/clientapi/auth/auth.go index b0bbe2bbb..668bab5f3 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/auth/auth.go +++ b/src/github.com/matrix-org/dendrite/clientapi/auth/auth.go @@ -86,6 +86,18 @@ func GenerateAccessToken() (string, error) { return base64.RawURLEncoding.EncodeToString(b), nil } +// GenerateDeviceID creates a new device id. Returns an error if failed to generate +// random bytes. +func GenerateDeviceID() (string, error) { + b := make([]byte, tokenByteLength) + _, err := rand.Read(b) + if err != nil { + return "", err + } + // url-safe no padding + return base64.RawURLEncoding.EncodeToString(b), nil +} + // extractAccessToken from a request, or return an error detailing what went wrong. The // error message MUST be human-readable and comprehensible to the client. func extractAccessToken(req *http.Request) (string, error) { diff --git a/src/github.com/matrix-org/dendrite/clientapi/readers/login.go b/src/github.com/matrix-org/dendrite/clientapi/readers/login.go index de6ecf5c6..329791fd1 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/readers/login.go +++ b/src/github.com/matrix-org/dendrite/clientapi/readers/login.go @@ -113,15 +113,17 @@ func Login( token, err := auth.GenerateAccessToken() if err != nil { - return util.JSONResponse{ - Code: 500, - JSON: jsonerror.Unknown("Failed to generate access token"), - } + httputil.LogThenError(req, err) + } + + deviceID, err := auth.GenerateDeviceID() + if err != nil { + httputil.LogThenError(req, err) } // TODO: Use the device ID in the request dev, err := deviceDB.CreateDevice( - req.Context(), acc.Localpart, auth.UnknownDeviceID, token, + req.Context(), acc.Localpart, deviceID, token, ) if err != nil { return util.JSONResponse{