Mercurial > gemma
view pkg/models/user.go @ 1644:eadf84bb0e98
New config variable 'external-url'.
Deep inside the import queue we don't known the URL we find the server at.
We don't have any HTTP request we can derive this information wrong
so it needs to be configured.
Defaults to http://${web-host}:${web-port} .
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Thu, 20 Dec 2018 14:39:23 +0100 |
parents | a244b18cb916 |
children | f1c3fe8b79f5 |
line wrap: on
line source
// This is Free Software under GNU Affero General Public License v >= 3.0 // without warranty, see README.md and license for details. // // SPDX-License-Identifier: AGPL-3.0-or-later // License-Filename: LICENSES/AGPL-3.0.txt // // Copyright (C) 2018 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha L. Teichmann <sascha.teichmann@intevation.de> // * Tom Gottfried <tom.gottfried@intevation.de> package models import ( "database/sql/driver" "encoding/json" "errors" "regexp" "strings" ) type ( Email string Country string Role string UserName string BoundingBox struct { X1 float64 `json:"x1"` Y1 float64 `json:"y1"` X2 float64 `json:"x2"` Y2 float64 `json:"y2"` } User struct { User UserName `json:"user"` Role Role `json:"role"` Password string `json:"password,omitempty"` Email Email `json:"email"` Country Country `json:"country"` Extent *BoundingBox `json:"extent"` } PWResetUser struct { User string `json:"user"` } ) var ( // https://stackoverflow.com/questions/201323/how-to-validate-an-email-address-using-a-regular-expression emailRe = regexp.MustCompile( `(?:[a-z0-9!#$%&'*+/=?^_` + "`" + `{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_` + "`" + `{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]` + `|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")` + `@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?` + `|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}` + `(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]` + `:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]` + `|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])`) errNoEmailAddress = errors.New("Not a valid email address") ) func (e *Email) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } if !emailRe.MatchString(s) { return errNoEmailAddress } *e = Email(s) return nil } func (e Email) Value() (driver.Value, error) { return string(e), nil } func (e *Email) Scan(src interface{}) (err error) { if s, ok := src.(string); ok { *e = Email(s) } else { err = errNoString } return } var errNoValidUser = errors.New("Not a valid user") func (u UserName) IsValid() bool { return u != "" } func (u *UserName) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } if user := UserName(s); user.IsValid() { *u = user return nil } return errNoValidUser } 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", "MD", "RO", "RS", "SK", "UA", } errNoValidCountry = errors.New("Not a valid country") ) func (c *Country) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } s = strings.ToUpper(s) for _, v := range validCountries { if v == s { *c = Country(v) return nil } } return errNoValidCountry } func (c Country) Value() (driver.Value, error) { return string(c), nil } func (c *Country) Scan(src interface{}) (err error) { if s, ok := src.(string); ok { *c = Country(s) } else { err = errNoString } return } var ( validRoles = []string{ "waterway_user", "waterway_admin", "sys_admin", } errNoValidRole = errors.New("Not a valid role") ) func (r Role) Value() (driver.Value, error) { return string(r), nil } func (r *Role) Scan(src interface{}) (err error) { if s, ok := src.(string); ok { *r = Role(s) } else { err = errNoString } return } func (r *Role) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } s = strings.ToLower(s) for _, v := range validRoles { if v == s { *r = Role(v) return nil } } return errNoValidRole }