source: n4d-server-plugins/trunk/fuentes/server-install-files/usr/share/n4d/python-plugins/PasswordManager.py

Last change on this file was 8048, checked in by hectorgh, 13 months ago

ensuring utf8 encoding when converting from sqlite to json

File size: 4.0 KB
Line 
1# -*- coding: utf-8 -*-
2
3import os
4import shutil
5import json
6import codecs
7
8import sqlite3
9
10class PasswordManager:
11       
12        PASSWORD_FILE="/net/server-sync/var/lib/n4d/n4d.json"
13        LOG_PATH="/net/server-sync/var/lib/n4d"
14       
15        def __init__(self):
16                       
17                self.users={}
18               
19                if not os.path.exists(PasswordManager.LOG_PATH):
20                        os.makedirs(PasswordManager.LOG_PATH)
21               
22                if not os.path.exists("/lib/systemd/system/net-server\\x2dsync.mount"):
23                       
24                        if os.path.exists("/net/server-sync/var/lib/n4d/n4d.sqlite"):
25                                ret=self.sqlite_to_json(True)
26                                if ret:
27                                        os.remove("/net/server-sync/var/lib/n4d/n4d.sqlite")
28                        else:
29                                self.load_password_file()
30                       
31        #def init
32
33       
34        def sqlite_to_json(self,force_write=False):
35               
36                try:
37                        conn = sqlite3.connect("/net/server-sync/var/lib/n4d/n4d.sqlite")
38                        cursor = conn.cursor()
39                        cursor.execute('select cn,sn,uid,passwd from password')
40                        result = cursor.fetchall()
41                        conn.close()
42                       
43                        self.users={}
44                        for user in result :
45                                self.users[user[2]]={}
46                                try:
47                                        self.users[user[2]]["cn"] = user[0].encode('utf-8')
48                                except:
49                                        self.users[user[2]]["cn"] = user[2]
50                                try:
51                                        self.users[user[2]]["sn"] = user[1].encode('utf-8')
52                                except:
53                                        self.users[user[2]]["sn"] = user[2]
54                                try:
55                                        self.users[user[2]]["passwd"] = user[3]
56                                except:
57                                        self.users[user[2]]["passwd"] = "#! UNKNOWN PASSWORD !#"       
58                       
59                        if force_write:
60                                self.write_file()
61                       
62                        return True
63                except Exception as e:
64                        print(e)
65                       
66                        return False
67               
68        #def sqlite_to_json
69       
70               
71        def load_password_file(self, f=None):
72
73                self.users={}
74                if f==None:
75                        f=PasswordManager.PASSWORD_FILE
76                       
77                if not os.path.exists(f):
78                        return False
79               
80                try:
81                        pfile=open(f,"r")
82                        self.users=json.load(pfile)
83                        pfile.close()
84                                                       
85                except Exception as e:
86                        print("[PasswordManager] Error reading file: %s"%e)
87                               
88        #def load_json
89       
90       
91        def write_file(self,f=None):
92               
93                if f==None:
94                        f=PasswordManager.PASSWORD_FILE
95               
96                set_perms=False
97                if not os.path.exists(f):
98                        set_perms=True
99               
100                for user in self.users:
101                        if type(self.users[user]["cn"])!=unicode:
102                                self.users[user]["cn"]=self.users[user]["cn"].decode("utf-8")
103                        if type(self.users[user]["sn"])!=unicode:
104                                self.users[user]["sn"]=self.users[user]["sn"].decode("utf-8")
105               
106                data=unicode(json.dumps(self.users,indent=4,encoding="utf-8",ensure_ascii=False)).encode("utf-8")
107                output_file=open(f,"w")
108                output_file.write(data)
109                output_file.close()
110               
111                if set_perms:
112                        prevmask=os.umask(0)
113                        os.chmod(f,0640)
114                        os.umask(prevmask)
115               
116        #def write_file
117
118       
119        def add_password(self,user_name,cn,sn,password):
120               
121                if user_name not in self.users:
122                        self.users[user_name]={}
123               
124                if type(cn)==str:
125                        cn=cn.decode("utf-8")
126                if type(sn)==str:
127                        sn=sn.decode("utf-8")
128       
129                self.users[user_name]["cn"]=cn
130                self.users[user_name]["sn"]=sn
131                self.users[user_name]["passwd"]=password
132               
133                self.write_file()
134               
135        #def add_password
136       
137       
138        def remove_password(self,user_name):
139               
140                if user_name in self.users:
141                        self.users.pop(user_name)
142                       
143                return True
144       
145        #def remove_password
146       
147       
148        def get_passwords(self):
149               
150                pwd_list = []
151                for user in self.users :
152                       
153                        a = {}
154                        try:
155                                a['cn'] = self.users[user]["cn"].encode("UTF-8")
156                        except:
157                                print("[PasswordManager] Error reading user cn %s."%user)
158                                a['cn'] = user
159                               
160                        try:
161                                a['sn'] = self.users[user]["sn"].encode("UTF-8")
162                        except:
163                                print("[PasswordManager] Error reading user sn %s."%user)
164                                a['sn'] =user
165                       
166                        a['uid'] = user
167                        try:
168                                a['passwd'] = self.users[user]["passwd"]
169                        except:
170                                print("[PasswordManager] Error reading user passwd %s."%user)
171                                a['passwd'] = "#! UNKNOWN PASSWORD !#"
172                               
173                        pwd_list.append(a)
174                       
175                       
176
177                return pwd_list
178               
179        #def get_passwords
180       
181       
182        def is_user_in_database(self,uid):
183               
184                for user in self.users:
185                        return True
186                       
187                return False
188               
189        #def is_user_in_database
190       
191       
192        def set_externally_modified(self,uid):
193               
194                if self.is_user_in_database(uid):
195                        self.add_password(uid,self.users[uid]["cn"],self.users[uid]["sn"],"#! CHANGED MANUALLY !#")
196                       
197        #def set_externally_modified   
198       
199       
200#class PasswordManager
201
202if __name__=="__main__":
203       
204        pm=PasswordManager()
205       
206
Note: See TracBrowser for help on using the repository browser.