Skip to content

Commit 2a9abc2

Browse files
committed
feat: add options accept user with encoded password
1 parent 79e13f1 commit 2a9abc2

File tree

8 files changed

+346
-43
lines changed

8 files changed

+346
-43
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ server [options]
8686
Use Basic Auth for specific file system path.
8787
--user [<username>]:[<password>] ...
8888
Specify users for Basic Auth, empty username and/or password is allowed.
89+
--user-base64 [<username>]:[<base64-password>] ...
90+
--user-md5 [<username>]:<md5-password> ...
91+
--user-sha1 [<username>]:<sha1-password> ...
92+
--user-sha256 [<username>]:<sha256-password> ...
93+
--user-sha512 [<username>]:<sha512-password> ...
94+
Specify users for Basic Auth, with encoded password.
8995
9096
-c|--cert <file>
9197
Specify TLS certificate file.

src/param/cli.go

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package param
33
import (
44
"../goNixArgParser"
55
"../serverErrHandler"
6-
"errors"
6+
"fmt"
77
"io/ioutil"
88
"os"
99
"strings"
@@ -63,6 +63,21 @@ func init() {
6363
err = options.AddFlagValues("users", "--user", "", nil, "user info: <username>:<password>")
6464
serverErrHandler.CheckFatal(err)
6565

66+
err = options.AddFlagValues("usersbase64", "--user-base64", "", nil, "user info: <username>:<base64-password>")
67+
serverErrHandler.CheckFatal(err)
68+
69+
err = options.AddFlagValues("usersmd5", "--user-md5", "", nil, "user info: <username>:<md5-password>")
70+
serverErrHandler.CheckFatal(err)
71+
72+
err = options.AddFlagValues("userssha1", "--user-sha1", "", nil, "user info: <username>:<sha1-password>")
73+
serverErrHandler.CheckFatal(err)
74+
75+
err = options.AddFlagValues("userssha256", "--user-sha256", "", nil, "user info: <username>:<sha256-password>")
76+
serverErrHandler.CheckFatal(err)
77+
78+
err = options.AddFlagValues("userssha512", "--user-sha512", "", nil, "user info: <username>:<sha512-password>")
79+
serverErrHandler.CheckFatal(err)
80+
6681
err = options.AddFlagsValue("key", []string{"-k", "--key"}, "GHFS_KEY", "", "TLS certificate key path")
6782
serverErrHandler.CheckFatal(err)
6883

@@ -221,23 +236,29 @@ func doParseCli() []*Param {
221236
param.AuthDirs = normalizeFsPaths(arrAuthDirs)
222237

223238
// normalize users
224-
param.Users = map[string]string{}
225-
arrUsers, _ := result.GetStrings("users")
226-
for _, userEntry := range arrUsers {
227-
username := userEntry
228-
password := ""
229-
230-
colonIndex := strings.IndexByte(userEntry, ':')
231-
if colonIndex >= 0 {
232-
username = userEntry[:colonIndex]
233-
password = userEntry[colonIndex+1:]
234-
}
235-
236-
if _, ok := param.Users[username]; ok {
237-
serverErrHandler.CheckError(errors.New("Duplicated username: " + username))
238-
} else {
239-
param.Users[username] = password
240-
}
239+
arrUsersPlain, _ := result.GetStrings("users")
240+
param.UsersPlain = getUsers(arrUsersPlain)
241+
arrUsersBase64, _ := result.GetStrings("usersbase64")
242+
param.UsersBase64 = getUsers(arrUsersBase64)
243+
arrUsersMd5, _ := result.GetStrings("usersmd5")
244+
param.UsersMd5 = getUsers(arrUsersMd5)
245+
arrUsersSha1, _ := result.GetStrings("userssha1")
246+
param.UsersSha1 = getUsers(arrUsersSha1)
247+
arrUsersSha256, _ := result.GetStrings("userssha256")
248+
param.UsersSha256 = getUsers(arrUsersSha256)
249+
arrUsersSha512, _ := result.GetStrings("userssha512")
250+
param.UsersSha512 = getUsers(arrUsersSha512)
251+
252+
dupUsers := getDupUserNames(
253+
param.UsersPlain,
254+
param.UsersBase64,
255+
param.UsersMd5,
256+
param.UsersSha1,
257+
param.UsersSha256,
258+
param.UsersSha512,
259+
)
260+
if len(dupUsers) > 0 {
261+
serverErrHandler.CheckFatal(fmt.Errorf("duplicated usernames: %q", dupUsers))
241262
}
242263

243264
// shows

src/param/main.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import (
99
"unicode/utf8"
1010
)
1111

12+
type user struct {
13+
Username string
14+
Password string
15+
}
16+
1217
type Param struct {
1318
Root string
1419
Aliases map[string]string
@@ -25,10 +30,15 @@ type Param struct {
2530
CorsUrls []string
2631
CorsDirs []string
2732

28-
GlobalAuth bool
29-
AuthUrls []string
30-
AuthDirs []string
31-
Users map[string]string
33+
GlobalAuth bool
34+
AuthUrls []string
35+
AuthDirs []string
36+
UsersPlain []*user
37+
UsersBase64 []*user
38+
UsersMd5 []*user
39+
UsersSha1 []*user
40+
UsersSha256 []*user
41+
UsersSha512 []*user
3242

3343
Key string
3444
Cert string

src/param/util.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package param
2+
3+
import "strings"
4+
5+
func getUsers(userEntries []string) []*user {
6+
users := make([]*user, 0, len(userEntries))
7+
for _, userEntry := range userEntries {
8+
username := userEntry
9+
password := ""
10+
11+
colonIndex := strings.IndexByte(userEntry, ':')
12+
if colonIndex >= 0 {
13+
username = userEntry[:colonIndex]
14+
password = userEntry[colonIndex+1:]
15+
}
16+
17+
users = append(users, &user{username, password})
18+
}
19+
return users
20+
}
21+
22+
func getDupUserNames(usersGroups ...[]*user) []string {
23+
userMap := map[string]bool{}
24+
dupUserMap := map[string]bool{}
25+
26+
for _, users := range usersGroups {
27+
for _, user := range users {
28+
if userMap[user.Username] {
29+
dupUserMap[user.Username] = true
30+
}
31+
userMap[user.Username] = true
32+
}
33+
}
34+
35+
dupUsers := make([]string, 0, len(dupUserMap))
36+
for username, _ := range dupUserMap {
37+
dupUsers = append(dupUsers, username)
38+
}
39+
return dupUsers
40+
}

src/serveMux/main.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,23 @@ func NewServeMux(
2222
errorHandler *serverErrHandler.ErrHandler,
2323
) *ServeMux {
2424
users := user.NewUsers()
25-
for username, password := range p.Users {
26-
users.Add(username, password)
25+
for _, u := range p.UsersPlain {
26+
users.AddPlain(u.Username, u.Password)
27+
}
28+
for _, u := range p.UsersBase64 {
29+
users.AddBase64(u.Username, u.Password)
30+
}
31+
for _, u := range p.UsersMd5 {
32+
users.AddMd5(u.Username, u.Password)
33+
}
34+
for _, u := range p.UsersSha1 {
35+
users.AddSha1(u.Username, u.Password)
36+
}
37+
for _, u := range p.UsersSha256 {
38+
users.AddSha256(u.Username, u.Password)
39+
}
40+
for _, u := range p.UsersSha512 {
41+
users.AddSha512(u.Username, u.Password)
2742
}
2843

2944
tplObj, err := tpl.LoadPage(p.Template)

src/user/main.go

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,68 @@ package user
22

33
import "errors"
44

5-
type user struct {
6-
username string
7-
password string
5+
type Users map[string]user
6+
7+
func (users Users) checkExist(username string) error {
8+
if _, exist := users[username]; exist {
9+
return errors.New("username already exist")
10+
}
11+
return nil
812
}
913

10-
func newUser(username, password string) *user {
11-
return &user{
12-
username,
13-
password,
14+
func (users Users) AddPlain(username, password string) (err error) {
15+
err = users.checkExist(username);
16+
if err == nil {
17+
users[username] = newPlainUser(password)
1418
}
19+
return
1520
}
1621

17-
type Users struct {
18-
pool map[string]*user
22+
func (users Users) AddBase64(username, password string) (err error) {
23+
err = users.checkExist(username);
24+
if err == nil {
25+
users[username] = newBase64User(password)
26+
}
27+
return
1928
}
2029

21-
func (users Users) Add(username, password string) error {
22-
if _, exist := users.pool[username]; exist {
23-
return errors.New("username already exist")
30+
func (users Users) AddMd5(username, password string) (err error) {
31+
err = users.checkExist(username);
32+
if err == nil {
33+
users[username] = newMd5User(password)
2434
}
35+
return
36+
}
2537

26-
users.pool[username] = newUser(username, password)
27-
return nil
38+
func (users Users) AddSha1(username, password string) (err error) {
39+
err = users.checkExist(username);
40+
if err == nil {
41+
users[username] = newSha1User(password)
42+
}
43+
return
44+
}
45+
46+
func (users Users) AddSha256(username, password string) (err error) {
47+
err = users.checkExist(username);
48+
if err == nil {
49+
users[username] = newSha256User(password)
50+
}
51+
return
52+
}
53+
54+
func (users Users) AddSha512(username, password string) (err error) {
55+
err = users.checkExist(username);
56+
if err == nil {
57+
users[username] = newSha512User(password)
58+
}
59+
return
2860
}
2961

3062
func (users Users) Auth(username, password string) bool {
31-
user, exist := users.pool[username]
32-
return exist && user.password == password
63+
user, exist := users[username]
64+
return exist && user.auth(password)
3365
}
3466

3567
func NewUsers() Users {
36-
return Users{
37-
pool: map[string]*user{},
38-
}
68+
return Users{}
3969
}

src/user/main_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package user
2+
3+
import (
4+
"testing"
5+
)
6+
7+
var users Users
8+
9+
func init() {
10+
users = NewUsers()
11+
}
12+
13+
func TestUserPlain(t *testing.T) {
14+
users.AddPlain("plain_user", "123")
15+
if !users.Auth("plain_user", "123") {
16+
t.Error()
17+
}
18+
if users.Auth("plain_user", "12") {
19+
t.Error()
20+
}
21+
}
22+
23+
func TestUserBase64(t *testing.T) {
24+
users.AddBase64("base64_user", "MjM0")
25+
if !users.Auth("base64_user", "234") {
26+
t.Error()
27+
}
28+
if users.Auth("base64_user", "23") {
29+
t.Error()
30+
}
31+
}
32+
33+
func TestUserMd5(t *testing.T) {
34+
users.AddMd5("md5_user", "d81f9c1be2e08964bf9f24b15f0e4900")
35+
if !users.Auth("md5_user", "345") {
36+
t.Error()
37+
}
38+
if users.Auth("md5_user", "34") {
39+
t.Error()
40+
}
41+
}
42+
43+
func TestUserSha1(t *testing.T) {
44+
users.AddSha1("sha1_user", "51eac6b471a284d3341d8c0c63d0f1a286262a18")
45+
if !users.Auth("sha1_user", "456") {
46+
t.Error()
47+
}
48+
if users.Auth("sha1_user", "45") {
49+
t.Error()
50+
}
51+
}
52+
53+
func TestUserSha256(t *testing.T) {
54+
users.AddSha256("sha256_user", "97a6d21df7c51e8289ac1a8c026aaac143e15aa1957f54f42e30d8f8a85c3a55")
55+
if !users.Auth("sha256_user", "567") {
56+
t.Error()
57+
}
58+
if users.Auth("sha256_user", "56") {
59+
t.Error()
60+
}
61+
}
62+
63+
func TestUserSha512(t *testing.T) {
64+
users.AddSha512("sha512_user", "c7d57e5c0b0792b154d573089792d80f5b64d2bc0cf4d7d1f551a9e4a4966e925d06b253cc9662c01df76623fdfecb812a2a0604119cb1ac37c47e8027e94cb5")
65+
if !users.Auth("sha512_user", "678") {
66+
t.Error()
67+
}
68+
if users.Auth("sha512_user", "67") {
69+
t.Error()
70+
}
71+
}

0 commit comments

Comments
 (0)