reyserver 1.1.50__py3-none-any.whl → 1.1.51__py3-none-any.whl
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.
- reyserver/rauth.py +80 -28
- reyserver/rbase.py +166 -30
- reyserver/rclient.py +38 -1
- reyserver/rfile.py +5 -5
- reyserver/rserver.py +7 -3
- {reyserver-1.1.50.dist-info → reyserver-1.1.51.dist-info}/METADATA +1 -1
- reyserver-1.1.51.dist-info/RECORD +11 -0
- reyserver-1.1.50.dist-info/RECORD +0 -11
- {reyserver-1.1.50.dist-info → reyserver-1.1.51.dist-info}/WHEEL +0 -0
- {reyserver-1.1.50.dist-info → reyserver-1.1.51.dist-info}/licenses/LICENSE +0 -0
reyserver/rauth.py
CHANGED
@@ -9,10 +9,11 @@
|
|
9
9
|
"""
|
10
10
|
|
11
11
|
|
12
|
+
from typing import Literal
|
12
13
|
from fastapi import APIRouter
|
13
14
|
from reydb import rorm, DatabaseEngine, DatabaseEngineAsync
|
14
|
-
from reykit.rdata import encode_jwt,
|
15
|
-
from reykit.rtime import now
|
15
|
+
# from reykit.rdata import encode_jwt, is_hash_bcrypt
|
16
|
+
# from reykit.rtime import now
|
16
17
|
|
17
18
|
from .rbase import ServerConfig, Bind, exit_api
|
18
19
|
|
@@ -72,8 +73,7 @@ class DatabaseORMTablePerm(rorm.Model, table=True):
|
|
72
73
|
perm_id: int = rorm.Field(rorm.types_mysql.SMALLINT(unsigned=True), key_auto=True, comment='Permission ID.')
|
73
74
|
name: str = rorm.Field(rorm.types.VARCHAR(50), not_null=True, index_u=True, comment='Permission name.')
|
74
75
|
desc: str = rorm.Field(rorm.types.VARCHAR(500), comment='Permission description.')
|
75
|
-
|
76
|
-
path: str = rorm.Field(rorm.types.VARCHAR(1000), comment='API resource path regular expression "match" pattern.')
|
76
|
+
api: str = rorm.Field(rorm.types.VARCHAR(1000), comment='API resource path regular expression "match" pattern.')
|
77
77
|
|
78
78
|
|
79
79
|
class DatabaseORMTableUserRole(rorm.Model, table=True):
|
@@ -202,8 +202,9 @@ depend_auth_conn = Bind.create_depend_db('auth', 'conn')
|
|
202
202
|
|
203
203
|
@auth_router.post('/sessions')
|
204
204
|
async def create_sessions(
|
205
|
-
|
206
|
-
password: str = Bind.body,
|
205
|
+
account: str = Bind.i.body,
|
206
|
+
password: str = Bind.i.body,
|
207
|
+
account_type: Literal['name', 'email', 'phone'] = Bind.Body('name'),
|
207
208
|
conn: Bind.Conn = depend_auth_conn
|
208
209
|
) -> dict:
|
209
210
|
"""
|
@@ -211,8 +212,9 @@ async def create_sessions(
|
|
211
212
|
|
212
213
|
Parameters
|
213
214
|
----------
|
214
|
-
|
215
|
+
account : User account, name or email or phone.
|
215
216
|
password : User password.
|
217
|
+
account_type : User account type.
|
216
218
|
|
217
219
|
Returns
|
218
220
|
-------
|
@@ -221,31 +223,81 @@ async def create_sessions(
|
|
221
223
|
|
222
224
|
# Parameter.
|
223
225
|
key = ServerConfig.server.api_auth_key
|
224
|
-
|
226
|
+
sess_seconds = ServerConfig.server.api_auth_sess_seconds
|
225
227
|
|
226
228
|
# Check.
|
227
229
|
sql = (
|
228
|
-
''
|
230
|
+
'SELECT ANY_VALUE(`create_time`) AS `create_time`,\n'
|
231
|
+
' ANY_VALUE(`update_time`) AS `update_time`,\n'
|
232
|
+
' ANY_VALUE(`user`.`user_id`) AS `user_id`,\n'
|
233
|
+
' ANY_VALUE(`user`.`name`) AS `user_name`,\n'
|
234
|
+
' ANY_VALUE(`password`) AS `password`,\n'
|
235
|
+
' ANY_VALUE(`email`) AS `email`,\n'
|
236
|
+
' ANY_VALUE(`phone`) AS `phone`,\n'
|
237
|
+
' ANY_VALUE(`avatar`) AS `avatar`,\n'
|
238
|
+
" GROUP_CONCAT(DISTINCT `role`.`name` SEPARATOR ';') AS `role_names`,\n"
|
239
|
+
" GROUP_CONCAT(DISTINCT `perm`.`name` SEPARATOR ';') AS `perm_names`,\n"
|
240
|
+
" GROUP_CONCAT(DISTINCT `perm`.`api` SEPARATOR ';') AS `perm_apis`\n"
|
241
|
+
'FROM (\n'
|
242
|
+
' SELECT `create_time`, `update_time`, `user_id`, `password`, `name`, `email`, `phone`, `avatar`\n'
|
243
|
+
' FROM `test`.`user`\n'
|
244
|
+
f' WHERE `{account_type}` = :account\n'
|
245
|
+
' LIMIT 1\n'
|
246
|
+
') as `user`\n'
|
247
|
+
'LEFT JOIN (\n'
|
248
|
+
' SELECT `user_id`, `role_id`\n'
|
249
|
+
' FROM `test`.`user_role`\n'
|
250
|
+
') as `user_role`\n'
|
251
|
+
'ON `user_role`.`user_id` = `user`.`user_id`\n'
|
252
|
+
'LEFT JOIN (\n'
|
253
|
+
' SELECT `role_id`, `name`\n'
|
254
|
+
' FROM `test`.`role`\n'
|
255
|
+
') AS `role`\n'
|
256
|
+
'ON `user_role`.`role_id` = `role`.`role_id`\n'
|
257
|
+
'LEFT JOIN (\n'
|
258
|
+
' SELECT `role_id`, `perm_id`\n'
|
259
|
+
' FROM `test`.`role_perm`\n'
|
260
|
+
') as `role_perm`\n'
|
261
|
+
'ON `role_perm`.`role_id` = `role`.`role_id`\n'
|
262
|
+
'LEFT JOIN (\n'
|
263
|
+
" SELECT `perm_id`, `name`, CONCAT(`method`, ':', `path`) as `api`\n"
|
264
|
+
' FROM `test`.`perm`\n'
|
265
|
+
') AS `perm`\n'
|
266
|
+
'ON `role_perm`.`perm_id` = `perm`.`perm_id`'
|
229
267
|
)
|
268
|
+
print(1111111111111)
|
230
269
|
result = await conn.execute(
|
231
270
|
sql,
|
232
|
-
|
233
|
-
password_hash=password_hash
|
271
|
+
account=account
|
234
272
|
)
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
#
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
273
|
+
print(result.fetchall())
|
274
|
+
return {'message': 'ok'}
|
275
|
+
|
276
|
+
# # Check.
|
277
|
+
# table = result.to_table()
|
278
|
+
# print(table)
|
279
|
+
# if table == []:
|
280
|
+
# exit_api(401)
|
281
|
+
# json = table[0]
|
282
|
+
# if not is_hash_bcrypt(password, json['password']):
|
283
|
+
# exit_api(401)
|
284
|
+
|
285
|
+
# # JWT.
|
286
|
+
# now_timestamp_s = now('timestamp_s')
|
287
|
+
# json['sub'] = json.pop('user_id')
|
288
|
+
# json['iat'] = now_timestamp_s
|
289
|
+
# json['nbf'] = now_timestamp_s
|
290
|
+
# json['exp'] = now_timestamp_s + sess_seconds
|
291
|
+
# json['role_names'] = json['role_names'].split(';')
|
292
|
+
# json['perm_names'] = json['perm_names'].split(';')
|
293
|
+
# perm_apis: list[str] = json['perm_apis'].split(';')
|
294
|
+
# perm_api_dict = {}
|
295
|
+
# for perm_api in perm_apis:
|
296
|
+
# for method, path in perm_api.split(':', 1):
|
297
|
+
# paths: list = perm_api_dict.setdefault(method, [])
|
298
|
+
# paths.append(path)
|
299
|
+
# json['perm_apis'] = perm_api_dict
|
300
|
+
# token = encode_jwt(json, key)
|
301
|
+
# data = {'token': token}
|
302
|
+
# print(111111, data)
|
303
|
+
# return data
|
reyserver/rbase.py
CHANGED
@@ -26,8 +26,7 @@ from fastapi.params import (
|
|
26
26
|
)
|
27
27
|
from reydb.rconn import DatabaseConnectionAsync
|
28
28
|
from reydb.rorm import DatabaseORMModel, DatabaseORMSessionAsync
|
29
|
-
from reykit.
|
30
|
-
from reykit.rbase import CoroutineFunctionSimple, Base, Exit, StaticMeta, ConfigMeta, throw
|
29
|
+
from reykit.rbase import CoroutineFunctionSimple, Base, Exit, StaticMeta, ConfigMeta, Singleton, throw
|
31
30
|
|
32
31
|
from . import rserver
|
33
32
|
|
@@ -38,7 +37,8 @@ __all__ = (
|
|
38
37
|
'ServerExit',
|
39
38
|
'ServerExitAPI',
|
40
39
|
'exit_api',
|
41
|
-
'ServerBind'
|
40
|
+
'ServerBind',
|
41
|
+
'Bind'
|
42
42
|
)
|
43
43
|
|
44
44
|
|
@@ -91,6 +91,168 @@ def exit_api(code: int = 400, text: str | None = None) -> NoReturn:
|
|
91
91
|
raise ServerExitAPI(code, text)
|
92
92
|
|
93
93
|
|
94
|
+
class ServerBindInstance(ServerBase, Singleton):
|
95
|
+
"""
|
96
|
+
Server API bind parameter build instance type.
|
97
|
+
"""
|
98
|
+
|
99
|
+
|
100
|
+
@property
|
101
|
+
def path(self) -> Path:
|
102
|
+
"""
|
103
|
+
Path instance.
|
104
|
+
"""
|
105
|
+
|
106
|
+
# Build.
|
107
|
+
path = Path()
|
108
|
+
|
109
|
+
return path
|
110
|
+
|
111
|
+
|
112
|
+
@property
|
113
|
+
def query(self) -> Query:
|
114
|
+
"""
|
115
|
+
Query instance.
|
116
|
+
"""
|
117
|
+
|
118
|
+
# Build.
|
119
|
+
query = Query()
|
120
|
+
|
121
|
+
return query
|
122
|
+
|
123
|
+
|
124
|
+
@property
|
125
|
+
def header(self) -> Header:
|
126
|
+
"""
|
127
|
+
Header instance.
|
128
|
+
"""
|
129
|
+
|
130
|
+
# Build.
|
131
|
+
header = Header()
|
132
|
+
|
133
|
+
return header
|
134
|
+
|
135
|
+
|
136
|
+
@property
|
137
|
+
def cookie(self) -> Cookie:
|
138
|
+
"""
|
139
|
+
Cookie instance.
|
140
|
+
"""
|
141
|
+
|
142
|
+
# Build.
|
143
|
+
cookie = Cookie()
|
144
|
+
|
145
|
+
return cookie
|
146
|
+
|
147
|
+
|
148
|
+
@property
|
149
|
+
def body(self) -> Body:
|
150
|
+
"""
|
151
|
+
Body instance.
|
152
|
+
"""
|
153
|
+
|
154
|
+
# Build.
|
155
|
+
body = Body()
|
156
|
+
|
157
|
+
return body
|
158
|
+
|
159
|
+
|
160
|
+
@property
|
161
|
+
def form(self) -> Form:
|
162
|
+
"""
|
163
|
+
Form instance.
|
164
|
+
"""
|
165
|
+
|
166
|
+
# Build.
|
167
|
+
form = Form()
|
168
|
+
|
169
|
+
return form
|
170
|
+
|
171
|
+
|
172
|
+
@property
|
173
|
+
def forms(self) -> Forms:
|
174
|
+
"""
|
175
|
+
Forms instance.
|
176
|
+
"""
|
177
|
+
|
178
|
+
# Build.
|
179
|
+
forms = Forms()
|
180
|
+
|
181
|
+
return forms
|
182
|
+
|
183
|
+
|
184
|
+
@property
|
185
|
+
def query_n(self) -> Query:
|
186
|
+
"""
|
187
|
+
Query instance, default `None`.
|
188
|
+
"""
|
189
|
+
|
190
|
+
# Build.
|
191
|
+
query = Query(None)
|
192
|
+
|
193
|
+
return query
|
194
|
+
|
195
|
+
|
196
|
+
@property
|
197
|
+
def header_n(self) -> Header:
|
198
|
+
"""
|
199
|
+
Header instance, default `None`.
|
200
|
+
"""
|
201
|
+
|
202
|
+
# Build.
|
203
|
+
header = Header(None)
|
204
|
+
|
205
|
+
return header
|
206
|
+
|
207
|
+
|
208
|
+
@property
|
209
|
+
def cookie_n(self) -> Cookie:
|
210
|
+
"""
|
211
|
+
Cookie instance, default `None`.
|
212
|
+
"""
|
213
|
+
|
214
|
+
# Build.
|
215
|
+
cookie = Cookie(None)
|
216
|
+
|
217
|
+
return cookie
|
218
|
+
|
219
|
+
|
220
|
+
@property
|
221
|
+
def body_n(self) -> Body:
|
222
|
+
"""
|
223
|
+
Body instance, default `None`.
|
224
|
+
"""
|
225
|
+
|
226
|
+
# Build.
|
227
|
+
body = Body(None)
|
228
|
+
|
229
|
+
return body
|
230
|
+
|
231
|
+
|
232
|
+
@property
|
233
|
+
def form_n(self) -> Form:
|
234
|
+
"""
|
235
|
+
Form instance, default `None`.
|
236
|
+
"""
|
237
|
+
|
238
|
+
# Build.
|
239
|
+
form = Form(None)
|
240
|
+
|
241
|
+
return form
|
242
|
+
|
243
|
+
|
244
|
+
@property
|
245
|
+
def forms_n(self) -> Forms:
|
246
|
+
"""
|
247
|
+
Forms instance, default `None`.
|
248
|
+
"""
|
249
|
+
|
250
|
+
# Build.
|
251
|
+
forms = Forms(None)
|
252
|
+
|
253
|
+
return forms
|
254
|
+
|
255
|
+
|
94
256
|
class ServerBind(ServerBase, metaclass=StaticMeta):
|
95
257
|
"""
|
96
258
|
Server API bind parameter type.
|
@@ -148,7 +310,6 @@ class ServerBind(ServerBase, metaclass=StaticMeta):
|
|
148
310
|
return lifespan
|
149
311
|
|
150
312
|
|
151
|
-
@wrap_cache
|
152
313
|
def create_depend_db(database: str, mode: Literal['sess', 'conn']) -> Depends:
|
153
314
|
"""
|
154
315
|
Create dependencie type of asynchronous database.
|
@@ -201,32 +362,7 @@ class ServerBind(ServerBase, metaclass=StaticMeta):
|
|
201
362
|
JSON = DatabaseORMModel
|
202
363
|
Conn = DatabaseConnectionAsync
|
203
364
|
Sess = DatabaseORMSessionAsync
|
204
|
-
|
205
|
-
'Path instance.'
|
206
|
-
query = Query()
|
207
|
-
'Query instance.'
|
208
|
-
header = Header()
|
209
|
-
'Header instance.'
|
210
|
-
cookie = Cookie()
|
211
|
-
'Cookie instance.'
|
212
|
-
body = Body()
|
213
|
-
'Body instance.'
|
214
|
-
form = Form()
|
215
|
-
'Form instance.'
|
216
|
-
forms = Forms()
|
217
|
-
'Forms instance.'
|
218
|
-
query_n = Query(None)
|
219
|
-
'Query instance, default `None`.'
|
220
|
-
header_n = Header(None)
|
221
|
-
'Header instance, default `None`.'
|
222
|
-
cookie_n = Cookie(None)
|
223
|
-
'Cookie instance, default `None`.'
|
224
|
-
body_n = Body(None)
|
225
|
-
'Body instance, default `None`.'
|
226
|
-
form_n = Form(None)
|
227
|
-
'Form instance, default `None`.'
|
228
|
-
forms_n = Forms(None)
|
229
|
-
'Forms instance, default `None`.'
|
365
|
+
i = ServerBindInstance()
|
230
366
|
|
231
367
|
|
232
368
|
Bind = ServerBind
|
reyserver/rclient.py
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
"""
|
10
10
|
|
11
11
|
|
12
|
-
from typing import TypedDict
|
12
|
+
from typing import TypedDict, Literal
|
13
13
|
from datetime import datetime as Datetime
|
14
14
|
from reykit.ros import File, Folder, overload
|
15
15
|
from reykit.rnet import join_url, request, get_response_file_name
|
@@ -44,6 +44,43 @@ class ServerClient(ServerBase):
|
|
44
44
|
self.url = url
|
45
45
|
|
46
46
|
|
47
|
+
def create_session(
|
48
|
+
self,
|
49
|
+
account: str,
|
50
|
+
password: str,
|
51
|
+
account_type: Literal['name', 'email', 'phone'] = 'name'
|
52
|
+
) -> str:
|
53
|
+
"""
|
54
|
+
Create session.
|
55
|
+
|
56
|
+
Parameters
|
57
|
+
----------
|
58
|
+
account : User account, name or email or phone.
|
59
|
+
password : User password.
|
60
|
+
account_type : User account type.
|
61
|
+
|
62
|
+
Returns
|
63
|
+
-------
|
64
|
+
Token.
|
65
|
+
"""
|
66
|
+
|
67
|
+
# Parameter.
|
68
|
+
url = join_url(self.url, 'sessions')
|
69
|
+
json = {
|
70
|
+
'account': account,
|
71
|
+
'password': password,
|
72
|
+
'account_type': account_type
|
73
|
+
}
|
74
|
+
|
75
|
+
# Request.
|
76
|
+
response = request(url, json=json, check=True)
|
77
|
+
response_dict = response.json()
|
78
|
+
print(response_dict)
|
79
|
+
token = response_dict['token']
|
80
|
+
|
81
|
+
return token
|
82
|
+
|
83
|
+
|
47
84
|
def upload_file(
|
48
85
|
self,
|
49
86
|
source: str | bytes,
|
reyserver/rfile.py
CHANGED
@@ -184,7 +184,7 @@ depend_file_conn = Bind.create_depend_db('file', 'conn')
|
|
184
184
|
|
185
185
|
@file_router.get('/files/{file_id}')
|
186
186
|
async def get_file_info(
|
187
|
-
file_id: int = Bind.path,
|
187
|
+
file_id: int = Bind.i.path,
|
188
188
|
sess: Bind.Sess = depend_file_sess
|
189
189
|
) -> DatabaseORMTableInfo:
|
190
190
|
"""
|
@@ -211,9 +211,9 @@ async def get_file_info(
|
|
211
211
|
|
212
212
|
@file_router.post('/files')
|
213
213
|
async def upload_file(
|
214
|
-
file: Bind.File = Bind.forms,
|
215
|
-
name: str = Bind.forms_n,
|
216
|
-
note: str = Bind.forms_n,
|
214
|
+
file: Bind.File = Bind.i.forms,
|
215
|
+
name: str = Bind.i.forms_n,
|
216
|
+
note: str = Bind.i.forms_n,
|
217
217
|
sess: Bind.Sess = depend_file_sess
|
218
218
|
) -> DatabaseORMTableInfo:
|
219
219
|
"""
|
@@ -265,7 +265,7 @@ async def upload_file(
|
|
265
265
|
|
266
266
|
@file_router.get('/files/{file_id}/download')
|
267
267
|
async def download_file(
|
268
|
-
file_id: int = Bind.path,
|
268
|
+
file_id: int = Bind.i.path,
|
269
269
|
conn: Bind.Conn = depend_file_conn
|
270
270
|
) -> FileResponse:
|
271
271
|
"""
|
reyserver/rserver.py
CHANGED
@@ -105,6 +105,8 @@ class Server(ServerBase, Singleton):
|
|
105
105
|
# API.
|
106
106
|
self.api_auth_key: str
|
107
107
|
'Authentication API JWT encryption key.'
|
108
|
+
self.api_auth_sess_seconds: int
|
109
|
+
'Authentication API session valid seconds.'
|
108
110
|
self.api_file_dir: str
|
109
111
|
'File API store directory path.'
|
110
112
|
|
@@ -190,7 +192,7 @@ class Server(ServerBase, Singleton):
|
|
190
192
|
setattr(self.app, key, value)
|
191
193
|
|
192
194
|
|
193
|
-
def add_api_auth(self, key: str | None = None) -> None:
|
195
|
+
def add_api_auth(self, key: str | None = None, sess_seconds: int = 28800) -> None:
|
194
196
|
"""
|
195
197
|
Add authentication API.
|
196
198
|
Note: must include database engine of `auth` name.
|
@@ -199,9 +201,10 @@ class Server(ServerBase, Singleton):
|
|
199
201
|
----------
|
200
202
|
key : JWT encryption key.
|
201
203
|
- `None`: Random 32 length string.
|
204
|
+
sess_seconds : Session valid seconds.
|
202
205
|
"""
|
203
206
|
|
204
|
-
from .rauth import
|
207
|
+
from .rauth import build_auth_db, auth_router
|
205
208
|
|
206
209
|
# Parameter.
|
207
210
|
if key is None:
|
@@ -209,10 +212,11 @@ class Server(ServerBase, Singleton):
|
|
209
212
|
|
210
213
|
# Build database.
|
211
214
|
engine = self.db.auth
|
212
|
-
|
215
|
+
build_auth_db(engine)
|
213
216
|
|
214
217
|
# Add.
|
215
218
|
self.api_auth_key = key
|
219
|
+
self.api_auth_sess_seconds = sess_seconds
|
216
220
|
self.app.include_router(auth_router, tags=['auth'])
|
217
221
|
|
218
222
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
reyserver/__init__.py,sha256=7GX64p7uI2eetJH9NJ-DTg-8iyQwOsGcviADFJCPxVA,373
|
2
|
+
reyserver/rall.py,sha256=riyDRTUsigco_Bee1H4aZFb8IgvjnxdX9qcnVb9i9mE,270
|
3
|
+
reyserver/rauth.py,sha256=T2oafUAmXr4WfVYmEHO5v0j9K703KUYLGNVEom0J76Q,11716
|
4
|
+
reyserver/rbase.py,sha256=xgdLP_O77e-pSrRWm9GVSziPSqEOh2w20cWkF4HBeWo,7042
|
5
|
+
reyserver/rclient.py,sha256=IWZ3smyIP0_YJrfSrM8JFCr0FCtN02AyT3hp8YuSsDQ,5103
|
6
|
+
reyserver/rfile.py,sha256=bvuXOYO3UDM1jMiyNzQDz56_0ekZUEIRcfNFAhGgdUY,9010
|
7
|
+
reyserver/rserver.py,sha256=gOvLfaLqiDgHcZbzd3h2iIaDtraCuBcmsy1d61TaJ2c,6717
|
8
|
+
reyserver-1.1.51.dist-info/METADATA,sha256=F4eENaUB_2lE1aEeV4ZZ_W7AHW7iB6NfPuTsR1fy-8U,1689
|
9
|
+
reyserver-1.1.51.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
10
|
+
reyserver-1.1.51.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
|
11
|
+
reyserver-1.1.51.dist-info/RECORD,,
|
@@ -1,11 +0,0 @@
|
|
1
|
-
reyserver/__init__.py,sha256=7GX64p7uI2eetJH9NJ-DTg-8iyQwOsGcviADFJCPxVA,373
|
2
|
-
reyserver/rall.py,sha256=riyDRTUsigco_Bee1H4aZFb8IgvjnxdX9qcnVb9i9mE,270
|
3
|
-
reyserver/rauth.py,sha256=xknFI0IEMJcDRTkmO8jb-4Pbl7QSnQOA8m87D7gU3MM,9228
|
4
|
-
reyserver/rbase.py,sha256=IUVkkNsLmQh-QRLX6qtbCjPZAbQAsxoe0goPLCxG9KA,5283
|
5
|
-
reyserver/rclient.py,sha256=pTJtn78jPKgFo5EoQwZRdM0cYHdCs7QUKqfl-jUBRgk,4220
|
6
|
-
reyserver/rfile.py,sha256=RpMeq0vRStop4RnyjKv4wjdXgJjKPOAKpwPAKpLt0hk,9000
|
7
|
-
reyserver/rserver.py,sha256=oOfAc0aM-C561k8mKhF8_gYDmF0Kn6hKyZ5ff6mzPCE,6498
|
8
|
-
reyserver-1.1.50.dist-info/METADATA,sha256=iVbZ7pE_k0IlyYw1bsuw5lJIziRJ2CvsRyM4ivSQRi8,1689
|
9
|
-
reyserver-1.1.50.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
10
|
-
reyserver-1.1.50.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
|
11
|
-
reyserver-1.1.50.dist-info/RECORD,,
|
File without changes
|
File without changes
|