Compare commits

...

8 Commits

Author SHA1 Message Date
Elias Schneider
e195565630 release: 1.2.1 2024-10-15 20:58:36 +02:00
Elias Schneider
520f9abcf7 chore(translations): update translations via Crowdin (#637)
* New translations en-us.ts (Polish)

* New translations en-us.ts (Italian)

* New translations en-us.ts (French)

* New translations en-us.ts (German)

* New translations en-us.ts (French)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Czech)

* New translations en-us.ts (German)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Serbian (Cyrillic))

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (Chinese Traditional)

* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Thai)

* New translations en-us.ts (Dutch, Belgium)

* New translations en-us.ts (Arabic, Egypt)
2024-10-15 20:57:24 +02:00
Marvin A. Ruder
bfbe8de98a fix(oauth): add post_logout_redirect_uri to OAuth logout redirect URI (#638)
* Add `post_logout_redirect_uri` to OAuth logout redirect URI

Signed-off-by: Marvin A. Ruder <signed@mruder.dev>

* Update OAuth2 configuration documentation

Signed-off-by: Marvin A. Ruder <signed@mruder.dev>

---------

Signed-off-by: Marvin A. Ruder <signed@mruder.dev>
2024-10-15 20:49:43 +02:00
Elias Schneider
d5cd3002a1 fix: share can't be created if an invalid email is entered in mail recipients 2024-10-15 20:47:04 +02:00
Elias Schneider
77a092a3cf fix: trim username, email and password on sign in and sign up page 2024-10-15 20:29:34 +02:00
Elias Schneider
613bae9033 fix: error message for invalid max use count of reverse share 2024-10-15 20:28:05 +02:00
Elias Schneider
2e692241c5 fix: disallow passwort reset if it's a ldap user 2024-10-15 20:12:56 +02:00
Elias Schneider
1e96011793 refactor: run formatter 2024-10-15 20:12:09 +02:00
44 changed files with 162 additions and 57 deletions

View File

@@ -1,3 +1,14 @@
## [1.2.1](https://github.com/stonith404/pingvin-share/compare/v1.2.0...v1.2.1) (2024-10-15)
### Bug Fixes
* disallow passwort reset if it's a ldap user ([2e69224](https://github.com/stonith404/pingvin-share/commit/2e692241c57b001c9312302523c6374c0c24ea0c))
* error message for invalid max use count of reverse share ([613bae9](https://github.com/stonith404/pingvin-share/commit/613bae90330a76c0964352a3fe927df3697309eb))
* **oauth:** add `post_logout_redirect_uri` to OAuth logout redirect URI ([#638](https://github.com/stonith404/pingvin-share/issues/638)) ([bfbe8de](https://github.com/stonith404/pingvin-share/commit/bfbe8de98a6a7a2d32dd8d4dddbcc1d4ce6388f4))
* share can't be created if an invalid email is entered in mail recipients ([d5cd300](https://github.com/stonith404/pingvin-share/commit/d5cd3002a1661e58d584e12280be36f17948c38c))
* trim username, email and password on sign in and sign up page ([77a092a](https://github.com/stonith404/pingvin-share/commit/77a092a3cf089a4aa8b9897b5ad14e5500181d10))
## [1.2.0](https://github.com/stonith404/pingvin-share/compare/v1.1.3...v1.2.0) (2024-10-14)

View File

@@ -1,12 +1,12 @@
{
"name": "pingvin-share-backend",
"version": "1.2.0",
"version": "1.2.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pingvin-share-backend",
"version": "1.2.0",
"version": "1.2.1",
"dependencies": {
"@nestjs/cache-manager": "^2.2.2",
"@nestjs/common": "^10.4.3",

View File

@@ -1,6 +1,6 @@
{
"name": "pingvin-share-backend",
"version": "1.2.0",
"version": "1.2.1",
"scripts": {
"build": "nest build",
"dev": "cross-env NODE_ENV=development nest start --watch",

View File

@@ -120,7 +120,7 @@ export class AuthController {
})
@HttpCode(202)
async requestResetPassword(@Param("email") email: string) {
this.authService.requestResetPassword(email);
await this.authService.requestResetPassword(email);
}
@Post("resetPassword")
@@ -172,7 +172,9 @@ export class AuthController {
@Req() request: Request,
@Res({ passthrough: true }) response: Response,
) {
const redirectURI = await this.authService.signOut(request.cookies.access_token);
const redirectURI = await this.authService.signOut(
request.cookies.access_token,
);
const isSecure = this.config.get("general.appUrl").startsWith("https");
response.cookie("access_token", "", {

View File

@@ -16,12 +16,12 @@ import * as moment from "moment";
import { ConfigService } from "src/config/config.service";
import { EmailService } from "src/email/email.service";
import { PrismaService } from "src/prisma/prisma.service";
import { OAuthService } from "../oauth/oauth.service";
import { GenericOidcProvider } from "../oauth/provider/genericOidc.provider";
import { UserSevice } from "../user/user.service";
import { AuthRegisterDTO } from "./dto/authRegister.dto";
import { AuthSignInDTO } from "./dto/authSignIn.dto";
import { LdapService } from "./ldap.service";
import { GenericOidcProvider } from "../oauth/provider/genericOidc.provider";
import { OAuthService } from "../oauth/oauth.service";
import { UserSevice } from "../user/user.service";
@Injectable()
export class AuthService {
@@ -120,10 +120,7 @@ export class AuthService {
async generateToken(user: User, oauth?: { idToken?: string }) {
// TODO: Make all old loginTokens invalid when a new one is created
// Check if the user has TOTP enabled
if (
user.totpVerified &&
!(oauth && this.config.get("oauth.ignoreTotp"))
) {
if (user.totpVerified && !(oauth && this.config.get("oauth.ignoreTotp"))) {
const loginToken = await this.createLoginToken(user.id);
return { loginToken };
@@ -149,6 +146,15 @@ export class AuthService {
if (!user) return;
if (user.ldapDN) {
this.logger.log(
`Failed password reset request for user ${email} because it is an LDAP user`,
);
throw new BadRequestException(
"This account can't reset its password here. Please contact your administrator.",
);
}
// Delete old reset password token
if (user.resetPasswordToken) {
await this.prisma.resetPasswordToken.delete({
@@ -163,7 +169,7 @@ export class AuthService {
},
});
await this.emailService.sendResetPasswordEmail(user.email, token);
this.emailService.sendResetPasswordEmail(user.email, token);
}
async resetPassword(token: string, newPassword: string) {
@@ -231,7 +237,10 @@ export class AuthService {
if (refreshTokenId) {
const oauthIDToken = await this.prisma.refreshToken
.findFirst({ select: { oauthIDToken: true }, where: { id: refreshTokenId } })
.findFirst({
select: { oauthIDToken: true },
where: { id: refreshTokenId },
})
.then((refreshToken) => refreshToken?.oauthIDToken)
.catch((e) => {
// Ignore error if refresh token doesn't exist
@@ -249,16 +258,28 @@ export class AuthService {
const provider = this.oAuthService.availableProviders()[providerName];
let signOutFromProviderSupportedAndActivated = false;
try {
signOutFromProviderSupportedAndActivated = this.config.get(`oauth.${providerName}-signOut`);
signOutFromProviderSupportedAndActivated = this.config.get(
`oauth.${providerName}-signOut`,
);
} catch (_) {
// Ignore error if the provider is not supported or if the provider sign out is not activated
}
if (provider instanceof GenericOidcProvider && signOutFromProviderSupportedAndActivated) {
if (
provider instanceof GenericOidcProvider &&
signOutFromProviderSupportedAndActivated
) {
const configuration = await provider.getConfiguration();
if (configuration.frontchannel_logout_supported && URL.canParse(configuration.end_session_endpoint)) {
if (
configuration.frontchannel_logout_supported &&
URL.canParse(configuration.end_session_endpoint)
) {
const redirectURI = new URL(configuration.end_session_endpoint);
redirectURI.searchParams.append("post_logout_redirect_uri", this.config.get("general.appUrl"));
redirectURI.searchParams.append("id_token_hint", idTokenHint);
redirectURI.searchParams.append("client_id", this.config.get(`oauth.${providerName}-clientId`));
redirectURI.searchParams.append(
"client_id",
this.config.get(`oauth.${providerName}-clientId`),
);
return redirectURI.toString();
}
}

View File

@@ -15,7 +15,8 @@ export class OAuthService {
private config: ConfigService,
@Inject(forwardRef(() => AuthService)) private auth: AuthService,
@Inject("OAUTH_PLATFORMS") private platforms: string[],
@Inject("OAUTH_PROVIDERS") private oAuthProviders: Record<string, OAuthProvider<unknown>>,
@Inject("OAUTH_PROVIDERS")
private oAuthProviders: Record<string, OAuthProvider<unknown>>,
) {}
private readonly logger = new Logger(OAuthService.name);
@@ -30,13 +31,15 @@ export class OAuthService {
}
availableProviders(): Record<string, OAuthProvider<unknown>> {
return Object.fromEntries(Object.entries(this.oAuthProviders)
return Object.fromEntries(
Object.entries(this.oAuthProviders)
.map(([providerName, provider]) => [
[providerName, provider],
this.config.get(`oauth.${providerName}-enabled`),
])
.filter(([_, enabled]) => enabled)
.map(([provider, _]) => provider));
.map(([provider, _]) => provider),
);
}
async status(user: User) {

View File

@@ -42,7 +42,9 @@ Redirect URL: `https://<your-domain>/api/oauth/callback/discord`
Generic OpenID Connect provider is also supported, we have tested it on Keycloak, Authentik and Casdoor.
Redirect URL: `https://<your-domain>/api/oauth/callback/oidc`
Redirect URI: `https://<your-domain>/api/oauth/callback/oidc`
Post Logout Redirect URI: `https://<your-domain>`
## Custom your OAuth 2 Provider

View File

@@ -1,12 +1,12 @@
{
"name": "pingvin-share-frontend",
"version": "1.2.0",
"version": "1.2.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "pingvin-share-frontend",
"version": "1.2.0",
"version": "1.2.1",
"dependencies": {
"@emotion/react": "^11.13.3",
"@emotion/server": "^11.11.0",

View File

@@ -1,6 +1,6 @@
{
"name": "pingvin-share-frontend",
"version": "1.2.0",
"version": "1.2.1",
"scripts": {
"dev": "next dev",
"build": "next build",

View File

@@ -97,7 +97,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
const signIn = async (email: string, password: string) => {
await authService
.signIn(email, password)
.signIn(email.trim(), password.trim())
.then(async (response) => {
if (response.data["loginToken"]) {
// Prompt the user to enter their totp code

View File

@@ -48,7 +48,7 @@ const SignUpForm = () => {
const signUp = async (email: string, username: string, password: string) => {
await authService
.signUp(email, username, password)
.signUp(email.trim(), username.trim(), password.trim())
.then(async () => {
const user = await refreshUser();
if (user?.isAdmin) {

View File

@@ -9,11 +9,13 @@ import {
Switch,
Text,
} from "@mantine/core";
import { useForm } from "@mantine/form";
import { useForm, yupResolver } from "@mantine/form";
import { useModals } from "@mantine/modals";
import { ModalsContextProps } from "@mantine/modals/lib/context";
import { getCookie, setCookie } from "cookies-next";
import moment from "moment";
import { FormattedMessage } from "react-intl";
import * as yup from "yup";
import useTranslate, {
translateOutsideContext,
} from "../../../hooks/useTranslate.hook";
@@ -22,7 +24,6 @@ import { getExpirationPreview } from "../../../utils/date.util";
import toast from "../../../utils/toast.util";
import FileSizeInput from "../FileSizeInput";
import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
import { getCookie, setCookie } from "cookies-next";
const showCreateReverseShareModal = (
modals: ModalsContextProps,
@@ -65,6 +66,16 @@ const Body = ({
simplified: !!(getCookie("reverse-share.simplified") ?? false),
publicAccess: !!(getCookie("reverse-share.public-access") ?? true),
},
validate: yupResolver(
yup.object().shape({
maxUseCount: yup
.number()
.typeError(t("common.error.invalid-number"))
.min(1, t("common.error.number-too-small", { min: 1 }))
.max(1000, t("common.error.number-too-large", { max: 1000 }))
.required(t("common.error.field-required")),
}),
),
});
const onSubmit = form.onSubmit(async (values) => {

View File

@@ -371,7 +371,7 @@ const CreateUploadModalBody = ({
searchable
creatable
id="recipient-emails"
type="email"
inputMode="email"
getCreateLabel={(query) => `+ ${query}`}
onCreate={(query) => {
if (!query.match(/^\S+@\S+\.\S+$/)) {

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "عنوان البريد غير صحيح",
"common.error.too-short": "يجب أن يكون على الأقل {length} حرفًا",
"common.error.too-long": "يجب أن يكون على الأكثر {length} حرفًا",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "يجب أن يكون بالضبط {length} حرفًا",
"common.error.invalid-number": "يجب أن يكون رقماً",
"common.error.field-required": "هذا الحقل مطلوب"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Invalid email address",
"common.error.too-short": "Must be at least {length} characters",
"common.error.too-long": "Must be at most {length} characters",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Must be exactly {length} characters",
"common.error.invalid-number": "Must be a number",
"common.error.field-required": "This field is required"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Invalid email address",
"common.error.too-short": "Musí mít alespoň {length} znaků",
"common.error.too-long": "Musí mít maximálně {length} znaků",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Musí mít přesně {length} znaků",
"common.error.invalid-number": "Musí být číslo",
"common.error.field-required": "Toto pole je povinné"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Ugyldig e-mail",
"common.error.too-short": "Skal være på mindst {length} tegn",
"common.error.too-long": "Må højst være {length} tegn",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Skal være præcis {length} tegn",
"common.error.invalid-number": "Skal være et tal",
"common.error.field-required": "Dette felt er påkrævet"

View File

@@ -396,9 +396,9 @@ export default {
"admin.config.oauth.oidc-sign-out.description": "Wenn aktiviert, wird der Benutzer mit der „Abmelden“-Schaltfläche vom OpenID-Connect-Provider abgemeldet.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect Benutzername anfordern",
"admin.config.oauth.oidc-username-claim.description": "Benutzername im OpenID Token. Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
"admin.config.oauth.oidc-role-path": "Pfad zu den Rollen im OpenID Verbindungs-Token",
"admin.config.oauth.oidc-role-path.description": "Muss ein valider JMES-Pfad sein, der zu einem Array an Rollen führt. " + "Die Zugangsverwaltung über Rollen in OpenID Connect ist nur empfohlen, wenn kein anderer Identitätsprovider konfiguriert und die Anmeldung per Password deaktiviert ist. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect Rolle für allgemeinen Zugriff",
"admin.config.oauth.oidc-role-general-access.description": "Rolle für generellen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser sich anmelden kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect Rolle für Admin-Zugriff",
"admin.config.oauth.oidc-role-admin-access.description": "Rolle für administrativen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser auf das Administrator-Panel zugreifen kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
@@ -407,10 +407,10 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client-Secret",
"admin.config.oauth.oidc-client-secret.description": "Client-Secret der OpenID Connect OAuth-App",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.enabled": "LDAP aktivieren",
"admin.config.ldap.enabled.description": "LDAP-Authentifizierung für die Benutzeranmeldung verwenden",
"admin.config.ldap.url": "Server-URL",
"admin.config.ldap.url.description": "URL des LDAP-Servers",
"admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search",
"admin.config.ldap.bind-password": "Bind password",
@@ -462,7 +462,7 @@ export default {
"common.text.link": "Link",
"common.text.navigate-to-link": "Link öffnen",
"common.text.or": "oder",
"common.text.redirecting": "Redirecting...",
"common.text.redirecting": "Umleitung...",
"common.button.go-back": "Zurück",
"common.button.go-home": "Zur Startseite",
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",
@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Ungültige E-Mail-Adresse",
"common.error.too-short": "Muss mindestens {length} Zeichen enthalten",
"common.error.too-long": "Muss maximal {length} Zeichen enthalten",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Muss genau {length} Zeichen lang sein",
"common.error.invalid-number": "Muss eine Zahl sein",
"common.error.field-required": "Dieses Feld ist erforderlich"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
"common.error.too-short": "Πρέπει να αποτελείται τουλάχιστον {length} χαρακτήρες",
"common.error.too-long": "Πρέπει να αποτελείται το πολύ από {length} χαρακτήρες",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Πρέπει να αποτελείται ακριβώς από {length} χαρακτήρες",
"common.error.invalid-number": "Πρέπει να είναι αριθμός",
"common.error.field-required": "Αυτό το πεδίο είναι υποχρεωτικό"

View File

@@ -649,6 +649,8 @@ export default {
"common.error.invalid-email": "Invalid email address",
"common.error.too-short": "Must be at least {length} characters",
"common.error.too-long": "Must be at most {length} characters",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Must be exactly {length} characters",
"common.error.invalid-number": "Must be a number",
"common.error.field-required": "This field is required",

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Correo electrónico no válido",
"common.error.too-short": "Debe tener al menos {length} caracteres",
"common.error.too-long": "Debe tener como máximo {length} caracteres",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Debe tener exactamente {length} caracteres",
"common.error.invalid-number": "Debe ser un número",
"common.error.field-required": "Este campo es requerido"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Virheellinen sähköpostiosoite",
"common.error.too-short": "Täytyy olla vähintään {length} merkkiä",
"common.error.too-long": "Täytyy olla enintään {length} merkkiä",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "On oltava tarkasti {length} merkkiä pitkä",
"common.error.invalid-number": "Pitää olla luku",
"common.error.field-required": "Tämä kenttä on pakollinen"

View File

@@ -156,7 +156,7 @@ export default {
"account.reverseShares.modal.simplified.description": "Simplifiez la tâche de la personne qui télécharge le fichier pour le partager avec vous. Ils ne pourront personnaliser que le nom et la description du partage.",
"account.reverseShares.modal.public-access": "Accès public",
"account.reverseShares.modal.public-access.description": "Rendre les partages créés avec ce partage inversé public. Si désactivé, seul vous et le créateur du partage pouvez le voir.",
"account.reverseShares.modal.max-use.label": "Nombre d'utilisation max",
"account.reverseShares.modal.max-use.label": "Nombre d'utilisations max",
"account.reverseShares.modal.max-use.description": "Le nombre maximal de fois que cette URL peut être utilisée pour créer un partage.",
"account.reverseShare.never-expires": "Ce partage inversé n'expirera jamais.",
"account.reverseShare.expires-on": "Ce partage inversé expirera le {expiration}.",
@@ -326,7 +326,7 @@ export default {
"admin.config.email.invite-message": "Message dune invitation",
"admin.config.email.invite-message.description": "Message qui est envoyé lorsqu'un administrateur invite un utilisateur. {url} sera remplacé avec l'URL d'invitation, {email} avec le courriel et {password} avec le mot de passe de l'utilisateur.",
"admin.config.share.allow-registration": "Autoriser les inscriptions",
"admin.config.share.allow-registration.description": "Permet aux visiteurs de créer un compte.",
"admin.config.share.allow-registration.description": "Permet aux visiteurs de créer un compte",
"admin.config.share.allow-unauthenticated-shares": "Autoriser les partages anonymes",
"admin.config.share.allow-unauthenticated-shares.description": "Permet aux visiteurs de créer des partages",
"admin.config.share.max-expiration": "Échéance",
@@ -381,7 +381,7 @@ export default {
"admin.config.oauth.microsoft-client-secret": "Secret du client Microsoft",
"admin.config.oauth.microsoft-client-secret.description": "Le secret du client de lapplication Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Permettre la connexion via Discord.",
"admin.config.oauth.discord-enabled.description": "Permettre la connexion via Discord",
"admin.config.oauth.discord-limited-guild": "ID de serveur restreint Discord",
"admin.config.oauth.discord-limited-guild.description": "Limiter la connexion aux utilisateurs sur un serveur spécifique. Laissez vide pour désactiver.",
"admin.config.oauth.discord-client-id": "ID du client Discord",
@@ -392,8 +392,8 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Permettre la connexion via OpenID",
"admin.config.oauth.oidc-discovery-uri": "URI de découverte OpenID",
"admin.config.oauth.oidc-discovery-uri.description": "LURI de découverte de la connexion à l'application OpenID OAuth",
"admin.config.oauth.oidc-sign-out": "Sign out from OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Whether the “Sign out” button will sign out from the OpenID Connect provider",
"admin.config.oauth.oidc-sign-out": "Déconnexion du fournisseur OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Si activé, le bouton \"Déconnexion\" vous déconnectera également du fournisseur d'identité OpenID Connect",
"admin.config.oauth.oidc-username-claim": "Revendication du nom dutilisateur OpenID",
"admin.config.oauth.oidc-username-claim.description": "Le champ contenant la revendication du nom dutilisateur dans le jeton OpenID Connect. Laissez vide si vous ne savez pas quoi indiquer.",
"admin.config.oauth.oidc-role-path": "Chemin vers les rôles dans le jeton OpenID Connect",
@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Adresse courriel invalide",
"common.error.too-short": "Doit comporter au moins {length} caractères",
"common.error.too-long": "Doit comporter au plus {length} caractères",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Doit comporter exactement {length} caractères",
"common.error.invalid-number": "Doit être un nombre",
"common.error.field-required": "Ce champ est obligatoire"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Érvénytelen emailcím",
"common.error.too-short": "Legalább {length} karakter kell",
"common.error.too-long": "Legfejlebb {length} karakter adható meg",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Pontosan {length} karakter szükséges",
"common.error.invalid-number": "Számot kell megadnia",
"common.error.field-required": "Ez egy kötelező mező"

View File

@@ -392,8 +392,8 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Se il login tramite OpenID Connect è abilitato",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect",
"admin.config.oauth.oidc-sign-out": "Sign out from OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Whether the “Sign out” button will sign out from the OpenID Connect provider",
"admin.config.oauth.oidc-sign-out": "Esci da OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Se premuto, il pulsante “Disconnettersi” disconnetterà dal provider OpenID Connect",
"admin.config.oauth.oidc-username-claim": "Richiesta nome utente OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Nome utente nel token OpenID Connect. Lascialo vuoto se non sai cos'è questa configurazione.",
"admin.config.oauth.oidc-role-path": "Percorso verso i ruoli in OpenID Connect token",
@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Indirizzo email non valido",
"common.error.too-short": "Deve contenere almeno {length} caratteri",
"common.error.too-long": "Deve contenere al massimo {length} caratteri",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Deve essere esattamente {length} caratteri",
"common.error.invalid-number": "Deve essere un numero",
"common.error.field-required": "Questo campo è obbligatorio"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "無効なメールアドレス",
"common.error.too-short": "最低{length} 文字である必要があります",
"common.error.too-long": "最大{length} 文字である必要があります",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "{length} 文字である必要があります",
"common.error.invalid-number": "数字でなければなりません",
"common.error.field-required": "これは必須項目です"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "이메일 주소가 틀립니다",
"common.error.too-short": "최소 {length} 자 이상이어야 합니다",
"common.error.too-long": "최대 {length} 자 까지 입력가능합니다.",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "{length} 자 이어야 합니다.",
"common.error.invalid-number": "숫자만 가능합니다.",
"common.error.field-required": "이 필드는 필수입니다"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Ongeldig e-mailadres",
"common.error.too-short": "Moet ten minste {length} tekens bevatten",
"common.error.too-long": "Moet maximaal {length} tekens bevatten",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Moet precies {length} tekens bevatten",
"common.error.invalid-number": "Moet een getal zijn",
"common.error.field-required": "Dit veld is verplicht"

View File

@@ -392,8 +392,8 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Czy jest włączony login OpenID Connect",
"admin.config.oauth.oidc-discovery-uri": "Wykrywanie URI OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
"admin.config.oauth.oidc-sign-out": "Sign out from OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Whether the “Sign out” button will sign out from the OpenID Connect provider",
"admin.config.oauth.oidc-sign-out": "Wylogowanie z OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Czy przycisk „Wyloguj się” spowoduje wylogowanie z dostawcy OpenID Connect",
"admin.config.oauth.oidc-username-claim": "Żądanie nazwy użytkownika OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Żądanie nazwy użytkownika w tokenie identyfikatora OpenID Connect. Jeśli nie wiesz, czym jest ta konfiguracja, pozostaw pustą.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Adres e-mail jest nieprawidłowy",
"common.error.too-short": "Musi mieć co najmniej {length} znaków",
"common.error.too-long": "Musi mieć co najmniej {length} znaków",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Musi mieć dokładnie {length} znaków",
"common.error.invalid-number": "Musi być liczbą",
"common.error.field-required": "To pole jest wymagane"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Endereço de e-mail inválido",
"common.error.too-short": "Deve ter no mínimo {length} caracteres",
"common.error.too-long": "Deve ter no máximo {length} caracteres",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Deve ter exatamente {length} caracteres",
"common.error.invalid-number": "Tem que ser um número",
"common.error.field-required": "Este campo é obrigatório"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Недопустимый адрес электронной почты",
"common.error.too-short": "Должно быть не менее {length} символов",
"common.error.too-long": "Должно быть не больше {length} символов",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Должно быть ровно {length} символов",
"common.error.invalid-number": "Должно быть числом",
"common.error.field-required": "Поле обязательно для заполнения"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Neveljaven e-poštni naslov",
"common.error.too-short": "Vsebovati mora vsaj {length} znakov",
"common.error.too-long": "Vsebuje lahko največ {length} znakov",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Dolžina mora biti točno {length} znakov",
"common.error.invalid-number": "Mora biti številka",
"common.error.field-required": "To polje je obvezno"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Неисправна адреса е-поште",
"common.error.too-short": "Мора да има најмање {length} знакова",
"common.error.too-long": "Мора да има највише {length} знакова",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Мора да има тачно {length} знакова",
"common.error.invalid-number": "Мора бити број",
"common.error.field-required": "Поље је обавезно"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Ogiltig e-postadress",
"common.error.too-short": "Måste minst vara {length} tecken långt",
"common.error.too-long": "Får högst innehålla {length} tecken",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Måste vara exakt {length} tecken långt",
"common.error.invalid-number": "Måste vara ett tal",
"common.error.field-required": "Obligatoriskt fält"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "ที่อยู่อีเมล์ไม่ถูกต้อง",
"common.error.too-short": "ต้องมีอย่างน้อย {length} ตัวอักษร",
"common.error.too-long": "ต้องมีไม่เกิน {length} ตัวอักษร",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "ต้องมีความยาว {length} ตัวอักษร",
"common.error.invalid-number": "ต้องเป็นตัวเลข",
"common.error.field-required": "ต้องกรอกข้อมูลนี้"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Geçersiz E-Posta adresi",
"common.error.too-short": "En azından {length} karakter olmalı",
"common.error.too-long": "En fazla {length} karakter olmalı",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Tam tamına {length} karakter olmalı",
"common.error.invalid-number": "Bir sayı olmalı",
"common.error.field-required": "Bu alan gerekli"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Неприпустима адреса електронної пошти",
"common.error.too-short": "Повинно бути не менше {length} символів",
"common.error.too-long": "Повинно бути не більше {length} символів",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Повинно бути рівно {length} символів",
"common.error.invalid-number": "Повинно бути числом",
"common.error.field-required": "Поле обов'язкове для заповнення"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Invalid email address",
"common.error.too-short": "Must be at least {length} characters",
"common.error.too-long": "Must be at most {length} characters",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Bằng {length} kí tự",
"common.error.invalid-number": "Phải là số",
"common.error.field-required": "Trường bắt buộc"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "邮件地址不可用",
"common.error.too-short": "必须不少于 {length} 个字符",
"common.error.too-long": "必须不超过 {length} 个字符",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "必须为 {length} 个字符",
"common.error.invalid-number": "必须为数字",
"common.error.field-required": "必填项"

View File

@@ -472,6 +472,8 @@ export default {
"common.error.invalid-email": "Email地址不可用",
"common.error.too-short": "必須不少於 {length} 個字元",
"common.error.too-long": "必須不超過 {length} 個字元",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "必須為 {length} 個字元",
"common.error.invalid-number": "必須為數字",
"common.error.field-required": "必填"

View File

@@ -31,7 +31,8 @@ const signUp = async (email: string, username: string, password: string) => {
const signOut = async () => {
const response = await api.post("/auth/signOut");
if (URL.canParse(response.data?.redirectURI)) window.location.href = response.data.redirectURI;
if (URL.canParse(response.data?.redirectURI))
window.location.href = response.data.redirectURI;
else window.location.reload();
};

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "pingvin-share",
"version": "1.2.0",
"version": "1.2.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pingvin-share",
"version": "1.2.0",
"version": "1.2.1",
"devDependencies": {
"conventional-changelog-cli": "^3.0.0"
}

View File

@@ -1,6 +1,6 @@
{
"name": "pingvin-share",
"version": "1.2.0",
"version": "1.2.1",
"scripts": {
"format": "cd frontend && npm run format && cd ../backend && npm run format",
"lint": "cd frontend && npm run lint && cd ../backend && npm run lint",