changeset 240:9012e4045da4

Implemented /user delete controller.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 26 Jul 2018 17:56:02 +0200
parents 713234a04a87
children 3b688fe04c39
files auth/pool.go controllers/json.go controllers/routes.go controllers/user.go
diffstat 4 files changed, 59 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/auth/pool.go	Thu Jul 26 17:15:22 2018 +0200
+++ b/auth/pool.go	Thu Jul 26 17:56:02 2018 +0200
@@ -296,6 +296,21 @@
 	return <-res
 }
 
+func (pcp *ConnectionPool) Logout(user string) {
+	pcp.cmds <- func(pcp *ConnectionPool) {
+		for token, con := range pcp.conns {
+			if con.session.User == user {
+				if db := con.db; db != nil {
+					con.db = nil
+					db.Close()
+				}
+				delete(pcp.conns, token)
+				pcp.remove(token)
+			}
+		}
+	}
+}
+
 func (pcp *ConnectionPool) Shutdown() error {
 	if db := pcp.storage; db != nil {
 		log.Println("info: shutdown persistent connection pool.")
--- a/controllers/json.go	Thu Jul 26 17:15:22 2018 +0200
+++ b/controllers/json.go	Thu Jul 26 17:56:02 2018 +0200
@@ -90,9 +90,13 @@
 		jr.Code = http.StatusOK
 	}
 
-	rw.Header().Set("Content-Type", "application/json")
+	if jr.Code != http.StatusNoContent {
+		rw.Header().Set("Content-Type", "application/json")
+	}
 	rw.WriteHeader(jr.Code)
-	if err := json.NewEncoder(rw).Encode(jr.Result); err != nil {
-		log.Printf("error: %v\n", err)
+	if jr.Code != http.StatusNoContent {
+		if err := json.NewEncoder(rw).Encode(jr.Result); err != nil {
+			log.Printf("error: %v\n", err)
+		}
 	}
 }
--- a/controllers/routes.go	Thu Jul 26 17:15:22 2018 +0200
+++ b/controllers/routes.go	Thu Jul 26 17:56:02 2018 +0200
@@ -24,6 +24,10 @@
 		Handle: updateUser,
 	})).Methods(http.MethodPut)
 
+	api.Handle("/users/{user}", sysAdmin(&JSONHandler{
+		Handle: deleteUser,
+	})).Methods(http.MethodPut)
+
 	api.HandleFunc("/login", login).
 		Methods(http.MethodGet, http.MethodPost)
 	api.Handle("/logout", auth.SessionMiddleware(http.HandlerFunc(logout))).
--- a/controllers/user.go	Thu Jul 26 17:15:22 2018 +0200
+++ b/controllers/user.go	Thu Jul 26 17:56:02 2018 +0200
@@ -8,6 +8,7 @@
 	"regexp"
 	"strings"
 
+	"gemma.intevation.de/gemma/auth"
 	"github.com/gorilla/mux"
 )
 
@@ -41,6 +42,8 @@
 	updateUserSQL       = `SELECT sys_admin.update_user($1, $2, $3, $4, $5, NULL, $6)`
 	updateUserExtentSQL = `SELECT sys_admin.update_user($1, $2, $3, $4, $5,
   ST_MakeBox2D(ST_Point($6, $7), ST_Point($8, $9)), $10)`
+
+	deleteUserSQL = `SELECT sys_admin.delete_user($1)`
 )
 
 var (
@@ -117,10 +120,37 @@
 	return errNoValidRole
 }
 
+func deleteUser(
+	rw http.ResponseWriter, req *http.Request,
+	input interface{}, db *sql.DB,
+) (jr JSONResult, err error) {
+
+	user := mux.Vars(req)["user"]
+	if user == "" {
+		err = JSONError{http.StatusBadRequest, "error: user empty"}
+		return
+	}
+
+	session, _ := auth.GetSession(req)
+	if session.User == user {
+		err = JSONError{http.StatusBadRequest, "error: cannot delete yourself"}
+		return
+	}
+
+	if _, err = db.Exec(deleteUserSQL, user); err != nil {
+		return
+	}
+
+	// Running in a go routine should not be necessary.
+	go func() { auth.ConnPool.Logout(user) }()
+
+	jr = JSONResult{Code: http.StatusNoContent}
+	return
+}
+
 func updateUser(
 	rw http.ResponseWriter, req *http.Request,
-	input interface{},
-	db *sql.DB,
+	input interface{}, db *sql.DB,
 ) (jr JSONResult, err error) {
 
 	user := mux.Vars(req)["user"]
@@ -172,8 +202,7 @@
 
 func createUser(
 	rw http.ResponseWriter, req *http.Request,
-	input interface{},
-	db *sql.DB,
+	input interface{}, db *sql.DB,
 ) (jr JSONResult, err error) {
 
 	user := input.(*User)