Work on clientapi/logout/all

TODO:
 - Fix new routing code in routing.go
 - Testing
Signed-off-by: Remi Reuvekamp <git@remireuvekamp.nl>
This commit is contained in:
Remi Reuvekamp 2017-10-15 00:09:41 +00:00
parent 32a2b3a5c0
commit db88b4d9ab
4 changed files with 63 additions and 4 deletions

View file

@ -57,13 +57,18 @@ const selectDeviceByTokenSQL = "" +
const deleteDeviceSQL = "" + const deleteDeviceSQL = "" +
"DELETE FROM device_devices WHERE device_id = $1 AND localpart = $2" "DELETE FROM device_devices WHERE device_id = $1 AND localpart = $2"
const deleteDevicesByLocalpartSQL = "" +
"DELETE FROM device_devices WHERE localpart = $1"
// TODO: List devices? // TODO: List devices?
type devicesStatements struct { type devicesStatements struct {
insertDeviceStmt *sql.Stmt insertDeviceStmt *sql.Stmt
selectDeviceByTokenStmt *sql.Stmt selectDeviceByTokenStmt *sql.Stmt
deleteDeviceStmt *sql.Stmt deleteDeviceStmt *sql.Stmt
serverName gomatrixserverlib.ServerName deleteDevicesByLocalpartStmt *sql.Stmt
serverName gomatrixserverlib.ServerName
} }
func (s *devicesStatements) prepare(db *sql.DB, server gomatrixserverlib.ServerName) (err error) { func (s *devicesStatements) prepare(db *sql.DB, server gomatrixserverlib.ServerName) (err error) {
@ -110,6 +115,14 @@ func (s *devicesStatements) deleteDevice(
return err return err
} }
func (s *devicesStatements) deleteDevicesByLocalpart(
ctx context.Context, txn *sql.Tx, localpart string,
) error {
stmt := common.TxStmt(txn, s.deleteDeviceStmt)
_, err := stmt.ExecContext(ctx, localpart)
return err
}
func (s *devicesStatements) selectDeviceByToken( func (s *devicesStatements) selectDeviceByToken(
ctx context.Context, accessToken string, ctx context.Context, accessToken string,
) (*authtypes.Device, error) { ) (*authtypes.Device, error) {

View file

@ -109,3 +109,17 @@ func (d *Database) RemoveDevice(
return nil return nil
}) })
} }
// RemoveAllDevices revokes devices by deleting the entry in the
// database matching with the given user ID localpart.
// If something went wrong during the deletion, it will return the SQL error
func (d *Database) RemoveAllDevices(
ctx context.Context, localpart string,
) error {
return common.WithTransaction(d.db, func(txn *sql.Tx) error {
if err := d.devices.deleteDevicesByLocalpart(ctx, txn, localpart); err != sql.ErrNoRows {
return err
}
return nil
})
}

View file

@ -50,3 +50,29 @@ func Logout(
JSON: struct{}{}, JSON: struct{}{},
} }
} }
// LogoutAll handles POST /logout/all
func LogoutAll(
req *http.Request, deviceDB *devices.Database, device *authtypes.Device,
) util.JSONResponse {
if req.Method != "POST" {
return util.JSONResponse{
Code: 405,
JSON: jsonerror.NotFound("Bad method"),
}
}
localpart, _, err := gomatrixserverlib.SplitID('@', device.UserID)
if err != nil {
return httputil.LogThenError(req, err)
}
if err := deviceDB.RemoveAllDevices(req.Context(), localpart); err != nil {
return httputil.LogThenError(req, err)
}
return util.JSONResponse{
Code: 200,
JSON: struct{}{},
}
}

View file

@ -160,6 +160,12 @@ func Setup(
}), }),
).Methods("POST", "OPTIONS") ).Methods("POST", "OPTIONS")
r0mux.Handle("/logout/all",
common.MakeAuthAPI("logout", deviceDB, func(req *http.Request, device *authtypes.Device) util.JSONResponse {
return LogoutAll(req, deviceDB, device)
}),
).Methods("POST", "OPTIONS")
// Stub endpoints required by Riot // Stub endpoints required by Riot
r0mux.Handle("/login", r0mux.Handle("/login",