|
@@ -2175,7 +2175,7 @@ func TestLoginExternalAuthPwdAndPubKey(t *testing.T) {
|
|
|
err = config.LoadConfig(configDir, "")
|
|
|
assert.NoError(t, err)
|
|
|
providerConf := config.GetProviderConf()
|
|
|
- err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, ""), os.ModePerm)
|
|
|
+ err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, false, ""), os.ModePerm)
|
|
|
assert.NoError(t, err)
|
|
|
providerConf.ExternalAuthHook = extAuthPath
|
|
|
providerConf.ExternalAuthScope = 0
|
|
@@ -2202,7 +2202,7 @@ func TestLoginExternalAuthPwdAndPubKey(t *testing.T) {
|
|
|
usePubKey = false
|
|
|
u = getTestUser(usePubKey)
|
|
|
u.PublicKeys = []string{}
|
|
|
- err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, ""), os.ModePerm)
|
|
|
+ err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, false, ""), os.ModePerm)
|
|
|
assert.NoError(t, err)
|
|
|
client, err = getSftpClient(u, usePubKey)
|
|
|
if assert.NoError(t, err) {
|
|
@@ -2231,6 +2231,81 @@ func TestLoginExternalAuthPwdAndPubKey(t *testing.T) {
|
|
|
assert.NoError(t, err)
|
|
|
}
|
|
|
|
|
|
+func TestExternalAuthEmptyResponse(t *testing.T) {
|
|
|
+ if runtime.GOOS == osWindows {
|
|
|
+ t.Skip("this test is not available on Windows")
|
|
|
+ }
|
|
|
+ usePubKey := false
|
|
|
+ u := getTestUser(usePubKey)
|
|
|
+ u.QuotaFiles = 1000
|
|
|
+ err := dataprovider.Close()
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = config.LoadConfig(configDir, "")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ providerConf := config.GetProviderConf()
|
|
|
+ err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, false, ""), os.ModePerm)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ providerConf.ExternalAuthHook = extAuthPath
|
|
|
+ providerConf.ExternalAuthScope = 0
|
|
|
+ err = dataprovider.Initialize(providerConf, configDir, true)
|
|
|
+ assert.NoError(t, err)
|
|
|
+
|
|
|
+ testFileSize := int64(65535)
|
|
|
+ // the user will be created
|
|
|
+ client, err := getSftpClient(u, usePubKey)
|
|
|
+ if assert.NoError(t, err) {
|
|
|
+ defer client.Close()
|
|
|
+ testFilePath := filepath.Join(homeBasePath, testFileName)
|
|
|
+ err = createTestFile(testFilePath, testFileSize)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.Remove(testFilePath)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ user, _, err := httpdtest.GetUserByUsername(defaultUsername, http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, 0, len(user.PublicKeys))
|
|
|
+ assert.Equal(t, testFileSize, user.UsedQuotaSize)
|
|
|
+ assert.Equal(t, 1, user.UsedQuotaFiles)
|
|
|
+ // now modify the user
|
|
|
+ user.MaxSessions = 10
|
|
|
+ user.QuotaFiles = 100
|
|
|
+ user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "")
|
|
|
+ assert.NoError(t, err)
|
|
|
+
|
|
|
+ err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, true, ""), os.ModePerm)
|
|
|
+ assert.NoError(t, err)
|
|
|
+
|
|
|
+ client, err = getSftpClient(u, usePubKey)
|
|
|
+ if assert.NoError(t, err) {
|
|
|
+ defer client.Close()
|
|
|
+ err = checkBasicSFTP(client)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ user, _, err = httpdtest.GetUserByUsername(defaultUsername, http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, 10, user.MaxSessions)
|
|
|
+ assert.Equal(t, 100, user.QuotaFiles)
|
|
|
+
|
|
|
+ _, err = httpdtest.RemoveUser(user, http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.RemoveAll(user.GetHomeDir())
|
|
|
+ assert.NoError(t, err)
|
|
|
+
|
|
|
+ err = dataprovider.Close()
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = config.LoadConfig(configDir, "")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ providerConf = config.GetProviderConf()
|
|
|
+ err = dataprovider.Initialize(providerConf, configDir, true)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.Remove(extAuthPath)
|
|
|
+ assert.NoError(t, err)
|
|
|
+}
|
|
|
+
|
|
|
func TestExternalAuthDifferentUsername(t *testing.T) {
|
|
|
if runtime.GOOS == osWindows {
|
|
|
t.Skip("this test is not available on Windows")
|
|
@@ -2244,7 +2319,7 @@ func TestExternalAuthDifferentUsername(t *testing.T) {
|
|
|
err = config.LoadConfig(configDir, "")
|
|
|
assert.NoError(t, err)
|
|
|
providerConf := config.GetProviderConf()
|
|
|
- err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, extAuthUsername), os.ModePerm)
|
|
|
+ err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, false, extAuthUsername), os.ModePerm)
|
|
|
assert.NoError(t, err)
|
|
|
providerConf.ExternalAuthHook = extAuthPath
|
|
|
providerConf.ExternalAuthScope = 0
|
|
@@ -2327,7 +2402,7 @@ func TestLoginExternalAuth(t *testing.T) {
|
|
|
err = config.LoadConfig(configDir, "")
|
|
|
assert.NoError(t, err)
|
|
|
providerConf := config.GetProviderConf()
|
|
|
- err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, ""), os.ModePerm)
|
|
|
+ err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, false, ""), os.ModePerm)
|
|
|
assert.NoError(t, err)
|
|
|
providerConf.ExternalAuthHook = extAuthPath
|
|
|
providerConf.ExternalAuthScope = authScope
|
|
@@ -2389,7 +2464,7 @@ func TestLoginExternalAuthInteractive(t *testing.T) {
|
|
|
err = config.LoadConfig(configDir, "")
|
|
|
assert.NoError(t, err)
|
|
|
providerConf := config.GetProviderConf()
|
|
|
- err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, ""), os.ModePerm)
|
|
|
+ err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, false, false, ""), os.ModePerm)
|
|
|
assert.NoError(t, err)
|
|
|
providerConf.ExternalAuthHook = extAuthPath
|
|
|
providerConf.ExternalAuthScope = 4
|
|
@@ -2443,7 +2518,7 @@ func TestLoginExternalAuthErrors(t *testing.T) {
|
|
|
err = config.LoadConfig(configDir, "")
|
|
|
assert.NoError(t, err)
|
|
|
providerConf := config.GetProviderConf()
|
|
|
- err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, true, ""), os.ModePerm)
|
|
|
+ err = os.WriteFile(extAuthPath, getExtAuthScriptContent(u, true, false, ""), os.ModePerm)
|
|
|
assert.NoError(t, err)
|
|
|
providerConf.ExternalAuthHook = extAuthPath
|
|
|
providerConf.ExternalAuthScope = 0
|
|
@@ -8978,8 +9053,11 @@ func getKeyboardInteractiveScriptContent(questions []string, sleepTime int, nonJ
|
|
|
return content
|
|
|
}
|
|
|
|
|
|
-func getExtAuthScriptContent(user dataprovider.User, nonJSONResponse bool, username string) []byte {
|
|
|
+func getExtAuthScriptContent(user dataprovider.User, nonJSONResponse, emptyResponse bool, username string) []byte {
|
|
|
extAuthContent := []byte("#!/bin/sh\n\n")
|
|
|
+ if emptyResponse {
|
|
|
+ return extAuthContent
|
|
|
+ }
|
|
|
extAuthContent = append(extAuthContent, []byte(fmt.Sprintf("if test \"$SFTPGO_AUTHD_USERNAME\" = \"%v\"; then\n", user.Username))...)
|
|
|
if len(username) > 0 {
|
|
|
user.Username = username
|