changeset 418:c70ddc6eb168

Don't allow user names to contain any of the following characters \"':;
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 16 Aug 2018 13:14:46 +0200
parents ff26ffc18a04
children 6627c48363a0
files pkg/controllers/token.go pkg/controllers/types.go pkg/controllers/user.go
diffstat 3 files changed, 44 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/token.go	Thu Aug 16 10:42:30 2018 +0200
+++ b/pkg/controllers/token.go	Thu Aug 16 13:14:46 2018 +0200
@@ -63,7 +63,7 @@
 		password = req.FormValue("password")
 	)
 
-	if user == "" || password == "" {
+	if user == "" || !UserName(user).isValid() || password == "" {
 		http.Error(rw, "Invalid credentials", http.StatusBadRequest)
 		return
 	}
--- a/pkg/controllers/types.go	Thu Aug 16 10:42:30 2018 +0200
+++ b/pkg/controllers/types.go	Thu Aug 16 13:14:46 2018 +0200
@@ -9,9 +9,10 @@
 )
 
 type (
-	Email   string
-	Country string
-	Role    string
+	Email    string
+	Country  string
+	Role     string
+	UserName string
 
 	BoundingBox struct {
 		X1 float64 `json:"x1"`
@@ -21,7 +22,7 @@
 	}
 
 	User struct {
-		User     string       `json:"user"`
+		User     UserName     `json:"user"`
 		Role     Role         `json:"role"`
 		Password string       `json:"password,omitempty"`
 		Email    Email        `json:"email"`
@@ -76,6 +77,37 @@
 	return
 }
 
+var errNoValidUser = errors.New("Not a valid user")
+
+func (u UserName) isValid() bool {
+	return !strings.ContainsAny(string(u), `\"':;`)
+}
+
+func (u *UserName) UnmarshalJSON(data []byte) error {
+	var s string
+	if err := json.Unmarshal(data, &s); err != nil {
+		return err
+	}
+	if !emailRe.MatchString(s) {
+		return errNoEmailAddress
+	}
+	user := UserName(s)
+	if !user.isValid() {
+		return errNoValidUser
+	}
+	*u = user
+	return nil
+}
+
+func (u *UserName) Scan(src interface{}) (err error) {
+	if s, ok := src.(string); ok {
+		*u = UserName(s)
+	} else {
+		err = errNoString
+	}
+	return
+}
+
 var (
 	validCountries = []string{
 		"AT", "BG", "DE", "HU", "HR",
--- a/pkg/controllers/user.go	Thu Aug 16 10:42:30 2018 +0200
+++ b/pkg/controllers/user.go	Thu Aug 16 13:14:46 2018 +0200
@@ -94,9 +94,9 @@
 	db *sql.DB,
 ) (jr JSONResult, err error) {
 
-	user := mux.Vars(req)["user"]
-	if user == "" {
-		err = JSONError{http.StatusBadRequest, "error: user empty"}
+	user := UserName(mux.Vars(req)["user"])
+	if user == "" || !user.isValid() {
+		err = JSONError{http.StatusBadRequest, "error: user invalid"}
 		return
 	}
 
@@ -156,7 +156,7 @@
 
 	if user != newUser.User {
 		// Running in a go routine should not be necessary.
-		go func() { auth.ConnPool.Logout(user) }()
+		go func() { auth.ConnPool.Logout(string(user)) }()
 	}
 
 	jr = JSONResult{
@@ -253,9 +253,9 @@
 	db *sql.DB,
 ) (jr JSONResult, err error) {
 
-	user := mux.Vars(req)["user"]
-	if user == "" {
-		err = JSONError{http.StatusBadRequest, "error: user empty"}
+	user := UserName(mux.Vars(req)["user"])
+	if user == "" || !user.isValid() {
+		err = JSONError{http.StatusBadRequest, "error: user invalid"}
 		return
 	}