@things-factory/auth-base 10.1.79 → 10.1.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/controllers/access-request.d.ts +53 -0
- package/dist-server/controllers/access-request.js +333 -0
- package/dist-server/controllers/access-request.js.map +1 -0
- package/dist-server/service/access-request/access-request-mutation.d.ts +17 -0
- package/dist-server/service/access-request/access-request-mutation.js +65 -0
- package/dist-server/service/access-request/access-request-mutation.js.map +1 -0
- package/dist-server/service/access-request/access-request-query.d.ts +11 -0
- package/dist-server/service/access-request/access-request-query.js +85 -0
- package/dist-server/service/access-request/access-request-query.js.map +1 -0
- package/dist-server/service/access-request/access-request-types.d.ts +32 -0
- package/dist-server/service/access-request/access-request-types.js +115 -0
- package/dist-server/service/access-request/access-request-types.js.map +1 -0
- package/dist-server/service/access-request/access-request.d.ts +33 -0
- package/dist-server/service/access-request/access-request.js +160 -0
- package/dist-server/service/access-request/access-request.js.map +1 -0
- package/dist-server/service/access-request/index.d.ts +5 -0
- package/dist-server/service/access-request/index.js +9 -0
- package/dist-server/service/access-request/index.js.map +1 -0
- package/dist-server/service/index.d.ts +3 -1
- package/dist-server/service/index.js +42 -37
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/open-fields.js +4 -1
- package/dist-server/service/open-fields.js.map +1 -1
- package/dist-server/service/privilege/privilege-directive.js +6 -6
- package/dist-server/service/privilege/privilege-directive.js.map +1 -1
- package/dist-server/service/privilege/privilege-rejection.d.ts +8 -2
- package/dist-server/service/privilege/privilege-rejection.js +27 -6
- package/dist-server/service/privilege/privilege-rejection.js.map +1 -1
- package/dist-server/service/user/user-mutation.js +5 -4
- package/dist-server/service/user/user-mutation.js.map +1 -1
- package/dist-server/service/user/user-query.js +5 -17
- package/dist-server/service/user/user-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/access-request-review.d.ts +69 -0
- package/dist-server/utils/access-request-review.js +119 -0
- package/dist-server/utils/access-request-review.js.map +1 -0
- package/dist-server/utils/assignable-roles.d.ts +23 -0
- package/dist-server/utils/assignable-roles.js +89 -0
- package/dist-server/utils/assignable-roles.js.map +1 -0
- package/dist-server/utils/check-permission.d.ts +29 -2
- package/dist-server/utils/check-permission.js +48 -14
- package/dist-server/utils/check-permission.js.map +1 -1
- package/package.json +4 -4
- package/tests/access-request-db.test.ts +236 -0
- package/tests/access-request-review.test.ts +155 -0
- package/tests/assignable-roles-db.test.ts +141 -0
- package/tests/permission-gate.test.ts +5 -7
- package/tests/privilege-directive.test.ts +21 -0
- package/tests/privilege-rejection.test.ts +32 -0
- package/tests/refusal-cause.test.ts +80 -0
- package/translations/en.json +26 -1
- package/translations/ja.json +26 -1
- package/translations/ko.json +26 -1
- package/translations/ms.json +26 -1
- package/translations/zh.json +26 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why the gate said no (ADR-0103 decision 1).
|
|
3
|
+
*
|
|
4
|
+
* The four refusals used to arrive as one sentence. Only one of them is opened by a role, so a screen
|
|
5
|
+
* that offers "request access" for all four sends the admin a request they cannot answer - the person is
|
|
6
|
+
* given the role and is refused again. `judgePermission` says which it was; `checkPermission` stays a boolean.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { loadCompiled } from './compiled'
|
|
10
|
+
|
|
11
|
+
const { judgePermission, checkPermission } = loadCompiled('utils/check-permission')
|
|
12
|
+
const { User } = loadCompiled('service/user/user')
|
|
13
|
+
|
|
14
|
+
const DOMAIN = { id: 'domain-1' } as any
|
|
15
|
+
const USER = { id: 'user-1' } as any
|
|
16
|
+
const NAMED = { category: 'warehouse', privilege: 'mutation' }
|
|
17
|
+
const OWNED = { ...NAMED, owner: true }
|
|
18
|
+
|
|
19
|
+
function given({ role = false, owner = false } = {}) {
|
|
20
|
+
User.hasPrivilege = jest.fn().mockResolvedValue(role)
|
|
21
|
+
;(process as any).domainOwnerGranted = jest.fn().mockResolvedValue(owner)
|
|
22
|
+
;(process as any).superUserGranted = jest.fn().mockResolvedValue(false)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
delete (process as any).domainOwnerGranted
|
|
27
|
+
delete (process as any).superUserGranted
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
describe('a refusal says which of the four it was', () => {
|
|
31
|
+
it('★ no role holds it: role', async () => {
|
|
32
|
+
given()
|
|
33
|
+
expect(await judgePermission(NAMED, USER, DOMAIN)).toEqual({ permitted: false, because: 'role' })
|
|
34
|
+
expect(await judgePermission(NAMED, USER, DOMAIN, true)).toEqual({ permitted: false, because: 'role' })
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('★ withheld by the address list: address - even with the role', async () => {
|
|
38
|
+
given({ role: true })
|
|
39
|
+
const prohibited = [{ ...NAMED, by: 'address' }]
|
|
40
|
+
expect(await judgePermission(NAMED, USER, DOMAIN, true, prohibited)).toEqual({ permitted: false, because: 'address' })
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('★ withheld by the license: license - even with the role', async () => {
|
|
44
|
+
given({ role: true })
|
|
45
|
+
const prohibited = [{ ...NAMED, by: 'license' }]
|
|
46
|
+
expect(await judgePermission(NAMED, USER, DOMAIN, false, prohibited)).toEqual({ permitted: false, because: 'license' })
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('★ a prohibition that does not say who made it: unknown - the cause is not made up', async () => {
|
|
50
|
+
given({ role: true })
|
|
51
|
+
expect(await judgePermission(NAMED, USER, DOMAIN, false, [NAMED])).toEqual({ permitted: false, because: 'unknown' })
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('★ only owners may: ownership', async () => {
|
|
55
|
+
given()
|
|
56
|
+
expect(await judgePermission({ owner: true }, USER, DOMAIN)).toEqual({ permitted: false, because: 'ownership' })
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('★ ownership asked from an unsafe address: address', async () => {
|
|
60
|
+
given({ owner: true })
|
|
61
|
+
expect(await judgePermission({ owner: true }, USER, DOMAIN, true)).toEqual({ permitted: false, because: 'address' })
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('★ an owner without the role, from an unsafe address: address - from a safe one they pass', async () => {
|
|
65
|
+
given({ owner: true })
|
|
66
|
+
expect(await judgePermission(OWNED, USER, DOMAIN, true)).toEqual({ permitted: false, because: 'address' })
|
|
67
|
+
expect(await judgePermission(OWNED, USER, DOMAIN, false)).toEqual({ permitted: true })
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
it('an unsafe address whose ownership cannot be asked still refuses as role - it refused before', async () => {
|
|
71
|
+
User.hasPrivilege = jest.fn().mockResolvedValue(false)
|
|
72
|
+
expect(await judgePermission(OWNED, USER, DOMAIN, true)).toEqual({ permitted: false, because: 'role' })
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('checkPermission answers the same, as a boolean', async () => {
|
|
76
|
+
given({ role: true })
|
|
77
|
+
expect(await checkPermission(NAMED, USER, DOMAIN)).toBe(true)
|
|
78
|
+
expect(await checkPermission(NAMED, USER, DOMAIN, false, [{ ...NAMED, by: 'license' }])).toBe(false)
|
|
79
|
+
})
|
|
80
|
+
})
|
package/translations/en.json
CHANGED
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
"error.username already exists": "username already used by another user",
|
|
28
28
|
"error.x is not a member of y": "{x} is not a member of {y}",
|
|
29
29
|
"error.x privilege required": "unauthorized! {x} privilege required",
|
|
30
|
+
"error.role-not-assignable-here": "this domain cannot assign the role(s) {roles}.",
|
|
31
|
+
"error.x not allowed from this address": "unauthorized! {x} is not allowed from this address",
|
|
32
|
+
"error.x not licensed": "unauthorized! {x} is not licensed on this installation",
|
|
33
|
+
"error.x refused for this request": "unauthorized! {x} is refused for this request",
|
|
34
|
+
"error.ownership not allowed from this address": "unauthorized! ownership does not count from this address",
|
|
30
35
|
"field.appliance_id": "appliance id",
|
|
31
36
|
"field.brand": "brand",
|
|
32
37
|
"field.password": "password",
|
|
@@ -222,5 +227,25 @@
|
|
|
222
227
|
"text.user inactivated successfully": "user inactivated successfully",
|
|
223
228
|
"text.user registered successfully": "user registered successfully. find your email to activate account",
|
|
224
229
|
"text.verification email sent": "verification email sent",
|
|
225
|
-
"privilege.description": "{name} {category}"
|
|
230
|
+
"privilege.description": "{name} {category}",
|
|
231
|
+
"error.access-request-names-nothing": "an access request names a category and a privilege.",
|
|
232
|
+
"error.access-request-unknown-privilege": "there is no privilege {privilege}.",
|
|
233
|
+
"error.access-request-already-holds": "you already have {privilege}.",
|
|
234
|
+
"error.access-request-not-by-role": "a role would not open {privilege} here, so it cannot be requested.",
|
|
235
|
+
"error.access-request-not-withdrawable": "there is no pending request of yours to withdraw.",
|
|
236
|
+
"error.access-decision-access-request-not-found": "the access request is not found in this domain.",
|
|
237
|
+
"error.access-decision-request-not-pending": "the request has already been decided, withdrawn or has expired.",
|
|
238
|
+
"error.access-decision-own-request": "you cannot decide your own request.",
|
|
239
|
+
"error.access-decision-requester-unavailable": "the requester is locked, inactive or no longer in this domain.",
|
|
240
|
+
"error.access-decision-deny-needs-reason": "a denial needs a reason.",
|
|
241
|
+
"error.access-decision-already-holds": "the requester already has this privilege.",
|
|
242
|
+
"error.access-decision-role-required": "choose the role to grant.",
|
|
243
|
+
"error.access-decision-role-not-assignable": "this domain cannot assign that role.",
|
|
244
|
+
"error.access-decision-role-does-not-grant": "that role does not hold the requested privilege.",
|
|
245
|
+
"access-request.notify.asked.title": "access request",
|
|
246
|
+
"access-request.notify.asked.body": "{name} asks for {privilege}.",
|
|
247
|
+
"access-request.notify.granted.title": "access granted",
|
|
248
|
+
"access-request.notify.granted.body": "you now have {privilege} (role: {role}).",
|
|
249
|
+
"access-request.notify.denied.title": "access request denied",
|
|
250
|
+
"access-request.notify.denied.body": "{privilege}: {reason}"
|
|
226
251
|
}
|
package/translations/ja.json
CHANGED
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
"error.username already exists": "ユーザー名はすでに他のユーザーによって使用されています.",
|
|
28
28
|
"error.x is not a member of y": "{x}は{y}のメンバーではありません.",
|
|
29
29
|
"error.x privilege required": "権限がありません。{x} 権限が必要です。",
|
|
30
|
+
"error.role-not-assignable-here": "この$t(term.domain)では付与できないロールです: {roles}",
|
|
31
|
+
"error.x not allowed from this address": "権限がありません。このアドレスからは {x} 権限を使えません。",
|
|
32
|
+
"error.x not licensed": "権限がありません。このインストールのライセンスには {x} 権限がありません。",
|
|
33
|
+
"error.x refused for this request": "権限がありません。このリクエストでは {x} 権限が許可されていません。",
|
|
34
|
+
"error.ownership not allowed from this address": "権限がありません。このアドレスからは所有者権限が適用されません。",
|
|
30
35
|
"field.appliance_id": "器具ID",
|
|
31
36
|
"field.brand": "ブランド",
|
|
32
37
|
"field.password": "パスワード",
|
|
@@ -222,5 +227,25 @@
|
|
|
222
227
|
"privilege.category.user": "ユーザー",
|
|
223
228
|
"privilege.category.webhook": "Webhook",
|
|
224
229
|
"privilege.category.work-shift": "勤務交代",
|
|
225
|
-
"privilege.category.worker": "作業者"
|
|
230
|
+
"privilege.category.worker": "作業者",
|
|
231
|
+
"error.access-request-names-nothing": "権限リクエストにはカテゴリーと権限が必要です。",
|
|
232
|
+
"error.access-request-unknown-privilege": "{privilege} という権限はありません。",
|
|
233
|
+
"error.access-request-already-holds": "すでに {privilege} 権限があります。",
|
|
234
|
+
"error.access-request-not-by-role": "{privilege} はここではロールで開けないため、リクエストできません。",
|
|
235
|
+
"error.access-request-not-withdrawable": "取り下げられる保留中のリクエストがありません。",
|
|
236
|
+
"error.access-decision-access-request-not-found": "この$t(term.domain)にその権限リクエストはありません。",
|
|
237
|
+
"error.access-decision-request-not-pending": "すでに決定済み、取り下げ済み、または期限切れのリクエストです。",
|
|
238
|
+
"error.access-decision-own-request": "自分のリクエストは決定できません。",
|
|
239
|
+
"error.access-decision-requester-unavailable": "リクエスト者がロック中、無効、またはこの$t(term.domain)に所属していません。",
|
|
240
|
+
"error.access-decision-deny-needs-reason": "拒否には理由が必要です。",
|
|
241
|
+
"error.access-decision-already-holds": "リクエスト者はすでにその権限を持っています。",
|
|
242
|
+
"error.access-decision-role-required": "付与するロールを選んでください。",
|
|
243
|
+
"error.access-decision-role-not-assignable": "この$t(term.domain)では付与できないロールです。",
|
|
244
|
+
"error.access-decision-role-does-not-grant": "そのロールにはリクエストされた権限がありません。",
|
|
245
|
+
"access-request.notify.asked.title": "権限リクエスト",
|
|
246
|
+
"access-request.notify.asked.body": "{name} さんが {privilege} 権限をリクエストしました。",
|
|
247
|
+
"access-request.notify.granted.title": "権限が付与されました",
|
|
248
|
+
"access-request.notify.granted.body": "{privilege} 権限が付与されました(ロール: {role})。",
|
|
249
|
+
"access-request.notify.denied.title": "権限リクエストが拒否されました",
|
|
250
|
+
"access-request.notify.denied.body": "{privilege}: {reason}"
|
|
226
251
|
}
|
package/translations/ko.json
CHANGED
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
"error.username already exists": "사용자 아이디가 이미 사용되고 있습니다.",
|
|
28
28
|
"error.x is not a member of y": "{x}은(는) {y}의 멤버가 아닙니다.",
|
|
29
29
|
"error.x privilege required": "권한이 없습니다. {x} 권한이 필요합니다.",
|
|
30
|
+
"error.role-not-assignable-here": "이 $t(term.domain)에서 줄 수 없는 역할입니다: {roles}",
|
|
31
|
+
"error.x not allowed from this address": "권한이 없습니다. 이 주소에서는 {x} 권한을 쓸 수 없습니다.",
|
|
32
|
+
"error.x not licensed": "권한이 없습니다. 이 설치의 라이선스에는 {x} 권한이 없습니다.",
|
|
33
|
+
"error.x refused for this request": "권한이 없습니다. 이 요청에는 {x} 권한이 허용되지 않습니다.",
|
|
34
|
+
"error.ownership not allowed from this address": "권한이 없습니다. 이 주소에서는 소유자 권한이 적용되지 않습니다.",
|
|
30
35
|
"field.appliance_id": "기구 아이디",
|
|
31
36
|
"field.brand": "브랜드",
|
|
32
37
|
"field.password": "비밀번호",
|
|
@@ -222,5 +227,25 @@
|
|
|
222
227
|
"text.user inactivated successfully": "사용자가 성공적으로 비활성화되었습니다.",
|
|
223
228
|
"text.user registered successfully": "사용자가 성공적으로 등록되었습니다. 확인 이메일을 통해서 계정을 활성화하시기 바랍니다.",
|
|
224
229
|
"text.verification email sent": "확인 이메일을 보냈습니다.",
|
|
225
|
-
"privilege.description": "{category} {name}"
|
|
230
|
+
"privilege.description": "{category} {name}",
|
|
231
|
+
"error.access-request-names-nothing": "권한 요청에는 범주와 권한이 있어야 합니다.",
|
|
232
|
+
"error.access-request-unknown-privilege": "{privilege} 권한이 없습니다.",
|
|
233
|
+
"error.access-request-already-holds": "이미 {privilege} 권한이 있습니다.",
|
|
234
|
+
"error.access-request-not-by-role": "{privilege} 권한은 여기서 역할로 열리지 않아 요청할 수 없습니다.",
|
|
235
|
+
"error.access-request-not-withdrawable": "거둘 수 있는 내 대기 중 요청이 없습니다.",
|
|
236
|
+
"error.access-decision-access-request-not-found": "이 $t(term.domain)에서 그 권한 요청을 찾을 수 없습니다.",
|
|
237
|
+
"error.access-decision-request-not-pending": "이미 정해졌거나, 거두었거나, 만료된 요청입니다.",
|
|
238
|
+
"error.access-decision-own-request": "자기 요청은 정할 수 없습니다.",
|
|
239
|
+
"error.access-decision-requester-unavailable": "요청자가 잠겼거나, 비활성이거나, 이 $t(term.domain)에서 빠졌습니다.",
|
|
240
|
+
"error.access-decision-deny-needs-reason": "거부에는 까닭이 있어야 합니다.",
|
|
241
|
+
"error.access-decision-already-holds": "요청자가 이미 그 권한을 가지고 있습니다.",
|
|
242
|
+
"error.access-decision-role-required": "부여할 역할을 고르세요.",
|
|
243
|
+
"error.access-decision-role-not-assignable": "이 $t(term.domain)에서 줄 수 없는 역할입니다.",
|
|
244
|
+
"error.access-decision-role-does-not-grant": "그 역할에는 요청한 권한이 없습니다.",
|
|
245
|
+
"access-request.notify.asked.title": "권한 요청",
|
|
246
|
+
"access-request.notify.asked.body": "{name} 님이 {privilege} 권한을 요청했습니다.",
|
|
247
|
+
"access-request.notify.granted.title": "권한을 받았습니다",
|
|
248
|
+
"access-request.notify.granted.body": "{privilege} 권한을 받았습니다(역할: {role}).",
|
|
249
|
+
"access-request.notify.denied.title": "권한 요청이 거부되었습니다",
|
|
250
|
+
"access-request.notify.denied.body": "{privilege}: {reason}"
|
|
226
251
|
}
|
package/translations/ms.json
CHANGED
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
"error.username already exists": "Nama pengguna telah digunakan oleh pengguna lain",
|
|
28
28
|
"error.x is not a member of y": "{x} bukan ahli {y}",
|
|
29
29
|
"error.x privilege required": "tidak dibenarkan! kebenaran {x} diperlukan",
|
|
30
|
+
"error.role-not-assignable-here": "$t(term.domain) ini tidak boleh memberikan peranan: {roles}",
|
|
31
|
+
"error.x not allowed from this address": "tidak dibenarkan! kebenaran {x} tidak dibenarkan dari alamat ini",
|
|
32
|
+
"error.x not licensed": "tidak dibenarkan! kebenaran {x} tiada dalam lesen pemasangan ini",
|
|
33
|
+
"error.x refused for this request": "tidak dibenarkan! kebenaran {x} ditolak untuk permintaan ini",
|
|
34
|
+
"error.ownership not allowed from this address": "tidak dibenarkan! kebenaran pemilik tidak terpakai dari alamat ini",
|
|
30
35
|
"field.appliance_id": "Perkakas",
|
|
31
36
|
"field.brand": "Jenama",
|
|
32
37
|
"field.password": "Kata laluan",
|
|
@@ -222,5 +227,25 @@
|
|
|
222
227
|
"privilege.category.user": "pengguna",
|
|
223
228
|
"privilege.category.webhook": "Webhook",
|
|
224
229
|
"privilege.category.work-shift": "syif kerja",
|
|
225
|
-
"privilege.category.worker": "pekerja"
|
|
230
|
+
"privilege.category.worker": "pekerja",
|
|
231
|
+
"error.access-request-names-nothing": "permintaan akses perlu menamakan kategori dan kebenaran.",
|
|
232
|
+
"error.access-request-unknown-privilege": "tiada kebenaran {privilege}.",
|
|
233
|
+
"error.access-request-already-holds": "anda sudah mempunyai {privilege}.",
|
|
234
|
+
"error.access-request-not-by-role": "{privilege} tidak dibuka oleh peranan di sini, jadi ia tidak boleh dipohon.",
|
|
235
|
+
"error.access-request-not-withdrawable": "tiada permintaan anda yang menunggu untuk ditarik balik.",
|
|
236
|
+
"error.access-decision-access-request-not-found": "permintaan akses tidak ditemui dalam $t(term.domain) ini.",
|
|
237
|
+
"error.access-decision-request-not-pending": "permintaan ini sudah diputuskan, ditarik balik atau tamat tempoh.",
|
|
238
|
+
"error.access-decision-own-request": "anda tidak boleh memutuskan permintaan anda sendiri.",
|
|
239
|
+
"error.access-decision-requester-unavailable": "peminta dikunci, tidak aktif atau tiada lagi dalam $t(term.domain) ini.",
|
|
240
|
+
"error.access-decision-deny-needs-reason": "penolakan memerlukan sebab.",
|
|
241
|
+
"error.access-decision-already-holds": "peminta sudah mempunyai kebenaran ini.",
|
|
242
|
+
"error.access-decision-role-required": "pilih peranan untuk diberikan.",
|
|
243
|
+
"error.access-decision-role-not-assignable": "$t(term.domain) ini tidak boleh memberikan peranan itu.",
|
|
244
|
+
"error.access-decision-role-does-not-grant": "peranan itu tidak memegang kebenaran yang dipohon.",
|
|
245
|
+
"access-request.notify.asked.title": "permintaan akses",
|
|
246
|
+
"access-request.notify.asked.body": "{name} memohon {privilege}.",
|
|
247
|
+
"access-request.notify.granted.title": "akses diberikan",
|
|
248
|
+
"access-request.notify.granted.body": "anda kini mempunyai {privilege} (peranan: {role}).",
|
|
249
|
+
"access-request.notify.denied.title": "permintaan akses ditolak",
|
|
250
|
+
"access-request.notify.denied.body": "{privilege}: {reason}"
|
|
226
251
|
}
|
package/translations/zh.json
CHANGED
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
"error.username already exists": "用户名已被其他用户使用",
|
|
28
28
|
"error.x is not a member of y": "{x}不是{y}的成员",
|
|
29
29
|
"error.x privilege required": "没有权限。需要 {x} 权限。",
|
|
30
|
+
"error.role-not-assignable-here": "此$t(term.domain)不能分配的角色: {roles}",
|
|
31
|
+
"error.x not allowed from this address": "没有权限。从此地址不能使用 {x} 权限。",
|
|
32
|
+
"error.x not licensed": "没有权限。此安装的许可证不包含 {x} 权限。",
|
|
33
|
+
"error.x refused for this request": "没有权限。此请求不允许 {x} 权限。",
|
|
34
|
+
"error.ownership not allowed from this address": "没有权限。从此地址所有者权限不适用。",
|
|
30
35
|
"field.appliance_id": "终端机ID",
|
|
31
36
|
"field.brand": "品牌",
|
|
32
37
|
"field.password": "密码",
|
|
@@ -222,5 +227,25 @@
|
|
|
222
227
|
"privilege.category.user": "用户",
|
|
223
228
|
"privilege.category.webhook": "Webhook",
|
|
224
229
|
"privilege.category.work-shift": "轮班",
|
|
225
|
-
"privilege.category.worker": "作业人员"
|
|
230
|
+
"privilege.category.worker": "作业人员",
|
|
231
|
+
"error.access-request-names-nothing": "权限请求需要类别和权限。",
|
|
232
|
+
"error.access-request-unknown-privilege": "不存在权限 {privilege}。",
|
|
233
|
+
"error.access-request-already-holds": "您已拥有 {privilege} 权限。",
|
|
234
|
+
"error.access-request-not-by-role": "{privilege} 在此无法通过角色开放,因此不能请求。",
|
|
235
|
+
"error.access-request-not-withdrawable": "没有可撤回的待处理请求。",
|
|
236
|
+
"error.access-decision-access-request-not-found": "在此$t(term.domain)中找不到该权限请求。",
|
|
237
|
+
"error.access-decision-request-not-pending": "该请求已被处理、撤回或已过期。",
|
|
238
|
+
"error.access-decision-own-request": "不能处理自己的请求。",
|
|
239
|
+
"error.access-decision-requester-unavailable": "请求者已被锁定、未激活或已不在此$t(term.domain)中。",
|
|
240
|
+
"error.access-decision-deny-needs-reason": "拒绝需要填写理由。",
|
|
241
|
+
"error.access-decision-already-holds": "请求者已拥有该权限。",
|
|
242
|
+
"error.access-decision-role-required": "请选择要授予的角色。",
|
|
243
|
+
"error.access-decision-role-not-assignable": "此$t(term.domain)不能分配该角色。",
|
|
244
|
+
"error.access-decision-role-does-not-grant": "该角色不包含所请求的权限。",
|
|
245
|
+
"access-request.notify.asked.title": "权限请求",
|
|
246
|
+
"access-request.notify.asked.body": "{name} 请求 {privilege} 权限。",
|
|
247
|
+
"access-request.notify.granted.title": "权限已授予",
|
|
248
|
+
"access-request.notify.granted.body": "您已获得 {privilege} 权限(角色: {role})。",
|
|
249
|
+
"access-request.notify.denied.title": "权限请求被拒绝",
|
|
250
|
+
"access-request.notify.denied.body": "{privilege}: {reason}"
|
|
226
251
|
}
|