aboutsummaryrefslogtreecommitdiffstats
path: root/src/py/tojauth.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/py/tojauth.py')
-rw-r--r--src/py/tojauth.py126
1 files changed, 74 insertions, 52 deletions
diff --git a/src/py/tojauth.py b/src/py/tojauth.py
index 11877ff..701095b 100644
--- a/src/py/tojauth.py
+++ b/src/py/tojauth.py
@@ -10,9 +10,16 @@ class TOJAuth(Auth):
ACCESS_SETPER = 0x10
ACCESS_EXECUTE = 0x20
+ ROLETYPE_USER = 1
+ ROLETYPE_3RD = 2
+ ROLETYPE_MOD = 3
+ ROLETYPE_TOJ = 4
+ ROLETYPE_GROUP = 5
+ ROLETYPE_GUEST = 6
+
auth_accessid = 1
- def __init__(self,pubkey,privkey = None):
+ def __init__(self, pubkey, privkey = None):
super().__init__()
self.set_verifykey(pubkey)
@@ -20,18 +27,21 @@ class TOJAuth(Auth):
self.set_signkey(privkey)
TOJAuth.instance = self
- TOJAuth.db = AsyncDB(config.CORE_DBNAME,config.CORE_DBUSER,
+ TOJAuth.db = AsyncDB(config.CORE_DBNAME, config.CORE_DBUSER,
config.CORE_DBPASSWORD)
- def create_iden(self,linkclass,linkid,idenid):
- iden = {
- 'linkclass':linkclass,
- 'linkid':linkid,
- 'idenid':idenid
- }
+ def create_iden(self, linkclass, linkid, idenid, roletype, payload = {}):
+ iden = payload
+ iden.update({
+ 'linkclass' : linkclass,
+ 'linkid' : linkid,
+ 'idenid' : idenid,
+ 'roletype' : roletype
+ })
+
return self.sign_iden(iden)
- def get_iden(self,conn_linkclass,conn_linkid,idendesc):
+ def get_iden(self, conn_linkclass, conn_linkid, idendesc):
iden = super().get_iden(idendesc)
if iden == None:
return None
@@ -41,46 +51,51 @@ class TOJAuth(Auth):
return iden
- def check_access(self, accessid, access_mask):
+ @staticmethod
+ def check_access(accessid, access_mask):
def wrapper(f):
- idenid = self.current_iden['idenid']
- ok = False
-
- cur = self.db.cursor()
-
- if not ok:
- sqlstr = ('SELECT "owner_idenid" FROM "ACCESS" WHERE '
- '"accessid"=%s;')
- sqlarr = (accessid, )
- cur.execute(sqlstr, sqlarr)
- for data in cur:
- owner_idenid = data[0]
- if owner_idenid == idenid:
- ok = True
-
- if not ok:
- sqlstr = ('SELECT "ACCESS_ROLE"."permission" FROM "ACCESS_ROLE"'
- ' INNER JOIN "IDEN_ROLE" ON "ACCESS_ROLE"."roleid" = '
- '"IDEN_ROLE"."roleid" WHERE "ACCESS_ROLE"."accessid"=%s'
- ' AND "IDEN_ROLE"."idenid"=%s;')
- sqlarr = (accessid, idenid)
- cur.execute(sqlstr, sqlarr)
-
- for data in cur:
- permission = data[0]
- if (permission & access_mask) == access_mask:
- ok = True
- break
-
- if ok:
- return f
- else:
- raise Exception('TOJAuth.check_access() : PERMISSION DENIED')
+ def wrapfunc(*args):
+ idenid = TOJAuth.get_current_iden()['idenid']
+ ok = False
+
+ cur = TOJAuth.instance.db.cursor()
+
+ if not ok:
+ sqlstr = ('SELECT "owner_idenid" FROM "ACCESS" WHERE '
+ '"accessid"=%s;')
+ sqlarr = (accessid, )
+ cur.execute(sqlstr, sqlarr)
+ for data in cur:
+ owner_idenid = data[0]
+ if owner_idenid == idenid:
+ ok = True
+
+ if not ok:
+ sqlstr = ('SELECT "ACCESS_ROLE"."permission" FROM "ACCESS_ROLE"'
+ ' INNER JOIN "IDEN_ROLE" ON "ACCESS_ROLE"."roleid" = '
+ '"IDEN_ROLE"."roleid" WHERE "ACCESS_ROLE"."accessid"=%s'
+ ' AND "IDEN_ROLE"."idenid"=%s;')
+ sqlarr = (accessid, idenid)
+ cur.execute(sqlstr, sqlarr)
+
+ for data in cur:
+ permission = data[0]
+ if (permission & access_mask) == access_mask:
+ ok = True
+ break
+
+ if ok:
+ return f(*args);
+ else:
+ raise Exception('TOJAuth.check_access() : PERMISSION DENIED')
+
+ return wrapfunc
return wrapper
def create_access(self, owner_idenid):
- self.check_access(self.auth_accessid, self.ACCESS_EXECUTE)(0)
+ self.check_access(
+ self.auth_accessid, self.ACCESS_EXECUTE)(lambda x:x)(0)
cur = self.db.cursor()
sqlstr = ('INSERT INTO "ACCESS" ("owner_idenid") VALUES (%s) '
@@ -93,7 +108,7 @@ class TOJAuth(Auth):
return accessid
def set_access_list(self, accessid, roleid, permission):
- self.check_access(accessid, self.ACCESS_SETPER)(0)
+ self.check_access(accessid, self.ACCESS_SETPER)(lambda x:x)(0)
cur = self.db.cursor()
table = 'ACCESS_ROLE'
@@ -107,7 +122,7 @@ class TOJAuth(Auth):
cur.upsert(table, cond, value)
def del_access_list(self, accessid, roleid):
- self.check_access(accessid, self.ACCESS_SETPER)(0)
+ self.check_access(accessid, self.ACCESS_SETPER)(lambda x:x)(0)
cur = self.db.cursor()
sqlstr = ('DELETE FROM "ACCESS_ROLE" WHERE "accessid"=%s '
@@ -116,19 +131,25 @@ class TOJAuth(Auth):
cur.execute(sqlstr, sqlarr)
def create_role(self, rolename, roletype):
- self.check_access(self.auth_accessid, self.ACCESS_EXECUTE)(0)
+ self.check_access(
+ self.auth_accessid, self.ACCESS_EXECUTE)(lambda x:x)(0)
cur = self.db.cursor()
- sqlstr = ('INSERT INTO "ROLE" ("rolename") VALUES (%s)'
+ sqlstr = ('INSERT INTO "ROLE" ("rolename", "roletype") VALUES (%s, %s)'
' RETURNING "roleid";')
- sqlarr = (rolename, )
+ sqlarr = (rolename, roletype)
cur.execute(sqlstr, sqlarr)
for data in cur:
roleid = data[0]
+
+ if(roleid != None):
+ self.set_role_relation(roleid, roleid)
+
return roleid
def set_role_relation(self, idenid, roleid):
- self.check_access(self.auth_accessid, self.ACCESS_EXECUTE)(0)
+ self.check_access(
+ self.auth_accessid, self.ACCESS_EXECUTE)(lambda x:x)(0)
cur = self.db.cursor()
table = 'IDEN_ROLE'
@@ -139,7 +160,8 @@ class TOJAuth(Auth):
cur.upsert(table, cond)
def del_role_relation(self, idenid, roleid):
- self.check_access(self.auth_accessid, self.ACCESS_EXECUTE)(0)
+ self.check_access(
+ self.auth_accessid, self.ACCESS_EXECUTE)(lambda x:x)(0)
cur = self.db.cursor()
sqlstr = ('DELETE FROM "IDEN_ROLE" WHERE "idenid"=%s '
@@ -148,7 +170,7 @@ class TOJAuth(Auth):
cur.execute(sqlstr, sqlarr)
def set_owner(self, idenid, accessid):
- self.check_access(accessid, self.ACCESS_SETPER)(0)
+ self.check_access(accessid, self.ACCESS_SETPER)(lambda x:x)(0)
cur = self.db.cursor()
sqlstr = ('UPDATE "ACCESS" SET "owner_idenid"=%s WHERE "accessid"=%s;')