170 lines
3.5 KiB
Go
170 lines
3.5 KiB
Go
package src
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"errors"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"../src/internal/authentication"
|
|
)
|
|
|
|
func activatedSystemAuthentication() (err error) {
|
|
|
|
err = authentication.Init(System.Folder.Config, 60)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
var defaults = make(map[string]interface{})
|
|
defaults["authentication.web"] = false
|
|
defaults["authentication.pms"] = false
|
|
defaults["authentication.xml"] = false
|
|
defaults["authentication.api"] = false
|
|
err = authentication.SetDefaultUserData(defaults)
|
|
|
|
return
|
|
}
|
|
|
|
func createFirstUserForAuthentication(username, password string) (token string, err error) {
|
|
|
|
var authenticationErr = func(err error) {
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
err = authentication.CreateDefaultUser(username, password)
|
|
authenticationErr(err)
|
|
|
|
token, err = authentication.UserAuthentication(username, password)
|
|
authenticationErr(err)
|
|
|
|
token, err = authentication.CheckTheValidityOfTheToken(token)
|
|
authenticationErr(err)
|
|
|
|
var userData = make(map[string]interface{})
|
|
userData["username"] = username
|
|
userData["authentication.web"] = true
|
|
userData["authentication.pms"] = true
|
|
userData["authentication.m3u"] = true
|
|
userData["authentication.xml"] = true
|
|
userData["authentication.api"] = false
|
|
userData["defaultUser"] = true
|
|
|
|
userID, err := authentication.GetUserID(token)
|
|
authenticationErr(err)
|
|
|
|
err = authentication.WriteUserData(userID, userData)
|
|
authenticationErr(err)
|
|
|
|
return
|
|
}
|
|
|
|
func tokenAuthentication(token string) (newToken string, err error) {
|
|
|
|
if System.ConfigurationWizard == true {
|
|
return
|
|
}
|
|
|
|
newToken, err = authentication.CheckTheValidityOfTheToken(token)
|
|
|
|
return
|
|
}
|
|
|
|
func basicAuth(r *http.Request, level string) (username string, err error) {
|
|
|
|
err = errors.New("User authentication failed")
|
|
|
|
auth := strings.SplitN(r.Header.Get("Authorization"), " ", 2)
|
|
|
|
if len(auth) != 2 || auth[0] != "Basic" {
|
|
return
|
|
}
|
|
|
|
payload, _ := base64.StdEncoding.DecodeString(auth[1])
|
|
pair := strings.SplitN(string(payload), ":", 2)
|
|
|
|
username = pair[0]
|
|
var password = pair[1]
|
|
|
|
token, err := authentication.UserAuthentication(username, password)
|
|
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = checkAuthorizationLevel(token, level)
|
|
|
|
return
|
|
}
|
|
|
|
func urlAuth(r *http.Request, requestType string) (err error) {
|
|
var level, token string
|
|
|
|
var username = r.URL.Query().Get("username")
|
|
var password = r.URL.Query().Get("password")
|
|
|
|
switch requestType {
|
|
|
|
case "m3u":
|
|
level = "authentication.m3u"
|
|
if Settings.AuthenticationM3U == true {
|
|
token, err = authentication.UserAuthentication(username, password)
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = checkAuthorizationLevel(token, level)
|
|
}
|
|
|
|
case "xml":
|
|
level = "authentication.xml"
|
|
if Settings.AuthenticationXML == true {
|
|
token, err = authentication.UserAuthentication(username, password)
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = checkAuthorizationLevel(token, level)
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func checkAuthorizationLevel(token, level string) (err error) {
|
|
|
|
var authenticationErr = func(err error) {
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
userID, err := authentication.GetUserID(token)
|
|
authenticationErr(err)
|
|
|
|
userData, err := authentication.ReadUserData(userID)
|
|
authenticationErr(err)
|
|
|
|
if len(userData) > 0 {
|
|
|
|
if v, ok := userData[level].(bool); ok {
|
|
|
|
if v == false {
|
|
err = errors.New("No authorization")
|
|
}
|
|
|
|
} else {
|
|
userData[level] = false
|
|
err = authentication.WriteUserData(userID, userData)
|
|
err = errors.New("No authorization")
|
|
}
|
|
|
|
} else {
|
|
err = authentication.WriteUserData(userID, userData)
|
|
err = errors.New("No authorization")
|
|
}
|
|
|
|
return
|
|
}
|