diff options
Diffstat (limited to 'bitbake/lib/hashserv/sqlite.py')
| -rw-r--r-- | bitbake/lib/hashserv/sqlite.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/bitbake/lib/hashserv/sqlite.py b/bitbake/lib/hashserv/sqlite.py index 6809c53706..414ee8ffb8 100644 --- a/bitbake/lib/hashserv/sqlite.py +++ b/bitbake/lib/hashserv/sqlite.py | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | import sqlite3 | 7 | import sqlite3 |
| 8 | import logging | 8 | import logging |
| 9 | from contextlib import closing | 9 | from contextlib import closing |
| 10 | from . import User | ||
| 10 | 11 | ||
| 11 | logger = logging.getLogger("hashserv.sqlite") | 12 | logger = logging.getLogger("hashserv.sqlite") |
| 12 | 13 | ||
| @@ -34,6 +35,14 @@ OUTHASH_TABLE_DEFINITION = ( | |||
| 34 | 35 | ||
| 35 | OUTHASH_TABLE_COLUMNS = tuple(name for name, _, _ in OUTHASH_TABLE_DEFINITION) | 36 | OUTHASH_TABLE_COLUMNS = tuple(name for name, _, _ in OUTHASH_TABLE_DEFINITION) |
| 36 | 37 | ||
| 38 | USERS_TABLE_DEFINITION = ( | ||
| 39 | ("username", "TEXT NOT NULL", "UNIQUE"), | ||
| 40 | ("token", "TEXT NOT NULL", ""), | ||
| 41 | ("permissions", "TEXT NOT NULL", ""), | ||
| 42 | ) | ||
| 43 | |||
| 44 | USERS_TABLE_COLUMNS = tuple(name for name, _, _ in USERS_TABLE_DEFINITION) | ||
| 45 | |||
| 37 | 46 | ||
| 38 | def _make_table(cursor, name, definition): | 47 | def _make_table(cursor, name, definition): |
| 39 | cursor.execute( | 48 | cursor.execute( |
| @@ -53,6 +62,15 @@ def _make_table(cursor, name, definition): | |||
| 53 | ) | 62 | ) |
| 54 | 63 | ||
| 55 | 64 | ||
| 65 | def map_user(row): | ||
| 66 | if row is None: | ||
| 67 | return None | ||
| 68 | return User( | ||
| 69 | username=row["username"], | ||
| 70 | permissions=set(row["permissions"].split()), | ||
| 71 | ) | ||
| 72 | |||
| 73 | |||
| 56 | class DatabaseEngine(object): | 74 | class DatabaseEngine(object): |
| 57 | def __init__(self, dbname, sync): | 75 | def __init__(self, dbname, sync): |
| 58 | self.dbname = dbname | 76 | self.dbname = dbname |
| @@ -66,6 +84,7 @@ class DatabaseEngine(object): | |||
| 66 | with closing(db.cursor()) as cursor: | 84 | with closing(db.cursor()) as cursor: |
| 67 | _make_table(cursor, "unihashes_v2", UNIHASH_TABLE_DEFINITION) | 85 | _make_table(cursor, "unihashes_v2", UNIHASH_TABLE_DEFINITION) |
| 68 | _make_table(cursor, "outhashes_v2", OUTHASH_TABLE_DEFINITION) | 86 | _make_table(cursor, "outhashes_v2", OUTHASH_TABLE_DEFINITION) |
| 87 | _make_table(cursor, "users", USERS_TABLE_DEFINITION) | ||
| 69 | 88 | ||
| 70 | cursor.execute("PRAGMA journal_mode = WAL") | 89 | cursor.execute("PRAGMA journal_mode = WAL") |
| 71 | cursor.execute( | 90 | cursor.execute( |
| @@ -227,6 +246,7 @@ class Database(object): | |||
| 227 | "oldest": oldest, | 246 | "oldest": oldest, |
| 228 | }, | 247 | }, |
| 229 | ) | 248 | ) |
| 249 | self.db.commit() | ||
| 230 | return cursor.rowcount | 250 | return cursor.rowcount |
| 231 | 251 | ||
| 232 | async def insert_unihash(self, method, taskhash, unihash): | 252 | async def insert_unihash(self, method, taskhash, unihash): |
| @@ -257,3 +277,88 @@ class Database(object): | |||
| 257 | cursor.execute(query, data) | 277 | cursor.execute(query, data) |
| 258 | self.db.commit() | 278 | self.db.commit() |
| 259 | return cursor.lastrowid != prevrowid | 279 | return cursor.lastrowid != prevrowid |
| 280 | |||
| 281 | def _get_user(self, username): | ||
| 282 | with closing(self.db.cursor()) as cursor: | ||
| 283 | cursor.execute( | ||
| 284 | """ | ||
| 285 | SELECT username, permissions, token FROM users WHERE username=:username | ||
| 286 | """, | ||
| 287 | { | ||
| 288 | "username": username, | ||
| 289 | }, | ||
| 290 | ) | ||
| 291 | return cursor.fetchone() | ||
| 292 | |||
| 293 | async def lookup_user_token(self, username): | ||
| 294 | row = self._get_user(username) | ||
| 295 | if row is None: | ||
| 296 | return None, None | ||
| 297 | return map_user(row), row["token"] | ||
| 298 | |||
| 299 | async def lookup_user(self, username): | ||
| 300 | return map_user(self._get_user(username)) | ||
| 301 | |||
| 302 | async def set_user_token(self, username, token): | ||
| 303 | with closing(self.db.cursor()) as cursor: | ||
| 304 | cursor.execute( | ||
| 305 | """ | ||
| 306 | UPDATE users SET token=:token WHERE username=:username | ||
| 307 | """, | ||
| 308 | { | ||
| 309 | "username": username, | ||
| 310 | "token": token, | ||
| 311 | }, | ||
| 312 | ) | ||
| 313 | self.db.commit() | ||
| 314 | return cursor.rowcount != 0 | ||
| 315 | |||
| 316 | async def set_user_perms(self, username, permissions): | ||
| 317 | with closing(self.db.cursor()) as cursor: | ||
| 318 | cursor.execute( | ||
| 319 | """ | ||
| 320 | UPDATE users SET permissions=:permissions WHERE username=:username | ||
| 321 | """, | ||
| 322 | { | ||
| 323 | "username": username, | ||
| 324 | "permissions": " ".join(permissions), | ||
| 325 | }, | ||
| 326 | ) | ||
| 327 | self.db.commit() | ||
| 328 | return cursor.rowcount != 0 | ||
| 329 | |||
| 330 | async def get_all_users(self): | ||
| 331 | with closing(self.db.cursor()) as cursor: | ||
| 332 | cursor.execute("SELECT username, permissions FROM users") | ||
| 333 | return [map_user(r) for r in cursor.fetchall()] | ||
| 334 | |||
| 335 | async def new_user(self, username, permissions, token): | ||
| 336 | with closing(self.db.cursor()) as cursor: | ||
| 337 | try: | ||
| 338 | cursor.execute( | ||
| 339 | """ | ||
| 340 | INSERT INTO users (username, token, permissions) VALUES (:username, :token, :permissions) | ||
| 341 | """, | ||
| 342 | { | ||
| 343 | "username": username, | ||
| 344 | "token": token, | ||
| 345 | "permissions": " ".join(permissions), | ||
| 346 | }, | ||
| 347 | ) | ||
| 348 | self.db.commit() | ||
| 349 | return True | ||
| 350 | except sqlite3.IntegrityError: | ||
| 351 | return False | ||
| 352 | |||
| 353 | async def delete_user(self, username): | ||
| 354 | with closing(self.db.cursor()) as cursor: | ||
| 355 | cursor.execute( | ||
| 356 | """ | ||
| 357 | DELETE FROM users WHERE username=:username | ||
| 358 | """, | ||
| 359 | { | ||
| 360 | "username": username, | ||
| 361 | }, | ||
| 362 | ) | ||
| 363 | self.db.commit() | ||
| 364 | return cursor.rowcount != 0 | ||
