Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e195565630 | ||
|
|
520f9abcf7 | ||
|
|
bfbe8de98a | ||
|
|
d5cd3002a1 | ||
|
|
77a092a3cf | ||
|
|
613bae9033 | ||
|
|
2e692241c5 | ||
|
|
1e96011793 | ||
|
|
522a041ca1 | ||
|
|
ce6430da9f | ||
|
|
2b3ce3ffd2 | ||
|
|
104cc06145 | ||
|
|
4a50a5aa3b | ||
|
|
d6b8b56247 | ||
|
|
5883dff4cf | ||
|
|
511ae933fa | ||
|
|
df2521b192 | ||
|
|
8f16d6b53e | ||
|
|
3310fe53b3 | ||
|
|
adc4af996d | ||
|
|
61edc4f4f6 | ||
|
|
eba7984a0f | ||
|
|
69752b8b41 | ||
|
|
ee73293c0f | ||
|
|
5553607ffe | ||
|
|
2ca6e6ee5f | ||
|
|
18135b0ec0 | ||
|
|
f8bfb8ec3c | ||
|
|
187911e334 | ||
|
|
64acae11a2 |
44
CHANGELOG.md
44
CHANGELOG.md
@@ -1,3 +1,47 @@
|
|||||||
|
## [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)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **oauth:** add ability to limit user IDs for Discord authentication ([#621](https://github.com/stonith404/pingvin-share/issues/621)) ([5883dff](https://github.com/stonith404/pingvin-share/commit/5883dff4cf0abe99b3ac8f0b56fdc9d04e80b51c))
|
||||||
|
* **oauth:** Add option to logout from OpenID Connect provider ([2b3ce3f](https://github.com/stonith404/pingvin-share/commit/2b3ce3ffd250f7e3052d43c1c1e76947abf91e55)), closes [#598](https://github.com/stonith404/pingvin-share/issues/598)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* use unique port env variable for backend ([d6b8b56](https://github.com/stonith404/pingvin-share/commit/d6b8b56247814087c2b676fe2367300172b5a94b))
|
||||||
|
|
||||||
|
## [1.1.3](https://github.com/stonith404/pingvin-share/compare/v1.1.2...v1.1.3) (2024-09-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* improve the LDAP implementation ([#615](https://github.com/stonith404/pingvin-share/issues/615)) ([3310fe5](https://github.com/stonith404/pingvin-share/commit/3310fe53b3e4c89db78d57ede6c8d57d8137ecc1)), closes [#601](https://github.com/stonith404/pingvin-share/issues/601)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* omit invalid username characters in oidc registration ([adc4af9](https://github.com/stonith404/pingvin-share/commit/adc4af996d30b295b06e4ee517aa53be62c0f6c1))
|
||||||
|
|
||||||
|
## [1.1.2](https://github.com/stonith404/pingvin-share/compare/v1.1.1...v1.1.2) (2024-09-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* disable auto complete for email recipients and share password ([ee73293](https://github.com/stonith404/pingvin-share/commit/ee73293c0f822d3e79cfefd096c656d4c36a12d1))
|
||||||
|
* enable secure cookies if app url starts with https ([69752b8](https://github.com/stonith404/pingvin-share/commit/69752b8b417edda1ab4a4acedbdda09d545d6df8))
|
||||||
|
|
||||||
## [1.1.1](https://github.com/stonith404/pingvin-share/compare/v1.1.0...v1.1.1) (2024-09-18)
|
## [1.1.1](https://github.com/stonith404/pingvin-share/compare/v1.1.0...v1.1.1) (2024-09-18)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
295
backend/package-lock.json
generated
295
backend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-backend",
|
"name": "pingvin-share-backend",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pingvin-share-backend",
|
"name": "pingvin-share-backend",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nestjs/cache-manager": "^2.2.2",
|
"@nestjs/cache-manager": "^2.2.2",
|
||||||
"@nestjs/common": "^10.4.3",
|
"@nestjs/common": "^10.4.3",
|
||||||
@@ -20,7 +20,6 @@
|
|||||||
"@nestjs/throttler": "^6.2.1",
|
"@nestjs/throttler": "^6.2.1",
|
||||||
"@prisma/client": "^5.19.1",
|
"@prisma/client": "^5.19.1",
|
||||||
"@types/jmespath": "^0.15.2",
|
"@types/jmespath": "^0.15.2",
|
||||||
"@types/ldapjs": "^3.0.6",
|
|
||||||
"archiver": "^7.0.1",
|
"archiver": "^7.0.1",
|
||||||
"argon2": "^0.41.1",
|
"argon2": "^0.41.1",
|
||||||
"body-parser": "^1.20.3",
|
"body-parser": "^1.20.3",
|
||||||
@@ -31,7 +30,7 @@
|
|||||||
"content-disposition": "^0.5.4",
|
"content-disposition": "^0.5.4",
|
||||||
"cookie-parser": "^1.4.6",
|
"cookie-parser": "^1.4.6",
|
||||||
"jmespath": "^0.16.0",
|
"jmespath": "^0.16.0",
|
||||||
"ldapjs": "^3.0.7",
|
"ldapts": "^7.2.0",
|
||||||
"mime-types": "^2.1.35",
|
"mime-types": "^2.1.35",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"nanoid": "^3.3.7",
|
"nanoid": "^3.3.7",
|
||||||
@@ -1027,101 +1026,6 @@
|
|||||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@ldapjs/asn1": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/asn1/-/asn1-2.0.0.tgz",
|
|
||||||
"integrity": "sha512-G9+DkEOirNgdPmD0I8nu57ygQJKOOgFEMKknEuQvIHbGLwP3ny1mY+OTUYLCbCaGJP4sox5eYgBJRuSUpnAddA==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@ldapjs/attribute": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/attribute/-/attribute-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-ptMl2d/5xJ0q+RgmnqOi3Zgwk/TMJYG7dYMC0Keko+yZU6n+oFM59MjQOUht5pxJeS4FWrImhu/LebX24vJNRQ==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@ldapjs/asn1": "2.0.0",
|
|
||||||
"@ldapjs/protocol": "^1.2.1",
|
|
||||||
"process-warning": "^2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@ldapjs/change": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/change/-/change-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-EOQNFH1RIku3M1s0OAJOzGfAohuFYXFY4s73wOhRm4KFGhmQQ7MChOh2YtYu9Kwgvuq1B0xKciXVzHCGkB5V+Q==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@ldapjs/asn1": "2.0.0",
|
|
||||||
"@ldapjs/attribute": "1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@ldapjs/controls": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/controls/-/controls-2.1.0.tgz",
|
|
||||||
"integrity": "sha512-2pFdD1yRC9V9hXfAWvCCO2RRWK9OdIEcJIos/9cCVP9O4k72BY1bLDQQ4KpUoJnl4y/JoD4iFgM+YWT3IfITWw==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@ldapjs/asn1": "^1.2.0",
|
|
||||||
"@ldapjs/protocol": "^1.2.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@ldapjs/controls/node_modules/@ldapjs/asn1": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/asn1/-/asn1-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-KX/qQJ2xxzvO2/WOvr1UdQ+8P5dVvuOLk/C9b1bIkXxZss8BaR28njXdPgFCpj5aHaf1t8PmuVnea+N9YG9YMw==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@ldapjs/dn": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/dn/-/dn-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-R72zH5ZeBj/Fujf/yBu78YzpJjJXG46YHFo5E4W1EqfNpo1UsVPqdLrRMXeKIsJT3x9dJVIfR6OpzgINlKpi0A==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@ldapjs/asn1": "2.0.0",
|
|
||||||
"process-warning": "^2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@ldapjs/filter": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/filter/-/filter-2.1.1.tgz",
|
|
||||||
"integrity": "sha512-TwPK5eEgNdUO1ABPBUQabcZ+h9heDORE4V9WNZqCtYLKc06+6+UAJ3IAbr0L0bYTnkkWC/JEQD2F+zAFsuikNw==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@ldapjs/asn1": "2.0.0",
|
|
||||||
"@ldapjs/protocol": "^1.2.1",
|
|
||||||
"process-warning": "^2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@ldapjs/messages": {
|
|
||||||
"version": "1.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/messages/-/messages-1.3.0.tgz",
|
|
||||||
"integrity": "sha512-K7xZpXJ21bj92jS35wtRbdcNrwmxAtPwy4myeh9duy/eR3xQKvikVycbdWVzkYEAVE5Ce520VXNOwCHjomjCZw==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@ldapjs/asn1": "^2.0.0",
|
|
||||||
"@ldapjs/attribute": "^1.0.0",
|
|
||||||
"@ldapjs/change": "^1.0.0",
|
|
||||||
"@ldapjs/controls": "^2.1.0",
|
|
||||||
"@ldapjs/dn": "^1.1.0",
|
|
||||||
"@ldapjs/filter": "^2.1.1",
|
|
||||||
"@ldapjs/protocol": "^1.2.1",
|
|
||||||
"process-warning": "^2.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@ldapjs/protocol": {
|
|
||||||
"version": "1.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ldapjs/protocol/-/protocol-1.2.1.tgz",
|
|
||||||
"integrity": "sha512-O89xFDLW2gBoZWNXuXpBSM32/KealKCTb3JGtJdtUQc7RjAk8XzrRgyz02cPAwGKwKPxy0ivuC7UP9bmN87egQ==",
|
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@ljharb/through": {
|
"node_modules/@ljharb/through": {
|
||||||
"version": "2.3.13",
|
"version": "2.3.13",
|
||||||
"resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz",
|
"resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz",
|
||||||
@@ -1780,6 +1684,14 @@
|
|||||||
"@types/readdir-glob": "*"
|
"@types/readdir-glob": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/asn1": {
|
||||||
|
"version": "0.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/asn1/-/asn1-0.2.4.tgz",
|
||||||
|
"integrity": "sha512-V91DSJ2l0h0gRhVP4oBfBzRBN9lAbPUkGDMCnwedqPKX2d84aAMc9CulOvxdw1f7DfEYx99afab+Rsm3e52jhA==",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/body-parser": {
|
"node_modules/@types/body-parser": {
|
||||||
"version": "1.19.2",
|
"version": "1.19.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
|
||||||
@@ -1894,15 +1806,6 @@
|
|||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/ldapjs": {
|
|
||||||
"version": "3.0.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-3.0.6.tgz",
|
|
||||||
"integrity": "sha512-E2Tn1ltJDYBsidOT9QG4engaQeQzRQ9aYNxVmjCkD33F7cIeLPgrRDXAYs0O35mK2YDU20c/+ZkNjeAPRGLM0Q==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/luxon": {
|
"node_modules/@types/luxon": {
|
||||||
"version": "3.4.2",
|
"version": "3.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz",
|
||||||
@@ -2429,12 +2332,6 @@
|
|||||||
"node": ">=6.5"
|
"node": ">=6.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/abstract-logging": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/accepts": {
|
"node_modules/accepts": {
|
||||||
"version": "1.3.8",
|
"version": "1.3.8",
|
||||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
|
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
|
||||||
@@ -2758,7 +2655,6 @@
|
|||||||
"version": "0.2.6",
|
"version": "0.2.6",
|
||||||
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
|
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
|
||||||
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
|
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safer-buffer": "~2.1.0"
|
"safer-buffer": "~2.1.0"
|
||||||
}
|
}
|
||||||
@@ -2767,6 +2663,7 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||||
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
|
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8"
|
"node": ">=0.8"
|
||||||
}
|
}
|
||||||
@@ -2813,18 +2710,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz",
|
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz",
|
||||||
"integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg=="
|
"integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg=="
|
||||||
},
|
},
|
||||||
"node_modules/backoff": {
|
|
||||||
"version": "2.5.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz",
|
|
||||||
"integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"precond": "0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/balanced-match": {
|
"node_modules/balanced-match": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||||
@@ -3699,12 +3584,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/debug": {
|
"node_modules/debug": {
|
||||||
"version": "4.3.4",
|
"version": "4.3.7",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
|
||||||
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": "2.1.2"
|
"ms": "^2.1.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.0"
|
"node": ">=6.0"
|
||||||
@@ -4355,6 +4239,7 @@
|
|||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
||||||
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
|
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
|
||||||
|
"dev": true,
|
||||||
"engines": [
|
"engines": [
|
||||||
"node >=0.6.0"
|
"node >=0.6.0"
|
||||||
]
|
]
|
||||||
@@ -5512,47 +5397,51 @@
|
|||||||
"node": ">= 0.6.3"
|
"node": ">= 0.6.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ldapjs": {
|
"node_modules/ldapts": {
|
||||||
"version": "3.0.7",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-3.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/ldapts/-/ldapts-7.2.0.tgz",
|
||||||
"integrity": "sha512-1ky+WrN+4CFMuoekUOv7Y1037XWdjKpu0xAPwSP+9KdvmV9PG+qOKlssDV6a+U32apwxdD3is/BZcWOYzN30cg==",
|
"integrity": "sha512-jFo3JI46nveXgILcEhUxR7N9it9d6gIooGAaem5OdXbXFjb6kIGdtI6FE2Y6SnT+XRvZvHy3diM5sdWzMsMK5w==",
|
||||||
"deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ldapjs/asn1": "^2.0.0",
|
"@types/asn1": ">=0.2.4",
|
||||||
"@ldapjs/attribute": "^1.0.0",
|
"asn1": "~0.2.6",
|
||||||
"@ldapjs/change": "^1.0.0",
|
"debug": "~4.3.7",
|
||||||
"@ldapjs/controls": "^2.1.0",
|
"strict-event-emitter-types": "~2.0.0",
|
||||||
"@ldapjs/dn": "^1.1.0",
|
"uuid": "~10.0.0",
|
||||||
"@ldapjs/filter": "^2.1.1",
|
"whatwg-url": "~14.0.0"
|
||||||
"@ldapjs/messages": "^1.3.0",
|
|
||||||
"@ldapjs/protocol": "^1.2.1",
|
|
||||||
"abstract-logging": "^2.0.1",
|
|
||||||
"assert-plus": "^1.0.0",
|
|
||||||
"backoff": "^2.5.0",
|
|
||||||
"once": "^1.4.0",
|
|
||||||
"vasync": "^2.2.1",
|
|
||||||
"verror": "^1.10.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/ldapjs/node_modules/core-util-is": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/ldapjs/node_modules/verror": {
|
|
||||||
"version": "1.10.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz",
|
|
||||||
"integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": "^1.0.0",
|
|
||||||
"core-util-is": "1.0.2",
|
|
||||||
"extsprintf": "^1.2.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.6.0"
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ldapts/node_modules/tr46": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
|
||||||
|
"dependencies": {
|
||||||
|
"punycode": "^2.3.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ldapts/node_modules/webidl-conversions": {
|
||||||
|
"version": "7.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
|
||||||
|
"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ldapts/node_modules/whatwg-url": {
|
||||||
|
"version": "14.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
|
||||||
|
"integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
|
||||||
|
"dependencies": {
|
||||||
|
"tr46": "^5.0.0",
|
||||||
|
"webidl-conversions": "^7.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/levn": {
|
"node_modules/levn": {
|
||||||
@@ -5882,9 +5771,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
||||||
},
|
},
|
||||||
"node_modules/mute-stream": {
|
"node_modules/mute-stream": {
|
||||||
"version": "0.0.8",
|
"version": "0.0.8",
|
||||||
@@ -6112,14 +6001,6 @@
|
|||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/once": {
|
|
||||||
"version": "1.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
|
||||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
|
||||||
"dependencies": {
|
|
||||||
"wrappy": "1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/onetime": {
|
"node_modules/onetime": {
|
||||||
"version": "5.1.2",
|
"version": "5.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
|
||||||
@@ -6637,14 +6518,6 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/precond": {
|
|
||||||
"version": "0.2.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz",
|
|
||||||
"integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prelude-ls": {
|
"node_modules/prelude-ls": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
||||||
@@ -6728,12 +6601,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||||
},
|
},
|
||||||
"node_modules/process-warning": {
|
|
||||||
"version": "2.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz",
|
|
||||||
"integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/promise-coalesce": {
|
"node_modules/promise-coalesce": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/promise-coalesce/-/promise-coalesce-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/promise-coalesce/-/promise-coalesce-1.1.2.tgz",
|
||||||
@@ -6767,10 +6634,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/punycode": {
|
"node_modules/punycode": {
|
||||||
"version": "2.1.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
|
||||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
|
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
@@ -7248,11 +7114,6 @@
|
|||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/send/node_modules/ms": {
|
|
||||||
"version": "2.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
|
||||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
|
||||||
},
|
|
||||||
"node_modules/serialised-error": {
|
"node_modules/serialised-error": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz",
|
||||||
@@ -7511,6 +7372,11 @@
|
|||||||
"bare-events": "^2.2.0"
|
"bare-events": "^2.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/strict-event-emitter-types": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA=="
|
||||||
|
},
|
||||||
"node_modules/string_decoder": {
|
"node_modules/string_decoder": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||||
@@ -8112,22 +7978,11 @@
|
|||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vasync": {
|
|
||||||
"version": "2.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz",
|
|
||||||
"integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==",
|
|
||||||
"engines": [
|
|
||||||
"node >=0.6.0"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"verror": "1.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/verror": {
|
"node_modules/verror": {
|
||||||
"version": "1.10.0",
|
"version": "1.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
||||||
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
|
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
|
||||||
|
"dev": true,
|
||||||
"engines": [
|
"engines": [
|
||||||
"node >=0.6.0"
|
"node >=0.6.0"
|
||||||
],
|
],
|
||||||
@@ -8140,7 +7995,8 @@
|
|||||||
"node_modules/verror/node_modules/core-util-is": {
|
"node_modules/verror/node_modules/core-util-is": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
|
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/wait-on": {
|
"node_modules/wait-on": {
|
||||||
"version": "8.0.1",
|
"version": "8.0.1",
|
||||||
@@ -8321,11 +8177,6 @@
|
|||||||
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/wrappy": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
|
||||||
},
|
|
||||||
"node_modules/xmlbuilder": {
|
"node_modules/xmlbuilder": {
|
||||||
"version": "15.1.1",
|
"version": "15.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-backend",
|
"name": "pingvin-share-backend",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "nest build",
|
"build": "nest build",
|
||||||
"dev": "cross-env NODE_ENV=development nest start --watch",
|
"dev": "cross-env NODE_ENV=development nest start --watch",
|
||||||
@@ -25,7 +25,6 @@
|
|||||||
"@nestjs/throttler": "^6.2.1",
|
"@nestjs/throttler": "^6.2.1",
|
||||||
"@prisma/client": "^5.19.1",
|
"@prisma/client": "^5.19.1",
|
||||||
"@types/jmespath": "^0.15.2",
|
"@types/jmespath": "^0.15.2",
|
||||||
"@types/ldapjs": "^3.0.6",
|
|
||||||
"archiver": "^7.0.1",
|
"archiver": "^7.0.1",
|
||||||
"argon2": "^0.41.1",
|
"argon2": "^0.41.1",
|
||||||
"body-parser": "^1.20.3",
|
"body-parser": "^1.20.3",
|
||||||
@@ -36,7 +35,7 @@
|
|||||||
"content-disposition": "^0.5.4",
|
"content-disposition": "^0.5.4",
|
||||||
"cookie-parser": "^1.4.6",
|
"cookie-parser": "^1.4.6",
|
||||||
"jmespath": "^0.16.0",
|
"jmespath": "^0.16.0",
|
||||||
"ldapjs": "^3.0.7",
|
"ldapts": "^7.2.0",
|
||||||
"mime-types": "^2.1.35",
|
"mime-types": "^2.1.35",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"nanoid": "^3.3.7",
|
"nanoid": "^3.3.7",
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "RefreshToken" ADD COLUMN "oauthIDToken" TEXT;
|
||||||
@@ -40,6 +40,8 @@ model RefreshToken {
|
|||||||
|
|
||||||
userId String
|
userId String
|
||||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||||
|
|
||||||
|
oauthIDToken String? // prefixed with the ID of the issuing OAuth provider, separated by a colon
|
||||||
}
|
}
|
||||||
|
|
||||||
model LoginToken {
|
model LoginToken {
|
||||||
|
|||||||
@@ -178,6 +178,15 @@ const configVariables: ConfigVariables = {
|
|||||||
adminGroups: {
|
adminGroups: {
|
||||||
type: "string",
|
type: "string",
|
||||||
defaultValue: ""
|
defaultValue: ""
|
||||||
|
},
|
||||||
|
|
||||||
|
fieldNameMemberOf: {
|
||||||
|
type: "string",
|
||||||
|
defaultValue: "memberOf",
|
||||||
|
},
|
||||||
|
fieldNameEmail: {
|
||||||
|
type: "string",
|
||||||
|
defaultValue: "userPrincipalName",
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
oauth: {
|
oauth: {
|
||||||
@@ -245,6 +254,10 @@ const configVariables: ConfigVariables = {
|
|||||||
type: "string",
|
type: "string",
|
||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
},
|
},
|
||||||
|
"discord-limitedUsers": {
|
||||||
|
type: "string",
|
||||||
|
defaultValue: "",
|
||||||
|
},
|
||||||
"discord-clientId": {
|
"discord-clientId": {
|
||||||
type: "string",
|
type: "string",
|
||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
@@ -262,6 +275,10 @@ const configVariables: ConfigVariables = {
|
|||||||
type: "string",
|
type: "string",
|
||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
},
|
},
|
||||||
|
"oidc-signOut": {
|
||||||
|
type: "boolean",
|
||||||
|
defaultValue: "false",
|
||||||
|
},
|
||||||
"oidc-usernameClaim": {
|
"oidc-usernameClaim": {
|
||||||
type: "string",
|
type: "string",
|
||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ export class AuthController {
|
|||||||
})
|
})
|
||||||
@HttpCode(202)
|
@HttpCode(202)
|
||||||
async requestResetPassword(@Param("email") email: string) {
|
async requestResetPassword(@Param("email") email: string) {
|
||||||
this.authService.requestResetPassword(email);
|
await this.authService.requestResetPassword(email);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Post("resetPassword")
|
@Post("resetPassword")
|
||||||
@@ -172,13 +172,25 @@ export class AuthController {
|
|||||||
@Req() request: Request,
|
@Req() request: Request,
|
||||||
@Res({ passthrough: true }) response: Response,
|
@Res({ passthrough: true }) response: Response,
|
||||||
) {
|
) {
|
||||||
await this.authService.signOut(request.cookies.access_token);
|
const redirectURI = await this.authService.signOut(
|
||||||
response.cookie("access_token", "accessToken", { maxAge: -1 });
|
request.cookies.access_token,
|
||||||
|
);
|
||||||
|
|
||||||
|
const isSecure = this.config.get("general.appUrl").startsWith("https");
|
||||||
|
response.cookie("access_token", "", {
|
||||||
|
maxAge: -1,
|
||||||
|
secure: isSecure,
|
||||||
|
});
|
||||||
response.cookie("refresh_token", "", {
|
response.cookie("refresh_token", "", {
|
||||||
path: "/api/auth/token",
|
path: "/api/auth/token",
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
maxAge: -1,
|
maxAge: -1,
|
||||||
|
secure: isSecure,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (typeof redirectURI === "string") {
|
||||||
|
return { redirectURI: redirectURI.toString() };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Post("totp/enable")
|
@Post("totp/enable")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Module } from "@nestjs/common";
|
import { forwardRef, Module } from "@nestjs/common";
|
||||||
import { JwtModule } from "@nestjs/jwt";
|
import { JwtModule } from "@nestjs/jwt";
|
||||||
import { EmailModule } from "src/email/email.module";
|
import { EmailModule } from "src/email/email.module";
|
||||||
import { AuthController } from "./auth.controller";
|
import { AuthController } from "./auth.controller";
|
||||||
@@ -7,6 +7,7 @@ import { AuthTotpService } from "./authTotp.service";
|
|||||||
import { JwtStrategy } from "./strategy/jwt.strategy";
|
import { JwtStrategy } from "./strategy/jwt.strategy";
|
||||||
import { LdapService } from "./ldap.service";
|
import { LdapService } from "./ldap.service";
|
||||||
import { UserModule } from "../user/user.module";
|
import { UserModule } from "../user/user.module";
|
||||||
|
import { OAuthModule } from "../oauth/oauth.module";
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
@@ -14,6 +15,7 @@ import { UserModule } from "../user/user.module";
|
|||||||
global: true,
|
global: true,
|
||||||
}),
|
}),
|
||||||
EmailModule,
|
EmailModule,
|
||||||
|
forwardRef(() => OAuthModule),
|
||||||
UserModule,
|
UserModule,
|
||||||
],
|
],
|
||||||
controllers: [AuthController],
|
controllers: [AuthController],
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import {
|
import {
|
||||||
BadRequestException,
|
BadRequestException,
|
||||||
ForbiddenException,
|
ForbiddenException,
|
||||||
|
forwardRef,
|
||||||
|
Inject,
|
||||||
Injectable,
|
Injectable,
|
||||||
Logger,
|
Logger,
|
||||||
UnauthorizedException,
|
UnauthorizedException,
|
||||||
@@ -14,11 +16,12 @@ import * as moment from "moment";
|
|||||||
import { ConfigService } from "src/config/config.service";
|
import { ConfigService } from "src/config/config.service";
|
||||||
import { EmailService } from "src/email/email.service";
|
import { EmailService } from "src/email/email.service";
|
||||||
import { PrismaService } from "src/prisma/prisma.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 { AuthRegisterDTO } from "./dto/authRegister.dto";
|
||||||
import { AuthSignInDTO } from "./dto/authSignIn.dto";
|
import { AuthSignInDTO } from "./dto/authSignIn.dto";
|
||||||
import { LdapService } from "./ldap.service";
|
import { LdapService } from "./ldap.service";
|
||||||
import { inspect } from "util";
|
|
||||||
import { UserSevice } from "../user/user.service";
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AuthService {
|
export class AuthService {
|
||||||
@@ -29,6 +32,7 @@ export class AuthService {
|
|||||||
private emailService: EmailService,
|
private emailService: EmailService,
|
||||||
private ldapService: LdapService,
|
private ldapService: LdapService,
|
||||||
private userService: UserSevice,
|
private userService: UserSevice,
|
||||||
|
@Inject(forwardRef(() => OAuthService)) private oAuthService: OAuthService,
|
||||||
) {}
|
) {}
|
||||||
private readonly logger = new Logger(AuthService.name);
|
private readonly logger = new Logger(AuthService.name);
|
||||||
|
|
||||||
@@ -66,8 +70,9 @@ export class AuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async signIn(dto: AuthSignInDTO, ip: string) {
|
async signIn(dto: AuthSignInDTO, ip: string) {
|
||||||
if (!dto.email && !dto.username)
|
if (!dto.email && !dto.username) {
|
||||||
throw new BadRequestException("Email or username is required");
|
throw new BadRequestException("Email or username is required");
|
||||||
|
}
|
||||||
|
|
||||||
if (!this.config.get("oauth.disablePassword")) {
|
if (!this.config.get("oauth.disablePassword")) {
|
||||||
const user = await this.prisma.user.findFirst({
|
const user = await this.prisma.user.findFirst({
|
||||||
@@ -85,18 +90,22 @@ export class AuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.config.get("ldap.enabled")) {
|
if (this.config.get("ldap.enabled")) {
|
||||||
this.logger.debug(`Trying LDAP login for user ${dto.username}`);
|
/*
|
||||||
|
* E-mail-like user credentials are passed as the email property
|
||||||
|
* instead of the username. Since the username format does not matter
|
||||||
|
* when searching for users in LDAP, we simply use the username
|
||||||
|
* in whatever format it is provided.
|
||||||
|
*/
|
||||||
|
const ldapUsername = dto.username || dto.email;
|
||||||
|
this.logger.debug(`Trying LDAP login for user ${ldapUsername}`);
|
||||||
const ldapUser = await this.ldapService.authenticateUser(
|
const ldapUser = await this.ldapService.authenticateUser(
|
||||||
dto.username,
|
ldapUsername,
|
||||||
dto.password,
|
dto.password,
|
||||||
);
|
);
|
||||||
if (ldapUser) {
|
if (ldapUser) {
|
||||||
const user = await this.userService.findOrCreateFromLDAP(
|
const user = await this.userService.findOrCreateFromLDAP(dto, ldapUser);
|
||||||
dto.username,
|
|
||||||
ldapUser,
|
|
||||||
);
|
|
||||||
this.logger.log(
|
this.logger.log(
|
||||||
`Successful LDAP login for user ${user.email} from IP ${ip}`,
|
`Successful LDAP login for user ${ldapUsername} (${user.id}) from IP ${ip}`,
|
||||||
);
|
);
|
||||||
return this.generateToken(user);
|
return this.generateToken(user);
|
||||||
}
|
}
|
||||||
@@ -108,13 +117,10 @@ export class AuthService {
|
|||||||
throw new UnauthorizedException("Wrong email or password");
|
throw new UnauthorizedException("Wrong email or password");
|
||||||
}
|
}
|
||||||
|
|
||||||
async generateToken(user: User, isOAuth = false) {
|
async generateToken(user: User, oauth?: { idToken?: string }) {
|
||||||
// TODO: Make all old loginTokens invalid when a new one is created
|
// TODO: Make all old loginTokens invalid when a new one is created
|
||||||
// Check if the user has TOTP enabled
|
// Check if the user has TOTP enabled
|
||||||
if (
|
if (user.totpVerified && !(oauth && this.config.get("oauth.ignoreTotp"))) {
|
||||||
user.totpVerified &&
|
|
||||||
!(isOAuth && this.config.get("oauth.ignoreTotp"))
|
|
||||||
) {
|
|
||||||
const loginToken = await this.createLoginToken(user.id);
|
const loginToken = await this.createLoginToken(user.id);
|
||||||
|
|
||||||
return { loginToken };
|
return { loginToken };
|
||||||
@@ -122,6 +128,7 @@ export class AuthService {
|
|||||||
|
|
||||||
const { refreshToken, refreshTokenId } = await this.createRefreshToken(
|
const { refreshToken, refreshTokenId } = await this.createRefreshToken(
|
||||||
user.id,
|
user.id,
|
||||||
|
oauth?.idToken,
|
||||||
);
|
);
|
||||||
const accessToken = await this.createAccessToken(user, refreshTokenId);
|
const accessToken = await this.createAccessToken(user, refreshTokenId);
|
||||||
|
|
||||||
@@ -139,6 +146,15 @@ export class AuthService {
|
|||||||
|
|
||||||
if (!user) return;
|
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
|
// Delete old reset password token
|
||||||
if (user.resetPasswordToken) {
|
if (user.resetPasswordToken) {
|
||||||
await this.prisma.resetPasswordToken.delete({
|
await this.prisma.resetPasswordToken.delete({
|
||||||
@@ -153,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) {
|
async resetPassword(token: string, newPassword: string) {
|
||||||
@@ -220,12 +236,54 @@ export class AuthService {
|
|||||||
}) || {};
|
}) || {};
|
||||||
|
|
||||||
if (refreshTokenId) {
|
if (refreshTokenId) {
|
||||||
|
const oauthIDToken = await this.prisma.refreshToken
|
||||||
|
.findFirst({
|
||||||
|
select: { oauthIDToken: true },
|
||||||
|
where: { id: refreshTokenId },
|
||||||
|
})
|
||||||
|
.then((refreshToken) => refreshToken?.oauthIDToken)
|
||||||
|
.catch((e) => {
|
||||||
|
// Ignore error if refresh token doesn't exist
|
||||||
|
if (e.code != "P2025") throw e;
|
||||||
|
});
|
||||||
await this.prisma.refreshToken
|
await this.prisma.refreshToken
|
||||||
.delete({ where: { id: refreshTokenId } })
|
.delete({ where: { id: refreshTokenId } })
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
// Ignore error if refresh token doesn't exist
|
// Ignore error if refresh token doesn't exist
|
||||||
if (e.code != "P2025") throw e;
|
if (e.code != "P2025") throw e;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (typeof oauthIDToken === "string") {
|
||||||
|
const [providerName, idTokenHint] = oauthIDToken.split(":");
|
||||||
|
const provider = this.oAuthService.availableProviders()[providerName];
|
||||||
|
let signOutFromProviderSupportedAndActivated = false;
|
||||||
|
try {
|
||||||
|
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
|
||||||
|
) {
|
||||||
|
const configuration = await provider.getConfiguration();
|
||||||
|
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`),
|
||||||
|
);
|
||||||
|
return redirectURI.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,13 +302,14 @@ export class AuthService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async createRefreshToken(userId: string) {
|
async createRefreshToken(userId: string, idToken?: string) {
|
||||||
const { id, token } = await this.prisma.refreshToken.create({
|
const { id, token } = await this.prisma.refreshToken.create({
|
||||||
data: {
|
data: {
|
||||||
userId,
|
userId,
|
||||||
expiresAt: moment()
|
expiresAt: moment()
|
||||||
.add(this.config.get("general.sessionDuration"), "hours")
|
.add(this.config.get("general.sessionDuration"), "hours")
|
||||||
.toDate(),
|
.toDate(),
|
||||||
|
oauthIDToken: idToken,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -272,9 +331,11 @@ export class AuthService {
|
|||||||
refreshToken?: string,
|
refreshToken?: string,
|
||||||
accessToken?: string,
|
accessToken?: string,
|
||||||
) {
|
) {
|
||||||
|
const isSecure = this.config.get("general.appUrl").startsWith("https");
|
||||||
if (accessToken)
|
if (accessToken)
|
||||||
response.cookie("access_token", accessToken, {
|
response.cookie("access_token", accessToken, {
|
||||||
sameSite: "lax",
|
sameSite: "lax",
|
||||||
|
secure: isSecure,
|
||||||
maxAge: 1000 * 60 * 60 * 24 * 30 * 3, // 3 months
|
maxAge: 1000 * 60 * 60 * 24 * 30 * 3, // 3 months
|
||||||
});
|
});
|
||||||
if (refreshToken)
|
if (refreshToken)
|
||||||
@@ -282,6 +343,7 @@ export class AuthService {
|
|||||||
path: "/api/auth/token",
|
path: "/api/auth/token",
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
sameSite: "strict",
|
sameSite: "strict",
|
||||||
|
secure: isSecure,
|
||||||
maxAge: 1000 * 60 * 60 * this.config.get("general.sessionDuration"),
|
maxAge: 1000 * 60 * 60 * this.config.get("general.sessionDuration"),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,101 +1,7 @@
|
|||||||
import { Inject, Injectable, Logger } from "@nestjs/common";
|
import { Inject, Injectable, Logger } from "@nestjs/common";
|
||||||
import * as ldap from "ldapjs";
|
|
||||||
import {
|
|
||||||
AttributeJson,
|
|
||||||
InvalidCredentialsError,
|
|
||||||
SearchCallbackResponse,
|
|
||||||
SearchOptions,
|
|
||||||
} from "ldapjs";
|
|
||||||
import { inspect } from "node:util";
|
import { inspect } from "node:util";
|
||||||
import { ConfigService } from "../config/config.service";
|
import { ConfigService } from "../config/config.service";
|
||||||
|
import { Client, Entry, InvalidCredentialsError } from "ldapts";
|
||||||
type LdapSearchEntry = {
|
|
||||||
objectName: string;
|
|
||||||
attributes: AttributeJson[];
|
|
||||||
};
|
|
||||||
|
|
||||||
async function ldapExecuteSearch(
|
|
||||||
client: ldap.Client,
|
|
||||||
base: string,
|
|
||||||
options: SearchOptions,
|
|
||||||
): Promise<LdapSearchEntry[]> {
|
|
||||||
const searchResponse = await new Promise<SearchCallbackResponse>(
|
|
||||||
(resolve, reject) => {
|
|
||||||
client.search(base, options, (err, res) => {
|
|
||||||
if (err) {
|
|
||||||
reject(err);
|
|
||||||
} else {
|
|
||||||
resolve(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
return await new Promise<any[]>((resolve, reject) => {
|
|
||||||
const entries: LdapSearchEntry[] = [];
|
|
||||||
searchResponse.on("searchEntry", (entry) =>
|
|
||||||
entries.push({
|
|
||||||
attributes: entry.pojo.attributes,
|
|
||||||
objectName: entry.pojo.objectName,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
searchResponse.once("error", reject);
|
|
||||||
searchResponse.once("end", () => resolve(entries));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ldapBindUser(
|
|
||||||
client: ldap.Client,
|
|
||||||
dn: string,
|
|
||||||
password: string,
|
|
||||||
): Promise<void> {
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
|
||||||
client.bind(dn, password, (error) => {
|
|
||||||
if (error) {
|
|
||||||
reject(error);
|
|
||||||
} else {
|
|
||||||
resolve();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ldapCreateConnection(
|
|
||||||
logger: Logger,
|
|
||||||
url: string,
|
|
||||||
): Promise<ldap.Client> {
|
|
||||||
const ldapClient = ldap.createClient({
|
|
||||||
url: url.split(","),
|
|
||||||
connectTimeout: 10_000,
|
|
||||||
timeout: 10_000,
|
|
||||||
});
|
|
||||||
|
|
||||||
await new Promise((resolve, reject) => {
|
|
||||||
ldapClient.once("error", reject);
|
|
||||||
ldapClient.on("setupError", reject);
|
|
||||||
ldapClient.on("socketTimeout", reject);
|
|
||||||
ldapClient.on("connectRefused", () =>
|
|
||||||
reject(new Error("connection has been refused")),
|
|
||||||
);
|
|
||||||
ldapClient.on("connectTimeout", () =>
|
|
||||||
reject(new Error("connect timed out")),
|
|
||||||
);
|
|
||||||
ldapClient.on("connectError", reject);
|
|
||||||
|
|
||||||
ldapClient.on("connect", resolve);
|
|
||||||
}).catch((error) => {
|
|
||||||
logger.error(`Connect error: ${inspect(error)}`);
|
|
||||||
ldapClient.destroy();
|
|
||||||
throw error;
|
|
||||||
});
|
|
||||||
|
|
||||||
return ldapClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type LdapAuthenticateResult = {
|
|
||||||
userDn: string;
|
|
||||||
attributes: Record<string, string[]>;
|
|
||||||
};
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class LdapService {
|
export class LdapService {
|
||||||
@@ -105,40 +11,42 @@ export class LdapService {
|
|||||||
private readonly serviceConfig: ConfigService,
|
private readonly serviceConfig: ConfigService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
private async createLdapConnection(): Promise<ldap.Client> {
|
private async createLdapConnection(): Promise<Client> {
|
||||||
const ldapUrl = this.serviceConfig.get("ldap.url");
|
const ldapUrl = this.serviceConfig.get("ldap.url");
|
||||||
if (!ldapUrl) {
|
if (!ldapUrl) {
|
||||||
throw new Error("LDAP server URL is not defined");
|
throw new Error("LDAP server URL is not defined");
|
||||||
}
|
}
|
||||||
|
|
||||||
const ldapClient = await ldapCreateConnection(this.logger, ldapUrl);
|
const ldapClient = new Client({
|
||||||
try {
|
url: ldapUrl,
|
||||||
const bindDn = this.serviceConfig.get("ldap.bindDn") || null;
|
timeout: 15_000,
|
||||||
if (bindDn) {
|
connectTimeout: 15_000,
|
||||||
try {
|
});
|
||||||
await ldapBindUser(
|
|
||||||
ldapClient,
|
|
||||||
bindDn,
|
|
||||||
this.serviceConfig.get("ldap.bindPassword"),
|
|
||||||
);
|
|
||||||
} catch (error) {
|
|
||||||
this.logger.warn(`Failed to bind to default user: ${error}`);
|
|
||||||
throw new Error("failed to bind to default user");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ldapClient;
|
const bindDn = this.serviceConfig.get("ldap.bindDn") || null;
|
||||||
} catch (error) {
|
if (bindDn) {
|
||||||
ldapClient.destroy();
|
try {
|
||||||
throw error;
|
await ldapClient.bind(
|
||||||
|
bindDn,
|
||||||
|
this.serviceConfig.get("ldap.bindPassword"),
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.warn(`Failed to bind to default user: ${error}`);
|
||||||
|
throw new Error("failed to bind to default user");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ldapClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async authenticateUser(
|
public async authenticateUser(
|
||||||
username: string,
|
username: string,
|
||||||
password: string,
|
password: string,
|
||||||
): Promise<LdapAuthenticateResult | null> {
|
): Promise<Entry | null> {
|
||||||
if (!username.match(/^[a-zA-Z0-0]+$/)) {
|
if (!username.match(/^[a-zA-Z0-9-_.@]+$/)) {
|
||||||
|
this.logger.verbose(
|
||||||
|
`Username ${username} does not match username pattern. Authentication failed.`,
|
||||||
|
);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,45 +57,48 @@ export class LdapService {
|
|||||||
|
|
||||||
const ldapClient = await this.createLdapConnection();
|
const ldapClient = await this.createLdapConnection();
|
||||||
try {
|
try {
|
||||||
const [result] = await ldapExecuteSearch(ldapClient, searchBase, {
|
const { searchEntries } = await ldapClient.search(searchBase, {
|
||||||
filter: searchQuery,
|
filter: searchQuery,
|
||||||
scope: "sub",
|
scope: "sub",
|
||||||
|
|
||||||
|
attributes: ["*"],
|
||||||
|
returnAttributeValues: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!result) {
|
if (searchEntries.length > 1) {
|
||||||
|
/* too many users found */
|
||||||
|
this.logger.verbose(
|
||||||
|
`Authentication for username ${username} failed. Too many users found with query ${searchQuery}`,
|
||||||
|
);
|
||||||
|
return null;
|
||||||
|
} else if (searchEntries.length == 0) {
|
||||||
/* user not found */
|
/* user not found */
|
||||||
|
this.logger.verbose(
|
||||||
|
`Authentication for username ${username} failed. No user found with query ${searchQuery}`,
|
||||||
|
);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const targetEntity = searchEntries[0];
|
||||||
|
this.logger.verbose(
|
||||||
|
`Trying to authenticate ${username} against LDAP user ${targetEntity.dn}`,
|
||||||
|
);
|
||||||
try {
|
try {
|
||||||
await ldapBindUser(ldapClient, result.objectName, password);
|
await ldapClient.bind(targetEntity.dn, password);
|
||||||
|
return targetEntity;
|
||||||
/*
|
|
||||||
* In theory we could query the user attributes now,
|
|
||||||
* but as we must query the user attributes for validation anyways
|
|
||||||
* we'll create a second ldap server connection.
|
|
||||||
*/
|
|
||||||
return {
|
|
||||||
userDn: result.objectName,
|
|
||||||
attributes: Object.fromEntries(
|
|
||||||
result.attributes.map((attribute) => [
|
|
||||||
attribute.type,
|
|
||||||
attribute.values,
|
|
||||||
]),
|
|
||||||
),
|
|
||||||
};
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error instanceof InvalidCredentialsError) {
|
if (error instanceof InvalidCredentialsError) {
|
||||||
|
this.logger.verbose(
|
||||||
|
`Failed to authenticate ${username} against ${targetEntity.dn}. Invalid credentials.`,
|
||||||
|
);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger.warn(`LDAP user bind failure: ${inspect(error)}`);
|
this.logger.warn(`User bind failure: ${inspect(error)}`);
|
||||||
return null;
|
return null;
|
||||||
} finally {
|
|
||||||
ldapClient.destroy();
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.logger.warn(`LDAP connect error: ${inspect(error)}`);
|
this.logger.warn(`Connect error: ${inspect(error)}`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { LogLevel } from "@nestjs/common";
|
||||||
|
|
||||||
export const DATA_DIRECTORY = process.env.DATA_DIRECTORY || "./data";
|
export const DATA_DIRECTORY = process.env.DATA_DIRECTORY || "./data";
|
||||||
export const SHARE_DIRECTORY = `${DATA_DIRECTORY}/uploads/shares`;
|
export const SHARE_DIRECTORY = `${DATA_DIRECTORY}/uploads/shares`;
|
||||||
export const DATABASE_URL =
|
export const DATABASE_URL =
|
||||||
@@ -7,3 +9,7 @@ export const CLAMAV_HOST =
|
|||||||
process.env.CLAMAV_HOST ||
|
process.env.CLAMAV_HOST ||
|
||||||
(process.env.NODE_ENV == "docker" ? "clamav" : "127.0.0.1");
|
(process.env.NODE_ENV == "docker" ? "clamav" : "127.0.0.1");
|
||||||
export const CLAMAV_PORT = parseInt(process.env.CLAMAV_PORT) || 3310;
|
export const CLAMAV_PORT = parseInt(process.env.CLAMAV_PORT) || 3310;
|
||||||
|
|
||||||
|
export const LOG_LEVEL_AVAILABLE: LogLevel[] = ['verbose', 'debug', 'log', 'warn', 'error', 'fatal'];
|
||||||
|
export const LOG_LEVEL_DEFAULT: LogLevel = process.env.NODE_ENV === 'development' ? "verbose" : "log";
|
||||||
|
export const LOG_LEVEL_ENV = `${process.env.PV_LOG_LEVEL || ""}`;
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
ClassSerializerInterceptor,
|
ClassSerializerInterceptor,
|
||||||
Logger,
|
Logger,
|
||||||
|
LogLevel,
|
||||||
ValidationPipe,
|
ValidationPipe,
|
||||||
} from "@nestjs/common";
|
} from "@nestjs/common";
|
||||||
import { NestFactory, Reflector } from "@nestjs/core";
|
import { NestFactory, Reflector } from "@nestjs/core";
|
||||||
@@ -12,10 +13,35 @@ import { NextFunction, Request, Response } from "express";
|
|||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { AppModule } from "./app.module";
|
import { AppModule } from "./app.module";
|
||||||
import { ConfigService } from "./config/config.service";
|
import { ConfigService } from "./config/config.service";
|
||||||
import { DATA_DIRECTORY } from "./constants";
|
import {
|
||||||
|
DATA_DIRECTORY,
|
||||||
|
LOG_LEVEL_AVAILABLE,
|
||||||
|
LOG_LEVEL_DEFAULT,
|
||||||
|
LOG_LEVEL_ENV,
|
||||||
|
} from "./constants";
|
||||||
|
|
||||||
|
function generateNestJsLogLevels(): LogLevel[] {
|
||||||
|
if (LOG_LEVEL_ENV) {
|
||||||
|
const levelIndex = LOG_LEVEL_AVAILABLE.indexOf(LOG_LEVEL_ENV as any);
|
||||||
|
if (levelIndex === -1) {
|
||||||
|
throw new Error(`log level ${LOG_LEVEL_ENV} unknown`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return LOG_LEVEL_AVAILABLE.slice(levelIndex, LOG_LEVEL_AVAILABLE.length);
|
||||||
|
} else {
|
||||||
|
const levelIndex = LOG_LEVEL_AVAILABLE.indexOf(LOG_LEVEL_DEFAULT);
|
||||||
|
return LOG_LEVEL_AVAILABLE.slice(levelIndex, LOG_LEVEL_AVAILABLE.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function bootstrap() {
|
async function bootstrap() {
|
||||||
const app = await NestFactory.create<NestExpressApplication>(AppModule);
|
const logLevels = generateNestJsLogLevels();
|
||||||
|
Logger.log(`Showing ${logLevels.join(", ")} messages`);
|
||||||
|
|
||||||
|
const app = await NestFactory.create<NestExpressApplication>(AppModule, {
|
||||||
|
logger: logLevels,
|
||||||
|
});
|
||||||
|
|
||||||
app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
|
app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
|
||||||
app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
|
app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
|
||||||
|
|
||||||
@@ -48,7 +74,9 @@ async function bootstrap() {
|
|||||||
SwaggerModule.setup("api/swagger", app, document);
|
SwaggerModule.setup("api/swagger", app, document);
|
||||||
}
|
}
|
||||||
|
|
||||||
await app.listen(parseInt(process.env.PORT) || 8080);
|
await app.listen(
|
||||||
|
parseInt(process.env.BACKEND_PORT || process.env.PORT || "8080"),
|
||||||
|
);
|
||||||
|
|
||||||
const logger = new Logger("UnhandledAsyncError");
|
const logger = new Logger("UnhandledAsyncError");
|
||||||
process.on("unhandledRejection", (e) => logger.error(e));
|
process.on("unhandledRejection", (e) => logger.error(e));
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ export interface OAuthSignInDto {
|
|||||||
providerUsername: string;
|
providerUsername: string;
|
||||||
email: string;
|
email: string;
|
||||||
isAdmin?: boolean;
|
isAdmin?: boolean;
|
||||||
|
idToken?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Module } from "@nestjs/common";
|
import { forwardRef, Module } from "@nestjs/common";
|
||||||
import { OAuthController } from "./oauth.controller";
|
import { OAuthController } from "./oauth.controller";
|
||||||
import { OAuthService } from "./oauth.service";
|
import { OAuthService } from "./oauth.service";
|
||||||
import { AuthModule } from "../auth/auth.module";
|
import { AuthModule } from "../auth/auth.module";
|
||||||
@@ -51,6 +51,7 @@ import { MicrosoftProvider } from "./provider/microsoft.provider";
|
|||||||
inject: ["OAUTH_PROVIDERS"],
|
inject: ["OAUTH_PROVIDERS"],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
imports: [AuthModule],
|
imports: [forwardRef(() => AuthModule)],
|
||||||
|
exports: [OAuthService],
|
||||||
})
|
})
|
||||||
export class OAuthModule {}
|
export class OAuthModule {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Inject, Injectable, Logger } from "@nestjs/common";
|
import { forwardRef, Inject, Injectable, Logger } from "@nestjs/common";
|
||||||
import { User } from "@prisma/client";
|
import { User } from "@prisma/client";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import { AuthService } from "../auth/auth.service";
|
import { AuthService } from "../auth/auth.service";
|
||||||
@@ -6,14 +6,17 @@ import { ConfigService } from "../config/config.service";
|
|||||||
import { PrismaService } from "../prisma/prisma.service";
|
import { PrismaService } from "../prisma/prisma.service";
|
||||||
import { OAuthSignInDto } from "./dto/oauthSignIn.dto";
|
import { OAuthSignInDto } from "./dto/oauthSignIn.dto";
|
||||||
import { ErrorPageException } from "./exceptions/errorPage.exception";
|
import { ErrorPageException } from "./exceptions/errorPage.exception";
|
||||||
|
import { OAuthProvider } from "./provider/oauthProvider.interface";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class OAuthService {
|
export class OAuthService {
|
||||||
constructor(
|
constructor(
|
||||||
private prisma: PrismaService,
|
private prisma: PrismaService,
|
||||||
private config: ConfigService,
|
private config: ConfigService,
|
||||||
private auth: AuthService,
|
@Inject(forwardRef(() => AuthService)) private auth: AuthService,
|
||||||
@Inject("OAUTH_PLATFORMS") private platforms: string[],
|
@Inject("OAUTH_PLATFORMS") private platforms: string[],
|
||||||
|
@Inject("OAUTH_PROVIDERS")
|
||||||
|
private oAuthProviders: Record<string, OAuthProvider<unknown>>,
|
||||||
) {}
|
) {}
|
||||||
private readonly logger = new Logger(OAuthService.name);
|
private readonly logger = new Logger(OAuthService.name);
|
||||||
|
|
||||||
@@ -27,6 +30,18 @@ export class OAuthService {
|
|||||||
.map(([platform, _]) => platform);
|
.map(([platform, _]) => platform);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
availableProviders(): Record<string, OAuthProvider<unknown>> {
|
||||||
|
return Object.fromEntries(
|
||||||
|
Object.entries(this.oAuthProviders)
|
||||||
|
.map(([providerName, provider]) => [
|
||||||
|
[providerName, provider],
|
||||||
|
this.config.get(`oauth.${providerName}-enabled`),
|
||||||
|
])
|
||||||
|
.filter(([_, enabled]) => enabled)
|
||||||
|
.map(([provider, _]) => provider),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
async status(user: User) {
|
async status(user: User) {
|
||||||
const oauthUsers = await this.prisma.oAuthUser.findMany({
|
const oauthUsers = await this.prisma.oAuthUser.findMany({
|
||||||
select: {
|
select: {
|
||||||
@@ -55,7 +70,7 @@ export class OAuthService {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
this.logger.log(`Successful login for user ${user.email} from IP ${ip}`);
|
this.logger.log(`Successful login for user ${user.email} from IP ${ip}`);
|
||||||
return this.auth.generateToken(updatedUser, true);
|
return this.auth.generateToken(updatedUser, { idToken: user.idToken });
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.signUp(user, ip);
|
return this.signUp(user, ip);
|
||||||
@@ -108,8 +123,10 @@ export class OAuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async getAvailableUsername(preferredUsername: string) {
|
private async getAvailableUsername(preferredUsername: string) {
|
||||||
// only remove + and - from preferred username for now (maybe not enough)
|
// Only keep letters, numbers, dots, and underscores. Truncate to 20 characters.
|
||||||
let username = preferredUsername.replace(/[+-]/g, "").substring(0, 20);
|
let username = preferredUsername
|
||||||
|
.replace(/[^a-zA-Z0-9._]/g, "")
|
||||||
|
.substring(0, 20);
|
||||||
while (true) {
|
while (true) {
|
||||||
const user = await this.prisma.user.findFirst({
|
const user = await this.prisma.user.findFirst({
|
||||||
where: {
|
where: {
|
||||||
@@ -154,7 +171,7 @@ export class OAuthService {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
await this.updateIsAdmin(user);
|
await this.updateIsAdmin(user);
|
||||||
return this.auth.generateToken(existingUser, true);
|
return this.auth.generateToken(existingUser, { idToken: user.idToken });
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await this.auth.signUp(
|
const result = await this.auth.signUp(
|
||||||
|
|||||||
@@ -81,12 +81,17 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
|
|||||||
if (guild) {
|
if (guild) {
|
||||||
await this.checkLimitedGuild(token, guild);
|
await this.checkLimitedGuild(token, guild);
|
||||||
}
|
}
|
||||||
|
const limitedUsers = this.config.get("oauth.discord-limitedUsers");
|
||||||
|
if (limitedUsers) {
|
||||||
|
await this.checkLimitedUsers(user, limitedUsers);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
provider: "discord",
|
provider: "discord",
|
||||||
providerId: user.id,
|
providerId: user.id,
|
||||||
providerUsername: user.global_name ?? user.username,
|
providerUsername: user.global_name ?? user.username,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
|
idToken: `discord:${token.idToken}`,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,6 +112,12 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
|
|||||||
throw new ErrorPageException("user_not_allowed");
|
throw new ErrorPageException("user_not_allowed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async checkLimitedUsers(user: DiscordUser, userIds: string) {
|
||||||
|
if (!userIds.split(",").includes(user.id)) {
|
||||||
|
throw new ErrorPageException("user_not_allowed");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DiscordToken {
|
export interface DiscordToken {
|
||||||
|
|||||||
@@ -197,6 +197,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
|
|||||||
providerId: idTokenData.sub,
|
providerId: idTokenData.sub,
|
||||||
providerUsername: username,
|
providerUsername: username,
|
||||||
...(isAdmin !== undefined && { isAdmin }),
|
...(isAdmin !== undefined && { isAdmin }),
|
||||||
|
idToken: `${this.name}:${token.idToken}`,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,6 +252,8 @@ export interface OidcConfiguration {
|
|||||||
id_token_signing_alg_values_supported: string[];
|
id_token_signing_alg_values_supported: string[];
|
||||||
scopes_supported?: string[];
|
scopes_supported?: string[];
|
||||||
claims_supported?: string[];
|
claims_supported?: string[];
|
||||||
|
frontchannel_logout_supported?: boolean;
|
||||||
|
end_session_endpoint?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface OidcJwk {
|
export interface OidcJwk {
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ export class GitHubProvider implements OAuthProvider<GitHubToken> {
|
|||||||
providerId: user.id.toString(),
|
providerId: user.id.toString(),
|
||||||
providerUsername: user.name ?? user.login,
|
providerUsername: user.name ?? user.login,
|
||||||
email,
|
email,
|
||||||
|
idToken: `github:${token.idToken}`,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import { Injectable } from "@nestjs/common";
|
import { Injectable, Logger } from "@nestjs/common";
|
||||||
import { PrismaClient } from "@prisma/client";
|
import { PrismaClient } from "@prisma/client";
|
||||||
import { DATABASE_URL } from "../constants";
|
import { DATABASE_URL } from "../constants";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class PrismaService extends PrismaClient {
|
export class PrismaService extends PrismaClient {
|
||||||
|
private readonly logger = new Logger(PrismaService.name);
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super({
|
super({
|
||||||
datasources: {
|
datasources: {
|
||||||
@@ -12,6 +14,6 @@ export class PrismaService extends PrismaClient {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
super.$connect().then(() => console.info("Connected to the database"));
|
super.$connect().then(() => this.logger.log("Connected to the database"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,10 +19,14 @@ import { UpdateOwnUserDTO } from "./dto/updateOwnUser.dto";
|
|||||||
import { UpdateUserDto } from "./dto/updateUser.dto";
|
import { UpdateUserDto } from "./dto/updateUser.dto";
|
||||||
import { UserDTO } from "./dto/user.dto";
|
import { UserDTO } from "./dto/user.dto";
|
||||||
import { UserSevice } from "./user.service";
|
import { UserSevice } from "./user.service";
|
||||||
|
import { ConfigService } from "../config/config.service";
|
||||||
|
|
||||||
@Controller("users")
|
@Controller("users")
|
||||||
export class UserController {
|
export class UserController {
|
||||||
constructor(private userService: UserSevice) {}
|
constructor(
|
||||||
|
private userService: UserSevice,
|
||||||
|
private config: ConfigService,
|
||||||
|
) {}
|
||||||
|
|
||||||
// Own user operations
|
// Own user operations
|
||||||
@Get("me")
|
@Get("me")
|
||||||
@@ -49,11 +53,17 @@ export class UserController {
|
|||||||
@GetUser() user: User,
|
@GetUser() user: User,
|
||||||
@Res({ passthrough: true }) response: Response,
|
@Res({ passthrough: true }) response: Response,
|
||||||
) {
|
) {
|
||||||
response.cookie("access_token", "accessToken", { maxAge: -1 });
|
const isSecure = this.config.get("general.appUrl").startsWith("https");
|
||||||
|
|
||||||
|
response.cookie("access_token", "accessToken", {
|
||||||
|
maxAge: -1,
|
||||||
|
secure: isSecure,
|
||||||
|
});
|
||||||
response.cookie("refresh_token", "", {
|
response.cookie("refresh_token", "", {
|
||||||
path: "/api/auth/token",
|
path: "/api/auth/token",
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
maxAge: -1,
|
maxAge: -1,
|
||||||
|
secure: isSecure,
|
||||||
});
|
});
|
||||||
return new UserDTO().from(await this.userService.delete(user.id));
|
return new UserDTO().from(await this.userService.delete(user.id));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { BadRequestException, Injectable } from "@nestjs/common";
|
import { BadRequestException, Injectable, Logger } from "@nestjs/common";
|
||||||
import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library";
|
import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library";
|
||||||
import * as argon from "argon2";
|
import * as argon from "argon2";
|
||||||
import * as crypto from "crypto";
|
import * as crypto from "crypto";
|
||||||
@@ -8,10 +8,14 @@ import { FileService } from "../file/file.service";
|
|||||||
import { CreateUserDTO } from "./dto/createUser.dto";
|
import { CreateUserDTO } from "./dto/createUser.dto";
|
||||||
import { UpdateUserDto } from "./dto/updateUser.dto";
|
import { UpdateUserDto } from "./dto/updateUser.dto";
|
||||||
import { ConfigService } from "../config/config.service";
|
import { ConfigService } from "../config/config.service";
|
||||||
import { LdapAuthenticateResult } from "../auth/ldap.service";
|
import { Entry } from "ldapts";
|
||||||
|
import { AuthSignInDTO } from "src/auth/dto/authSignIn.dto";
|
||||||
|
import { inspect } from "util";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UserSevice {
|
export class UserSevice {
|
||||||
|
private readonly logger = new Logger(UserSevice.name);
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private prisma: PrismaService,
|
private prisma: PrismaService,
|
||||||
private emailService: EmailService,
|
private emailService: EmailService,
|
||||||
@@ -92,33 +96,114 @@ export class UserSevice {
|
|||||||
return await this.prisma.user.delete({ where: { id } });
|
return await this.prisma.user.delete({ where: { id } });
|
||||||
}
|
}
|
||||||
|
|
||||||
async findOrCreateFromLDAP(username: string, ldap: LdapAuthenticateResult) {
|
async findOrCreateFromLDAP(
|
||||||
const passwordHash = await argon.hash(crypto.randomUUID());
|
providedCredentials: AuthSignInDTO,
|
||||||
const userEmail =
|
ldapEntry: Entry,
|
||||||
ldap.attributes["userPrincipalName"]?.at(0) ??
|
) {
|
||||||
`${crypto.randomUUID()}@ldap.local`;
|
const fieldNameMemberOf = this.configService.get("ldap.fieldNameMemberOf");
|
||||||
const adminGroup = this.configService.get("ldap.adminGroups");
|
const fieldNameEmail = this.configService.get("ldap.fieldNameEmail");
|
||||||
const isAdmin = ldap.attributes["memberOf"]?.includes(adminGroup) ?? false;
|
|
||||||
|
let isAdmin = false;
|
||||||
|
if (fieldNameMemberOf in ldapEntry) {
|
||||||
|
const adminGroup = this.configService.get("ldap.adminGroups");
|
||||||
|
const entryGroups = Array.isArray(ldapEntry[fieldNameMemberOf])
|
||||||
|
? ldapEntry[fieldNameMemberOf]
|
||||||
|
: [ldapEntry[fieldNameMemberOf]];
|
||||||
|
isAdmin = entryGroups.includes(adminGroup) ?? false;
|
||||||
|
} else {
|
||||||
|
this.logger.warn(
|
||||||
|
`Trying to create/update a ldap user but the member field ${fieldNameMemberOf} is not present.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let userEmail: string | null = null;
|
||||||
|
if (fieldNameEmail in ldapEntry) {
|
||||||
|
const value = Array.isArray(ldapEntry[fieldNameEmail])
|
||||||
|
? ldapEntry[fieldNameEmail][0]
|
||||||
|
: ldapEntry[fieldNameEmail];
|
||||||
|
if (value) {
|
||||||
|
userEmail = value.toString();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.logger.warn(
|
||||||
|
`Trying to create/update a ldap user but the email field ${fieldNameEmail} is not present.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (providedCredentials.email) {
|
||||||
|
/* if LDAP does not provides an users email address, take the user provided email address instead */
|
||||||
|
userEmail = providedCredentials.email;
|
||||||
|
}
|
||||||
|
|
||||||
|
const randomId = crypto.randomUUID();
|
||||||
|
const placeholderUsername = `ldap_user_${randomId}`;
|
||||||
|
const placeholderEMail = `${randomId}@ldap.local`;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return await this.prisma.user.upsert({
|
const user = await this.prisma.user.upsert({
|
||||||
create: {
|
create: {
|
||||||
username,
|
username: providedCredentials.username ?? placeholderUsername,
|
||||||
email: userEmail,
|
email: userEmail ?? placeholderEMail,
|
||||||
password: passwordHash,
|
password: await argon.hash(crypto.randomUUID()),
|
||||||
isAdmin,
|
|
||||||
ldapDN: ldap.userDn,
|
|
||||||
},
|
|
||||||
update: {
|
|
||||||
username,
|
|
||||||
email: userEmail,
|
|
||||||
|
|
||||||
isAdmin,
|
isAdmin,
|
||||||
ldapDN: ldap.userDn,
|
ldapDN: ldapEntry.dn,
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
isAdmin,
|
||||||
|
ldapDN: ldapEntry.dn,
|
||||||
},
|
},
|
||||||
where: {
|
where: {
|
||||||
ldapDN: ldap.userDn,
|
ldapDN: ldapEntry.dn,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (user.username === placeholderUsername) {
|
||||||
|
/* Give the user a human readable name if the user has been created with a placeholder username */
|
||||||
|
await this.prisma.user
|
||||||
|
.update({
|
||||||
|
where: {
|
||||||
|
id: user.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
username: `user_${user.id}`,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((newUser) => {
|
||||||
|
user.username = newUser.username;
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
this.logger.warn(
|
||||||
|
`Failed to update users ${user.id} placeholder username: ${inspect(error)}`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (userEmail && userEmail !== user.email) {
|
||||||
|
/* Sync users email if it has changed */
|
||||||
|
await this.prisma.user
|
||||||
|
.update({
|
||||||
|
where: {
|
||||||
|
id: user.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
email: userEmail,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((newUser) => {
|
||||||
|
this.logger.log(
|
||||||
|
`Updated users ${user.id} email from ldap from ${user.email} to ${userEmail}.`,
|
||||||
|
);
|
||||||
|
user.email = newUser.email;
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
this.logger.error(
|
||||||
|
`Failed to update users ${user.id} email to ${userEmail}: ${inspect(error)}`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return user;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof PrismaClientKnownRequestError) {
|
if (e instanceof PrismaClientKnownRequestError) {
|
||||||
if (e.code == "P2002") {
|
if (e.code == "P2002") {
|
||||||
|
|||||||
@@ -34,13 +34,13 @@ For installation specific configuration, you can use environment variables. The
|
|||||||
|
|
||||||
#### Backend
|
#### Backend
|
||||||
|
|
||||||
| Variable | Default Value | Description |
|
| Variable | Default Value | Description |
|
||||||
| ---------------- | -------------------------------------------------- | -------------------------------------- |
|
| ---------------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
||||||
| `PORT` | `8080` | The port on which the backend listens. |
|
| `BACKEND_PORT` | `8080` | The port on which the backend listens. |
|
||||||
| `DATABASE_URL` | `file:../data/pingvin-share.db?connection_limit=1` | The URL of the SQLite database. |
|
| `DATABASE_URL` | `file:../data/pingvin-share.db?connection_limit=1` | The URL of the SQLite database. |
|
||||||
| `DATA_DIRECTORY` | `./data` | The directory where data is stored. |
|
| `DATA_DIRECTORY` | `./data` | The directory where data is stored. |
|
||||||
| `CLAMAV_HOST` | `127.0.0.1` | The IP address of the ClamAV server. |
|
| `CLAMAV_HOST` | `127.0.0.1` or `clamav` when running with Docker | The IP address of the ClamAV server. See the [ClamAV docs](integrations.md#clamav) for more information. |
|
||||||
| `CLAMAV_PORT` | `3310` | The port number of the ClamAV server. |
|
| `CLAMAV_PORT` | `3310` | The port number of the ClamAV server. |
|
||||||
|
|
||||||
#### Frontend
|
#### Frontend
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ cd ../frontend
|
|||||||
npm install
|
npm install
|
||||||
npm run build
|
npm run build
|
||||||
API_URL=http://localhost:8080 # Set the URL of the backend, default: http://localhost:8080
|
API_URL=http://localhost:8080 # Set the URL of the backend, default: http://localhost:8080
|
||||||
pm2 start --name="pingvin-share-frontend" .next/standalone/server.js
|
pm2 start npm --name "pingvin-share-frontend" -- run start
|
||||||
```
|
```
|
||||||
|
|
||||||
**Uploading Large Files**: By default, Pingvin Share uses a built-in reverse proxy to reduce the installation steps. However, this reverse proxy is not optimized for uploading large files. If you wish to upload larger files, you can either use the Docker installation or set up your own reverse proxy. An example configuration for Caddy can be found in `./reverse-proxy/Caddyfile`.
|
**Uploading Large Files**: By default, Pingvin Share uses a built-in reverse proxy to reduce the installation steps. However, this reverse proxy is not optimized for uploading large files. If you wish to upload larger files, you can either use the Docker installation or set up your own reverse proxy. An example configuration for Caddy can be found in `./reverse-proxy/Caddyfile`.
|
||||||
|
|||||||
@@ -4,12 +4,18 @@ id: integrations
|
|||||||
|
|
||||||
# Integrations
|
# Integrations
|
||||||
|
|
||||||
#### ClamAV
|
## ClamAV
|
||||||
|
|
||||||
> **_NOTE:_** Currently ClamAV is only available in the Docker installation.
|
|
||||||
|
|
||||||
ClamAV is used to scan shares for malicious files and remove them if found.
|
ClamAV is used to scan shares for malicious files and remove them if found.
|
||||||
|
|
||||||
|
Please note that ClamAV needs a lot of [ressources](https://docs.clamav.net/manual/Installing/Docker.html#memory-ram-requirements).
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
If you are already running ClamAV elsewhere, you can specify the `CLAMAV_HOST` environment variable to point to that instance.
|
||||||
|
|
||||||
|
Else you have to add the ClamAV container to the Pingvin Share Docker Compose stack:
|
||||||
|
|
||||||
1. Add the ClamAV container to the Docker Compose stack and start the container.
|
1. Add the ClamAV container to the Docker Compose stack and start the container.
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
@@ -30,4 +36,7 @@ services:
|
|||||||
2. Docker will wait for ClamAV to start before starting Pingvin Share. This may take a minute or two.
|
2. Docker will wait for ClamAV to start before starting Pingvin Share. This may take a minute or two.
|
||||||
3. The Pingvin Share logs should now log "ClamAV is active"
|
3. The Pingvin Share logs should now log "ClamAV is active"
|
||||||
|
|
||||||
Please note that ClamAV needs a lot of [ressources](https://docs.clamav.net/manual/Installing/Docker.html#memory-ram-requirements).
|
### Stand-Alone
|
||||||
|
|
||||||
|
1. Install ClamAV
|
||||||
|
2. Specify the `CLAMAV_HOST` environment variable for the backend and restart the Pingvin Share backend.
|
||||||
|
|||||||
@@ -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.
|
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
|
## Custom your OAuth 2 Provider
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,6 @@ docker compose up -d
|
|||||||
cd ../frontend
|
cd ../frontend
|
||||||
npm install
|
npm install
|
||||||
npm run build
|
npm run build
|
||||||
API_URL=http://localhost:8080 # Set the URL of the backend, default: http://localhost:8080
|
|
||||||
pm2 restart pingvin-share-frontend
|
pm2 restart pingvin-share-frontend
|
||||||
```
|
```
|
||||||
|
Note that environemnt variables are not picked up when using pm2 restart, if you actually want to change configs, you need to run ````pm2 --update-env restart````
|
||||||
|
|||||||
@@ -56,6 +56,11 @@ const sidebars: SidebarsConfig = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: "link",
|
||||||
|
label: "Demo",
|
||||||
|
href: "https://pingvin-share.dev.eliasschneider.com",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: "link",
|
type: "link",
|
||||||
label: "Discord",
|
label: "Discord",
|
||||||
|
|||||||
4
frontend/package-lock.json
generated
4
frontend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-frontend",
|
"name": "pingvin-share-frontend",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pingvin-share-frontend",
|
"name": "pingvin-share-frontend",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.13.3",
|
"@emotion/react": "^11.13.3",
|
||||||
"@emotion/server": "^11.11.0",
|
"@emotion/server": "^11.11.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-frontend",
|
"name": "pingvin-share-frontend",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
|
|||||||
@@ -80,9 +80,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
|
|||||||
useState(false);
|
useState(false);
|
||||||
|
|
||||||
const validationSchema = yup.object().shape({
|
const validationSchema = yup.object().shape({
|
||||||
emailOrUsername: config.get("ldap.enabled")
|
emailOrUsername: yup.string().required(t("common.error.field-required")),
|
||||||
? yup.string().matches(/^[^@]+$/, t("signIn.error.invalid-username"))
|
|
||||||
: yup.string().required(t("common.error.field-required")),
|
|
||||||
password: yup
|
password: yup
|
||||||
.string()
|
.string()
|
||||||
.min(8, t("common.error.too-short", { length: 8 }))
|
.min(8, t("common.error.too-short", { length: 8 }))
|
||||||
@@ -99,7 +97,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
|
|||||||
|
|
||||||
const signIn = async (email: string, password: string) => {
|
const signIn = async (email: string, password: string) => {
|
||||||
await authService
|
await authService
|
||||||
.signIn(email, password)
|
.signIn(email.trim(), password.trim())
|
||||||
.then(async (response) => {
|
.then(async (response) => {
|
||||||
if (response.data["loginToken"]) {
|
if (response.data["loginToken"]) {
|
||||||
// Prompt the user to enter their totp code
|
// Prompt the user to enter their totp code
|
||||||
@@ -174,16 +172,8 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
|
|||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<TextInput
|
<TextInput
|
||||||
label={
|
label={t("signin.input.email-or-username")}
|
||||||
config.get("ldap.enabled")
|
placeholder={t("signin.input.email-or-username.placeholder")}
|
||||||
? t("signup.input.username")
|
|
||||||
: t("signin.input.email-or-username")
|
|
||||||
}
|
|
||||||
placeholder={
|
|
||||||
config.get("ldap.enabled")
|
|
||||||
? t("signup.input.username.placeholder")
|
|
||||||
: t("signin.input.email-or-username.placeholder")
|
|
||||||
}
|
|
||||||
{...form.getInputProps("emailOrUsername")}
|
{...form.getInputProps("emailOrUsername")}
|
||||||
/>
|
/>
|
||||||
<PasswordInput
|
<PasswordInput
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ const SignUpForm = () => {
|
|||||||
|
|
||||||
const signUp = async (email: string, username: string, password: string) => {
|
const signUp = async (email: string, username: string, password: string) => {
|
||||||
await authService
|
await authService
|
||||||
.signUp(email, username, password)
|
.signUp(email.trim(), username.trim(), password.trim())
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
const user = await refreshUser();
|
const user = await refreshUser();
|
||||||
if (user?.isAdmin) {
|
if (user?.isAdmin) {
|
||||||
|
|||||||
@@ -9,11 +9,13 @@ import {
|
|||||||
Switch,
|
Switch,
|
||||||
Text,
|
Text,
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
import { useForm } from "@mantine/form";
|
import { useForm, yupResolver } from "@mantine/form";
|
||||||
import { useModals } from "@mantine/modals";
|
import { useModals } from "@mantine/modals";
|
||||||
import { ModalsContextProps } from "@mantine/modals/lib/context";
|
import { ModalsContextProps } from "@mantine/modals/lib/context";
|
||||||
|
import { getCookie, setCookie } from "cookies-next";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage } from "react-intl";
|
||||||
|
import * as yup from "yup";
|
||||||
import useTranslate, {
|
import useTranslate, {
|
||||||
translateOutsideContext,
|
translateOutsideContext,
|
||||||
} from "../../../hooks/useTranslate.hook";
|
} from "../../../hooks/useTranslate.hook";
|
||||||
@@ -22,7 +24,6 @@ import { getExpirationPreview } from "../../../utils/date.util";
|
|||||||
import toast from "../../../utils/toast.util";
|
import toast from "../../../utils/toast.util";
|
||||||
import FileSizeInput from "../FileSizeInput";
|
import FileSizeInput from "../FileSizeInput";
|
||||||
import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
|
import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
|
||||||
import { getCookie, setCookie } from "cookies-next";
|
|
||||||
|
|
||||||
const showCreateReverseShareModal = (
|
const showCreateReverseShareModal = (
|
||||||
modals: ModalsContextProps,
|
modals: ModalsContextProps,
|
||||||
@@ -65,6 +66,16 @@ const Body = ({
|
|||||||
simplified: !!(getCookie("reverse-share.simplified") ?? false),
|
simplified: !!(getCookie("reverse-share.simplified") ?? false),
|
||||||
publicAccess: !!(getCookie("reverse-share.public-access") ?? true),
|
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) => {
|
const onSubmit = form.onSubmit(async (values) => {
|
||||||
|
|||||||
@@ -370,9 +370,8 @@ const CreateUploadModalBody = ({
|
|||||||
placeholder={t("upload.modal.accordion.email.placeholder")}
|
placeholder={t("upload.modal.accordion.email.placeholder")}
|
||||||
searchable
|
searchable
|
||||||
creatable
|
creatable
|
||||||
id="recipient_email"
|
id="recipient-emails"
|
||||||
autoComplete="email"
|
inputMode="email"
|
||||||
type="email"
|
|
||||||
getCreateLabel={(query) => `+ ${query}`}
|
getCreateLabel={(query) => `+ ${query}`}
|
||||||
onCreate={(query) => {
|
onCreate={(query) => {
|
||||||
if (!query.match(/^\S+@\S+\.\S+$/)) {
|
if (!query.match(/^\S+@\S+\.\S+$/)) {
|
||||||
@@ -426,7 +425,7 @@ const CreateUploadModalBody = ({
|
|||||||
"upload.modal.accordion.security.password.placeholder",
|
"upload.modal.accordion.security.password.placeholder",
|
||||||
)}
|
)}
|
||||||
label={t("upload.modal.accordion.security.password.label")}
|
label={t("upload.modal.accordion.security.password.label")}
|
||||||
autoComplete="off"
|
autoComplete="new-password"
|
||||||
{...form.getInputProps("password")}
|
{...form.getInputProps("password")}
|
||||||
/>
|
/>
|
||||||
<NumberInput
|
<NumberInput
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "تفعيل الدخول باستخدام OpenID Connect",
|
"admin.config.oauth.oidc-enabled.description": "تفعيل الدخول باستخدام OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "رابط الاستكشاف لتطبيق OpenID Connect OAuth",
|
"admin.config.oauth.oidc-discovery-uri.description": "رابط الاستكشاف لتطبيق OpenID Connect 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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "طلب اسم المستخدم في رمز معرف OpenID Connect. إذا كنت لا تعرف معنى هذا الإعداد، اتركه فارغًا.",
|
"admin.config.oauth.oidc-username-claim.description": "طلب اسم المستخدم في رمز معرف OpenID Connect. إذا كنت لا تعرف معنى هذا الإعداد، اتركه فارغًا.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "هذه الصفحة غير موجودة.",
|
"404.description": "هذه الصفحة غير موجودة.",
|
||||||
"404.button.home": "أعدني للصفحة الرئيسية",
|
"404.button.home": "أعدني للصفحة الرئيسية",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "الرابط",
|
"common.text.link": "الرابط",
|
||||||
"common.text.navigate-to-link": "الذهاب إلى الرابط",
|
"common.text.navigate-to-link": "الذهاب إلى الرابط",
|
||||||
"common.text.or": "أو",
|
"common.text.or": "أو",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "العودة",
|
"common.button.go-back": "العودة",
|
||||||
"common.button.go-home": "العودة للصفحة الرئيسية",
|
"common.button.go-home": "العودة للصفحة الرئيسية",
|
||||||
"common.notify.copied": "تم نسخ الرابط إلى الحافظة",
|
"common.notify.copied": "تم نسخ الرابط إلى الحافظة",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "عنوان البريد غير صحيح",
|
"common.error.invalid-email": "عنوان البريد غير صحيح",
|
||||||
"common.error.too-short": "يجب أن يكون على الأقل {length} حرفًا",
|
"common.error.too-short": "يجب أن يكون على الأقل {length} حرفًا",
|
||||||
"common.error.too-long": "يجب أن يكون على الأكثر {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.exact-length": "يجب أن يكون بالضبط {length} حرفًا",
|
||||||
"common.error.invalid-number": "يجب أن يكون رقماً",
|
"common.error.invalid-number": "يجب أن يكون رقماً",
|
||||||
"common.error.field-required": "هذا الحقل مطلوب"
|
"common.error.field-required": "هذا الحقل مطلوب"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Oops this page doesn't exist.",
|
"404.description": "Oops this page doesn't exist.",
|
||||||
"404.button.home": "Bring me back home",
|
"404.button.home": "Bring me back home",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Link",
|
"common.text.link": "Link",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Go to the link",
|
||||||
"common.text.or": "or",
|
"common.text.or": "or",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Go back",
|
"common.button.go-back": "Go back",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Go home",
|
||||||
"common.notify.copied": "Your link was copied to the clipboard",
|
"common.notify.copied": "Your link was copied to the clipboard",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Invalid email address",
|
||||||
"common.error.too-short": "Must be at least {length} characters",
|
"common.error.too-short": "Must be at least {length} characters",
|
||||||
"common.error.too-long": "Must be at most {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.exact-length": "Must be exactly {length} characters",
|
||||||
"common.error.invalid-number": "Must be a number",
|
"common.error.invalid-number": "Must be a number",
|
||||||
"common.error.field-required": "This field is required"
|
"common.error.field-required": "This field is required"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Zda je povoleno přihlášení přes OpenID Connect",
|
"admin.config.oauth.oidc-enabled.description": "Zda je povoleno přihlášení přes OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Skupina potřebná pro administrativní přístup.",
|
"admin.config.ldap.admin-groups.description": "Skupina potřebná pro administrativní přístup.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Jejda, tato stránka neexistuje.",
|
"404.description": "Jejda, tato stránka neexistuje.",
|
||||||
"404.button.home": "Bring me back home",
|
"404.button.home": "Bring me back home",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Odkaz",
|
"common.text.link": "Odkaz",
|
||||||
"common.text.navigate-to-link": "Přejít na odkaz",
|
"common.text.navigate-to-link": "Přejít na odkaz",
|
||||||
"common.text.or": "nebo",
|
"common.text.or": "nebo",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Vrátit se zpět",
|
"common.button.go-back": "Vrátit se zpět",
|
||||||
"common.button.go-home": "Jít domů",
|
"common.button.go-home": "Jít domů",
|
||||||
"common.notify.copied": "Váš odkaz byl zkopírován do schránky",
|
"common.notify.copied": "Váš odkaz byl zkopírován do schránky",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Invalid email address",
|
||||||
"common.error.too-short": "Musí mít alespoň {length} znaků",
|
"common.error.too-short": "Musí mít alespoň {length} znaků",
|
||||||
"common.error.too-long": "Musí mít maximálně {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.exact-length": "Musí mít přesně {length} znaků",
|
||||||
"common.error.invalid-number": "Musí být číslo",
|
"common.error.invalid-number": "Musí být číslo",
|
||||||
"common.error.field-required": "Toto pole je povinné"
|
"common.error.field-required": "Toto pole je povinné"
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "2-faktor login påkrævet",
|
"signIn.notify.totp-required.title": "2-faktor login påkrævet",
|
||||||
"signIn.notify.totp-required.description": "Indtast den aktuelle engangskode fra din 2-faktor Authenticator",
|
"signIn.notify.totp-required.description": "Indtast den aktuelle engangskode fra din 2-faktor Authenticator",
|
||||||
"signIn.oauth.or": "OR",
|
"signIn.oauth.or": "OR",
|
||||||
"signIn.oauth.signInWith": "Sign in with",
|
"signIn.oauth.signInWith": "Log ind med",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -58,7 +58,7 @@ export default {
|
|||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "Glemt din adgangskode?",
|
"resetPassword.title": "Glemt din adgangskode?",
|
||||||
"resetPassword.description": "Indtast din e-mail for at nulstille din adgangskode.",
|
"resetPassword.description": "Indtast din e-mail for at nulstille din adgangskode.",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "En besked med et link til at nulstille din adgangskode er blevet sendt, hvis e-mailen eksisterer.",
|
||||||
"resetPassword.button.back": "Tilbage til login",
|
"resetPassword.button.back": "Tilbage til login",
|
||||||
"resetPassword.text.resetPassword": "Nulstil adgangskode",
|
"resetPassword.text.resetPassword": "Nulstil adgangskode",
|
||||||
"resetPassword.text.enterNewPassword": "Indtast din nye adgangskode",
|
"resetPassword.text.enterNewPassword": "Indtast din nye adgangskode",
|
||||||
@@ -135,7 +135,7 @@ export default {
|
|||||||
"account.reverseShares.title.empty": "Der er tomt her 👀",
|
"account.reverseShares.title.empty": "Der er tomt her 👀",
|
||||||
"account.reverseShares.description.empty": "You don't have any reverse shares.",
|
"account.reverseShares.description.empty": "You don't have any reverse shares.",
|
||||||
// showCreateReverseShareModal.tsx
|
// showCreateReverseShareModal.tsx
|
||||||
"account.reverseShares.modal.title": "Create reverse share",
|
"account.reverseShares.modal.title": "Opret omvendt deling",
|
||||||
"account.reverseShares.modal.expiration.label": "Udløb",
|
"account.reverseShares.modal.expiration.label": "Udløb",
|
||||||
"account.reverseShares.modal.expiration.minute-singular": "Minut",
|
"account.reverseShares.modal.expiration.minute-singular": "Minut",
|
||||||
"account.reverseShares.modal.expiration.minute-plural": "Minutter",
|
"account.reverseShares.modal.expiration.minute-plural": "Minutter",
|
||||||
@@ -154,7 +154,7 @@ export default {
|
|||||||
"account.reverseShares.modal.send-email.description": "Send en e-mail notifikation, når der oprettes en deling med dette omvendte delingslink.",
|
"account.reverseShares.modal.send-email.description": "Send en e-mail notifikation, når der oprettes en deling med dette omvendte delingslink.",
|
||||||
"account.reverseShares.modal.simplified": "Simple mode",
|
"account.reverseShares.modal.simplified": "Simple mode",
|
||||||
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.",
|
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.",
|
||||||
"account.reverseShares.modal.public-access": "Public access",
|
"account.reverseShares.modal.public-access": "Offentlig adgang",
|
||||||
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.",
|
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.",
|
||||||
"account.reverseShares.modal.max-use.label": "Maksimal anvendelser",
|
"account.reverseShares.modal.max-use.label": "Maksimal anvendelser",
|
||||||
"account.reverseShares.modal.max-use.description": "Det maksimale antal gange, denne URL kan bruges til at oprette en deling.",
|
"account.reverseShares.modal.max-use.description": "Det maksimale antal gange, denne URL kan bruges til at oprette en deling.",
|
||||||
@@ -168,7 +168,7 @@ export default {
|
|||||||
"account.reverseShares.table.max-size": "Maksimal størrelse for deling",
|
"account.reverseShares.table.max-size": "Maksimal størrelse for deling",
|
||||||
"account.reverseShares.table.expires": "Udløber d",
|
"account.reverseShares.table.expires": "Udløber d",
|
||||||
"account.reverseShares.modal.reverse-share-link": "Reverse share link",
|
"account.reverseShares.modal.reverse-share-link": "Reverse share link",
|
||||||
"account.reverseShares.modal.delete.title": "Delete reverse share",
|
"account.reverseShares.modal.delete.title": "Slet omvendt deling",
|
||||||
"account.reverseShares.modal.delete.description": "Ønsker du virkelig at slette denne omvendte deling? Hvis du gør det, vil de tilknyttede delinger også blive slettet.",
|
"account.reverseShares.modal.delete.description": "Ønsker du virkelig at slette denne omvendte deling? Hvis du gør det, vil de tilknyttede delinger også blive slettet.",
|
||||||
// END /account/reverseShares
|
// END /account/reverseShares
|
||||||
// /admin
|
// /admin
|
||||||
@@ -244,7 +244,7 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Måneder",
|
"upload.modal.expires.month-plural": "Måneder",
|
||||||
"upload.modal.expires.year-singular": "År",
|
"upload.modal.expires.year-singular": "År",
|
||||||
"upload.modal.expires.year-plural": "År",
|
"upload.modal.expires.year-plural": "År",
|
||||||
"upload.modal.accordion.name-and-description.title": "Name and description",
|
"upload.modal.accordion.name-and-description.title": "Navn og beskrivelse",
|
||||||
"upload.modal.accordion.name-and-description.name.placeholder": "Navn",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Navn",
|
||||||
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "E-mail modtagere",
|
"upload.modal.accordion.email.title": "E-mail modtagere",
|
||||||
@@ -269,7 +269,7 @@ export default {
|
|||||||
"share.error.removed.title": "Deling fjernet",
|
"share.error.removed.title": "Deling fjernet",
|
||||||
"share.error.not-found.title": "Delingen blev ikke fundet",
|
"share.error.not-found.title": "Delingen blev ikke fundet",
|
||||||
"share.error.not-found.description": "Den deling, du leder efter, eksisterer ikke.",
|
"share.error.not-found.description": "Den deling, du leder efter, eksisterer ikke.",
|
||||||
"share.error.access-denied.title": "Private share",
|
"share.error.access-denied.title": "Privat deling",
|
||||||
"share.error.access-denied.description": "The current account does not have permission to access this share",
|
"share.error.access-denied.description": "The current account does not have permission to access this share",
|
||||||
"share.modal.password.title": "Adgangskode påkrævet",
|
"share.modal.password.title": "Adgangskode påkrævet",
|
||||||
"share.modal.password.description": "For at få adgang til denne deling, indtast venligst adgangskoden til delingen.",
|
"share.modal.password.description": "For at få adgang til denne deling, indtast venligst adgangskoden til delingen.",
|
||||||
@@ -287,7 +287,7 @@ export default {
|
|||||||
"share.edit.title": "Rediger {shareId}",
|
"share.edit.title": "Rediger {shareId}",
|
||||||
"share.edit.append-upload": "Append file",
|
"share.edit.append-upload": "Append file",
|
||||||
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
|
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
|
||||||
"share.edit.notify.save-success": "Share updated successfully",
|
"share.edit.notify.save-success": "Deling opdateret",
|
||||||
// END /share/[id]/edit
|
// END /share/[id]/edit
|
||||||
// /admin/config
|
// /admin/config
|
||||||
"admin.config.title": "Konfiguration",
|
"admin.config.title": "Konfiguration",
|
||||||
@@ -355,13 +355,13 @@ export default {
|
|||||||
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Tillad registrering",
|
"admin.config.oauth.allow-registration": "Tillad registrering",
|
||||||
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
"admin.config.oauth.allow-registration.description": "Tillad brugere at registrere sig via socialt login",
|
||||||
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
||||||
"admin.config.oauth.disable-password": "Disable password login",
|
"admin.config.oauth.disable-password": "Deaktiver login med password",
|
||||||
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
|
"admin.config.oauth.github-enabled.description": "Om GitHub login er aktiveret",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
||||||
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app",
|
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app",
|
||||||
"admin.config.oauth.github-client-secret": "GitHub Client secret",
|
"admin.config.oauth.github-client-secret": "GitHub Client secret",
|
||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -405,7 +407,7 @@ export default {
|
|||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
|
||||||
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
|
||||||
"admin.config.category.ldap": "LDAP",
|
"admin.config.category.ldap": "LDAP",
|
||||||
"admin.config.ldap.enabled": "Enabled LDAP",
|
"admin.config.ldap.enabled": "Aktiveret LDAP",
|
||||||
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
|
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
|
||||||
"admin.config.ldap.url": "Server URL",
|
"admin.config.ldap.url": "Server URL",
|
||||||
"admin.config.ldap.url.description": "URL of the LDAP server",
|
"admin.config.ldap.url.description": "URL of the LDAP server",
|
||||||
@@ -417,8 +419,12 @@ export default {
|
|||||||
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed",
|
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed",
|
||||||
"admin.config.ldap.search-query": "User query",
|
"admin.config.ldap.search-query": "User query",
|
||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin gruppe",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Gruppe påkrævet for administrativ adgang.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Ups! Denne side findes ikke.",
|
"404.description": "Ups! Denne side findes ikke.",
|
||||||
"404.button.home": "Gå tilbage",
|
"404.button.home": "Gå tilbage",
|
||||||
@@ -426,7 +432,7 @@ export default {
|
|||||||
"error.title": "Fejl",
|
"error.title": "Fejl",
|
||||||
"error.description": "Hovsa!",
|
"error.description": "Hovsa!",
|
||||||
"error.button.back": "Gå tilbage",
|
"error.button.back": "Gå tilbage",
|
||||||
"error.msg.default": "Something went wrong.",
|
"error.msg.default": "Noget gik galt.",
|
||||||
"error.msg.access_denied": "You canceled the authentication process, please try again.",
|
"error.msg.access_denied": "You canceled the authentication process, please try again.",
|
||||||
"error.msg.expired_token": "The authentication process took too long, please try again.",
|
"error.msg.expired_token": "The authentication process took too long, please try again.",
|
||||||
"error.msg.invalid_token": "Intern Fejl",
|
"error.msg.invalid_token": "Intern Fejl",
|
||||||
@@ -454,8 +460,9 @@ export default {
|
|||||||
"common.button.generate": "Generer",
|
"common.button.generate": "Generer",
|
||||||
"common.button.done": "Færdig",
|
"common.button.done": "Færdig",
|
||||||
"common.text.link": "Link",
|
"common.text.link": "Link",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Gå til linket",
|
||||||
"common.text.or": "eller",
|
"common.text.or": "eller",
|
||||||
|
"common.text.redirecting": "Omdirigerer...",
|
||||||
"common.button.go-back": "Gå tilbage",
|
"common.button.go-back": "Gå tilbage",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Go home",
|
||||||
"common.notify.copied": "Linket blev kopieret til udklipsholderen",
|
"common.notify.copied": "Linket blev kopieret til udklipsholderen",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Ugyldig e-mail",
|
"common.error.invalid-email": "Ugyldig e-mail",
|
||||||
"common.error.too-short": "Skal være på mindst {length} tegn",
|
"common.error.too-short": "Skal være på mindst {length} tegn",
|
||||||
"common.error.too-long": "Må højst være {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.exact-length": "Skal være præcis {length} tegn",
|
||||||
"common.error.invalid-number": "Skal være et tal",
|
"common.error.invalid-number": "Skal være et tal",
|
||||||
"common.error.field-required": "Dette felt er påkrævet"
|
"common.error.field-required": "Dette felt er påkrævet"
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ export default {
|
|||||||
// END /account/shares
|
// END /account/shares
|
||||||
// /account/reverseShares
|
// /account/reverseShares
|
||||||
"account.reverseShares.title": "Externe Freigaben",
|
"account.reverseShares.title": "Externe Freigaben",
|
||||||
"account.reverseShares.description": "Eine externe Freigabe erlaubt dir eine einzigartige URL zu erstellen, die externen Benutzern erlaubt Dateien hochzuladen.",
|
"account.reverseShares.description": "Eine externe Freigabe erlaubt dir eine einzigartige URL zu erstellen, die externen Benutzern erlaubt, Dateien hochzuladen.",
|
||||||
"account.reverseShares.title.empty": "Es ist leer hier 👀",
|
"account.reverseShares.title.empty": "Es ist leer hier 👀",
|
||||||
"account.reverseShares.description.empty": "Du hast keine externen Freigaben erstellt.",
|
"account.reverseShares.description.empty": "Du hast keine externen Freigaben erstellt.",
|
||||||
// showCreateReverseShareModal.tsx
|
// showCreateReverseShareModal.tsx
|
||||||
@@ -155,7 +155,7 @@ export default {
|
|||||||
"account.reverseShares.modal.simplified": "Einfacher Modus",
|
"account.reverseShares.modal.simplified": "Einfacher Modus",
|
||||||
"account.reverseShares.modal.simplified.description": "Mache es der Person einfach, die die Datei hochlädt, sie mit Dir zu teilen. Sie können nur den Namen und die Beschreibung der Freigabe ändern.",
|
"account.reverseShares.modal.simplified.description": "Mache es der Person einfach, die die Datei hochlädt, sie mit Dir zu teilen. Sie können nur den Namen und die Beschreibung der Freigabe ändern.",
|
||||||
"account.reverseShares.modal.public-access": "Öffentlicher Zugriff",
|
"account.reverseShares.modal.public-access": "Öffentlicher Zugriff",
|
||||||
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.",
|
"account.reverseShares.modal.public-access.description": "Mache die erstellten Freigaben mit dieser Rückfreigabe öffentlich. Wenn deaktiviert, kannst nur du und der Ersteller der Freigaben diese anzeigen.",
|
||||||
"account.reverseShares.modal.max-use.label": "Maximale Nutzungen",
|
"account.reverseShares.modal.max-use.label": "Maximale Nutzungen",
|
||||||
"account.reverseShares.modal.max-use.description": "Die maximale Anzahl von Verwendungen der URL, um Dateien hochzuladen.",
|
"account.reverseShares.modal.max-use.description": "Die maximale Anzahl von Verwendungen der URL, um Dateien hochzuladen.",
|
||||||
"account.reverseShare.never-expires": "Diese externe Freigabe wird nicht ablaufen.",
|
"account.reverseShare.never-expires": "Diese externe Freigabe wird nicht ablaufen.",
|
||||||
@@ -324,7 +324,7 @@ export default {
|
|||||||
"admin.config.email.invite-subject": "Betreff für Einladung",
|
"admin.config.email.invite-subject": "Betreff für Einladung",
|
||||||
"admin.config.email.invite-subject.description": "Betreff der E-Mail, die gesendet wird, wenn ein Administrator einen Benutzer einlädt.",
|
"admin.config.email.invite-subject.description": "Betreff der E-Mail, die gesendet wird, wenn ein Administrator einen Benutzer einlädt.",
|
||||||
"admin.config.email.invite-message": "Nachricht für Einladung",
|
"admin.config.email.invite-message": "Nachricht für Einladung",
|
||||||
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the password of the user.",
|
"admin.config.email.invite-message.description": "Nachricht welche gesendet wird, wenn der Administrator einen Nutzer einlädt. {url} wird ersetzt durch die Einladung URL, {email} mit der die E-Mail und {password} mit dem Passwort des Benutzers.",
|
||||||
"admin.config.share.allow-registration": "Registrierung erlauben",
|
"admin.config.share.allow-registration": "Registrierung erlauben",
|
||||||
"admin.config.share.allow-registration.description": "Gibt an, ob eine Registrierung erlaubt ist",
|
"admin.config.share.allow-registration.description": "Gibt an, ob eine Registrierung erlaubt ist",
|
||||||
"admin.config.share.allow-unauthenticated-shares": "Nicht authentifizierte Freigaben erlauben",
|
"admin.config.share.allow-unauthenticated-shares": "Nicht authentifizierte Freigaben erlauben",
|
||||||
@@ -392,11 +392,13 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "OpenID Connect Anmeldung erlaubt",
|
"admin.config.oauth.oidc-enabled.description": "OpenID Connect Anmeldung erlaubt",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Verbindung Discovery URL",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Verbindung Discovery URL",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery-URL der OpenID OAuth App",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery-URL der OpenID OAuth App",
|
||||||
|
"admin.config.oauth.oidc-sign-out": "Abmelden von OpenID Connect",
|
||||||
|
"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": "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-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-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-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": "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.",
|
"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.",
|
||||||
@@ -405,10 +407,10 @@ export default {
|
|||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client-Secret",
|
"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.oauth.oidc-client-secret.description": "Client-Secret der OpenID Connect OAuth-App",
|
||||||
"admin.config.category.ldap": "LDAP",
|
"admin.config.category.ldap": "LDAP",
|
||||||
"admin.config.ldap.enabled": "Enabled LDAP",
|
"admin.config.ldap.enabled": "LDAP aktivieren",
|
||||||
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
|
"admin.config.ldap.enabled.description": "LDAP-Authentifizierung für die Benutzeranmeldung verwenden",
|
||||||
"admin.config.ldap.url": "Server URL",
|
"admin.config.ldap.url": "Server-URL",
|
||||||
"admin.config.ldap.url.description": "URL of the LDAP server",
|
"admin.config.ldap.url.description": "URL des LDAP-Servers",
|
||||||
"admin.config.ldap.bind-dn": "Bind DN",
|
"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-dn.description": "Default user which will be used to execute the user search",
|
||||||
"admin.config.ldap.bind-password": "Bind password",
|
"admin.config.ldap.bind-password": "Bind password",
|
||||||
@@ -416,9 +418,13 @@ export default {
|
|||||||
"admin.config.ldap.search-base": "User base",
|
"admin.config.ldap.search-base": "User base",
|
||||||
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed",
|
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed",
|
||||||
"admin.config.ldap.search-query": "User query",
|
"admin.config.ldap.search-query": "User query",
|
||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "Die Benutzer Abfrage wird in der \"Benutzerdatenbank\" gesucht für den LDAP Benutzer. %username% kann als Platzhalter für den Benutzer eingegeben werden.",
|
||||||
"admin.config.ldap.admin-groups": "Administratorengruppe",
|
"admin.config.ldap.admin-groups": "Administratorengruppe",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Gruppe benötigt für den Administrations Zugang.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Ups, diese Seite existiert nicht.",
|
"404.description": "Ups, diese Seite existiert nicht.",
|
||||||
"404.button.home": "Zurück zur Startseite",
|
"404.button.home": "Zurück zur Startseite",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Link",
|
"common.text.link": "Link",
|
||||||
"common.text.navigate-to-link": "Link öffnen",
|
"common.text.navigate-to-link": "Link öffnen",
|
||||||
"common.text.or": "oder",
|
"common.text.or": "oder",
|
||||||
|
"common.text.redirecting": "Umleitung...",
|
||||||
"common.button.go-back": "Zurück",
|
"common.button.go-back": "Zurück",
|
||||||
"common.button.go-home": "Zur Startseite",
|
"common.button.go-home": "Zur Startseite",
|
||||||
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",
|
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Ungültige E-Mail-Adresse",
|
"common.error.invalid-email": "Ungültige E-Mail-Adresse",
|
||||||
"common.error.too-short": "Muss mindestens {length} Zeichen enthalten",
|
"common.error.too-short": "Muss mindestens {length} Zeichen enthalten",
|
||||||
"common.error.too-long": "Muss maximal {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.exact-length": "Muss genau {length} Zeichen lang sein",
|
||||||
"common.error.invalid-number": "Muss eine Zahl sein",
|
"common.error.invalid-number": "Muss eine Zahl sein",
|
||||||
"common.error.field-required": "Dieses Feld ist erforderlich"
|
"common.error.field-required": "Dieses Feld ist erforderlich"
|
||||||
|
|||||||
@@ -153,9 +153,9 @@ export default {
|
|||||||
"account.reverseShares.modal.send-email": "Αποστολή ειδοποιήσεων με email",
|
"account.reverseShares.modal.send-email": "Αποστολή ειδοποιήσεων με email",
|
||||||
"account.reverseShares.modal.send-email.description": "Στείλτε μια ειδοποίηση μέσω ηλεκτρονικού ταχυδρομείου όταν δημιουργείται ένας διαμοιρασμός με αυτόν τον σύνδεσμο ανάστροφης κοινοποίησης.",
|
"account.reverseShares.modal.send-email.description": "Στείλτε μια ειδοποίηση μέσω ηλεκτρονικού ταχυδρομείου όταν δημιουργείται ένας διαμοιρασμός με αυτόν τον σύνδεσμο ανάστροφης κοινοποίησης.",
|
||||||
"account.reverseShares.modal.simplified": "Απλή λειτουργία",
|
"account.reverseShares.modal.simplified": "Απλή λειτουργία",
|
||||||
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.",
|
"account.reverseShares.modal.simplified.description": "Κάντε εύκολο για το άτομο που ανεβάζει το αρχείο να το μοιραστεί μαζί σας. Θα είναι σε θέση να προσαρμόσει μόνο το όνομα και την περιγραφή της κοινοποίησης.",
|
||||||
"account.reverseShares.modal.public-access": "Public access",
|
"account.reverseShares.modal.public-access": "Δημόσια πρόσβαση",
|
||||||
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.",
|
"account.reverseShares.modal.public-access.description": "Κάντε τις δημιουργημένες κοινοποιήσεις με αυτή την αντίστροφη κοινή χρήση δημόσιες. Εάν απενεργοποιηθεί, μόνο εσείς και ο δημιουργός της κοινής χρήσης μπορείτε να τη δείτε.",
|
||||||
"account.reverseShares.modal.max-use.label": "Μέγιστες χρήσεις",
|
"account.reverseShares.modal.max-use.label": "Μέγιστες χρήσεις",
|
||||||
"account.reverseShares.modal.max-use.description": "Ο μέγιστος αριθμός που μπορεί να χρησιμοποιηθεί αυτό το URL για τη δημιουργία ενός διαμοιρασμού.",
|
"account.reverseShares.modal.max-use.description": "Ο μέγιστος αριθμός που μπορεί να χρησιμοποιηθεί αυτό το URL για τη δημιουργία ενός διαμοιρασμού.",
|
||||||
"account.reverseShare.never-expires": "Αυτός ο αντίστροφος διαμοιρασμός δε λήγει.",
|
"account.reverseShare.never-expires": "Αυτός ο αντίστροφος διαμοιρασμός δε λήγει.",
|
||||||
@@ -174,7 +174,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Διαχείριση",
|
"admin.title": "Διαχείριση",
|
||||||
"admin.button.users": "Διαχείριση χρηστών",
|
"admin.button.users": "Διαχείριση χρηστών",
|
||||||
"admin.button.shares": "Share management",
|
"admin.button.shares": "Διαχείριση κοινοποιήσεων",
|
||||||
"admin.button.config": "Διαμόρφωση",
|
"admin.button.config": "Διαμόρφωση",
|
||||||
"admin.version": "Έκδοση",
|
"admin.version": "Έκδοση",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -202,13 +202,13 @@ export default {
|
|||||||
"admin.users.modal.create.admin.description": "Αν ενεργοποιηθεί, ο χρήστης θα μπορεί να έχει πρόσβαση στον πίνακα διαχείρισης.",
|
"admin.users.modal.create.admin.description": "Αν ενεργοποιηθεί, ο χρήστης θα μπορεί να έχει πρόσβαση στον πίνακα διαχείρισης.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
// /admin/shares
|
// /admin/shares
|
||||||
"admin.shares.title": "Share management",
|
"admin.shares.title": "Διαχείριση κοινοποιήσεων",
|
||||||
"admin.shares.table.id": "Share ID",
|
"admin.shares.table.id": "Αναγνωριστικό κοινοποίησης",
|
||||||
"admin.shares.table.username": "Creator",
|
"admin.shares.table.username": "Δημιουργός",
|
||||||
"admin.shares.table.visitors": "Visitors",
|
"admin.shares.table.visitors": "Επισκέπτες",
|
||||||
"admin.shares.table.expires": "Expires At",
|
"admin.shares.table.expires": "Λήγει στις",
|
||||||
"admin.shares.edit.delete.title": "Delete share {id}",
|
"admin.shares.edit.delete.title": "Διαγραφή κοινοποίησης {id}",
|
||||||
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
"admin.shares.edit.delete.description": "Θέλετε πραγματικά να διαγράψετε αυτή τη κοινοποίηση;",
|
||||||
// END /admin/shares
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Μεταφόρτωση",
|
"upload.title": "Μεταφόρτωση",
|
||||||
@@ -244,9 +244,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Μήνες",
|
"upload.modal.expires.month-plural": "Μήνες",
|
||||||
"upload.modal.expires.year-singular": "Έτος",
|
"upload.modal.expires.year-singular": "Έτος",
|
||||||
"upload.modal.expires.year-plural": "Έτη",
|
"upload.modal.expires.year-plural": "Έτη",
|
||||||
"upload.modal.accordion.name-and-description.title": "Name and description",
|
"upload.modal.accordion.name-and-description.title": "Όνομα και περιγραφή",
|
||||||
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Όνομα",
|
||||||
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
"upload.modal.accordion.name-and-description.description.placeholder": "Σημείωση για τους παραλήπτες αυτής της κοινοποίησης",
|
||||||
"upload.modal.accordion.email.title": "Αποδέκτες email",
|
"upload.modal.accordion.email.title": "Αποδέκτες email",
|
||||||
"upload.modal.accordion.email.placeholder": "Εισάγετε αποδέκτες email",
|
"upload.modal.accordion.email.placeholder": "Εισάγετε αποδέκτες email",
|
||||||
"upload.modal.accordion.email.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
|
"upload.modal.accordion.email.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
|
||||||
@@ -259,7 +259,7 @@ export default {
|
|||||||
"upload.modal.completed.never-expires": "Αυτός ο διαμοιρασμός δεν λήγει.",
|
"upload.modal.completed.never-expires": "Αυτός ο διαμοιρασμός δεν λήγει.",
|
||||||
"upload.modal.completed.expires-on": "Αυτός ο διαμοιρασμός θα λήξει {expiration}.",
|
"upload.modal.completed.expires-on": "Αυτός ο διαμοιρασμός θα λήξει {expiration}.",
|
||||||
"upload.modal.completed.share-ready": "Κοινοποίηση έτοιμου",
|
"upload.modal.completed.share-ready": "Κοινοποίηση έτοιμου",
|
||||||
"upload.modal.completed.notified-reverse-share-creator": "We have notified the creator of the reverse share. You can also manually share this link with them through other means.",
|
"upload.modal.completed.notified-reverse-share-creator": "Έχουμε ειδοποιήσει τον δημιουργό της αντίστροφης κοινής χρήσης. Μπορείτε επίσης να μοιραστείτε χειροκίνητα αυτόν τον σύνδεσμο μαζί τους μέσω άλλων μέσων.",
|
||||||
// END /upload
|
// END /upload
|
||||||
// /share/[id]
|
// /share/[id]
|
||||||
"share.title": "Διαμοιρασμός {shareId}",
|
"share.title": "Διαμοιρασμός {shareId}",
|
||||||
@@ -269,8 +269,8 @@ export default {
|
|||||||
"share.error.removed.title": "Κοινοποίηση αφαιρέθηκε",
|
"share.error.removed.title": "Κοινοποίηση αφαιρέθηκε",
|
||||||
"share.error.not-found.title": "Η κοινοποίηση δε βρέθηκε",
|
"share.error.not-found.title": "Η κοινοποίηση δε βρέθηκε",
|
||||||
"share.error.not-found.description": "Η κοινοποίηση που ψάχνετε δεν υπάρχει.",
|
"share.error.not-found.description": "Η κοινοποίηση που ψάχνετε δεν υπάρχει.",
|
||||||
"share.error.access-denied.title": "Private share",
|
"share.error.access-denied.title": "Ιδιωτική κοινοποίηση",
|
||||||
"share.error.access-denied.description": "The current account does not have permission to access this share",
|
"share.error.access-denied.description": "Ο τρέχων λογαριασμός δεν έχει δικαίωμα πρόσβασης σε αυτήν την κοινοποίηση",
|
||||||
"share.modal.password.title": "Απαιτείται κωδικός",
|
"share.modal.password.title": "Απαιτείται κωδικός",
|
||||||
"share.modal.password.description": "Για να αποκτήσετε πρόσβαση σε αυτή την κοινοποίηση εισάγετε τον κωδικό πρόσβασης.",
|
"share.modal.password.description": "Για να αποκτήσετε πρόσβαση σε αυτή την κοινοποίηση εισάγετε τον κωδικό πρόσβασης.",
|
||||||
"share.modal.password": "Κωδικός πρόσβασης",
|
"share.modal.password": "Κωδικός πρόσβασης",
|
||||||
@@ -302,8 +302,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Η διεύθυνση URL όπου το Pingvin Share είναι διαθέσιμο",
|
"admin.config.general.app-url.description": "Η διεύθυνση URL όπου το Pingvin Share είναι διαθέσιμο",
|
||||||
"admin.config.general.show-home-page": "Εμφάνιση αρχικής σελίδας",
|
"admin.config.general.show-home-page": "Εμφάνιση αρχικής σελίδας",
|
||||||
"admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα",
|
"admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα",
|
||||||
"admin.config.general.session-duration": "Session Duration",
|
"admin.config.general.session-duration": "Διάρκεια συνεδρίας",
|
||||||
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
"admin.config.general.session-duration.description": "Χρόνος σε ώρες μετά την οποία ένας χρήστης πρέπει να συνδεθεί ξανά (προεπιλογή: 3 μήνες).",
|
||||||
"admin.config.general.logo": "Λογότυπο",
|
"admin.config.general.logo": "Λογότυπο",
|
||||||
"admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.",
|
"admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Επιλέξτε εικόνα",
|
"admin.config.general.logo.placeholder": "Επιλέξτε εικόνα",
|
||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση OpenID",
|
"admin.config.oauth.oidc-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση OpenID",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Αφήστε κενό αν δε γνωρίζετε για αυτή τη ρύθμιση",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Αφήστε κενό αν δε γνωρίζετε για αυτή τη ρύθμιση",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Ουπς. Αυτή η σελίδα δεν υπάρχει.",
|
"404.description": "Ουπς. Αυτή η σελίδα δεν υπάρχει.",
|
||||||
"404.button.home": "Πήγαινέ με πίσω",
|
"404.button.home": "Πήγαινέ με πίσω",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Σύνδεσμος",
|
"common.text.link": "Σύνδεσμος",
|
||||||
"common.text.navigate-to-link": "Μεταβείτε στο σύνδεσμο",
|
"common.text.navigate-to-link": "Μεταβείτε στο σύνδεσμο",
|
||||||
"common.text.or": "ή",
|
"common.text.or": "ή",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Επιστροφή",
|
"common.button.go-back": "Επιστροφή",
|
||||||
"common.button.go-home": "Μετάβαση στην αρχική",
|
"common.button.go-home": "Μετάβαση στην αρχική",
|
||||||
"common.notify.copied": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
|
"common.notify.copied": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
|
"common.error.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
|
||||||
"common.error.too-short": "Πρέπει να αποτελείται τουλάχιστον {length} χαρακτήρες",
|
"common.error.too-short": "Πρέπει να αποτελείται τουλάχιστον {length} χαρακτήρες",
|
||||||
"common.error.too-long": "Πρέπει να αποτελείται το πολύ από {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.exact-length": "Πρέπει να αποτελείται ακριβώς από {length} χαρακτήρες",
|
||||||
"common.error.invalid-number": "Πρέπει να είναι αριθμός",
|
"common.error.invalid-number": "Πρέπει να είναι αριθμός",
|
||||||
"common.error.field-required": "Αυτό το πεδίο είναι υποχρεωτικό"
|
"common.error.field-required": "Αυτό το πεδίο είναι υποχρεωτικό"
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ export default {
|
|||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
"signIn.oauth.discord": "Discord",
|
"signIn.oauth.discord": "Discord",
|
||||||
"signIn.oauth.oidc": "OpenID",
|
"signIn.oauth.oidc": "OpenID",
|
||||||
"signIn.error.invalid-username": "Invalid username",
|
|
||||||
|
|
||||||
// END /auth/signin
|
// END /auth/signin
|
||||||
|
|
||||||
@@ -548,6 +547,9 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description":
|
"admin.config.oauth.oidc-discovery-uri.description":
|
||||||
"Discovery URI of the OpenID Connect OAuth app",
|
"Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description":
|
"admin.config.oauth.oidc-username-claim.description":
|
||||||
"Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
@@ -586,6 +588,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
|
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Oops this page doesn't exist.",
|
"404.description": "Oops this page doesn't exist.",
|
||||||
@@ -643,6 +649,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Invalid email address",
|
||||||
"common.error.too-short": "Must be at least {length} characters",
|
"common.error.too-short": "Must be at least {length} characters",
|
||||||
"common.error.too-long": "Must be at most {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.exact-length": "Must be exactly {length} characters",
|
||||||
"common.error.invalid-number": "Must be a number",
|
"common.error.invalid-number": "Must be a number",
|
||||||
"common.error.field-required": "This field is required",
|
"common.error.field-required": "This field is required",
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Oops esta página no existe.",
|
"404.description": "Oops esta página no existe.",
|
||||||
"404.button.home": "Regrésame al inicio",
|
"404.button.home": "Regrésame al inicio",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Enlace",
|
"common.text.link": "Enlace",
|
||||||
"common.text.navigate-to-link": "Ir al enlace",
|
"common.text.navigate-to-link": "Ir al enlace",
|
||||||
"common.text.or": "o",
|
"common.text.or": "o",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Volver",
|
"common.button.go-back": "Volver",
|
||||||
"common.button.go-home": "Página de inicio",
|
"common.button.go-home": "Página de inicio",
|
||||||
"common.notify.copied": "Tu enlace se ha copiado al portapapeles",
|
"common.notify.copied": "Tu enlace se ha copiado al portapapeles",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Correo electrónico no válido",
|
"common.error.invalid-email": "Correo electrónico no válido",
|
||||||
"common.error.too-short": "Debe tener al menos {length} caracteres",
|
"common.error.too-short": "Debe tener al menos {length} caracteres",
|
||||||
"common.error.too-long": "Debe tener como máximo {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.exact-length": "Debe tener exactamente {length} caracteres",
|
||||||
"common.error.invalid-number": "Debe ser un número",
|
"common.error.invalid-number": "Debe ser un número",
|
||||||
"common.error.field-required": "Este campo es requerido"
|
"common.error.field-required": "Este campo es requerido"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Hups tätä sivua ei ole olemassa.",
|
"404.description": "Hups tätä sivua ei ole olemassa.",
|
||||||
"404.button.home": "Tuo minut takaisin kotiin",
|
"404.button.home": "Tuo minut takaisin kotiin",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Linkki",
|
"common.text.link": "Linkki",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Go to the link",
|
||||||
"common.text.or": "tai",
|
"common.text.or": "tai",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Takaisin",
|
"common.button.go-back": "Takaisin",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Go home",
|
||||||
"common.notify.copied": "Linkki kopioitiin leikepöydälle",
|
"common.notify.copied": "Linkki kopioitiin leikepöydälle",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Virheellinen sähköpostiosoite",
|
"common.error.invalid-email": "Virheellinen sähköpostiosoite",
|
||||||
"common.error.too-short": "Täytyy olla vähintään {length} merkkiä",
|
"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.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.exact-length": "On oltava tarkasti {length} merkkiä pitkä",
|
||||||
"common.error.invalid-number": "Pitää olla luku",
|
"common.error.invalid-number": "Pitää olla luku",
|
||||||
"common.error.field-required": "Tämä kenttä on pakollinen"
|
"common.error.field-required": "Tämä kenttä on pakollinen"
|
||||||
|
|||||||
@@ -24,10 +24,10 @@ export default {
|
|||||||
// END /
|
// END /
|
||||||
// /auth/signin
|
// /auth/signin
|
||||||
"signin.title": "Content de vous revoir",
|
"signin.title": "Content de vous revoir",
|
||||||
"signin.description": "Pas encore de compte ?",
|
"signin.description": "Vous n'avez pas encore de compte ?",
|
||||||
"signin.button.signup": "S’inscrire",
|
"signin.button.signup": "S’inscrire",
|
||||||
"signin.input.email-or-username": "Courriel ou surnom",
|
"signin.input.email-or-username": "Courriel ou nom d'utilisateur",
|
||||||
"signin.input.email-or-username.placeholder": "Votre courriel ou surnom",
|
"signin.input.email-or-username.placeholder": "Votre courriel ou nom d'utilisateur",
|
||||||
"signin.input.password": "Mot de passe",
|
"signin.input.password": "Mot de passe",
|
||||||
"signin.input.password.placeholder": "Votre mot de passe",
|
"signin.input.password.placeholder": "Votre mot de passe",
|
||||||
"signin.button.submit": "Se connecter",
|
"signin.button.submit": "Se connecter",
|
||||||
@@ -45,8 +45,8 @@ export default {
|
|||||||
"signup.title": "Créer un compte",
|
"signup.title": "Créer un compte",
|
||||||
"signup.description": "Vous avez déjà un compte ?",
|
"signup.description": "Vous avez déjà un compte ?",
|
||||||
"signup.button.signin": "Se connecter",
|
"signup.button.signin": "Se connecter",
|
||||||
"signup.input.username": "Surnom",
|
"signup.input.username": "Nom d'utilisateur",
|
||||||
"signup.input.username.placeholder": "Votre surnom",
|
"signup.input.username.placeholder": "Votre nom d'utilisateur",
|
||||||
"signup.input.email": "Adresse email",
|
"signup.input.email": "Adresse email",
|
||||||
"signup.input.email.placeholder": "Votre courriel",
|
"signup.input.email.placeholder": "Votre courriel",
|
||||||
"signup.button.submit": "Commençons",
|
"signup.button.submit": "Commençons",
|
||||||
@@ -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.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": "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.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.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.never-expires": "Ce partage inversé n'expirera jamais.",
|
||||||
"account.reverseShare.expires-on": "Ce partage inversé expirera le {expiration}.",
|
"account.reverseShare.expires-on": "Ce partage inversé expirera le {expiration}.",
|
||||||
@@ -324,9 +324,9 @@ export default {
|
|||||||
"admin.config.email.invite-subject": "Sujet d’une invitation",
|
"admin.config.email.invite-subject": "Sujet d’une invitation",
|
||||||
"admin.config.email.invite-subject.description": "Intitulé du courriel envoyé lorsqu’un administrateur invite un utilisateur.",
|
"admin.config.email.invite-subject.description": "Intitulé du courriel envoyé lorsqu’un administrateur invite un utilisateur.",
|
||||||
"admin.config.email.invite-message": "Message d’une invitation",
|
"admin.config.email.invite-message": "Message d’une invitation",
|
||||||
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the password of the user.",
|
"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": "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": "Autoriser les partages anonymes",
|
||||||
"admin.config.share.allow-unauthenticated-shares.description": "Permet aux visiteurs de créer des partages",
|
"admin.config.share.allow-unauthenticated-shares.description": "Permet aux visiteurs de créer des partages",
|
||||||
"admin.config.share.max-expiration": "Échéance",
|
"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": "Secret du client Microsoft",
|
||||||
"admin.config.oauth.microsoft-client-secret.description": "Le secret du client de l’application Microsoft OAuth",
|
"admin.config.oauth.microsoft-client-secret.description": "Le secret du client de l’application Microsoft OAuth",
|
||||||
"admin.config.oauth.discord-enabled": "Discord",
|
"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": "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-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",
|
"admin.config.oauth.discord-client-id": "ID du client Discord",
|
||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Permettre la connexion via OpenID",
|
"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": "URI de découverte OpenID",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "L’URI de découverte de la connexion à l'application OpenID OAuth",
|
"admin.config.oauth.oidc-discovery-uri.description": "L’URI de découverte de la connexion à l'application OpenID OAuth",
|
||||||
|
"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 d’utilisateur OpenID",
|
"admin.config.oauth.oidc-username-claim": "Revendication du nom d’utilisateur OpenID",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Le champ contenant la revendication du nom d’utilisateur dans le jeton OpenID Connect. Laissez vide si vous ne savez pas quoi indiquer.",
|
"admin.config.oauth.oidc-username-claim.description": "Le champ contenant la revendication du nom d’utilisateur 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",
|
"admin.config.oauth.oidc-role-path": "Chemin vers les rôles dans le jeton OpenID Connect",
|
||||||
@@ -418,7 +420,11 @@ export default {
|
|||||||
"admin.config.ldap.search-query": "Requête utilisateur",
|
"admin.config.ldap.search-query": "Requête utilisateur",
|
||||||
"admin.config.ldap.search-query.description": "La requête utilisateur sera utilisée pour rechercher dans la ‘base d'utilisateurs’ de l'utilisateur LDAP. %username% peut être utilisé comme espace réservé pour les entrées données par l'utilisateur.",
|
"admin.config.ldap.search-query.description": "La requête utilisateur sera utilisée pour rechercher dans la ‘base d'utilisateurs’ de l'utilisateur LDAP. %username% peut être utilisé comme espace réservé pour les entrées données par l'utilisateur.",
|
||||||
"admin.config.ldap.admin-groups": "Groupe administrateur",
|
"admin.config.ldap.admin-groups": "Groupe administrateur",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Un groupe est nécessaire pour un accès administratif.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "Nom de l'attribut des groupes d'utilisateurs",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "Nom d'attribut LDAP pour les groupes dont un utilisateur est membre. Il est utilisé lors de la vérification du groupe d'administrateurs.",
|
||||||
|
"admin.config.ldap.field-name-email": "Nom d'attribut de l'e-mail de l'utilisateur",
|
||||||
|
"admin.config.ldap.field-name-email.description": "Nom d'attribut LDAP pour l'e-mail d'un utilisateur.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Désolé, mais cette page n’existe pas.",
|
"404.description": "Désolé, mais cette page n’existe pas.",
|
||||||
"404.button.home": "Retour à l’accueil",
|
"404.button.home": "Retour à l’accueil",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Lien",
|
"common.text.link": "Lien",
|
||||||
"common.text.navigate-to-link": "Accéder au lien",
|
"common.text.navigate-to-link": "Accéder au lien",
|
||||||
"common.text.or": "ou",
|
"common.text.or": "ou",
|
||||||
|
"common.text.redirecting": "Redirection...",
|
||||||
"common.button.go-back": "Précédent",
|
"common.button.go-back": "Précédent",
|
||||||
"common.button.go-home": "Accueil",
|
"common.button.go-home": "Accueil",
|
||||||
"common.notify.copied": "Votre lien a été copié dans le presse-papiers",
|
"common.notify.copied": "Votre lien a été copié dans le presse-papiers",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Adresse courriel invalide",
|
"common.error.invalid-email": "Adresse courriel invalide",
|
||||||
"common.error.too-short": "Doit comporter au moins {length} caractères",
|
"common.error.too-short": "Doit comporter au moins {length} caractères",
|
||||||
"common.error.too-long": "Doit comporter au plus {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.exact-length": "Doit comporter exactement {length} caractères",
|
||||||
"common.error.invalid-number": "Doit être un nombre",
|
"common.error.invalid-number": "Doit être un nombre",
|
||||||
"common.error.field-required": "Ce champ est obligatoire"
|
"common.error.field-required": "Ce champ est obligatoire"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "OpenID Connect bejelentkezés engedélyezése",
|
"admin.config.oauth.oidc-enabled.description": "OpenID Connect bejelentkezés engedélyezése",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Az OpenID Connect OAuth applikáció Discovery URI azonosítója",
|
"admin.config.oauth.oidc-discovery-uri.description": "Az OpenID Connect OAuth applikáció Discovery URI azonosítója",
|
||||||
|
"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-username-claim": "OpenID Connect felhasználónév igény",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect felhasználónév igény",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Az OpenID Connect ID token felhasználónév igénye. Hagyja üresen ha nincs információja a beállításról.",
|
"admin.config.oauth.oidc-username-claim.description": "Az OpenID Connect ID token felhasználónév igénye. Hagyja üresen ha nincs információja a beállításról.",
|
||||||
"admin.config.oauth.oidc-role-path": "Az OpenID Connect token szerepeinek elérési útvonala",
|
"admin.config.oauth.oidc-role-path": "Az OpenID Connect token szerepeinek elérési útvonala",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "A felhasználó lekérdezés kísérli meg az LDAP felhasználó elérését a felhasználóbázisban. %username% helyettesítheti az adott felhasználónevet.",
|
"admin.config.ldap.search-query.description": "A felhasználó lekérdezés kísérli meg az LDAP felhasználó elérését a felhasználóbázisban. %username% helyettesítheti az adott felhasználónevet.",
|
||||||
"admin.config.ldap.admin-groups": "Admin csoport",
|
"admin.config.ldap.admin-groups": "Admin csoport",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Hoppá - ez az oldal nem létezik.",
|
"404.description": "Hoppá - ez az oldal nem létezik.",
|
||||||
"404.button.home": "Vissza a Kezdőlapra",
|
"404.button.home": "Vissza a Kezdőlapra",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Hivatkozás",
|
"common.text.link": "Hivatkozás",
|
||||||
"common.text.navigate-to-link": "Ugrás a hivatkozásra",
|
"common.text.navigate-to-link": "Ugrás a hivatkozásra",
|
||||||
"common.text.or": "vagy",
|
"common.text.or": "vagy",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Vissza",
|
"common.button.go-back": "Vissza",
|
||||||
"common.button.go-home": "Kezdőlap",
|
"common.button.go-home": "Kezdőlap",
|
||||||
"common.notify.copied": "A hivatkozást a Vágólapra másoltuk",
|
"common.notify.copied": "A hivatkozást a Vágólapra másoltuk",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Érvénytelen emailcím",
|
"common.error.invalid-email": "Érvénytelen emailcím",
|
||||||
"common.error.too-short": "Legalább {length} karakter kell",
|
"common.error.too-short": "Legalább {length} karakter kell",
|
||||||
"common.error.too-long": "Legfejlebb {length} karakter adható meg",
|
"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.exact-length": "Pontosan {length} karakter szükséges",
|
||||||
"common.error.invalid-number": "Számot kell megadnia",
|
"common.error.invalid-number": "Számot kell megadnia",
|
||||||
"common.error.field-required": "Ez egy kötelező mező"
|
"common.error.field-required": "Ez egy kötelező mező"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Se il login tramite OpenID Connect è abilitato",
|
"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": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect",
|
||||||
|
"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": "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-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",
|
"admin.config.oauth.oidc-role-path": "Percorso verso i ruoli in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "La query utente verrà utilizzata per cercare la 'base utente' per l'utente LDAP. %username% può essere usato come segnaposto per l'input dato dall'utente.",
|
"admin.config.ldap.search-query.description": "La query utente verrà utilizzata per cercare la 'base utente' per l'utente LDAP. %username% può essere usato come segnaposto per l'input dato dall'utente.",
|
||||||
"admin.config.ldap.admin-groups": "Gruppo di amministrazione",
|
"admin.config.ldap.admin-groups": "Gruppo di amministrazione",
|
||||||
"admin.config.ldap.admin-groups.description": "Gruppo richiesto per l’accesso amministrativo.",
|
"admin.config.ldap.admin-groups.description": "Gruppo richiesto per l’accesso amministrativo.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "Nome dell'attributo per il gruppo utenti",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "Nome attributo LDAP per i gruppi, di cui un utente è membro. Questo viene utilizzato per controllare il gruppo amministratore.",
|
||||||
|
"admin.config.ldap.field-name-email": "Nome dell'attributo email dell'utente",
|
||||||
|
"admin.config.ldap.field-name-email.description": "Nome attributo LDAP per l'email di un utente.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Ops, questa pagina non esiste.",
|
"404.description": "Ops, questa pagina non esiste.",
|
||||||
"404.button.home": "Riportami a casa",
|
"404.button.home": "Riportami a casa",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Collegamento",
|
"common.text.link": "Collegamento",
|
||||||
"common.text.navigate-to-link": "Vai al collegamento",
|
"common.text.navigate-to-link": "Vai al collegamento",
|
||||||
"common.text.or": "o",
|
"common.text.or": "o",
|
||||||
|
"common.text.redirecting": "Reindirizzamento...",
|
||||||
"common.button.go-back": "Torna indietro",
|
"common.button.go-back": "Torna indietro",
|
||||||
"common.button.go-home": "Vai alla Home Page",
|
"common.button.go-home": "Vai alla Home Page",
|
||||||
"common.notify.copied": "Il tuo collegamento e' stato copiato negli appunti",
|
"common.notify.copied": "Il tuo collegamento e' stato copiato negli appunti",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Indirizzo email non valido",
|
"common.error.invalid-email": "Indirizzo email non valido",
|
||||||
"common.error.too-short": "Deve contenere almeno {length} caratteri",
|
"common.error.too-short": "Deve contenere almeno {length} caratteri",
|
||||||
"common.error.too-long": "Deve contenere al massimo {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.exact-length": "Deve essere esattamente {length} caratteri",
|
||||||
"common.error.invalid-number": "Deve essere un numero",
|
"common.error.invalid-number": "Deve essere un numero",
|
||||||
"common.error.field-required": "Questo campo è obbligatorio"
|
"common.error.field-required": "Questo campo è obbligatorio"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "OpenID Connect のログインが有効かを設定します",
|
"admin.config.oauth.oidc-enabled.description": "OpenID Connect のログインが有効かを設定します",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "OpenID OAuthアプリのDiscovery URI",
|
"admin.config.oauth.oidc-discovery-uri.description": "OpenID OAuthアプリのDiscovery URI",
|
||||||
|
"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-username-claim": "OpenID Connect ユーザー名の要求",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect ユーザー名の要求",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID トークンのユーザー名要求。この設定が何かわからない場合は空白のままにしてください。",
|
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID トークンのユーザー名要求。この設定が何かわからない場合は空白のままにしてください。",
|
||||||
"admin.config.oauth.oidc-role-path": "OpenID Connectトークンのロールへのパス",
|
"admin.config.oauth.oidc-role-path": "OpenID Connectトークンのロールへのパス",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "ユーザークエリはLDAPユーザーの「ユーザーベース」を検索するために使用されます。 %username% は、入力されたユーザーのプレースホルダとして使用できます。",
|
"admin.config.ldap.search-query.description": "ユーザークエリはLDAPユーザーの「ユーザーベース」を検索するために使用されます。 %username% は、入力されたユーザーのプレースホルダとして使用できます。",
|
||||||
"admin.config.ldap.admin-groups": "管理者グループ",
|
"admin.config.ldap.admin-groups": "管理者グループ",
|
||||||
"admin.config.ldap.admin-groups.description": "管理者アクセスに必要なグループです。",
|
"admin.config.ldap.admin-groups.description": "管理者アクセスに必要なグループです。",
|
||||||
|
"admin.config.ldap.field-name-member-of": "ユーザーグループ属性名",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "ユーザーがメンバーであるグループのLDAP属性名。これは、管理者グループを確認するときに使用されます。",
|
||||||
|
"admin.config.ldap.field-name-email": "ユーザーのメール属性名",
|
||||||
|
"admin.config.ldap.field-name-email.description": "ユーザーのメールのLDAP属性名。",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "ページが見つかりません。",
|
"404.description": "ページが見つかりません。",
|
||||||
"404.button.home": "ホームに戻る",
|
"404.button.home": "ホームに戻る",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "リンク",
|
"common.text.link": "リンク",
|
||||||
"common.text.navigate-to-link": "リンクへ移動",
|
"common.text.navigate-to-link": "リンクへ移動",
|
||||||
"common.text.or": "または",
|
"common.text.or": "または",
|
||||||
|
"common.text.redirecting": "リダイレクトしています...",
|
||||||
"common.button.go-back": "戻る",
|
"common.button.go-back": "戻る",
|
||||||
"common.button.go-home": "ホームに戻る",
|
"common.button.go-home": "ホームに戻る",
|
||||||
"common.notify.copied": "リンクをクリップボードにコピーしました",
|
"common.notify.copied": "リンクをクリップボードにコピーしました",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "無効なメールアドレス",
|
"common.error.invalid-email": "無効なメールアドレス",
|
||||||
"common.error.too-short": "最低{length} 文字である必要があります",
|
"common.error.too-short": "最低{length} 文字である必要があります",
|
||||||
"common.error.too-long": "最大{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.exact-length": "{length} 文字である必要があります",
|
||||||
"common.error.invalid-number": "数字でなければなりません",
|
"common.error.invalid-number": "数字でなければなりません",
|
||||||
"common.error.field-required": "これは必須項目です"
|
"common.error.field-required": "これは必須項目です"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "OpenID Connect 로그인 사용 여부",
|
"admin.config.oauth.oidc-enabled.description": "OpenID Connect 로그인 사용 여부",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID 토큰의 Username claim 입니다. 이 구성이 무엇인지 모르면 비워 둡니다.",
|
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID 토큰의 Username claim 입니다. 이 구성이 무엇인지 모르면 비워 둡니다.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "이런, 이 페이지는 존재하지 않습니다.",
|
"404.description": "이런, 이 페이지는 존재하지 않습니다.",
|
||||||
"404.button.home": "나를 집으로 데려다 줘",
|
"404.button.home": "나를 집으로 데려다 줘",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "링크",
|
"common.text.link": "링크",
|
||||||
"common.text.navigate-to-link": "링크로 이동",
|
"common.text.navigate-to-link": "링크로 이동",
|
||||||
"common.text.or": "또는",
|
"common.text.or": "또는",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "뒤로 가기",
|
"common.button.go-back": "뒤로 가기",
|
||||||
"common.button.go-home": "첫 페이지",
|
"common.button.go-home": "첫 페이지",
|
||||||
"common.notify.copied": "당신의 링크가 클립보드에 복사되었습니다.",
|
"common.notify.copied": "당신의 링크가 클립보드에 복사되었습니다.",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "이메일 주소가 틀립니다",
|
"common.error.invalid-email": "이메일 주소가 틀립니다",
|
||||||
"common.error.too-short": "최소 {length} 자 이상이어야 합니다",
|
"common.error.too-short": "최소 {length} 자 이상이어야 합니다",
|
||||||
"common.error.too-long": "최대 {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.exact-length": "{length} 자 이어야 합니다.",
|
||||||
"common.error.invalid-number": "숫자만 가능합니다.",
|
"common.error.invalid-number": "숫자만 가능합니다.",
|
||||||
"common.error.field-required": "이 필드는 필수입니다"
|
"common.error.field-required": "이 필드는 필수입니다"
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Tweestapsverificatie vereist",
|
"signIn.notify.totp-required.title": "Tweestapsverificatie vereist",
|
||||||
"signIn.notify.totp-required.description": "Voer uw tweestapsverificatiecode in",
|
"signIn.notify.totp-required.description": "Voer uw tweestapsverificatiecode in",
|
||||||
"signIn.oauth.or": "OF",
|
"signIn.oauth.or": "OF",
|
||||||
"signIn.oauth.signInWith": "Sign in with",
|
"signIn.oauth.signInWith": "Registreer met",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -151,11 +151,11 @@ export default {
|
|||||||
"account.reverseShares.modal.expiration.year-plural": "Jaren",
|
"account.reverseShares.modal.expiration.year-plural": "Jaren",
|
||||||
"account.reverseShares.modal.max-size.label": "Maximale share-grootte",
|
"account.reverseShares.modal.max-size.label": "Maximale share-grootte",
|
||||||
"account.reverseShares.modal.send-email": "Stuur e-mailnotificatie",
|
"account.reverseShares.modal.send-email": "Stuur e-mailnotificatie",
|
||||||
"account.reverseShares.modal.send-email.description": "Stuur een e-mailnotificatie wanneer er bestanden zijn gedeeld via deze omgekeerde share link.",
|
"account.reverseShares.modal.send-email.description": "Stuur een e-mail notificatie wanneer er bestanden zijn gedeeld via deze omgekeerde share link.",
|
||||||
"account.reverseShares.modal.simplified": "Simple mode",
|
"account.reverseShares.modal.simplified": "Simple mode",
|
||||||
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.",
|
"account.reverseShares.modal.simplified.description": "Maak het makkelijk voor de persoon die het bestand uploadt om het met u te delen. Ze kunnen alleen de naam en beschrijving van de share aanpassen.",
|
||||||
"account.reverseShares.modal.public-access": "Public access",
|
"account.reverseShares.modal.public-access": "Public access",
|
||||||
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.",
|
"account.reverseShares.modal.public-access.description": "Maak de gemaakte shares met deze reverse share openbaar. Als dit is uitgeschakeld, kunnen alleen jij en de maker van de share deze bekijken.",
|
||||||
"account.reverseShares.modal.max-use.label": "Maximaal gebruikte keren",
|
"account.reverseShares.modal.max-use.label": "Maximaal gebruikte keren",
|
||||||
"account.reverseShares.modal.max-use.description": "Maximale keren dat deze URL gebruikt kan worden om een share aan te maken.",
|
"account.reverseShares.modal.max-use.description": "Maximale keren dat deze URL gebruikt kan worden om een share aan te maken.",
|
||||||
"account.reverseShare.never-expires": "Deze omgekeerde share zal nooit verlopen.",
|
"account.reverseShare.never-expires": "Deze omgekeerde share zal nooit verlopen.",
|
||||||
@@ -246,7 +246,7 @@ export default {
|
|||||||
"upload.modal.expires.year-plural": "Jaren",
|
"upload.modal.expires.year-plural": "Jaren",
|
||||||
"upload.modal.accordion.name-and-description.title": "Naam en beschrijving",
|
"upload.modal.accordion.name-and-description.title": "Naam en beschrijving",
|
||||||
"upload.modal.accordion.name-and-description.name.placeholder": "Naam",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Naam",
|
||||||
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
"upload.modal.accordion.name-and-description.description.placeholder": "Opmerking voor de ontvangers van deze share",
|
||||||
"upload.modal.accordion.email.title": "E-mail van de ontvangers",
|
"upload.modal.accordion.email.title": "E-mail van de ontvangers",
|
||||||
"upload.modal.accordion.email.placeholder": "Voer e-mail ontvangers in",
|
"upload.modal.accordion.email.placeholder": "Voer e-mail ontvangers in",
|
||||||
"upload.modal.accordion.email.invalid-email": "Ongeldig e-mailadres",
|
"upload.modal.accordion.email.invalid-email": "Ongeldig e-mailadres",
|
||||||
@@ -259,7 +259,7 @@ export default {
|
|||||||
"upload.modal.completed.never-expires": "Deze omgekeerde share zal nooit verlopen.",
|
"upload.modal.completed.never-expires": "Deze omgekeerde share zal nooit verlopen.",
|
||||||
"upload.modal.completed.expires-on": "Deze omgekeerde share verloopt op {expiration}.",
|
"upload.modal.completed.expires-on": "Deze omgekeerde share verloopt op {expiration}.",
|
||||||
"upload.modal.completed.share-ready": "Share is gereed",
|
"upload.modal.completed.share-ready": "Share is gereed",
|
||||||
"upload.modal.completed.notified-reverse-share-creator": "We have notified the creator of the reverse share. You can also manually share this link with them through other means.",
|
"upload.modal.completed.notified-reverse-share-creator": "We hebben de maker van de reverse share op de hoogte gesteld. U kunt deze link ook handmatig met hen delen via andere middelen.",
|
||||||
// END /upload
|
// END /upload
|
||||||
// /share/[id]
|
// /share/[id]
|
||||||
"share.title": "Share {shareId}",
|
"share.title": "Share {shareId}",
|
||||||
@@ -270,7 +270,7 @@ export default {
|
|||||||
"share.error.not-found.title": "Share niet gevonden",
|
"share.error.not-found.title": "Share niet gevonden",
|
||||||
"share.error.not-found.description": "De share die u zoekt kan niet gevonden worden.",
|
"share.error.not-found.description": "De share die u zoekt kan niet gevonden worden.",
|
||||||
"share.error.access-denied.title": "Private share",
|
"share.error.access-denied.title": "Private share",
|
||||||
"share.error.access-denied.description": "The current account does not have permission to access this share",
|
"share.error.access-denied.description": "Dit account heeft geen toestemming om toegang te krijgen tot deze share",
|
||||||
"share.modal.password.title": "Wachtwoord vereist",
|
"share.modal.password.title": "Wachtwoord vereist",
|
||||||
"share.modal.password.description": "Vul een wachtwoord in om toegang te krijgen tot deze share.",
|
"share.modal.password.description": "Vul een wachtwoord in om toegang te krijgen tot deze share.",
|
||||||
"share.modal.password": "Wachtwoord",
|
"share.modal.password": "Wachtwoord",
|
||||||
@@ -302,8 +302,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "De URL waar Pingvin Share bereikbaar is",
|
"admin.config.general.app-url.description": "De URL waar Pingvin Share bereikbaar is",
|
||||||
"admin.config.general.show-home-page": "Toon startpagina",
|
"admin.config.general.show-home-page": "Toon startpagina",
|
||||||
"admin.config.general.show-home-page.description": "Toon of verberg de home pagina",
|
"admin.config.general.show-home-page.description": "Toon of verberg de home pagina",
|
||||||
"admin.config.general.session-duration": "Session Duration",
|
"admin.config.general.session-duration": "Sessieduur",
|
||||||
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
"admin.config.general.session-duration.description": "Tijd in uren waarna een gebruiker zich opnieuw moet aanmelden (standaard: 3 maanden).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Verander uw logo door een nieuwe afbeelding te uploaden. De afbeelding moet PNG zijn en het formaat moet 1:1 hebben.",
|
"admin.config.general.logo.description": "Verander uw logo door een nieuwe afbeelding te uploaden. De afbeelding moet PNG zijn en het formaat moet 1:1 hebben.",
|
||||||
"admin.config.general.logo.placeholder": "Afbeelding kiezen",
|
"admin.config.general.logo.placeholder": "Afbeelding kiezen",
|
||||||
@@ -324,7 +324,7 @@ export default {
|
|||||||
"admin.config.email.invite-subject": "Onderwerp voor uitnodiging",
|
"admin.config.email.invite-subject": "Onderwerp voor uitnodiging",
|
||||||
"admin.config.email.invite-subject.description": "Onderwerp van de e-mail die wordt verzonden wanneer een beheerder een gebruiker uitnodigt.",
|
"admin.config.email.invite-subject.description": "Onderwerp van de e-mail die wordt verzonden wanneer een beheerder een gebruiker uitnodigt.",
|
||||||
"admin.config.email.invite-message": "Bericht voor uitnodiging",
|
"admin.config.email.invite-message": "Bericht voor uitnodiging",
|
||||||
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the password of the user.",
|
"admin.config.email.invite-message.description": "Bericht dat wordt verzonden wanneer een beheerder een gebruiker uitnodigt. {url} wordt vervangen door de uitnodigings-URL, {email} door het e-mailadres en {password} door het wachtwoord van de gebruiker.",
|
||||||
"admin.config.share.allow-registration": "Sta registratie toe",
|
"admin.config.share.allow-registration": "Sta registratie toe",
|
||||||
"admin.config.share.allow-registration.description": "Of registratie is toegestaan",
|
"admin.config.share.allow-registration.description": "Of registratie is toegestaan",
|
||||||
"admin.config.share.allow-unauthenticated-shares": "Ongeverifieerde shares toestaan",
|
"admin.config.share.allow-unauthenticated-shares": "Ongeverifieerde shares toestaan",
|
||||||
@@ -336,7 +336,7 @@ export default {
|
|||||||
"admin.config.share.zip-compression-level": "Zip compressie niveau",
|
"admin.config.share.zip-compression-level": "Zip compressie niveau",
|
||||||
"admin.config.share.zip-compression-level.description": "Pas het niveau aan voor evenwicht tussen bestandsgrootte en compressie snelheid. Geldige waarden variëren van 0 tot 9, waarbij 0 geen compressie is en 9 de maximale compressie is. ",
|
"admin.config.share.zip-compression-level.description": "Pas het niveau aan voor evenwicht tussen bestandsgrootte en compressie snelheid. Geldige waarden variëren van 0 tot 9, waarbij 0 geen compressie is en 9 de maximale compressie is. ",
|
||||||
"admin.config.share.chunk-size": "Chunk size",
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
"admin.config.share.chunk-size.description": "Pas de chunkgrootte (in bytes) voor uw uploads aan om efficiëntie en betrouwbaarheid in evenwicht te brengen op basis van uw internetverbinding. Kleinere chunks kunnen de slagingspercentages voor onstabiele verbindingen verbeteren, terwijl grotere chunks uploads voor stabiele verbindingen versnellen.",
|
||||||
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Inschakelen",
|
"admin.config.smtp.enabled": "Inschakelen",
|
||||||
@@ -352,14 +352,14 @@ export default {
|
|||||||
"admin.config.smtp.password": "Wachtwoord",
|
"admin.config.smtp.password": "Wachtwoord",
|
||||||
"admin.config.smtp.password.description": "Wachtwoord van de SMTP-server",
|
"admin.config.smtp.password.description": "Wachtwoord van de SMTP-server",
|
||||||
"admin.config.smtp.button.test": "Teste-mail verzenden",
|
"admin.config.smtp.button.test": "Teste-mail verzenden",
|
||||||
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
"admin.config.smtp.allow-unauthorized-certificates": "Vertrouw ongeautoriseerde SMTP-servercertificaten",
|
||||||
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Zet dit alleen aan als je de self signed certificates vertrouwt.",
|
||||||
"admin.config.oauth.allow-registration": "Sta registratie toe",
|
"admin.config.oauth.allow-registration": "Sta registratie toe",
|
||||||
"admin.config.oauth.allow-registration.description": "Gebruikers toestaan zich te registreren via sociale login",
|
"admin.config.oauth.allow-registration.description": "Gebruikers toestaan zich te registreren via sociale login",
|
||||||
"admin.config.oauth.ignore-totp": "TOTP negeren",
|
"admin.config.oauth.ignore-totp": "TOTP negeren",
|
||||||
"admin.config.oauth.ignore-totp.description": "TOTP negeren wanneer gebruiker sociale login gebruikt",
|
"admin.config.oauth.ignore-totp.description": "TOTP negeren wanneer gebruiker sociale login gebruikt",
|
||||||
"admin.config.oauth.disable-password": "Disable password login",
|
"admin.config.oauth.disable-password": "Zet password login uit",
|
||||||
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
"admin.config.oauth.disable-password.description": "Of password login moet worden uitgeschakeld\nZorg ervoor dat een OAuth-provider correct is geconfigureerd voordat u deze configuratie activeert om te voorkomen dat u wordt buitengesloten.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Ofdat GitHub login is ingeschakeld",
|
"admin.config.oauth.github-enabled.description": "Ofdat GitHub login is ingeschakeld",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
||||||
@@ -392,33 +392,39 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Ofdat OpenID Connect login is ingeschakeld",
|
"admin.config.oauth.oidc-enabled.description": "Ofdat OpenID Connect login is ingeschakeld",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI van de OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI van de OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Gebruikersnaam claim in OpenID Connect-ID-token. Laat het leeg als u niet weet wat deze configuratie is.",
|
"admin.config.oauth.oidc-username-claim.description": "Gebruikersnaam claim in OpenID Connect-ID-token. Laat het leeg als u niet weet wat deze configuratie is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-role-path.description": "Moet een geldig JMES-pad zijn dat verwijst naar een reeks rollen. " + "Het beheren van toegangsrechten met behulp van OpenID Connect-rollen wordt alleen aanbevolen als er geen andere identiteitsprovider is geconfigureerd en wachtwoordaanmelding is uitgeschakeld. " + "Laat dit leeg als u niet weet wat deze configuratie is.",
|
||||||
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role voor algemene toegang",
|
||||||
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-role-general-access.description": "Rol vereist voor algemene toegang. Moet aanwezig zijn in de rollen van een gebruiker om in te loggen. " + "Laat het leeg als u niet weet wat deze configuratie is.",
|
||||||
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role voor admin toegang",
|
||||||
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-role-admin-access.description": "Rol vereist voor administratieve toegang. Moet aanwezig zijn in de rollen van een gebruiker om toegang te krijgen tot het admin-paneel. " + "Laat dit leeg als u niet weet wat deze configuratie is.",
|
||||||
"admin.config.oauth.oidc-client-id": "Client-ID OpenID Connect",
|
"admin.config.oauth.oidc-client-id": "Client-ID OpenID Connect",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client-ID van de OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-client-id.description": "Client-ID van de OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect client secret",
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect client secret",
|
||||||
"admin.config.oauth.oidc-client-secret.description": "Client secret van de OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-client-secret.description": "Client secret van de OpenID Connect OAuth app",
|
||||||
"admin.config.category.ldap": "LDAP",
|
"admin.config.category.ldap": "LDAP",
|
||||||
"admin.config.ldap.enabled": "Enabled LDAP",
|
"admin.config.ldap.enabled": "Enabled LDAP",
|
||||||
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
|
"admin.config.ldap.enabled.description": "Gebruik LDAP authentication voor gebruiker login",
|
||||||
"admin.config.ldap.url": "Server URL",
|
"admin.config.ldap.url": "Server URL",
|
||||||
"admin.config.ldap.url.description": "URL of the LDAP server",
|
"admin.config.ldap.url.description": "URL van de LDAP server",
|
||||||
"admin.config.ldap.bind-dn": "Bind DN",
|
"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-dn.description": "Standaardgebruiker die zal worden gebruikt om de gebruikerszoekopdracht uit te voeren",
|
||||||
"admin.config.ldap.bind-password": "Bind password",
|
"admin.config.ldap.bind-password": "Bind password",
|
||||||
"admin.config.ldap.bind-password.description": "Password for the user search user",
|
"admin.config.ldap.bind-password.description": "Wachtwoord voor de user search gebruiker",
|
||||||
"admin.config.ldap.search-base": "User base",
|
"admin.config.ldap.search-base": "User base",
|
||||||
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed",
|
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed",
|
||||||
"admin.config.ldap.search-query": "User query",
|
"admin.config.ldap.search-query": "User query",
|
||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin groep",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Groep vereist voor administratieve toegang.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Oeps, deze pagina bestaat niet.",
|
"404.description": "Oeps, deze pagina bestaat niet.",
|
||||||
"404.button.home": "Breng me terug naar huis",
|
"404.button.home": "Breng me terug naar huis",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Koppeling",
|
"common.text.link": "Koppeling",
|
||||||
"common.text.navigate-to-link": "Ga naar de koppeling",
|
"common.text.navigate-to-link": "Ga naar de koppeling",
|
||||||
"common.text.or": "of",
|
"common.text.or": "of",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Ga terug",
|
"common.button.go-back": "Ga terug",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Go home",
|
||||||
"common.notify.copied": "Uw link is gekopieerd naar het klembord",
|
"common.notify.copied": "Uw link is gekopieerd naar het klembord",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Ongeldig e-mailadres",
|
"common.error.invalid-email": "Ongeldig e-mailadres",
|
||||||
"common.error.too-short": "Moet ten minste {length} tekens bevatten",
|
"common.error.too-short": "Moet ten minste {length} tekens bevatten",
|
||||||
"common.error.too-long": "Moet maximaal {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.exact-length": "Moet precies {length} tekens bevatten",
|
||||||
"common.error.invalid-number": "Moet een getal zijn",
|
"common.error.invalid-number": "Moet een getal zijn",
|
||||||
"common.error.field-required": "Dit veld is verplicht"
|
"common.error.field-required": "Dit veld is verplicht"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Czy jest włączony login OpenID Connect",
|
"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": "Wykrywanie URI OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
|
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
|
||||||
|
"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": "Żą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-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",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Ups! Ta strona nie istnieje.",
|
"404.description": "Ups! Ta strona nie istnieje.",
|
||||||
"404.button.home": "Wróć do strony domowej",
|
"404.button.home": "Wróć do strony domowej",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Link",
|
"common.text.link": "Link",
|
||||||
"common.text.navigate-to-link": "Przejdź do linku",
|
"common.text.navigate-to-link": "Przejdź do linku",
|
||||||
"common.text.or": "lub",
|
"common.text.or": "lub",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Wróć",
|
"common.button.go-back": "Wróć",
|
||||||
"common.button.go-home": "Wróć do ekranu głównego",
|
"common.button.go-home": "Wróć do ekranu głównego",
|
||||||
"common.notify.copied": "Link został skopiowany do schowka",
|
"common.notify.copied": "Link został skopiowany do schowka",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Adres e-mail jest nieprawidłowy",
|
"common.error.invalid-email": "Adres e-mail jest nieprawidłowy",
|
||||||
"common.error.too-short": "Musi mieć co najmniej {length} znaków",
|
"common.error.too-short": "Musi mieć co najmniej {length} znaków",
|
||||||
"common.error.too-long": "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.exact-length": "Musi mieć dokładnie {length} znaków",
|
||||||
"common.error.invalid-number": "Musi być liczbą",
|
"common.error.invalid-number": "Musi być liczbą",
|
||||||
"common.error.field-required": "To pole jest wymagane"
|
"common.error.field-required": "To pole jest wymagane"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Se o login do OpenID Connect está ativado",
|
"admin.config.oauth.oidc-enabled.description": "Se o login do OpenID Connect está ativado",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "URI de descoberta do OpenID Connect",
|
"admin.config.oauth.oidc-discovery-uri": "URI de descoberta do OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI da descoberta do aplicativo OpenID Connect OAuth",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI da descoberta do aplicativo OpenID Connect 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-username-claim": "Reivindicação de nome de usuário OpenID Connect",
|
"admin.config.oauth.oidc-username-claim": "Reivindicação de nome de usuário OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Nome de usuário no token de ID OpenID Connect. Deixe em branco se você não sabe o que é esta configuração.",
|
"admin.config.oauth.oidc-username-claim.description": "Nome de usuário no token de ID OpenID Connect. Deixe em branco se você não sabe o que é esta configuração.",
|
||||||
"admin.config.oauth.oidc-role-path": "Caminho para as funções no token OpenID Connect",
|
"admin.config.oauth.oidc-role-path": "Caminho para as funções no token OpenID Connect",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "A consulta do usuário será usada para pesquisar a 'base de usuários' para o usuário LDAP. %username% pode ser usado como espaço reservado para o usuário fornecido na entrada.",
|
"admin.config.ldap.search-query.description": "A consulta do usuário será usada para pesquisar a 'base de usuários' para o usuário LDAP. %username% pode ser usado como espaço reservado para o usuário fornecido na entrada.",
|
||||||
"admin.config.ldap.admin-groups": "Grupo de administração",
|
"admin.config.ldap.admin-groups": "Grupo de administração",
|
||||||
"admin.config.ldap.admin-groups.description": "Grupo necessário para acesso administrativo.",
|
"admin.config.ldap.admin-groups.description": "Grupo necessário para acesso administrativo.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "Nome do atributo do grupo de usuários",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "Nome do atributo LDAP para os grupos, de um usuário é membro. Isto é usado ao verificar para o grupo de administração.",
|
||||||
|
"admin.config.ldap.field-name-email": "Nome do atributo do grupo de usuários",
|
||||||
|
"admin.config.ldap.field-name-email.description": "Nome do atributo LDAP para o email de um usuário.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Ops, esta página não existe.",
|
"404.description": "Ops, esta página não existe.",
|
||||||
"404.button.home": "Me traga de volta para casa",
|
"404.button.home": "Me traga de volta para casa",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Link",
|
"common.text.link": "Link",
|
||||||
"common.text.navigate-to-link": "Ir para o link",
|
"common.text.navigate-to-link": "Ir para o link",
|
||||||
"common.text.or": "ou",
|
"common.text.or": "ou",
|
||||||
|
"common.text.redirecting": "Redirecionando...",
|
||||||
"common.button.go-back": "Voltar",
|
"common.button.go-back": "Voltar",
|
||||||
"common.button.go-home": "Voltar para o Início",
|
"common.button.go-home": "Voltar para o Início",
|
||||||
"common.notify.copied": "O seu link foi copiado para a área de transferência",
|
"common.notify.copied": "O seu link foi copiado para a área de transferência",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Endereço de e-mail inválido",
|
"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-short": "Deve ter no mínimo {length} caracteres",
|
||||||
"common.error.too-long": "Deve ter no máximo {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.exact-length": "Deve ter exatamente {length} caracteres",
|
||||||
"common.error.invalid-number": "Tem que ser um número",
|
"common.error.invalid-number": "Tem que ser um número",
|
||||||
"common.error.field-required": "Este campo é obrigatório"
|
"common.error.field-required": "Este campo é obrigatório"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Упс, этой страницы не существует.",
|
"404.description": "Упс, этой страницы не существует.",
|
||||||
"404.button.home": "Верните меня домой",
|
"404.button.home": "Верните меня домой",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Ссылка",
|
"common.text.link": "Ссылка",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Go to the link",
|
||||||
"common.text.or": "или",
|
"common.text.or": "или",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Назад",
|
"common.button.go-back": "Назад",
|
||||||
"common.button.go-home": "Домой",
|
"common.button.go-home": "Домой",
|
||||||
"common.notify.copied": "Ваша ссылка скопирована в буфер обмена",
|
"common.notify.copied": "Ваша ссылка скопирована в буфер обмена",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Недопустимый адрес электронной почты",
|
"common.error.invalid-email": "Недопустимый адрес электронной почты",
|
||||||
"common.error.too-short": "Должно быть не менее {length} символов",
|
"common.error.too-short": "Должно быть не менее {length} символов",
|
||||||
"common.error.too-long": "Должно быть не больше {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.exact-length": "Должно быть ровно {length} символов",
|
||||||
"common.error.invalid-number": "Должно быть числом",
|
"common.error.invalid-number": "Должно быть числом",
|
||||||
"common.error.field-required": "Поле обязательно для заполнения"
|
"common.error.field-required": "Поле обязательно для заполнения"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Če je dovoljena prijava z OpenID Connect",
|
"admin.config.oauth.oidc-enabled.description": "Če je dovoljena prijava z OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect URI za odkrivanje",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect URI za odkrivanje",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI za odkrivanje OpenID Connect OAuth aplikacije",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI za odkrivanje OpenID Connect OAuth aplikacije",
|
||||||
|
"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-username-claim": "OpenID Connect zahteva za uporabniško ime",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect zahteva za uporabniško ime",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Zahteva za uporabniško ime za OpenID Connect ID žetona. Pustite prazno, če ne poznate te nastavitve.",
|
"admin.config.oauth.oidc-username-claim.description": "Zahteva za uporabniško ime za OpenID Connect ID žetona. Pustite prazno, če ne poznate te nastavitve.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Ups! Ta stran ne obstaja.",
|
"404.description": "Ups! Ta stran ne obstaja.",
|
||||||
"404.button.home": "Pelji me domov",
|
"404.button.home": "Pelji me domov",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Poveži",
|
"common.text.link": "Poveži",
|
||||||
"common.text.navigate-to-link": "Pojdi na povezavo",
|
"common.text.navigate-to-link": "Pojdi na povezavo",
|
||||||
"common.text.or": "ali",
|
"common.text.or": "ali",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Nazaj",
|
"common.button.go-back": "Nazaj",
|
||||||
"common.button.go-home": "Pojdi domov",
|
"common.button.go-home": "Pojdi domov",
|
||||||
"common.notify.copied": "Povezava je bila kopirana v odložišče",
|
"common.notify.copied": "Povezava je bila kopirana v odložišče",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Neveljaven e-poštni naslov",
|
"common.error.invalid-email": "Neveljaven e-poštni naslov",
|
||||||
"common.error.too-short": "Vsebovati mora vsaj {length} znakov",
|
"common.error.too-short": "Vsebovati mora vsaj {length} znakov",
|
||||||
"common.error.too-long": "Vsebuje lahko največ {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.exact-length": "Dolžina mora biti točno {length} znakov",
|
||||||
"common.error.invalid-number": "Mora biti številka",
|
"common.error.invalid-number": "Mora biti številka",
|
||||||
"common.error.field-required": "To polje je obvezno"
|
"common.error.field-required": "To polje je obvezno"
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Потребна је двофакторска аутентификација",
|
"signIn.notify.totp-required.title": "Потребна је двофакторска аутентификација",
|
||||||
"signIn.notify.totp-required.description": "Унесите свој двофакторски код за аутентификацију",
|
"signIn.notify.totp-required.description": "Унесите свој двофакторски код за аутентификацију",
|
||||||
"signIn.oauth.or": "Или",
|
"signIn.oauth.or": "Или",
|
||||||
"signIn.oauth.signInWith": "Sign in with",
|
"signIn.oauth.signInWith": "Пријавите се са",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -58,7 +58,7 @@ export default {
|
|||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "Заборавили сте лозинку?",
|
"resetPassword.title": "Заборавили сте лозинку?",
|
||||||
"resetPassword.description": "Унесите своју е-пошту да бисте ресетовали лозинку.",
|
"resetPassword.description": "Унесите своју е-пошту да бисте ресетовали лозинку.",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "Порука са везом за ресетовање ваше лозинке је послата ако имејл постоји.",
|
||||||
"resetPassword.button.back": "Назад на страницу за пријаву",
|
"resetPassword.button.back": "Назад на страницу за пријаву",
|
||||||
"resetPassword.text.resetPassword": "Обнови лозинку",
|
"resetPassword.text.resetPassword": "Обнови лозинку",
|
||||||
"resetPassword.text.enterNewPassword": "Унесите вашу нову лозинку",
|
"resetPassword.text.enterNewPassword": "Унесите вашу нову лозинку",
|
||||||
@@ -152,10 +152,10 @@ export default {
|
|||||||
"account.reverseShares.modal.max-size.label": "Максимална величина дељења",
|
"account.reverseShares.modal.max-size.label": "Максимална величина дељења",
|
||||||
"account.reverseShares.modal.send-email": "Пошаљите обавештење путем е-поште",
|
"account.reverseShares.modal.send-email": "Пошаљите обавештење путем е-поште",
|
||||||
"account.reverseShares.modal.send-email.description": "Пошаљите обавештење е-поштом када се креира дељење помоћу ове обрнуте везе за дељење.",
|
"account.reverseShares.modal.send-email.description": "Пошаљите обавештење е-поштом када се креира дељење помоћу ове обрнуте везе за дељење.",
|
||||||
"account.reverseShares.modal.simplified": "Simple mode",
|
"account.reverseShares.modal.simplified": "Једноставан режим",
|
||||||
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.",
|
"account.reverseShares.modal.simplified.description": "Олакшајте особи која отпрема датотеку да је подели са вама. Они ће моћи да прилагоде само име и опис дељења.",
|
||||||
"account.reverseShares.modal.public-access": "Public access",
|
"account.reverseShares.modal.public-access": "Јавни приступ",
|
||||||
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.",
|
"account.reverseShares.modal.public-access.description": "Учините креирана дељења са овим обрнутим дељењем јавном. Ако је онемогућено, само ви и креатор дељења можете да га видите.",
|
||||||
"account.reverseShares.modal.max-use.label": "Максималан број коришћења",
|
"account.reverseShares.modal.max-use.label": "Максималан број коришћења",
|
||||||
"account.reverseShares.modal.max-use.description": "Максималан број пута који овај URL може да се користи за прављење дељења.",
|
"account.reverseShares.modal.max-use.description": "Максималан број пута који овај URL може да се користи за прављење дељења.",
|
||||||
"account.reverseShare.never-expires": "Ово обрнуто дељење никада неће истећи.",
|
"account.reverseShare.never-expires": "Ово обрнуто дељење никада неће истећи.",
|
||||||
@@ -174,7 +174,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Администрација",
|
"admin.title": "Администрација",
|
||||||
"admin.button.users": "Управљање корисницима",
|
"admin.button.users": "Управљање корисницима",
|
||||||
"admin.button.shares": "Share management",
|
"admin.button.shares": "Управљање deljenjima",
|
||||||
"admin.button.config": "Конфигурација",
|
"admin.button.config": "Конфигурација",
|
||||||
"admin.version": "Верзија",
|
"admin.version": "Верзија",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Опа - Ова страна не постоји.",
|
"404.description": "Опа - Ова страна не постоји.",
|
||||||
"404.button.home": "Врати ме на почетак",
|
"404.button.home": "Врати ме на почетак",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Линк",
|
"common.text.link": "Линк",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Go to the link",
|
||||||
"common.text.or": "или",
|
"common.text.or": "или",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Иди назад",
|
"common.button.go-back": "Иди назад",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Go home",
|
||||||
"common.notify.copied": "Ваша веза је копирана у clipboard",
|
"common.notify.copied": "Ваша веза је копирана у clipboard",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Неисправна адреса е-поште",
|
"common.error.invalid-email": "Неисправна адреса е-поште",
|
||||||
"common.error.too-short": "Мора да има најмање {length} знакова",
|
"common.error.too-short": "Мора да има најмање {length} знакова",
|
||||||
"common.error.too-long": "Мора да има највише {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.exact-length": "Мора да има тачно {length} знакова",
|
||||||
"common.error.invalid-number": "Мора бити број",
|
"common.error.invalid-number": "Мора бити број",
|
||||||
"common.error.field-required": "Поље је обавезно"
|
"common.error.field-required": "Поље је обавезно"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Om OpenID-inloggning är aktiverat",
|
"admin.config.oauth.oidc-enabled.description": "Om OpenID-inloggning är aktiverat",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI för OpenID Connect OAuth appen",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI för OpenID Connect OAuth appen",
|
||||||
|
"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-username-claim": "OpenID Connect användarnamnsanspråk",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect användarnamnsanspråk",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Användarnamnsanspråk i OpenID Connect ID token. Lämna tomt om du inte vet vad denna konfiguration är.",
|
"admin.config.oauth.oidc-username-claim.description": "Användarnamnsanspråk i OpenID Connect ID token. Lämna tomt om du inte vet vad denna konfiguration är.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Hoppsan den här sidan finns inte.",
|
"404.description": "Hoppsan den här sidan finns inte.",
|
||||||
"404.button.home": "Ta mig tillbaka hem",
|
"404.button.home": "Ta mig tillbaka hem",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Länk",
|
"common.text.link": "Länk",
|
||||||
"common.text.navigate-to-link": "Gå till länken",
|
"common.text.navigate-to-link": "Gå till länken",
|
||||||
"common.text.or": "eller",
|
"common.text.or": "eller",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Gå tillbaka",
|
"common.button.go-back": "Gå tillbaka",
|
||||||
"common.button.go-home": "Gå hem",
|
"common.button.go-home": "Gå hem",
|
||||||
"common.notify.copied": "Din länk har kopierats till urklipp",
|
"common.notify.copied": "Din länk har kopierats till urklipp",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Ogiltig e-postadress",
|
"common.error.invalid-email": "Ogiltig e-postadress",
|
||||||
"common.error.too-short": "Måste minst vara {length} tecken långt",
|
"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.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.exact-length": "Måste vara exakt {length} tecken långt",
|
||||||
"common.error.invalid-number": "Måste vara ett tal",
|
"common.error.invalid-number": "Måste vara ett tal",
|
||||||
"common.error.field-required": "Obligatoriskt fält"
|
"common.error.field-required": "Obligatoriskt fält"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "ไม่พบหน้าที่คุณกำลังมองหา",
|
"404.description": "ไม่พบหน้าที่คุณกำลังมองหา",
|
||||||
"404.button.home": "หน้าแรก",
|
"404.button.home": "หน้าแรก",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "ลิงค์",
|
"common.text.link": "ลิงค์",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Go to the link",
|
||||||
"common.text.or": "หรือ",
|
"common.text.or": "หรือ",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "ย้อนกลับ",
|
"common.button.go-back": "ย้อนกลับ",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Go home",
|
||||||
"common.notify.copied": "คัดลอกไปยังคลิปบอร์ดแล้ว",
|
"common.notify.copied": "คัดลอกไปยังคลิปบอร์ดแล้ว",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "ที่อยู่อีเมล์ไม่ถูกต้อง",
|
"common.error.invalid-email": "ที่อยู่อีเมล์ไม่ถูกต้อง",
|
||||||
"common.error.too-short": "ต้องมีอย่างน้อย {length} ตัวอักษร",
|
"common.error.too-short": "ต้องมีอย่างน้อย {length} ตัวอักษร",
|
||||||
"common.error.too-long": "ต้องมีไม่เกิน {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.exact-length": "ต้องมีความยาว {length} ตัวอักษร",
|
||||||
"common.error.invalid-number": "ต้องเป็นตัวเลข",
|
"common.error.invalid-number": "ต้องเป็นตัวเลข",
|
||||||
"common.error.field-required": "ต้องกรอกข้อมูลนี้"
|
"common.error.field-required": "ต้องกรอกข้อมูลนี้"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "OpenID girişine izin verilip verilmeyeceği",
|
"admin.config.oauth.oidc-enabled.description": "OpenID girişine izin verilip verilmeyeceği",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Keşfetme URI'si",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Keşfetme URI'si",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth uygulamasının Keşfetme URI'si",
|
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth uygulamasının Keşfetme URI'si",
|
||||||
|
"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-username-claim": "OpenID Connect kullanıcı adı sahiplenme",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect kullanıcı adı sahiplenme",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID belirtecinde kullanıcı adı sahiplenme. Bu yapılandırmanın ne olduğunu bilmiyorsanız boş bırakın.",
|
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID belirtecinde kullanıcı adı sahiplenme. Bu yapılandırmanın ne olduğunu bilmiyorsanız boş bırakın.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Haydaa, böyle bir sayfa yok.",
|
"404.description": "Haydaa, böyle bir sayfa yok.",
|
||||||
"404.button.home": "Beni eve götür",
|
"404.button.home": "Beni eve götür",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Bağlantı",
|
"common.text.link": "Bağlantı",
|
||||||
"common.text.navigate-to-link": "Bağlantıya git",
|
"common.text.navigate-to-link": "Bağlantıya git",
|
||||||
"common.text.or": "ya da",
|
"common.text.or": "ya da",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Geri dön",
|
"common.button.go-back": "Geri dön",
|
||||||
"common.button.go-home": "Ana sayfaya dön",
|
"common.button.go-home": "Ana sayfaya dön",
|
||||||
"common.notify.copied": "Bağlantınız kopyalandı",
|
"common.notify.copied": "Bağlantınız kopyalandı",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Geçersiz E-Posta adresi",
|
"common.error.invalid-email": "Geçersiz E-Posta adresi",
|
||||||
"common.error.too-short": "En azından {length} karakter olmalı",
|
"common.error.too-short": "En azından {length} karakter olmalı",
|
||||||
"common.error.too-long": "En fazla {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.exact-length": "Tam tamına {length} karakter olmalı",
|
||||||
"common.error.invalid-number": "Bir sayı olmalı",
|
"common.error.invalid-number": "Bir sayı olmalı",
|
||||||
"common.error.field-required": "Bu alan gerekli"
|
"common.error.field-required": "Bu alan gerekli"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Чи ввімкнено логін OpenID Connect",
|
"admin.config.oauth.oidc-enabled.description": "Чи ввімкнено логін OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI Discovery URI додатка OpenID Connect OAuth",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI Discovery URI додатка OpenID Connect 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-username-claim": "Заява на ім'я користувача OpenID Connect",
|
"admin.config.oauth.oidc-username-claim": "Заява на ім'я користувача OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Заява про ім'я користувача в токені OpenID Connect ID. Залиште порожнім, якщо не знаєте, що це за конфіг.",
|
"admin.config.oauth.oidc-username-claim.description": "Заява про ім'я користувача в токені OpenID Connect ID. Залиште порожнім, якщо не знаєте, що це за конфіг.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Бляха, цієї строрінки не існує.",
|
"404.description": "Бляха, цієї строрінки не існує.",
|
||||||
"404.button.home": "Поверни мене додому",
|
"404.button.home": "Поверни мене додому",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Посилання",
|
"common.text.link": "Посилання",
|
||||||
"common.text.navigate-to-link": "Перейти до посилання",
|
"common.text.navigate-to-link": "Перейти до посилання",
|
||||||
"common.text.or": "або",
|
"common.text.or": "або",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Назад",
|
"common.button.go-back": "Назад",
|
||||||
"common.button.go-home": "Перейти додому",
|
"common.button.go-home": "Перейти додому",
|
||||||
"common.notify.copied": "Ваше посилання скопійовано в буфер обміну",
|
"common.notify.copied": "Ваше посилання скопійовано в буфер обміну",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Неприпустима адреса електронної пошти",
|
"common.error.invalid-email": "Неприпустима адреса електронної пошти",
|
||||||
"common.error.too-short": "Повинно бути не менше {length} символів",
|
"common.error.too-short": "Повинно бути не менше {length} символів",
|
||||||
"common.error.too-long": "Повинно бути не більше {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.exact-length": "Повинно бути рівно {length} символів",
|
||||||
"common.error.invalid-number": "Повинно бути числом",
|
"common.error.invalid-number": "Повинно бути числом",
|
||||||
"common.error.field-required": "Поле обов'язкове для заповнення"
|
"common.error.field-required": "Поле обов'язкове для заповнення"
|
||||||
|
|||||||
@@ -3,15 +3,15 @@ export default {
|
|||||||
"navbar.upload": "Tải lên",
|
"navbar.upload": "Tải lên",
|
||||||
"navbar.signin": "Đăng nhập",
|
"navbar.signin": "Đăng nhập",
|
||||||
"navbar.home": "Trang chủ",
|
"navbar.home": "Trang chủ",
|
||||||
"navbar.signup": "Đăng kí",
|
"navbar.signup": "Đăng ký",
|
||||||
"navbar.links.shares": "My shares",
|
"navbar.links.shares": "Chia sẻ của tôi",
|
||||||
"navbar.links.reverse": "Reverse shares",
|
"navbar.links.reverse": "Reverse shares",
|
||||||
"navbar.avatar.account": "Tài khoản",
|
"navbar.avatar.account": "Tài khoản",
|
||||||
"navbar.avatar.admin": "Administration",
|
"navbar.avatar.admin": "Quản trị viên",
|
||||||
"navbar.avatar.signout": "Đăng xuất",
|
"navbar.avatar.signout": "Đăng xuất",
|
||||||
// END navbar
|
// END navbar
|
||||||
// /
|
// /
|
||||||
"home.title": "A <h>self-hosted</h> file sharing platform.",
|
"home.title": "Một nền tảng <h>seft-hosted</h> chi sẻ tệp tin.",
|
||||||
"home.description": "Do you really want to give your personal files in the hand of third parties like WeTransfer?",
|
"home.description": "Do you really want to give your personal files in the hand of third parties like WeTransfer?",
|
||||||
"home.bullet.a.name": "Self-Hosted",
|
"home.bullet.a.name": "Self-Hosted",
|
||||||
"home.bullet.a.description": "Host Pingvin Share on your own machine.",
|
"home.bullet.a.description": "Host Pingvin Share on your own machine.",
|
||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Oops this page doesn't exist.",
|
"404.description": "Oops this page doesn't exist.",
|
||||||
"404.button.home": "Về trang chủ",
|
"404.button.home": "Về trang chủ",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "Link",
|
"common.text.link": "Link",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Go to the link",
|
||||||
"common.text.or": "hoặc",
|
"common.text.or": "hoặc",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Quay lại",
|
"common.button.go-back": "Quay lại",
|
||||||
"common.button.go-home": "Về trang chủ",
|
"common.button.go-home": "Về trang chủ",
|
||||||
"common.notify.copied": "Đã sao chép liên kết vào bộ nhớ",
|
"common.notify.copied": "Đã sao chép liên kết vào bộ nhớ",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Invalid email address",
|
||||||
"common.error.too-short": "Must be at least {length} characters",
|
"common.error.too-short": "Must be at least {length} characters",
|
||||||
"common.error.too-long": "Must be at most {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.exact-length": "Bằng {length} kí tự",
|
||||||
"common.error.invalid-number": "Phải là số",
|
"common.error.invalid-number": "Phải là số",
|
||||||
"common.error.field-required": "Trường bắt buộc"
|
"common.error.field-required": "Trường bắt buộc"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "是否启用 OpenID Connect 登录",
|
"admin.config.oauth.oidc-enabled.description": "是否启用 OpenID Connect 登录",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect 的 Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect 的 Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth App 的 Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth App 的 Discovery URI",
|
||||||
|
"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-username-claim": "OpenID Connect 用户名请求",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect 用户名请求",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID token 中的用户名请求。如果您不知道这项配置是什么,请留空。",
|
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID token 中的用户名请求。如果您不知道这项配置是什么,请留空。",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "将用于在 'User base'中搜索 LDAP 用户。%username% 可以作为用户输入的占位符。",
|
"admin.config.ldap.search-query.description": "将用于在 'User base'中搜索 LDAP 用户。%username% 可以作为用户输入的占位符。",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "当前的页面走丢啦",
|
"404.description": "当前的页面走丢啦",
|
||||||
"404.button.home": "返回主页",
|
"404.button.home": "返回主页",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "链接",
|
"common.text.link": "链接",
|
||||||
"common.text.navigate-to-link": "访问链接",
|
"common.text.navigate-to-link": "访问链接",
|
||||||
"common.text.or": "或",
|
"common.text.or": "或",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "返回",
|
"common.button.go-back": "返回",
|
||||||
"common.button.go-home": "返回主页",
|
"common.button.go-home": "返回主页",
|
||||||
"common.notify.copied": "已复制到剪贴板",
|
"common.notify.copied": "已复制到剪贴板",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "邮件地址不可用",
|
"common.error.invalid-email": "邮件地址不可用",
|
||||||
"common.error.too-short": "必须不少于 {length} 个字符",
|
"common.error.too-short": "必须不少于 {length} 个字符",
|
||||||
"common.error.too-long": "必须不超过 {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.exact-length": "必须为 {length} 个字符",
|
||||||
"common.error.invalid-number": "必须为数字",
|
"common.error.invalid-number": "必须为数字",
|
||||||
"common.error.field-required": "必填项"
|
"common.error.field-required": "必填项"
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
|
"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-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -419,6 +421,10 @@ export default {
|
|||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
||||||
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
|
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
|
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "查無此頁",
|
"404.description": "查無此頁",
|
||||||
"404.button.home": "返回主頁",
|
"404.button.home": "返回主頁",
|
||||||
@@ -456,6 +462,7 @@ export default {
|
|||||||
"common.text.link": "聯結",
|
"common.text.link": "聯結",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Go to the link",
|
||||||
"common.text.or": "或",
|
"common.text.or": "或",
|
||||||
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "返回",
|
"common.button.go-back": "返回",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Go home",
|
||||||
"common.notify.copied": "已複製到剪貼簿",
|
"common.notify.copied": "已複製到剪貼簿",
|
||||||
@@ -465,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Email地址不可用",
|
"common.error.invalid-email": "Email地址不可用",
|
||||||
"common.error.too-short": "必須不少於 {length} 個字元",
|
"common.error.too-short": "必須不少於 {length} 個字元",
|
||||||
"common.error.too-long": "必須不超過 {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.exact-length": "必須為 {length} 個字元",
|
||||||
"common.error.invalid-number": "必須為數字",
|
"common.error.invalid-number": "必須為數字",
|
||||||
"common.error.field-required": "必填"
|
"common.error.field-required": "必填"
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
|
Badge,
|
||||||
Button,
|
Button,
|
||||||
Center,
|
Center,
|
||||||
Container,
|
Container,
|
||||||
@@ -142,6 +143,9 @@ const Account = () => {
|
|||||||
<Paper withBorder p="xl">
|
<Paper withBorder p="xl">
|
||||||
<Title order={5} mb="xs">
|
<Title order={5} mb="xs">
|
||||||
<FormattedMessage id="account.card.info.title" />
|
<FormattedMessage id="account.card.info.title" />
|
||||||
|
{user?.isLdap ? (
|
||||||
|
<Badge style={{ marginLeft: "1em" }}>LDAP</Badge>
|
||||||
|
) : null}
|
||||||
</Title>
|
</Title>
|
||||||
<form
|
<form
|
||||||
onSubmit={accountForm.onSubmit((values) =>
|
onSubmit={accountForm.onSubmit((values) =>
|
||||||
@@ -162,13 +166,16 @@ const Account = () => {
|
|||||||
/>
|
/>
|
||||||
<TextInput
|
<TextInput
|
||||||
label={t("account.card.info.email")}
|
label={t("account.card.info.email")}
|
||||||
|
disabled={user?.isLdap}
|
||||||
{...accountForm.getInputProps("email")}
|
{...accountForm.getInputProps("email")}
|
||||||
/>
|
/>
|
||||||
<Group position="right">
|
{!user?.isLdap && (
|
||||||
<Button type="submit">
|
<Group position="right">
|
||||||
<FormattedMessage id="common.button.save" />
|
<Button type="submit">
|
||||||
</Button>
|
<FormattedMessage id="common.button.save" />
|
||||||
</Group>
|
</Button>
|
||||||
|
</Group>
|
||||||
|
)}
|
||||||
</Stack>
|
</Stack>
|
||||||
</form>
|
</form>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ export default function AppShellDemo() {
|
|||||||
})
|
})
|
||||||
.catch(toast.axiosError);
|
.catch(toast.axiosError);
|
||||||
void config.refresh();
|
void config.refresh();
|
||||||
|
} else {
|
||||||
|
toast.success("No changes to save");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -29,8 +29,11 @@ const signUp = async (email: string, username: string, password: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const signOut = async () => {
|
const signOut = async () => {
|
||||||
await api.post("/auth/signOut");
|
const response = await api.post("/auth/signOut");
|
||||||
window.location.reload();
|
|
||||||
|
if (URL.canParse(response.data?.redirectURI))
|
||||||
|
window.location.href = response.data.redirectURI;
|
||||||
|
else window.location.reload();
|
||||||
};
|
};
|
||||||
|
|
||||||
const refreshAccessToken = async () => {
|
const refreshAccessToken = async () => {
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share",
|
"name": "pingvin-share",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pingvin-share",
|
"name": "pingvin-share",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"conventional-changelog-cli": "^3.0.0"
|
"conventional-changelog-cli": "^3.0.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share",
|
"name": "pingvin-share",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"format": "cd frontend && npm run format && cd ../backend && npm run format",
|
"format": "cd frontend && npm run format && cd ../backend && npm run format",
|
||||||
"lint": "cd frontend && npm run lint && cd ../backend && npm run lint",
|
"lint": "cd frontend && npm run lint && cd ../backend && npm run lint",
|
||||||
|
|||||||
Reference in New Issue
Block a user