multiserver/privs.go

141 lines
2.2 KiB
Go
Raw Normal View History

2021-01-07 14:29:46 -08:00
package multiserver
import (
"database/sql"
"fmt"
2021-01-13 12:48:42 -08:00
_ "github.com/mattn/go-sqlite3"
"log"
2021-01-09 03:26:30 -08:00
"strings"
2021-01-07 14:29:46 -08:00
)
// encodePrivs encodes priv map into DB-ready string
func encodePrivs(privs map[string]bool) string {
lenP := 0
for priv := range privs {
if privs[priv] {
lenP++
}
}
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
ps := make([]string, lenP)
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
i := 0
for priv := range privs {
if privs[priv] {
ps[i] = priv
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
i++
}
}
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
r := strings.Join(ps, "|")
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
return r
}
// decodePrivs decodes DB-ready string into priv map
func decodePrivs(s string) map[string]bool {
ps := strings.Split(s, "|")
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
r := make(map[string]bool)
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
for i := range ps {
2021-01-10 12:51:26 -08:00
if ps[i] != "" {
r[ps[i]] = true
}
2021-01-07 14:29:46 -08:00
}
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
return r
}
// addPrivItem inserts a priv DB entry
func addPrivItem(db *sql.DB, name string) error {
sql_addPrivItem := `INSERT INTO privileges (
name,
privileges
) VALUES (
?,
""
);
`
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
stmt, err := db.Prepare(sql_addPrivItem)
if err != nil {
return err
}
defer stmt.Close()
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
_, err = stmt.Exec(name)
if err != nil {
return err
}
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
return nil
}
// modPrivItem updates a priv DB entry
func modPrivItem(db *sql.DB, name, privs string) error {
sql_modPrivItem := `UPDATE privileges SET privileges = ? WHERE name = ?;`
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
stmt, err := db.Prepare(sql_modPrivItem)
if err != nil {
return err
}
defer stmt.Close()
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
_, err = stmt.Exec(privs, name)
if err != nil {
return err
}
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
return nil
}
// readPrivItem selects and reads a priv DB entry
func readPrivItem(db *sql.DB, name string) (string, error) {
sql_readPrivItem := `SELECT privileges FROM privileges WHERE name = ?;`
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
stmt, err := db.Prepare(sql_readPrivItem)
if err != nil {
return "", err
}
defer stmt.Close()
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
rows, err := stmt.Query(name)
if err != nil {
return "", err
}
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
var r string
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
for rows.Next() {
err = rows.Scan(&r)
}
2021-01-09 03:26:30 -08:00
2021-01-07 14:29:46 -08:00
return r, nil
}
func init() {
admin := GetConfKey("admin")
if admin != nil || fmt.Sprintf("%T", admin) == "string" {
db, err := initAuthDB()
if err != nil {
log.Print(err)
return
}
eprivs, err := readPrivItem(db, admin.(string))
if err != nil {
log.Print(err)
return
}
privs := decodePrivs(eprivs)
privs["privs"] = true
newprivs := encodePrivs(privs)
modPrivItem(db, admin.(string), newprivs)
}
}