diff --git a/src/github.com/matrix-org/dendrite/clientapi/auth/storage/devices/storage.go b/src/github.com/matrix-org/dendrite/clientapi/auth/storage/devices/storage.go index 185dbba12..8f39cad3c 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/auth/storage/devices/storage.go +++ b/src/github.com/matrix-org/dendrite/clientapi/auth/storage/devices/storage.go @@ -69,6 +69,19 @@ func (d *Database) CreateDevice(localpart, deviceID, accessToken string) (dev *a return } +// RemoveDevice revokes a device by deleting the entry in the database +// matching with the given device ID and user ID localpart +// If the device doesn't exist, it will not return an error +// If something went wrong during the deletion, it will return the SQL error +func (d *Database) RemoveDevice(deviceID string, localpart string) error { + return runTransaction(d.db, func(txn *sql.Tx) error { + if err := d.devices.deleteDevice(txn, deviceID, localpart); err != sql.ErrNoRows { + return err + } + return nil + }) +} + // TODO: factor out to common func runTransaction(db *sql.DB, fn func(txn *sql.Tx) error) (err error) { txn, err := db.Begin() diff --git a/src/github.com/matrix-org/dendrite/clientapi/readers/logout.go b/src/github.com/matrix-org/dendrite/clientapi/readers/logout.go new file mode 100644 index 000000000..62aaee1c3 --- /dev/null +++ b/src/github.com/matrix-org/dendrite/clientapi/readers/logout.go @@ -0,0 +1,47 @@ +// Copyright 2017 Vector Creations Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package readers + +import ( + "net/http" + + "github.com/matrix-org/dendrite/clientapi/auth/authtypes" + "github.com/matrix-org/dendrite/clientapi/auth/storage/devices" + "github.com/matrix-org/dendrite/clientapi/httputil" + "github.com/matrix-org/dendrite/clientapi/jsonerror" + "github.com/matrix-org/util" +) + +// Logout handles POST /logout +func Logout( + 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 := getLocalPart(device.UserID) + if err := deviceDB.RemoveDevice(device.ID, localpart); err != nil { + return httputil.LogThenError(req, err) + } + + return util.JSONResponse{ + Code: 200, + JSON: struct{}{}, + } +} diff --git a/src/github.com/matrix-org/dendrite/clientapi/routing/routing.go b/src/github.com/matrix-org/dendrite/clientapi/routing/routing.go index 4d5556d9f..8d6f024e2 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/routing/routing.go +++ b/src/github.com/matrix-org/dendrite/clientapi/routing/routing.go @@ -113,6 +113,12 @@ func Setup( }), ) + r0mux.Handle("/logout", + common.MakeAuthAPI("logout", deviceDB, func(req *http.Request, device *authtypes.Device) util.JSONResponse { + return readers.Logout(req, deviceDB, device) + }), + ) + // Stub endpoints required by Riot r0mux.Handle("/login",