mirror of https://gogs.blitter.com/RLabs/xs
				
				
				
			auth.go: added new unit tests
Signed-off-by: Russ Magee <rmagee@gmail.com>
This commit is contained in:
		
							parent
							
								
									f4cc9ab0b6
								
							
						
					
					
						commit
						de936ad7d4
					
				
							
								
								
									
										6
									
								
								auth.go
								
								
								
								
							
							
						
						
									
										6
									
								
								auth.go
								
								
								
								
							| 
						 | 
					@ -31,9 +31,9 @@ type AuthCtx struct {
 | 
				
			||||||
	userlookup func(string) (*user.User, error) // eg. os/user.Lookup()
 | 
						userlookup func(string) (*user.User, error) // eg. os/user.Lookup()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewAuthCtx(/*reader func(string) ([]byte, error), userlookup func(string) (*user.User, error)*/) (ret *AuthCtx) {
 | 
					func NewAuthCtx( /*reader func(string) ([]byte, error), userlookup func(string) (*user.User, error)*/ ) (ret *AuthCtx) {
 | 
				
			||||||
		ret = &AuthCtx{ioutil.ReadFile, user.Lookup}
 | 
						ret = &AuthCtx{ioutil.ReadFile, user.Lookup}
 | 
				
			||||||
		return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// --------- System passwd/shadow auth routine(s) --------------
 | 
					// --------- System passwd/shadow auth routine(s) --------------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										68
									
								
								auth_test.go
								
								
								
								
							
							
						
						
									
										68
									
								
								auth_test.go
								
								
								
								
							| 
						 | 
					@ -21,19 +21,29 @@ disableduser:!:18310::::::`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dummyAuthTokenFile = "hostA:abcdefg\nhostB:wxyz\n"
 | 
						dummyAuthTokenFile = "hostA:abcdefg\nhostB:wxyz\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dummyXsPasswdFile = `#username:salt:authCookie
 | 
				
			||||||
 | 
					bobdobbs:$2a$12$9vqGkFqikspe/2dTARqu1O:$2a$12$9vqGkFqikspe/2dTARqu1OuDKCQ/RYWsnaFjmi.HtmECRkxcZ.kBK
 | 
				
			||||||
 | 
					notbob:$2a$12$cZpiYaq5U998cOkXzRKdyu:$2a$12$cZpiYaq5U998cOkXzRKdyuJ2FoEQyVLa3QkYdPQk74VXMoAzhvuP6
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	testGoodUsers = []userVerifs{
 | 
						testGoodUsers = []userVerifs{
 | 
				
			||||||
		{"johndoe", "testpass", true},
 | 
							{"johndoe", "testpass", true},
 | 
				
			||||||
		{"joebloggs", "testpass2", true},
 | 
							{"joebloggs", "testpass2", true},
 | 
				
			||||||
		{"johndoe", "badpass", false},
 | 
							{"johndoe", "badpass", false},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						testXsPasswdUsers = []userVerifs{
 | 
				
			||||||
 | 
							{"bobdobbs", "praisebob", true},
 | 
				
			||||||
 | 
							{"notbob", "imposter", false},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	userlookup_arg_u string
 | 
						userlookup_arg_u string
 | 
				
			||||||
	readfile_arg_f   string
 | 
						readfile_arg_f   string
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newMockAuthCtx(reader func(string) ([]byte, error), userlookup func(string) (*user.User, error)) (ret *AuthCtx) {
 | 
					func newMockAuthCtx(reader func(string) ([]byte, error), userlookup func(string) (*user.User, error)) (ret *AuthCtx) {
 | 
				
			||||||
		ret = &AuthCtx{reader, userlookup}
 | 
						ret = &AuthCtx{reader, userlookup}
 | 
				
			||||||
		return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _mock_user_Lookup(username string) (*user.User, error) {
 | 
					func _mock_user_Lookup(username string) (*user.User, error) {
 | 
				
			||||||
| 
						 | 
					@ -52,6 +62,10 @@ func _mock_ioutil_ReadFile(f string) ([]byte, error) {
 | 
				
			||||||
		fmt.Println("  [mocking ReadFile(\"/etc/shadow\")]")
 | 
							fmt.Println("  [mocking ReadFile(\"/etc/shadow\")]")
 | 
				
			||||||
		return []byte(dummyShadowA), nil
 | 
							return []byte(dummyShadowA), nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if f == "/etc/xs.passwd" {
 | 
				
			||||||
 | 
							fmt.Println("  [mocking ReadFile(\"/etc/xs.passwd\")]")
 | 
				
			||||||
 | 
							return []byte(dummyXsPasswdFile), nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if strings.Contains(f, "/.xs_id") {
 | 
						if strings.Contains(f, "/.xs_id") {
 | 
				
			||||||
		fmt.Println("  [mocking ReadFile(\".xs_id\")]")
 | 
							fmt.Println("  [mocking ReadFile(\".xs_id\")]")
 | 
				
			||||||
		return []byte(dummyAuthTokenFile), nil
 | 
							return []byte(dummyAuthTokenFile), nil
 | 
				
			||||||
| 
						 | 
					@ -146,3 +160,53 @@ func TestAuthUserByTokenSucceedsWithMatchedUserAndToken(t *testing.T) {
 | 
				
			||||||
		t.Fatal("failed with valid user and token")
 | 
							t.Fatal("failed with valid user and token")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAuthUserByPasswdFailsOnEmptyFile(t *testing.T) {
 | 
				
			||||||
 | 
						ctx := newMockAuthCtx(_mock_ioutil_ReadFileEmpty, _mock_user_Lookup)
 | 
				
			||||||
 | 
						userlookup_arg_u = "bobdobbs"
 | 
				
			||||||
 | 
						readfile_arg_f = "/etc/xs.passwd"
 | 
				
			||||||
 | 
						stat, _ := AuthUserByPasswd(ctx, userlookup_arg_u, "praisebob", readfile_arg_f)
 | 
				
			||||||
 | 
						if stat {
 | 
				
			||||||
 | 
							t.Fatal("failed to fail with missing xs.passwd file")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAuthUserByPasswdFailsOnBadAuth(t *testing.T) {
 | 
				
			||||||
 | 
						ctx := newMockAuthCtx(_mock_ioutil_ReadFile, _mock_user_Lookup)
 | 
				
			||||||
 | 
						userlookup_arg_u = "bobdobbs"
 | 
				
			||||||
 | 
						readfile_arg_f = "/etc/xs.passwd"
 | 
				
			||||||
 | 
						stat, _ := AuthUserByPasswd(ctx, userlookup_arg_u, "wrongpass", readfile_arg_f)
 | 
				
			||||||
 | 
						if stat {
 | 
				
			||||||
 | 
							t.Fatal("failed to fail with valid user, incorrect passwd in xs.passwd file")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAuthUserByPasswdFailsOnBadUser(t *testing.T) {
 | 
				
			||||||
 | 
						ctx := newMockAuthCtx(_mock_ioutil_ReadFile, _mock_user_Lookup)
 | 
				
			||||||
 | 
						userlookup_arg_u = "bobdobbs"
 | 
				
			||||||
 | 
						readfile_arg_f = "/etc/xs.passwd"
 | 
				
			||||||
 | 
						stat, _ := AuthUserByPasswd(ctx, userlookup_arg_u, "theotherbob", readfile_arg_f)
 | 
				
			||||||
 | 
						if stat {
 | 
				
			||||||
 | 
							t.Fatal("failed to fail on invalid user vs. xs.passwd file")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAuthUserByPasswdPassesOnGoodAuth(t *testing.T) {
 | 
				
			||||||
 | 
						ctx := newMockAuthCtx(_mock_ioutil_ReadFile, _mock_user_Lookup)
 | 
				
			||||||
 | 
						userlookup_arg_u = "bobdobbs"
 | 
				
			||||||
 | 
						readfile_arg_f = "/etc/xs.passwd"
 | 
				
			||||||
 | 
						stat, _ := AuthUserByPasswd(ctx, userlookup_arg_u, "praisebob", readfile_arg_f)
 | 
				
			||||||
 | 
						if !stat {
 | 
				
			||||||
 | 
							t.Fatal("failed on valid user w/correct passwd in xs.passwd file")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAuthUserByPasswdPassesOnOtherGoodAuth(t *testing.T) {
 | 
				
			||||||
 | 
						ctx := newMockAuthCtx(_mock_ioutil_ReadFile, _mock_user_Lookup)
 | 
				
			||||||
 | 
						userlookup_arg_u = "notbob"
 | 
				
			||||||
 | 
						readfile_arg_f = "/etc/xs.passwd"
 | 
				
			||||||
 | 
						stat, _ := AuthUserByPasswd(ctx, userlookup_arg_u, "imposter", readfile_arg_f)
 | 
				
			||||||
 | 
						if !stat {
 | 
				
			||||||
 | 
							t.Fatal("failed on valid user 2nd entry w/correct passwd in xs.passwd file")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue