I needed a way of translating “644″, an object permission setting, into something more readable.
I wanted to be able to do the following:
def determinePermissions(obj): obj_usr= {"owner":obj.owner, "group":obj.group, "everyone":True} usr = { "owner":cherrypy.session.get('user'), "group":cherrypy.session.get('group'), "everyone":True } perms = self.translatePermissions(obj) r, w = False, False for x in ["owner", "group", "everyone"]: r = True if perms[x]["read"] and obj_user[x] == usr[x] else r w = True if perms[x]["write"] and obj_user[x] == usr[x] else w if usr["owner"] == "root": r, w = True, True return {"read":r, "write":w}
So I first wrote this [unexecuted]:
def translatePermissions(self, obj): obj = self.get(oid=object_id) user, group, everyone = struct.unpack("3c",str(obj.permissions)):</p><p> if owner == 6: owner["read"] = True owner["write"] = True if owner == 4: owner["read"] = True owner["write"] = False if owner == 0: owner["read"] = False owner["write"] = False</p><p> if group == 6: group["read"] = True group["write"] = True if group == 4: group["read"] = True group["write"] = False if group == 0: group["read"] = False group["write"] = False</p><p> if everyone == 6: everyone["read"] = True everyone["write"] = True if everyone == 4: everyone["read"] = True everyone["write"] = False if everyone == 0: everyone["read"] = False everyone["write"] = False</p><p> return {"owner": owner, "group": group, "everyone": everyone}
And then I rewrote it to the following:
def translatePermissions(self, object_id): rw = [] obj = self.get(oid=object_id) for value in struct.unpack("3c",str(obj.permissions)): if value == 6: r = True w = True elif value == 4: r = True w = False elif value == 2: r = False w = True else: r = False w = False rw.append({"read":r, "write":w}) return {"owner": rw[0], "group": rw[1], "everyone": rw[2]}
And then checking for read and write rather than going through each possibility of v, as well as passing an object prior to reduce multiple seeks:
def checkPermissions(self, obj): rw = [] for v in struct.unpack("3c",str(obj.permissions)): if v == 6 or v == 4: r = True else: r = False if v == 6 or v == 2: w = True else: w = False rw.append({"read":r, "write":w}) return {"owner": rw[0], "group": rw[1], "everyone": rw[2]}
But with Python2.5 you can go even further and reduce it to:
def translatePermissions(self, obj): rw = [] for v in struct.unpack("3c",str(obj.permissions)): r = True if v == 6 or v == 4 else False w = True if v == 6 or v == 2 else False rw.append({"read":r, "write":w}) return {"owner": rw[0], "group": rw[1], "everyone": rw[2]}
From 32 lines at the start to 8 lines in the end!
And both together they look like this:
def determinePermissions(obj): obj_usr= {"owner":obj.owner, "group":obj.group, "everyone":True} usr = { "owner":cherrypy.session.get('user'), "group":cherrypy.session.get('group'), "everyone":True } perms = self.translatePermissions(object_id) r, w = False, False for x in ["owner", "group", "everyone"]: r = True if perms[x]["read"] and obj_user[x] == usr[x] else r w = True if perms[x]["write"] and obj_user[x] == usr[x] else w if usr["owner"] == "root": r, w = True, True return {"read":r, "write":w}</p><p>def translatePermissions(self, obj): rw = [] for v in struct.unpack("3c",str(o.permissions)): r = True if v == 6 or v == 4 else False w = True if v == 6 or v == 2 else False rw.append({"read":r, "write":w}) return {"owner": rw[0], "group": rw[1], "everyone": rw[2]}
Poetry!

Try executing these lines in python: 4&1; 4&2; 4&3; 4&4; 4&5; 4&6; 4&7; You’ll get either 0 or 4 each time depending on if its a permission containing read. Use this method and your system will work for any valid value besides just 6 and 4.