/* GoCheese -- Python private package repository and caching proxy Copyright (C) 2019 Sergey Matveev 2019 Elena Balakhonova This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package main import ( "errors" "io/ioutil" "log" "os" "strings" ) var passwords map[string]Auther = make(map[string]Auther) type Auther interface { Auth(password string) bool } func strToAuther(verifier string) (string, Auther, error) { st := strings.SplitN(verifier, "$", 3) if len(st) != 3 || st[0] != "" { return "", nil, errors.New("invalid verifier structure") } algorithm := st[1] var auther Auther var err error switch algorithm { case "argon2i": auther, err = parseArgon2i(st[2]) case "sha256": auther, err = parseSHA256(st[2]) default: err = errors.New("unknown hashing algorithm") } return algorithm, auther, err } func refreshPasswd() { passwd, err := ioutil.ReadFile(*passwdPath) if os.IsNotExist(err) { return } if err != nil { log.Fatal(err) } passwordsNew := make(map[string]Auther) for i, credentials := range strings.Split(strings.TrimRight(string(passwd), "\n"), "\n") { if len(credentials) == 0 || strings.HasPrefix(credentials, "#") { continue } splitted := strings.Split(credentials, ":") if len(splitted) != 2 { log.Fatalf("%s:%d: Wrong login:password format", *passwdPath, i) } login := splitted[0] if _, exists := passwordsNew[login]; exists { log.Fatalf("%s:%d: %s: already exists", *passwdPath, i, login) } _, auther, err := strToAuther(splitted[1]) if err != nil { log.Fatalf("%s:%d: %s: %s", *passwdPath, i, login, err) } passwordsNew[login] = auther log.Println("Added password for " + login) } passwords = passwordsNew }