mirror of
				https://github.com/steveiliop56/tinyauth.git
				synced 2025-11-04 08:05:42 +00:00 
			
		
		
		
	Compare commits
	
		
			8 Commits
		
	
	
		
			v3.6.1-bet
			...
			v3.6.2-bet
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					2233557990 | ||
| 
						 | 
					d3bec635f8 | ||
| 
						 | 
					6519644fc1 | ||
| 
						 | 
					736f65b7b2 | ||
| 
						 | 
					63d39b5500 | ||
| 
						 | 
					b735ab6f39 | ||
| 
						 | 
					232c50eaef | ||
| 
						 | 
					52b12abeb2 | 
							
								
								
									
										8
									
								
								codeconv.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								codeconv.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					coverage:
 | 
				
			||||||
 | 
					  status:
 | 
				
			||||||
 | 
					    project:
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        informational: true
 | 
				
			||||||
 | 
					    patch:
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        informational: true
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "نسيت كلمة المرور؟",
 | 
					    "forgotPasswordTitle": "نسيت كلمة المرور؟",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "حدث خطأ",
 | 
					    "errorTitle": "حدث خطأ",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Glemt din adgangskode?",
 | 
					    "forgotPasswordTitle": "Glemt din adgangskode?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Kunne ikke indlæse godkendelsesudbydere. Tjek venligst din konfiguration.",
 | 
					    "failedToFetchProvidersTitle": "Kunne ikke indlæse godkendelsesudbydere. Tjek venligst din konfiguration.",
 | 
				
			||||||
    "errorTitle": "Der opstod en fejl",
 | 
					    "errorTitle": "Der opstod en fejl",
 | 
				
			||||||
    "errorSubtitle": "Der opstod en fejl under forsøget på at udføre denne handling. Tjek venligst konsollen for mere information."
 | 
					    "errorSubtitle": "Der opstod en fejl under forsøget på at udføre denne handling. Tjek venligst konsollen for mere information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Passwort vergessen?",
 | 
					    "forgotPasswordTitle": "Passwort vergessen?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Fehler beim Laden der Authentifizierungsanbieter. Bitte überprüfen Sie Ihre Konfiguration.",
 | 
					    "failedToFetchProvidersTitle": "Fehler beim Laden der Authentifizierungsanbieter. Bitte überprüfen Sie Ihre Konfiguration.",
 | 
				
			||||||
    "errorTitle": "Ein Fehler ist aufgetreten",
 | 
					    "errorTitle": "Ein Fehler ist aufgetreten",
 | 
				
			||||||
    "errorSubtitle": "Beim Versuch, diese Aktion auszuführen, ist ein Fehler aufgetreten. Bitte überprüfen Sie die Konsole für weitere Informationen."
 | 
					    "errorSubtitle": "Beim Versuch, diese Aktion auszuführen, ist ein Fehler aufgetreten. Bitte überprüfen Sie die Konsole für weitere Informationen.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Ξεχάσατε το συνθηματικό σας;",
 | 
					    "forgotPasswordTitle": "Ξεχάσατε το συνθηματικό σας;",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Αποτυχία φόρτωσης παρόχων πιστοποίησης. Παρακαλώ ελέγξτε τις ρυθμίσεις σας.",
 | 
					    "failedToFetchProvidersTitle": "Αποτυχία φόρτωσης παρόχων πιστοποίησης. Παρακαλώ ελέγξτε τις ρυθμίσεις σας.",
 | 
				
			||||||
    "errorTitle": "Παρουσιάστηκε ένα σφάλμα",
 | 
					    "errorTitle": "Παρουσιάστηκε ένα σφάλμα",
 | 
				
			||||||
    "errorSubtitle": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια εκτέλεσης αυτής της ενέργειας. Ελέγξτε την κονσόλα για περισσότερες πληροφορίες."
 | 
					    "errorSubtitle": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια εκτέλεσης αυτής της ενέργειας. Ελέγξτε την κονσόλα για περισσότερες πληροφορίες.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "Μπορείτε να επαναφέρετε τον κωδικό πρόσβασής σας αλλάζοντας τη μεταβλητή περιβάλλοντος `USERS`."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "¿Olvidó su contraseña?",
 | 
					    "forgotPasswordTitle": "¿Olvidó su contraseña?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Error al cargar los proveedores de autenticación. Por favor revise su configuración.",
 | 
					    "failedToFetchProvidersTitle": "Error al cargar los proveedores de autenticación. Por favor revise su configuración.",
 | 
				
			||||||
    "errorTitle": "Ha ocurrido un error",
 | 
					    "errorTitle": "Ha ocurrido un error",
 | 
				
			||||||
    "errorSubtitle": "Ocurrió un error mientras se trataba de realizar esta acción. Por favor, revise la consola para más información."
 | 
					    "errorSubtitle": "Ocurrió un error mientras se trataba de realizar esta acción. Por favor, revise la consola para más información.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,15 +1,15 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "loginTitle": "Bienvenue, connectez-vous avec",
 | 
					    "loginTitle": "Bienvenue, connectez-vous avec",
 | 
				
			||||||
    "loginTitleSimple": "Welcome back, please login",
 | 
					    "loginTitleSimple": "De retour parmi nous, veuillez vous connecter",
 | 
				
			||||||
    "loginDivider": "Or",
 | 
					    "loginDivider": "Ou",
 | 
				
			||||||
    "loginUsername": "Nom d'utilisateur",
 | 
					    "loginUsername": "Nom d'utilisateur",
 | 
				
			||||||
    "loginPassword": "Mot de passe",
 | 
					    "loginPassword": "Mot de passe",
 | 
				
			||||||
    "loginSubmit": "Se connecter",
 | 
					    "loginSubmit": "Se connecter",
 | 
				
			||||||
    "loginFailTitle": "Échec de la connexion",
 | 
					    "loginFailTitle": "Échec de la connexion",
 | 
				
			||||||
    "loginFailSubtitle": "Veuillez vérifier votre nom d'utilisateur et votre mot de passe",
 | 
					    "loginFailSubtitle": "Veuillez vérifier votre nom d'utilisateur et votre mot de passe",
 | 
				
			||||||
    "loginFailRateLimit": "You failed to login too many times. Please try again later",
 | 
					    "loginFailRateLimit": "Vous avez échoué trop de fois à vous connecter. Veuillez réessayer ultérieurement",
 | 
				
			||||||
    "loginSuccessTitle": "Connecté",
 | 
					    "loginSuccessTitle": "Connecté",
 | 
				
			||||||
    "loginSuccessSubtitle": "Bienvenue!",
 | 
					    "loginSuccessSubtitle": "Bienvenue !",
 | 
				
			||||||
    "loginOauthFailTitle": "Une erreur s'est produite",
 | 
					    "loginOauthFailTitle": "Une erreur s'est produite",
 | 
				
			||||||
    "loginOauthFailSubtitle": "Impossible d'obtenir l'URL OAuth",
 | 
					    "loginOauthFailSubtitle": "Impossible d'obtenir l'URL OAuth",
 | 
				
			||||||
    "loginOauthSuccessTitle": "Redirection",
 | 
					    "loginOauthSuccessTitle": "Redirection",
 | 
				
			||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
    "continueInvalidRedirectTitle": "Redirection invalide",
 | 
					    "continueInvalidRedirectTitle": "Redirection invalide",
 | 
				
			||||||
    "continueInvalidRedirectSubtitle": "L'URL de redirection est invalide",
 | 
					    "continueInvalidRedirectSubtitle": "L'URL de redirection est invalide",
 | 
				
			||||||
    "continueInsecureRedirectTitle": "Redirection non sécurisée",
 | 
					    "continueInsecureRedirectTitle": "Redirection non sécurisée",
 | 
				
			||||||
    "continueInsecureRedirectSubtitle": "You are trying to redirect from <code>https</code> to <code>http</code> which is not secure. Are you sure you want to continue?",
 | 
					    "continueInsecureRedirectSubtitle": "Vous tentez de rediriger de <code>https</code> vers <code>http</code>, ce qui n'est pas sécurisé. Êtes-vous sûr de vouloir continuer ?",
 | 
				
			||||||
    "continueTitle": "Continuer",
 | 
					    "continueTitle": "Continuer",
 | 
				
			||||||
    "continueSubtitle": "Cliquez sur le bouton pour continuer vers votre application.",
 | 
					    "continueSubtitle": "Cliquez sur le bouton pour continuer vers votre application.",
 | 
				
			||||||
    "logoutFailTitle": "Échec de la déconnexion",
 | 
					    "logoutFailTitle": "Échec de la déconnexion",
 | 
				
			||||||
@@ -27,8 +27,8 @@
 | 
				
			|||||||
    "logoutSuccessTitle": "Déconnecté",
 | 
					    "logoutSuccessTitle": "Déconnecté",
 | 
				
			||||||
    "logoutSuccessSubtitle": "Vous avez été déconnecté",
 | 
					    "logoutSuccessSubtitle": "Vous avez été déconnecté",
 | 
				
			||||||
    "logoutTitle": "Déconnexion",
 | 
					    "logoutTitle": "Déconnexion",
 | 
				
			||||||
    "logoutUsernameSubtitle": "You are currently logged in as <code>{{username}}</code>. Click the button below to logout.",
 | 
					    "logoutUsernameSubtitle": "Vous êtes actuellement connecté en tant que <code>{{username}}</code>. Cliquez sur le bouton ci-dessous pour vous déconnecter.",
 | 
				
			||||||
    "logoutOauthSubtitle": "You are currently logged in as <code>{{username}}</code> using the {{provider}} OAuth provider. Click the button below to logout.",
 | 
					    "logoutOauthSubtitle": "Vous êtes actuellement connecté en tant que <code>{{username}}</code> via le fournisseur OAuth {{provider}}. Cliquez sur le bouton ci-dessous pour vous déconnecter.",
 | 
				
			||||||
    "notFoundTitle": "Page introuvable",
 | 
					    "notFoundTitle": "Page introuvable",
 | 
				
			||||||
    "notFoundSubtitle": "La page recherchée n'existe pas.",
 | 
					    "notFoundSubtitle": "La page recherchée n'existe pas.",
 | 
				
			||||||
    "notFoundButton": "Retour à la page d'accueil",
 | 
					    "notFoundButton": "Retour à la page d'accueil",
 | 
				
			||||||
@@ -37,18 +37,19 @@
 | 
				
			|||||||
    "totpSuccessTitle": "Vérifié",
 | 
					    "totpSuccessTitle": "Vérifié",
 | 
				
			||||||
    "totpSuccessSubtitle": "Redirection vers votre application",
 | 
					    "totpSuccessSubtitle": "Redirection vers votre application",
 | 
				
			||||||
    "totpTitle": "Saisissez votre code TOTP",
 | 
					    "totpTitle": "Saisissez votre code TOTP",
 | 
				
			||||||
    "totpSubtitle": "Please enter the code from your authenticator app.",
 | 
					    "totpSubtitle": "Veuillez saisir le code de votre application d'authentification.",
 | 
				
			||||||
    "unauthorizedTitle": "Non autorisé",
 | 
					    "unauthorizedTitle": "Unauthorized",
 | 
				
			||||||
    "unauthorizedResourceSubtitle": "The user with username <code>{{username}}</code> is not authorized to access the resource <code>{{resource}}</code>.",
 | 
					    "unauthorizedResourceSubtitle": "L'utilisateur avec le nom d'utilisateur <code>{{username}}</code> n'est pas autorisé à accéder à la ressource <code>{{resource}}</code>.",
 | 
				
			||||||
    "unauthorizedLoginSubtitle": "The user with username <code>{{username}}</code> is not authorized to login.",
 | 
					    "unauthorizedLoginSubtitle": "L'utilisateur avec le nom d'utilisateur <code>{{username}}</code> n'est pas autorisé à se connecter.",
 | 
				
			||||||
    "unauthorizedGroupsSubtitle": "The user with username <code>{{username}}</code> is not in the groups required by the resource <code>{{resource}}</code>.",
 | 
					    "unauthorizedGroupsSubtitle": "L'utilisateur avec le nom d'utilisateur <code>{{username}}</code> n'appartient pas aux groupes requis par la ressource <code>{{resource}}</code>.",
 | 
				
			||||||
    "unauthorizedIpSubtitle": "Your IP address <code>{{ip}}</code> is not authorized to access the resource <code>{{resource}}</code>.",
 | 
					    "unauthorizedIpSubtitle": "Votre adresse IP <code>{{ip}}</code> n'est pas autorisée à accéder à la ressource <code>{{resource}}</code>.",
 | 
				
			||||||
    "unauthorizedButton": "Réessayer",
 | 
					    "unauthorizedButton": "Réessayer",
 | 
				
			||||||
    "untrustedRedirectTitle": "Untrusted redirect",
 | 
					    "untrustedRedirectTitle": "Redirection non fiable",
 | 
				
			||||||
    "untrustedRedirectSubtitle": "You are trying to redirect to a domain that does not match your configured domain (<code>{{domain}}</code>). Are you sure you want to continue?",
 | 
					    "untrustedRedirectSubtitle": "Vous tentez de rediriger vers un domaine qui ne correspond pas à votre domaine configuré (<code>{{domain}}</code>). Êtes-vous sûr de vouloir continuer ?",
 | 
				
			||||||
    "cancelTitle": "Cancel",
 | 
					    "cancelTitle": "Annuler",
 | 
				
			||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Mot de passe oublié ?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Échec du chargement des fournisseurs d'authentification. Veuillez vérifier votre configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "Une erreur est survenue",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "Une erreur est survenue lors de l'exécution de cette action. Veuillez consulter la console pour plus d'informations.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "Vous pouvez réinitialiser votre mot de passe en modifiant la variable d'environnement `USERS`."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -26,7 +26,7 @@
 | 
				
			|||||||
    "logoutFailSubtitle": "Spróbuj ponownie",
 | 
					    "logoutFailSubtitle": "Spróbuj ponownie",
 | 
				
			||||||
    "logoutSuccessTitle": "Wylogowano",
 | 
					    "logoutSuccessTitle": "Wylogowano",
 | 
				
			||||||
    "logoutSuccessSubtitle": "Zostałeś wylogowany",
 | 
					    "logoutSuccessSubtitle": "Zostałeś wylogowany",
 | 
				
			||||||
    "logoutTitle": "Wylogowanie",
 | 
					    "logoutTitle": "Wyloguj się",
 | 
				
			||||||
    "logoutUsernameSubtitle": "Jesteś obecnie zalogowany jako <code>{{username}}</code>. Kliknij poniższy przycisk, aby się wylogować.",
 | 
					    "logoutUsernameSubtitle": "Jesteś obecnie zalogowany jako <code>{{username}}</code>. Kliknij poniższy przycisk, aby się wylogować.",
 | 
				
			||||||
    "logoutOauthSubtitle": "Obecnie jesteś zalogowany jako <code>{{username}}</code> przy użyciu dostawcy {{provider}} OAuth. Kliknij poniższy przycisk, aby się wylogować.",
 | 
					    "logoutOauthSubtitle": "Obecnie jesteś zalogowany jako <code>{{username}}</code> przy użyciu dostawcy {{provider}} OAuth. Kliknij poniższy przycisk, aby się wylogować.",
 | 
				
			||||||
    "notFoundTitle": "Nie znaleziono strony",
 | 
					    "notFoundTitle": "Nie znaleziono strony",
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Nie pamiętasz hasła?",
 | 
					    "forgotPasswordTitle": "Nie pamiętasz hasła?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Nie udało się załadować dostawców uwierzytelniania. Sprawdź swoją konfigurację.",
 | 
					    "failedToFetchProvidersTitle": "Nie udało się załadować dostawców uwierzytelniania. Sprawdź swoją konfigurację.",
 | 
				
			||||||
    "errorTitle": "Wystąpił błąd",
 | 
					    "errorTitle": "Wystąpił błąd",
 | 
				
			||||||
    "errorSubtitle": "Wystąpił błąd podczas próby wykonania tej czynności. Sprawdź konsolę, aby uzyskać więcej informacji."
 | 
					    "errorSubtitle": "Wystąpił błąd podczas próby wykonania tej czynności. Sprawdź konsolę, aby uzyskać więcej informacji.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "Możesz zresetować hasło, zmieniając zmienną środowiskową `USERS`."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Esqueceu sua senha?",
 | 
					    "forgotPasswordTitle": "Esqueceu sua senha?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Забыли пароль?",
 | 
					    "forgotPasswordTitle": "Забыли пароль?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Не удалось загрузить провайдеров аутентификации. Пожалуйста, проверьте конфигурацию.",
 | 
					    "failedToFetchProvidersTitle": "Не удалось загрузить провайдеров аутентификации. Пожалуйста, проверьте конфигурацию.",
 | 
				
			||||||
    "errorTitle": "Произошла ошибка",
 | 
					    "errorTitle": "Произошла ошибка",
 | 
				
			||||||
    "errorSubtitle": "Произошла ошибка при попытке выполнить это действие. Проверьте консоль для дополнительной информации."
 | 
					    "errorSubtitle": "Произошла ошибка при попытке выполнить это действие. Проверьте консоль для дополнительной информации.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "Forgot your password?",
 | 
					    "forgotPasswordTitle": "Forgot your password?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
					    "failedToFetchProvidersTitle": "Failed to load authentication providers. Please check your configuration.",
 | 
				
			||||||
    "errorTitle": "An error occurred",
 | 
					    "errorTitle": "An error occurred",
 | 
				
			||||||
    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information."
 | 
					    "errorSubtitle": "An error occurred while trying to perform this action. Please check the console for more information.",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "忘记密码?",
 | 
					    "forgotPasswordTitle": "忘记密码?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "加载身份验证提供程序失败,请检查您的配置。",
 | 
					    "failedToFetchProvidersTitle": "加载身份验证提供程序失败,请检查您的配置。",
 | 
				
			||||||
    "errorTitle": "发生了错误",
 | 
					    "errorTitle": "发生了错误",
 | 
				
			||||||
    "errorSubtitle": "执行此操作时发生错误,请检查控制台以获取更多信息。"
 | 
					    "errorSubtitle": "执行此操作时发生错误,请检查控制台以获取更多信息。",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,5 +50,6 @@
 | 
				
			|||||||
    "forgotPasswordTitle": "忘記密碼?",
 | 
					    "forgotPasswordTitle": "忘記密碼?",
 | 
				
			||||||
    "failedToFetchProvidersTitle": "載入驗證供應商失敗。請檢查您的設定。",
 | 
					    "failedToFetchProvidersTitle": "載入驗證供應商失敗。請檢查您的設定。",
 | 
				
			||||||
    "errorTitle": "發生錯誤",
 | 
					    "errorTitle": "發生錯誤",
 | 
				
			||||||
    "errorSubtitle": "執行此操作時發生錯誤。請檢查主控台以獲取更多資訊。"
 | 
					    "errorSubtitle": "執行此操作時發生錯誤。請檢查主控台以獲取更多資訊。",
 | 
				
			||||||
 | 
					    "forgotPasswordMessage": "You can reset your password by changing the `USERS` environment variable."
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							@@ -17,6 +17,7 @@ require (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
 | 
						github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
 | 
				
			||||||
 | 
						github.com/cenkalti/backoff/v5 v5.0.2 // indirect
 | 
				
			||||||
	github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
 | 
						github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
 | 
				
			||||||
	github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
 | 
						github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
 | 
				
			||||||
	github.com/containerd/errdefs v1.0.0 // indirect
 | 
						github.com/containerd/errdefs v1.0.0 // indirect
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@@ -26,6 +26,8 @@ github.com/catppuccin/go v0.3.0 h1:d+0/YicIq+hSTo5oPuRi5kOpqkVA5tAsU6dNhvRu+aY=
 | 
				
			|||||||
github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc=
 | 
					github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc=
 | 
				
			||||||
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
 | 
					github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
 | 
				
			||||||
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 | 
					github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 | 
				
			||||||
 | 
					github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
 | 
				
			||||||
 | 
					github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
 | 
				
			||||||
github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs=
 | 
					github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs=
 | 
				
			||||||
github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg=
 | 
					github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg=
 | 
				
			||||||
github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI=
 | 
					github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI=
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,7 +88,9 @@ func (auth *Auth) SearchUser(username string) types.UserSearch {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return types.UserSearch{}
 | 
						return types.UserSearch{
 | 
				
			||||||
 | 
							Type: "unknown",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (auth *Auth) VerifyUser(search types.UserSearch, password string) bool {
 | 
					func (auth *Auth) VerifyUser(search types.UserSearch, password string) bool {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,10 @@ package constants
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Claims are the OIDC supported claims (prefered username is included for convinience)
 | 
					// Claims are the OIDC supported claims (prefered username is included for convinience)
 | 
				
			||||||
type Claims struct {
 | 
					type Claims struct {
 | 
				
			||||||
	Name              string   `json:"name"`
 | 
						Name              string `json:"name"`
 | 
				
			||||||
	Email             string   `json:"email"`
 | 
						Email             string `json:"email"`
 | 
				
			||||||
	PreferredUsername string   `json:"preferred_username"`
 | 
						PreferredUsername string `json:"preferred_username"`
 | 
				
			||||||
	Groups            []string `json:"groups"`
 | 
						Groups            any    `json:"groups"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Version information
 | 
					// Version information
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package server_test
 | 
					package handlers_test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
@@ -189,7 +189,7 @@ func (h *Handlers) OAuthCallbackHandler(c *gin.Context) {
 | 
				
			|||||||
		Name:        name,
 | 
							Name:        name,
 | 
				
			||||||
		Email:       user.Email,
 | 
							Email:       user.Email,
 | 
				
			||||||
		Provider:    providerName.Provider,
 | 
							Provider:    providerName.Provider,
 | 
				
			||||||
		OAuthGroups: strings.Join(user.Groups, ","),
 | 
							OAuthGroups: utils.CoalesceToString(user.Groups),
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check if we have a redirect URI
 | 
						// Check if we have a redirect URI
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,10 +40,7 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
	proto := c.Request.Header.Get("X-Forwarded-Proto")
 | 
						proto := c.Request.Header.Get("X-Forwarded-Proto")
 | 
				
			||||||
	host := c.Request.Header.Get("X-Forwarded-Host")
 | 
						host := c.Request.Header.Get("X-Forwarded-Host")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Remove the port from the host if it exists
 | 
					 | 
				
			||||||
	hostPortless := strings.Split(host, ":")[0] // *lol*
 | 
						hostPortless := strings.Split(host, ":")[0] // *lol*
 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get the id
 | 
					 | 
				
			||||||
	id := strings.Split(hostPortless, ".")[0]
 | 
						id := strings.Split(hostPortless, ".")[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	labels, err := h.Docker.GetLabels(id, hostPortless)
 | 
						labels, err := h.Docker.GetLabels(id, hostPortless)
 | 
				
			||||||
@@ -66,10 +63,10 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ip := c.ClientIP()
 | 
						ip := c.ClientIP()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check if the IP is in bypass list
 | 
					 | 
				
			||||||
	if h.Auth.BypassedIP(labels, ip) {
 | 
						if h.Auth.BypassedIP(labels, ip) {
 | 
				
			||||||
		headersParsed := utils.ParseHeaders(labels.Headers)
 | 
							c.Header("Authorization", c.Request.Header.Get("Authorization"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							headersParsed := utils.ParseHeaders(labels.Headers)
 | 
				
			||||||
		for key, value := range headersParsed {
 | 
							for key, value := range headersParsed {
 | 
				
			||||||
			log.Debug().Str("key", key).Msg("Setting header")
 | 
								log.Debug().Str("key", key).Msg("Setting header")
 | 
				
			||||||
			c.Header(key, value)
 | 
								c.Header(key, value)
 | 
				
			||||||
@@ -87,7 +84,6 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check if the IP is allowed/blocked
 | 
					 | 
				
			||||||
	if !h.Auth.CheckIP(labels, ip) {
 | 
						if !h.Auth.CheckIP(labels, ip) {
 | 
				
			||||||
		if proxy.Proxy == "nginx" || !isBrowser {
 | 
							if proxy.Proxy == "nginx" || !isBrowser {
 | 
				
			||||||
			c.JSON(403, gin.H{
 | 
								c.JSON(403, gin.H{
 | 
				
			||||||
@@ -113,7 +109,6 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check if auth is enabled
 | 
					 | 
				
			||||||
	authEnabled, err := h.Auth.AuthEnabled(uri, labels)
 | 
						authEnabled, err := h.Auth.AuthEnabled(uri, labels)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Error().Err(err).Msg("Failed to check if app is allowed")
 | 
							log.Error().Err(err).Msg("Failed to check if app is allowed")
 | 
				
			||||||
@@ -129,8 +124,9 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If auth is not enabled, return 200
 | 
					 | 
				
			||||||
	if !authEnabled {
 | 
						if !authEnabled {
 | 
				
			||||||
 | 
							c.Header("Authorization", c.Request.Header.Get("Authorization"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		headersParsed := utils.ParseHeaders(labels.Headers)
 | 
							headersParsed := utils.ParseHeaders(labels.Headers)
 | 
				
			||||||
		for key, value := range headersParsed {
 | 
							for key, value := range headersParsed {
 | 
				
			||||||
			log.Debug().Str("key", key).Msg("Setting header")
 | 
								log.Debug().Str("key", key).Msg("Setting header")
 | 
				
			||||||
@@ -150,7 +146,6 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get user context
 | 
					 | 
				
			||||||
	userContext := h.Hooks.UseUserContext(c)
 | 
						userContext := h.Hooks.UseUserContext(c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If we are using basic auth, we need to check if the user has totp and if it does then disable basic auth
 | 
						// If we are using basic auth, we need to check if the user has totp and if it does then disable basic auth
 | 
				
			||||||
@@ -159,7 +154,6 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
		userContext.IsLoggedIn = false
 | 
							userContext.IsLoggedIn = false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check if user is logged in
 | 
					 | 
				
			||||||
	if userContext.IsLoggedIn {
 | 
						if userContext.IsLoggedIn {
 | 
				
			||||||
		log.Debug().Msg("Authenticated")
 | 
							log.Debug().Msg("Authenticated")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -200,7 +194,6 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Check groups if using OAuth
 | 
					 | 
				
			||||||
		if userContext.OAuth {
 | 
							if userContext.OAuth {
 | 
				
			||||||
			groupOk := h.Auth.OAuthGroup(c, userContext, labels)
 | 
								groupOk := h.Auth.OAuthGroup(c, userContext, labels)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -239,19 +232,18 @@ func (h *Handlers) ProxyHandler(c *gin.Context) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							c.Header("Authorization", c.Request.Header.Get("Authorization"))
 | 
				
			||||||
		c.Header("Remote-User", utils.SanitizeHeader(userContext.Username))
 | 
							c.Header("Remote-User", utils.SanitizeHeader(userContext.Username))
 | 
				
			||||||
		c.Header("Remote-Name", utils.SanitizeHeader(userContext.Name))
 | 
							c.Header("Remote-Name", utils.SanitizeHeader(userContext.Name))
 | 
				
			||||||
		c.Header("Remote-Email", utils.SanitizeHeader(userContext.Email))
 | 
							c.Header("Remote-Email", utils.SanitizeHeader(userContext.Email))
 | 
				
			||||||
		c.Header("Remote-Groups", utils.SanitizeHeader(userContext.OAuthGroups))
 | 
							c.Header("Remote-Groups", utils.SanitizeHeader(userContext.OAuthGroups))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Set the rest of the headers
 | 
					 | 
				
			||||||
		parsedHeaders := utils.ParseHeaders(labels.Headers)
 | 
							parsedHeaders := utils.ParseHeaders(labels.Headers)
 | 
				
			||||||
		for key, value := range parsedHeaders {
 | 
							for key, value := range parsedHeaders {
 | 
				
			||||||
			log.Debug().Str("key", key).Msg("Setting header")
 | 
								log.Debug().Str("key", key).Msg("Setting header")
 | 
				
			||||||
			c.Header(key, value)
 | 
								c.Header(key, value)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Set basic auth headers if configured
 | 
					 | 
				
			||||||
		if labels.Basic.Username != "" && utils.GetSecret(labels.Basic.Password.Plain, labels.Basic.Password.File) != "" {
 | 
							if labels.Basic.Username != "" && utils.GetSecret(labels.Basic.Password.Plain, labels.Basic.Password.File) != "" {
 | 
				
			||||||
			log.Debug().Str("username", labels.Basic.Username).Msg("Setting basic auth headers")
 | 
								log.Debug().Str("username", labels.Basic.Username).Msg("Setting basic auth headers")
 | 
				
			||||||
			c.Header("Authorization", fmt.Sprintf("Basic %s", utils.GetBasicAuth(labels.Basic.Username, utils.GetSecret(labels.Basic.Password.Plain, labels.Basic.Password.File))))
 | 
								c.Header("Authorization", fmt.Sprintf("Basic %s", utils.GetBasicAuth(labels.Basic.Username, utils.GetSecret(labels.Basic.Password.Plain, labels.Basic.Password.File))))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,15 +37,15 @@ func (hooks *Hooks) UseUserContext(c *gin.Context) types.UserContext {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		userSearch := hooks.Auth.SearchUser(basic.Username)
 | 
							userSearch := hooks.Auth.SearchUser(basic.Username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if userSearch.Type == "" {
 | 
							if userSearch.Type == "unkown" {
 | 
				
			||||||
			log.Error().Str("username", basic.Username).Msg("User does not exist")
 | 
								log.Warn().Str("username", basic.Username).Msg("Basic auth user does not exist, skipping")
 | 
				
			||||||
			return types.UserContext{}
 | 
								goto session
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Verify the user
 | 
							// Verify the user
 | 
				
			||||||
		if !hooks.Auth.VerifyUser(userSearch, basic.Password) {
 | 
							if !hooks.Auth.VerifyUser(userSearch, basic.Password) {
 | 
				
			||||||
			log.Error().Str("username", basic.Username).Msg("Password incorrect")
 | 
								log.Error().Str("username", basic.Username).Msg("Basic auth user password incorrect, skipping")
 | 
				
			||||||
			return types.UserContext{}
 | 
								goto session
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Get the user type
 | 
							// Get the user type
 | 
				
			||||||
@@ -75,6 +75,7 @@ func (hooks *Hooks) UseUserContext(c *gin.Context) types.UserContext {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					session:
 | 
				
			||||||
	// Check cookie error after basic auth
 | 
						// Check cookie error after basic auth
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Error().Err(err).Msg("Failed to get session cookie")
 | 
							log.Error().Err(err).Msg("Failed to get session cookie")
 | 
				
			||||||
@@ -98,7 +99,7 @@ func (hooks *Hooks) UseUserContext(c *gin.Context) types.UserContext {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		userSearch := hooks.Auth.SearchUser(cookie.Username)
 | 
							userSearch := hooks.Auth.SearchUser(cookie.Username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if userSearch.Type == "" {
 | 
							if userSearch.Type == "unknown" {
 | 
				
			||||||
			log.Error().Str("username", cookie.Username).Msg("User does not exist")
 | 
								log.Error().Str("username", cookie.Username).Msg("User does not exist")
 | 
				
			||||||
			return types.UserContext{}
 | 
								return types.UserContext{}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,13 @@
 | 
				
			|||||||
package ldap
 | 
					package ldap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"crypto/tls"
 | 
						"crypto/tls"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
	"tinyauth/internal/types"
 | 
						"tinyauth/internal/types"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/cenkalti/backoff/v5"
 | 
				
			||||||
	ldapgo "github.com/go-ldap/ldap/v3"
 | 
						ldapgo "github.com/go-ldap/ldap/v3"
 | 
				
			||||||
	"github.com/rs/zerolog/log"
 | 
						"github.com/rs/zerolog/log"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -30,6 +32,11 @@ func NewLDAP(config types.LdapConfig) (*LDAP, error) {
 | 
				
			|||||||
			err := ldap.heartbeat()
 | 
								err := ldap.heartbeat()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				log.Error().Err(err).Msg("LDAP connection heartbeat failed")
 | 
									log.Error().Err(err).Msg("LDAP connection heartbeat failed")
 | 
				
			||||||
 | 
									if reconnectErr := ldap.reconnect(); reconnectErr != nil {
 | 
				
			||||||
 | 
										log.Error().Err(reconnectErr).Msg("Failed to reconnect to LDAP server")
 | 
				
			||||||
 | 
										continue
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									log.Info().Msg("Successfully reconnected to LDAP server")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
@@ -38,6 +45,7 @@ func NewLDAP(config types.LdapConfig) (*LDAP, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (l *LDAP) connect() (*ldapgo.Conn, error) {
 | 
					func (l *LDAP) connect() (*ldapgo.Conn, error) {
 | 
				
			||||||
 | 
						log.Debug().Msg("Connecting to LDAP server")
 | 
				
			||||||
	conn, err := ldapgo.DialURL(l.Config.Address, ldapgo.DialWithTLSConfig(&tls.Config{
 | 
						conn, err := ldapgo.DialURL(l.Config.Address, ldapgo.DialWithTLSConfig(&tls.Config{
 | 
				
			||||||
		InsecureSkipVerify: l.Config.Insecure,
 | 
							InsecureSkipVerify: l.Config.Insecure,
 | 
				
			||||||
		MinVersion:         tls.VersionTLS12,
 | 
							MinVersion:         tls.VersionTLS12,
 | 
				
			||||||
@@ -46,6 +54,7 @@ func (l *LDAP) connect() (*ldapgo.Conn, error) {
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log.Debug().Msg("Binding to LDAP server")
 | 
				
			||||||
	err = conn.Bind(l.Config.BindDN, l.Config.BindPassword)
 | 
						err = conn.Bind(l.Config.BindDN, l.Config.BindPassword)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -91,7 +100,7 @@ func (l *LDAP) Bind(userDN string, password string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (l *LDAP) heartbeat() error {
 | 
					func (l *LDAP) heartbeat() error {
 | 
				
			||||||
	log.Info().Msg("Performing LDAP connection heartbeat")
 | 
						log.Debug().Msg("Performing LDAP connection heartbeat")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	searchRequest := ldapgo.NewSearchRequest(
 | 
						searchRequest := ldapgo.NewSearchRequest(
 | 
				
			||||||
		"",
 | 
							"",
 | 
				
			||||||
@@ -109,3 +118,30 @@ func (l *LDAP) heartbeat() error {
 | 
				
			|||||||
	// No error means the connection is alive
 | 
						// No error means the connection is alive
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (l *LDAP) reconnect() error {
 | 
				
			||||||
 | 
						log.Info().Msg("Reconnecting to LDAP server")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						exp := backoff.NewExponentialBackOff()
 | 
				
			||||||
 | 
						exp.InitialInterval = 500 * time.Millisecond
 | 
				
			||||||
 | 
						exp.RandomizationFactor = 0.1
 | 
				
			||||||
 | 
						exp.Multiplier = 1.5
 | 
				
			||||||
 | 
						exp.Reset()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						operation := func() (*ldapgo.Conn, error) {
 | 
				
			||||||
 | 
							l.Conn.Close()
 | 
				
			||||||
 | 
							_, err := l.connect()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err := backoff.Retry(context.TODO(), operation, backoff.WithBackOff(exp), backoff.WithMaxTries(3))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -327,3 +327,15 @@ func DeriveKey(secret string, info string) (string, error) {
 | 
				
			|||||||
	encodedKey := base64.StdEncoding.EncodeToString(key)
 | 
						encodedKey := base64.StdEncoding.EncodeToString(key)
 | 
				
			||||||
	return encodedKey, nil
 | 
						return encodedKey, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func CoalesceToString(value any) string {
 | 
				
			||||||
 | 
						switch v := value.(type) {
 | 
				
			||||||
 | 
						case []string:
 | 
				
			||||||
 | 
							return strings.Join(v, ",")
 | 
				
			||||||
 | 
						case string:
 | 
				
			||||||
 | 
							return v
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							log.Warn().Interface("value", value).Msg("Unsupported type, returning empty string")
 | 
				
			||||||
 | 
							return ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -511,3 +511,38 @@ func TestDeriveKey(t *testing.T) {
 | 
				
			|||||||
		t.Fatalf("Expected %v, got %v", expected, result)
 | 
							t.Fatalf("Expected %v, got %v", expected, result)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCoalesceToString(t *testing.T) {
 | 
				
			||||||
 | 
						t.Log("Testing coalesce to string with a string")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						value := "test"
 | 
				
			||||||
 | 
						expected := "test"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result := utils.CoalesceToString(value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if result != expected {
 | 
				
			||||||
 | 
							t.Fatalf("Expected %v, got %v", expected, result)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						t.Log("Testing coalesce to string with a slice of strings")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						valueSlice := []string{"test1", "test2"}
 | 
				
			||||||
 | 
						expected = "test1,test2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result = utils.CoalesceToString(valueSlice)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if result != expected {
 | 
				
			||||||
 | 
							t.Fatalf("Expected %v, got %v", expected, result)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						t.Log("Testing coalesce to string with an unsupported type")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						valueUnsupported := 12345
 | 
				
			||||||
 | 
						expected = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result = utils.CoalesceToString(valueUnsupported)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if result != expected {
 | 
				
			||||||
 | 
							t.Fatalf("Expected %v, got %v", expected, result)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user