@quenty/permissionprovider 8.18.1-canary.405.6fa018e.0 → 8.19.0
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/CHANGELOG.md +5 -2
- package/package.json +13 -10
- package/src/Server/PermissionService.lua +46 -6
- package/src/Server/Providers/BasePermissionProvider.lua +43 -26
- package/src/Server/Providers/CreatorPermissionProvider.lua +14 -13
- package/src/Server/Providers/GroupPermissionProvider.lua +22 -10
- package/src/Shared/PermissionLevel.lua +12 -0
- package/src/Shared/PermissionLevelUtils.lua +20 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
# [8.19.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/permissionprovider@8.18.0...@quenty/permissionprovider@8.19.0) (2023-08-23)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* Add PermissionService:PromiseIsPermissionLevel(player, permissionLevel) ([2297438](https://github.com/Quenty/NevermoreEngine/commit/229743882002800c917e5fd131f81b4f7a36dc89))
|
|
9
12
|
|
|
10
13
|
|
|
11
14
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/permissionprovider",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.19.0",
|
|
4
4
|
"description": "Permission provider for Roblox, including authenticating against group membership",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -25,17 +25,20 @@
|
|
|
25
25
|
"Quenty"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@quenty/baseobject": "6.
|
|
29
|
-
"@quenty/
|
|
30
|
-
"@quenty/
|
|
31
|
-
"@quenty/
|
|
32
|
-
"@quenty/
|
|
33
|
-
"@quenty/
|
|
34
|
-
"@quenty/
|
|
35
|
-
"@quenty/
|
|
28
|
+
"@quenty/baseobject": "^6.3.0",
|
|
29
|
+
"@quenty/brio": "^8.17.0",
|
|
30
|
+
"@quenty/grouputils": "^6.8.0",
|
|
31
|
+
"@quenty/loader": "^6.3.0",
|
|
32
|
+
"@quenty/maid": "^2.6.0",
|
|
33
|
+
"@quenty/playerutils": "^2.19.0",
|
|
34
|
+
"@quenty/promise": "^6.8.0",
|
|
35
|
+
"@quenty/remoting": "^6.10.0",
|
|
36
|
+
"@quenty/rx": "^7.15.0",
|
|
37
|
+
"@quenty/servicebag": "^6.9.0",
|
|
38
|
+
"@quenty/table": "^3.3.0"
|
|
36
39
|
},
|
|
37
40
|
"publishConfig": {
|
|
38
41
|
"access": "public"
|
|
39
42
|
},
|
|
40
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "3b7e47e2180964b6b0b156d07814810e063ef7ed"
|
|
41
44
|
}
|
|
@@ -26,10 +26,15 @@ local require = require(script.Parent.loader).load(script)
|
|
|
26
26
|
|
|
27
27
|
local CreatorPermissionProvider = require("CreatorPermissionProvider")
|
|
28
28
|
local GroupPermissionProvider = require("GroupPermissionProvider")
|
|
29
|
+
local Maid = require("Maid")
|
|
30
|
+
local PermissionLevel = require("PermissionLevel")
|
|
29
31
|
local PermissionProviderConstants = require("PermissionProviderConstants")
|
|
30
32
|
local PermissionProviderUtils = require("PermissionProviderUtils")
|
|
31
33
|
local Promise = require("Promise")
|
|
32
|
-
local
|
|
34
|
+
local Rx = require("Rx")
|
|
35
|
+
local RxBrioUtils = require("RxBrioUtils")
|
|
36
|
+
local RxPlayerUtils = require("RxPlayerUtils")
|
|
37
|
+
local PermissionLevelUtils = require("PermissionLevelUtils")
|
|
33
38
|
|
|
34
39
|
local PermissionService = {}
|
|
35
40
|
PermissionService.ServiceName = "PermissionService"
|
|
@@ -100,10 +105,7 @@ end
|
|
|
100
105
|
function PermissionService:PromiseIsAdmin(player)
|
|
101
106
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "bad player")
|
|
102
107
|
|
|
103
|
-
return self:
|
|
104
|
-
:Then(function(permissionProvider)
|
|
105
|
-
return permissionProvider:PromiseIsAdmin(player)
|
|
106
|
-
end)
|
|
108
|
+
return self:PromiseIsPermissionLevel(player, PermissionLevel.ADMIN)
|
|
107
109
|
end
|
|
108
110
|
|
|
109
111
|
--[=[
|
|
@@ -114,12 +116,50 @@ end
|
|
|
114
116
|
function PermissionService:PromiseIsCreator(player)
|
|
115
117
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "bad player")
|
|
116
118
|
|
|
119
|
+
return self:PromiseIsPermissionLevel(player, PermissionLevel.CREATOR)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
--[=[
|
|
123
|
+
Returns whether the player is a creator.
|
|
124
|
+
@param player Player
|
|
125
|
+
@param permissionLevel PermissionLevel
|
|
126
|
+
@return Promise<boolean>
|
|
127
|
+
]=]
|
|
128
|
+
function PermissionService:PromiseIsPermissionLevel(player, permissionLevel)
|
|
129
|
+
assert(typeof(player) == "Instance" and player:IsA("Player"), "bad player")
|
|
130
|
+
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
131
|
+
|
|
117
132
|
return self:PromisePermissionProvider()
|
|
118
133
|
:Then(function(permissionProvider)
|
|
119
|
-
return permissionProvider:
|
|
134
|
+
return permissionProvider:PromiseIsPermissionLevel(player, permissionLevel)
|
|
120
135
|
end)
|
|
121
136
|
end
|
|
122
137
|
|
|
138
|
+
--[=[
|
|
139
|
+
Observe all creators in the game
|
|
140
|
+
|
|
141
|
+
@param permissionLevel PermissionLevel
|
|
142
|
+
@return Observable<Brio<Player>>
|
|
143
|
+
]=]
|
|
144
|
+
function PermissionService:ObservePermissionedPlayersBrio(permissionLevel)
|
|
145
|
+
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
146
|
+
|
|
147
|
+
return RxPlayerUtils.observePlayersBrio():Pipe({
|
|
148
|
+
RxBrioUtils.flatMapBrio(function(player)
|
|
149
|
+
return Rx.fromPromise(self:PromiseIsPermissionLevel(player, permissionLevel))
|
|
150
|
+
:Pipe({
|
|
151
|
+
Rx.switchMap(function(hasPermission)
|
|
152
|
+
if hasPermission then
|
|
153
|
+
return Rx.of(player)
|
|
154
|
+
else
|
|
155
|
+
return Rx.EMPTY
|
|
156
|
+
end
|
|
157
|
+
end)
|
|
158
|
+
})
|
|
159
|
+
end);
|
|
160
|
+
})
|
|
161
|
+
end
|
|
162
|
+
|
|
123
163
|
function PermissionService:Destroy()
|
|
124
164
|
self._maid:DoCleaning()
|
|
125
165
|
self._provider = nil
|
|
@@ -8,6 +8,8 @@ local require = require(script.Parent.loader).load(script)
|
|
|
8
8
|
|
|
9
9
|
local BaseObject = require("BaseObject")
|
|
10
10
|
local GetRemoteFunction = require("GetRemoteFunction")
|
|
11
|
+
local PermissionLevel = require("PermissionLevel")
|
|
12
|
+
local PermissionLevelUtils = require("PermissionLevelUtils")
|
|
11
13
|
local Table = require("Table")
|
|
12
14
|
|
|
13
15
|
local BasePermissionProvider = setmetatable({}, BaseObject)
|
|
@@ -44,14 +46,51 @@ end
|
|
|
44
46
|
--[=[
|
|
45
47
|
Returns whether the player is a creator.
|
|
46
48
|
@param player Player
|
|
49
|
+
@param permissionLevel PermissionLevel
|
|
47
50
|
@return Promise<boolean>
|
|
48
51
|
]=]
|
|
49
|
-
function BasePermissionProvider:
|
|
52
|
+
function BasePermissionProvider:PromiseIsPermissionLevel(player, permissionLevel)
|
|
50
53
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
54
|
+
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
51
55
|
|
|
52
56
|
error("Not implemented")
|
|
53
57
|
end
|
|
54
58
|
|
|
59
|
+
--[=[
|
|
60
|
+
Returns whether the player is a creator.
|
|
61
|
+
@param player Player
|
|
62
|
+
@param permissionLevel PermissionLevel
|
|
63
|
+
@return Promise<boolean>
|
|
64
|
+
]=]
|
|
65
|
+
function BasePermissionProvider:IsPermissionLevel(player, permissionLevel)
|
|
66
|
+
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
67
|
+
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
68
|
+
|
|
69
|
+
local promise = self:PromiseIsPermissionLevel(player, permissionLevel)
|
|
70
|
+
if promise:IsPending() then
|
|
71
|
+
return false -- We won't yield for this
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
local ok, result = promise:Yield()
|
|
75
|
+
if not ok then
|
|
76
|
+
warn("[BasePermissionProvider] - %s"):format(tostring(result))
|
|
77
|
+
return false
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
return result
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
--[=[
|
|
84
|
+
Returns whether the player is a creator.
|
|
85
|
+
@param player Player
|
|
86
|
+
@return Promise<boolean>
|
|
87
|
+
]=]
|
|
88
|
+
function BasePermissionProvider:PromiseIsCreator(player)
|
|
89
|
+
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
90
|
+
|
|
91
|
+
return self:PromiseIsPermissionLevel(player, PermissionLevel.CREATOR)
|
|
92
|
+
end
|
|
93
|
+
|
|
55
94
|
--[=[
|
|
56
95
|
Returns whether the player is an admin.
|
|
57
96
|
@param player Player
|
|
@@ -60,7 +99,7 @@ end
|
|
|
60
99
|
function BasePermissionProvider:PromiseIsAdmin(player)
|
|
61
100
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
62
101
|
|
|
63
|
-
|
|
102
|
+
return self:PromiseIsPermissionLevel(player, PermissionLevel.ADMIN)
|
|
64
103
|
end
|
|
65
104
|
|
|
66
105
|
--[=[
|
|
@@ -76,18 +115,7 @@ end
|
|
|
76
115
|
function BasePermissionProvider:IsCreator(player)
|
|
77
116
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
78
117
|
|
|
79
|
-
|
|
80
|
-
if promise:IsPending() then
|
|
81
|
-
return false -- We won't yield for this
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
local ok, result = promise:Yield()
|
|
85
|
-
if not ok then
|
|
86
|
-
warn("[BasePermissionProvider] - %s"):format(tostring(result))
|
|
87
|
-
return false
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
return result
|
|
118
|
+
return self:IsCreator(player, PermissionLevel.CREATOR)
|
|
91
119
|
end
|
|
92
120
|
|
|
93
121
|
--[=[
|
|
@@ -103,18 +131,7 @@ end
|
|
|
103
131
|
function BasePermissionProvider:IsAdmin(player)
|
|
104
132
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
105
133
|
|
|
106
|
-
|
|
107
|
-
if promise:IsPending() then
|
|
108
|
-
return false -- We won't yield for this
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
local ok, result = promise:Yield()
|
|
112
|
-
if not ok then
|
|
113
|
-
warn("[BasePermissionProvider] - %s"):format(tostring(result))
|
|
114
|
-
return false
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
return result
|
|
134
|
+
return self:IsPermissionLevel(player, PermissionLevel.ADMIN)
|
|
118
135
|
end
|
|
119
136
|
|
|
120
137
|
function BasePermissionProvider:_onServerInvoke(player)
|
|
@@ -12,6 +12,8 @@ local RunService = game:GetService("RunService")
|
|
|
12
12
|
local BasePermissionProvider = require("BasePermissionProvider")
|
|
13
13
|
local PermissionProviderConstants = require("PermissionProviderConstants")
|
|
14
14
|
local Promise = require("Promise")
|
|
15
|
+
local PermissionLevel = require("PermissionLevel")
|
|
16
|
+
local PermissionLevelUtils = require("PermissionLevelUtils")
|
|
15
17
|
|
|
16
18
|
local CreatorPermissionProvider = setmetatable({}, BasePermissionProvider)
|
|
17
19
|
CreatorPermissionProvider.ClassName = "CreatorPermissionProvider"
|
|
@@ -31,23 +33,22 @@ function CreatorPermissionProvider.new(config)
|
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
--[=[
|
|
34
|
-
Returns whether the player is a
|
|
35
|
-
@param player Player
|
|
36
|
-
@return Promise<boolean>
|
|
37
|
-
]=]
|
|
38
|
-
function CreatorPermissionProvider:PromiseIsCreator(player)
|
|
39
|
-
return Promise.resolved(player.UserId == self._userId
|
|
40
|
-
or RunService:IsStudio())
|
|
41
|
-
end
|
|
36
|
+
Returns whether the player is at a specific permission level.
|
|
42
37
|
|
|
43
|
-
--[=[
|
|
44
|
-
Returns whether the player is an admin.
|
|
45
38
|
@param player Player
|
|
39
|
+
@param permissionLevel PermissionLevel
|
|
46
40
|
@return Promise<boolean>
|
|
47
41
|
]=]
|
|
48
|
-
function CreatorPermissionProvider:
|
|
49
|
-
|
|
50
|
-
|
|
42
|
+
function CreatorPermissionProvider:PromiseIsPermissionLevel(player, permissionLevel)
|
|
43
|
+
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
44
|
+
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
45
|
+
|
|
46
|
+
if permissionLevel == PermissionLevel.ADMIN
|
|
47
|
+
or permissionLevel == PermissionLevel.CREATOR then
|
|
48
|
+
return Promise.resolved(player.UserId == self._userId or RunService:IsStudio())
|
|
49
|
+
else
|
|
50
|
+
error("Unknown permissionLevel")
|
|
51
|
+
end
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
return CreatorPermissionProvider
|
|
@@ -9,10 +9,12 @@ local require = require(script.Parent.loader).load(script)
|
|
|
9
9
|
|
|
10
10
|
local Players = game:GetService("Players")
|
|
11
11
|
|
|
12
|
-
local PermissionProviderConstants = require("PermissionProviderConstants")
|
|
13
|
-
local Promise = require("Promise")
|
|
14
12
|
local BasePermissionProvider = require("BasePermissionProvider")
|
|
15
13
|
local GroupUtils = require("GroupUtils")
|
|
14
|
+
local PermissionLevel = require("PermissionLevel")
|
|
15
|
+
local PermissionLevelUtils = require("PermissionLevelUtils")
|
|
16
|
+
local PermissionProviderConstants = require("PermissionProviderConstants")
|
|
17
|
+
local Promise = require("Promise")
|
|
16
18
|
|
|
17
19
|
local GroupPermissionProvider = setmetatable({}, BasePermissionProvider)
|
|
18
20
|
GroupPermissionProvider.__index = GroupPermissionProvider
|
|
@@ -68,11 +70,26 @@ function GroupPermissionProvider:Start()
|
|
|
68
70
|
end
|
|
69
71
|
|
|
70
72
|
--[=[
|
|
71
|
-
Returns whether the player is a
|
|
73
|
+
Returns whether the player is at a specific permission level
|
|
74
|
+
|
|
72
75
|
@param player Player
|
|
76
|
+
@param permissionLevel PermissionLevel
|
|
73
77
|
@return Promise<boolean>
|
|
74
78
|
]=]
|
|
75
|
-
function GroupPermissionProvider:
|
|
79
|
+
function GroupPermissionProvider:PromiseIsPermissionLevel(player, permissionLevel)
|
|
80
|
+
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
81
|
+
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
82
|
+
|
|
83
|
+
if permissionLevel == PermissionLevel.ADMIN then
|
|
84
|
+
return self:_promiseIsAdmin(player)
|
|
85
|
+
elseif permissionLevel == PermissionLevel.CREATOR then
|
|
86
|
+
return self:_promiseIsCreator(player)
|
|
87
|
+
else
|
|
88
|
+
error("Unknown permissionLevel")
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
function GroupPermissionProvider:_promiseIsCreator(player)
|
|
76
93
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
77
94
|
assert(player:IsDescendantOf(game), "Bad player")
|
|
78
95
|
|
|
@@ -86,12 +103,7 @@ function GroupPermissionProvider:PromiseIsCreator(player)
|
|
|
86
103
|
end)
|
|
87
104
|
end
|
|
88
105
|
|
|
89
|
-
|
|
90
|
-
Returns whether the player is an admin.
|
|
91
|
-
@param player Player
|
|
92
|
-
@return Promise<boolean>
|
|
93
|
-
]=]
|
|
94
|
-
function GroupPermissionProvider:PromiseIsAdmin(player)
|
|
106
|
+
function GroupPermissionProvider:_promiseIsAdmin(player)
|
|
95
107
|
assert(player:IsDescendantOf(game))
|
|
96
108
|
|
|
97
109
|
-- really not saving much time.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
--[=[
|
|
2
|
+
@class PermissionLevelUtils
|
|
3
|
+
]=]
|
|
4
|
+
|
|
5
|
+
local require = require(script.Parent.loader).load(script)
|
|
6
|
+
|
|
7
|
+
local PermissionLevel = require("PermissionLevel")
|
|
8
|
+
|
|
9
|
+
local PermissionLevelUtils = {}
|
|
10
|
+
|
|
11
|
+
local ALLOWED = {}
|
|
12
|
+
for _, item in pairs(PermissionLevel) do
|
|
13
|
+
ALLOWED[item] = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
function PermissionLevelUtils.isPermissionLevel(permissionLevel)
|
|
17
|
+
return ALLOWED[permissionLevel]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
return PermissionLevelUtils
|