github.com/wostzone/hub/auth@v0.0.0-20220118060317-7bb375743b17/pkg/authenticate/Authenticator_test.go (about)

     1  package authenticate_test
     2  
     3  import (
     4  	"os"
     5  	"path"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/sirupsen/logrus"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/wostzone/hub/auth/pkg/authenticate"
    12  	"github.com/wostzone/hub/auth/pkg/unpwstore"
    13  	"github.com/wostzone/hub/lib/client/pkg/config"
    14  )
    15  
    16  const unpwFileName = "test.passwd"
    17  
    18  var unpwFilePath string
    19  
    20  // TestMain for all auth tests, setup of default folders and filenames
    21  func TestMain(m *testing.M) {
    22  	config.SetLogging("info", "")
    23  	cwd, _ := os.Getwd()
    24  	homeFolder := path.Join(cwd, "../../test")
    25  	configFolder := path.Join(homeFolder, "config")
    26  
    27  	// Make sure password file exist
    28  	unpwFilePath = path.Join(configFolder, unpwFileName)
    29  	fp, _ := os.Create(unpwFilePath)
    30  	fp.Close()
    31  	// creating these files takes a bit of time,
    32  	time.Sleep(time.Second)
    33  
    34  	res := m.Run()
    35  	os.Exit(res)
    36  }
    37  
    38  // Create auth handler with empty username/pw
    39  func createEmptyTestAuthenticator() *authenticate.Authenticator {
    40  	fp, _ := os.Create(unpwFilePath)
    41  	fp.Close()
    42  	unpwStore := unpwstore.NewPasswordFileStore(unpwFilePath, "createEmptyTestAuthHandler")
    43  	ah := authenticate.NewAuthenticator(unpwStore)
    44  	return ah
    45  }
    46  
    47  func TestAuthenticatorStartStop(t *testing.T) {
    48  	logrus.Infof("---TestAuthenticatorStartStop---")
    49  	ah := createEmptyTestAuthenticator()
    50  	err := ah.Start()
    51  	time.Sleep(time.Second * 1)
    52  	assert.NoError(t, err)
    53  	ah.Stop()
    54  }
    55  
    56  func TestAuthHandlerBadStart(t *testing.T) {
    57  	logrus.Infof("---TestAuthHandlerBadStart---")
    58  	unpwStore := unpwstore.NewPasswordFileStore("/bad/file", "TestAuthHandlerBadStart")
    59  	ah := authenticate.NewAuthenticator(unpwStore)
    60  
    61  	// opening the password store should fail
    62  	err := ah.Start()
    63  	assert.Error(t, err)
    64  	ah.Stop()
    65  
    66  	//
    67  	ah = authenticate.NewAuthenticator(nil)
    68  	err = ah.Start()
    69  	assert.Error(t, err)
    70  
    71  	// should not blow up without password store
    72  	match := ah.VerifyUsernamePassword("user1", "user1")
    73  	assert.False(t, match)
    74  
    75  }
    76  
    77  func TestUnpwMatch(t *testing.T) {
    78  	logrus.Infof("---TestUnpwMatch---")
    79  	userName1 := "user1" // as in test file
    80  	userName2 := "user2" // as in test file
    81  	password1 := "password1"
    82  	password2 := "password2"
    83  
    84  	ah := createEmptyTestAuthenticator()
    85  	ah.Start()
    86  	err := ah.SetPassword(userName1, password1)
    87  	assert.NoError(t, err)
    88  
    89  	err = ah.SetPassword(userName2, password2)
    90  	assert.NoError(t, err)
    91  
    92  	err = ah.SetPassword(userName2, "")
    93  	assert.Error(t, err)
    94  
    95  	err = ah.SetPassword("", password2)
    96  	assert.Error(t, err)
    97  
    98  	match := ah.VerifyUsernamePassword(userName1, password1)
    99  	assert.True(t, match)
   100  
   101  	match = ah.VerifyUsernamePassword(userName1, password2)
   102  	assert.False(t, match)
   103  
   104  	match = ah.VerifyUsernamePassword("notauser", password1)
   105  	assert.False(t, match)
   106  
   107  	ah.Stop()
   108  }
   109  
   110  func TestBadHashAlgo(t *testing.T) {
   111  	logrus.Infof("---TestBadHashAlgo---")
   112  	password1 := "password1"
   113  	_, err := authenticate.CreatePasswordHash(password1, "Badalgo", 0)
   114  	assert.Error(t, err)
   115  	_, err = authenticate.CreatePasswordHash("", "", 0)
   116  	assert.Error(t, err)
   117  
   118  	hash, err := authenticate.CreatePasswordHash("user1", authenticate.PWHASH_ARGON2id, 0)
   119  	assert.NoError(t, err)
   120  	ah := createEmptyTestAuthenticator()
   121  	match := ah.VerifyPasswordHash(hash, "password1", "badalgo")
   122  	assert.False(t, match)
   123  }
   124  
   125  func TestBCrypt(t *testing.T) {
   126  	logrus.Infof("---TestBCrypt---")
   127  	var password1 = "password1"
   128  	ah := createEmptyTestAuthenticator()
   129  	err := ah.Start()
   130  	assert.NoError(t, err)
   131  	hash, err := authenticate.CreatePasswordHash(password1, authenticate.PWHASH_BCRYPT, 0)
   132  	assert.NoError(t, err)
   133  	match := ah.VerifyPasswordHash(hash, password1, authenticate.PWHASH_BCRYPT)
   134  	assert.True(t, match)
   135  	ah.Stop()
   136  }