package api import ( "encoding/hex" "strings" "github.com/astaxie/beego" "github.com/deluan/gosonic/api/responses" ) type ControllerInterface interface { GetString(key string, def ...string) string CustomAbort(status int, body string) SendError(errorCode int, message ...interface{}) } func Validate(controller ControllerInterface) { if beego.AppConfig.String("disableValidation") != "true" { checkParameters(controller) authenticate(controller) // TODO Validate version } } func checkParameters(c ControllerInterface) { requiredParameters := []string{"u", "p", "v", "c"} for _, p := range requiredParameters { if c.GetString(p) == "" { beego.Warn("Missing required parameter:", p) abortRequest(c, responses.ERROR_MISSING_PARAMETER) } } } func authenticate(c ControllerInterface) { user := c.GetString("u") pass := c.GetString("p") if strings.HasPrefix(pass, "enc:") { e := strings.TrimPrefix(pass, "enc:") if dec, err := hex.DecodeString(e); err == nil { pass = string(dec) } } if user != beego.AppConfig.String("user") || pass != beego.AppConfig.String("password") { beego.Warn("Invalid login:", user) abortRequest(c, responses.ERROR_AUTHENTICATION_FAIL) } } func abortRequest(c ControllerInterface, code int) { c.SendError(code) }