use binary search when finding new uid (#39)
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
closes #36 Co-authored-by: Daniel Liu <mr.picklepinosaur@gmail.com> Reviewed-on: #39 Co-authored-by: d278liu <d278liu@localhost> Co-committed-by: d278liu <d278liu@localhost>
This commit is contained in:
parent
0640337564
commit
250d24ae37
|
@ -1,6 +1,4 @@
|
||||||
import contextlib
|
import contextlib
|
||||||
import grp
|
|
||||||
import pwd
|
|
||||||
from typing import Union, Dict, List
|
from typing import Union, Dict, List
|
||||||
|
|
||||||
from flask import g
|
from flask import g
|
||||||
|
@ -119,19 +117,6 @@ class LDAPService:
|
||||||
|
|
||||||
def _get_next_uid(self, conn: ldap3.Connection, min_id: int, max_id: int) -> int:
|
def _get_next_uid(self, conn: ldap3.Connection, min_id: int, max_id: int) -> int:
|
||||||
"""Gets the next available UID number between min_id and max_id, inclusive."""
|
"""Gets the next available UID number between min_id and max_id, inclusive."""
|
||||||
def uid_exists(uid: int) -> bool:
|
|
||||||
try:
|
|
||||||
pwd.getpwuid(uid)
|
|
||||||
return True
|
|
||||||
except KeyError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def gid_exists(gid: int) -> bool:
|
|
||||||
try:
|
|
||||||
grp.getgrgid(gid)
|
|
||||||
return True
|
|
||||||
except KeyError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def ldap_uid_or_gid_exists(uid: int) -> bool:
|
def ldap_uid_or_gid_exists(uid: int) -> bool:
|
||||||
return conn.search(
|
return conn.search(
|
||||||
|
@ -139,12 +124,17 @@ class LDAPService:
|
||||||
f'(|(uidNumber={uid})(gidNumber={uid}))',
|
f'(|(uidNumber={uid})(gidNumber={uid}))',
|
||||||
size_limit=1)
|
size_limit=1)
|
||||||
|
|
||||||
# TODO: replace this with binary search
|
while min_id != max_id:
|
||||||
for uid in range(min_id, max_id + 1):
|
cur_uid = (min_id + max_id) // 2
|
||||||
if uid_exists(uid) or gid_exists(uid) or ldap_uid_or_gid_exists(uid):
|
if ldap_uid_or_gid_exists(cur_uid):
|
||||||
continue
|
min_id = cur_uid + 1
|
||||||
return uid
|
else:
|
||||||
|
max_id = cur_uid
|
||||||
|
|
||||||
|
if ldap_uid_or_gid_exists(min_id):
|
||||||
raise Exception('no UIDs remaining')
|
raise Exception('no UIDs remaining')
|
||||||
|
else:
|
||||||
|
return min_id
|
||||||
|
|
||||||
def add_sudo_role(self, uid: str):
|
def add_sudo_role(self, uid: str):
|
||||||
conn = self._get_ldap_conn()
|
conn = self._get_ldap_conn()
|
||||||
|
|
Loading…
Reference in New Issue