comparison easyhg2.py @ 436:b7a740eef696

Refactor config get/set
author Chris Cannam
date Tue, 28 Jun 2011 13:27:05 +0100
parents 74047159a044
children 765255e9cc92
comparison
equal deleted inserted replaced
435:74047159a044 436:b7a740eef696
97 """ 97 """
98 parsed_url = urlparse.urlparse(authuri) 98 parsed_url = urlparse.urlparse(authuri)
99 return "%s://%s%s" % (parsed_url.scheme, parsed_url.netloc, 99 return "%s://%s%s" % (parsed_url.scheme, parsed_url.netloc,
100 parsed_url.path) 100 parsed_url.path)
101 101
102 def load_config(pfile): 102 def load_config(pcfg, pfile):
103 fp = None 103 fp = None
104 try: 104 try:
105 fp = open(pfile) 105 fp = open(pfile)
106 except: 106 except:
107 self.ui.write("failed to open authfile %s\n" % pfile) 107 pass
108 if fp: 108 if fp:
109 pcfg.readfp(fp) 109 pcfg.readfp(fp)
110 fp.close() 110 fp.close()
111 111
112 def save_config(pcfg, pfile): 112 def save_config(pcfg, pfile):
113 ofp = None 113 ofp = None
114 try: 114 try:
115 ofp = open(pfile, 'w') 115 ofp = open(pfile, 'w')
124 self.ui.write("failed to set proper permissions on authfile %s\n" % pfile) 124 self.ui.write("failed to set proper permissions on authfile %s\n" % pfile)
125 raise 125 raise
126 pcfg.write(ofp) 126 pcfg.write(ofp)
127 ofp.close() 127 ofp.close()
128 128
129 def get_from_config(pcfg, sect, key):
130 data = None
131 try:
132 data = pcfg.get(sect, key)
133 except (ConfigParser.NoOptionError, ConfigParser.NoSectionError):
134 pass
135 return data
136
137 def get_boolean_from_config(pcfg, sect, key, deflt):
138 data = deflt
139 try:
140 data = pcfg.getboolean(sect, key)
141 except (ConfigParser.NoOptionError, ConfigParser.NoSectionError):
142 pass
143 return data
144
145 def set_to_config(pcfg, sect, key, data):
146 if not pcfg.has_section(sect):
147 pcfg.add_section(sect)
148 pcfg.set(sect, key, data)
149
129 @monkeypatch_method(passwordmgr) 150 @monkeypatch_method(passwordmgr)
130 def find_user_password(self, realm, authuri): 151 def find_user_password(self, realm, authuri):
131 152
132 if not self.ui.interactive(): 153 if not self.ui.interactive():
133 return orig_find(self, realm, authuri) 154 return orig_find(self, realm, authuri)
146 uri = canonical_url(authuri) 167 uri = canonical_url(authuri)
147 168
148 pkey = base64.b64encode('%s@@%s' % (uri, user)).replace('=', '_') 169 pkey = base64.b64encode('%s@@%s' % (uri, user)).replace('=', '_')
149 pekey = self.ui.config('easyhg', 'authkey') 170 pekey = self.ui.config('easyhg', 'authkey')
150 pfile = self.ui.config('easyhg', 'authfile') 171 pfile = self.ui.config('easyhg', 'authfile')
172 use_authfile = (pekey and pfile)
151 if pfile: pfile = os.path.expanduser(pfile) 173 if pfile: pfile = os.path.expanduser(pfile)
152 pdata = None 174 pdata = None
153 175
154 self.ui.write("pekey is %s\n" % pekey) 176 self.ui.write("pekey is %s\n" % pekey)
155 self.ui.write("pfile is %s\n" % pfile) 177 self.ui.write("pfile is %s\n" % pfile)
176 userfield.connect(userfield, Qt.SIGNAL("textChanged(QString)"), passfield, Qt.SLOT("clear()")) 198 userfield.connect(userfield, Qt.SIGNAL("textChanged(QString)"), passfield, Qt.SLOT("clear()"))
177 199
178 remember = None 200 remember = None
179 pcfg = None 201 pcfg = None
180 202
181 if pekey and pfile: 203 if use_authfile:
182 # load pwd from our cache file, decrypt with given key 204 # load pwd from our cache file, decrypt with given key
183 pcfg = ConfigParser.RawConfigParser() 205 pcfg = ConfigParser.RawConfigParser()
184 remember_default = False
185 load_config(pcfg, pfile) 206 load_config(pcfg, pfile)
186 try: 207 remember_default = get_boolean_from_config(pcfg, 'preferences', 'remember', False)
187 remember_default = pcfg.getboolean('preferences', 'remember') 208 pdata = get_from_config(pcfg, 'auth', pkey)
188 except:
189 remember_default = False
190 try:
191 pdata = pcfg.get('auth', pkey)
192 except ConfigParser.NoOptionError:
193 pdata = None
194 if pdata: 209 if pdata:
195 cachedpwd = decrypt(pdata, pekey) 210 cachedpwd = decrypt(pdata, pekey)
196 passfield.setText(cachedpwd) 211 passfield.setText(cachedpwd)
197 remember = QtGui.QCheckBox() 212 remember = QtGui.QCheckBox()
198 remember.setChecked(remember_default) 213 remember.setChecked(remember_default)
217 elif not passwd: 232 elif not passwd:
218 passfield.setFocus(True) 233 passfield.setFocus(True)
219 234
220 dialog.raise_() 235 dialog.raise_()
221 ok = dialog.exec_() 236 ok = dialog.exec_()
222 if ok: 237 if not ok:
223 self.ui.write('Dialog accepted\n')
224 user = userfield.text()
225 passwd = passfield.text()
226
227 if pekey and pfile and remember:
228
229 #!!! add these sections first...
230
231 if remember.isChecked():
232 pdata = encrypt(passwd, pekey)
233 pcfg.set('auth', pkey, pdata)
234 else:
235 pcfg.set('auth', pkey, '')
236
237 pcfg.set('preferences', 'remember', remember.isChecked())
238
239 save_config(pcfg, pfile)
240
241 # if passwd and keyring_key != '' and not from_keyring:
242 # keyring_key = '%s@@%s' % (uri, user)
243 ## keyring.set_password('Mercurial', keyring_key, passwd)
244 self.add_password(realm, authuri, user, passwd)
245 else:
246 raise util.Abort(_('password entry cancelled')) 238 raise util.Abort(_('password entry cancelled'))
239
240 self.ui.write('Dialog accepted\n')
241 user = userfield.text()
242 passwd = passfield.text()
243
244 if use_authfile:
245 set_to_config(pcfg, 'preferences', 'remember', remember.isChecked())
246 if remember.isChecked():
247 pdata = encrypt(passwd, pekey)
248 set_to_config(pcfg, 'auth', pkey, pdata)
249 else:
250 set_to_config(pcfg, 'auth', pkey, '')
251 save_config(pcfg, pfile)
252
253 self.add_password(realm, authuri, user, passwd)
247 return (user, passwd) 254 return (user, passwd)
248 255
249 256
250