Mailing list archives: September 2008
Site index
·
List index
Message list
Thread
· Author ·
Date
<ashanan.chand...@gmail.com>
@param view: Repository view. </span><span class="add">+ @return: deferred </span><span class="cx"> """ global masterPassword if not masterPassword: masterPassword = MasterPassword() </span><span class="rem">- masterPassword.changeMasterPassword(view, window) </span><span class="add">+ return masterPassword.changeMasterPassword(view, window) </span><span class="cx"> def clear(): """ Clear the master password. </span><span class="add">+ + Safe to call from from a background thread. + + @return: deferred </span><span class="cx"> """ </span><span class="rem">- if masterPassword: - masterPassword.clearMasterPassword() </span><span class="add">+ global masterPassword + if not masterPassword: + masterPassword = MasterPassword() </span><span class="cx"> </span><span class="add">+ return masterPassword.clearMasterPassword() </span><span class="cx"> </span><span class="add">+ </span><span class="cx"> def beforeBackup(view, window=None): """ Call before doing any kind of backup or export of data that includes account passwords. Will prompt the user to set their master password if appropriate. </span><span class="add">+ + Must be called from the UI thread. </span><span class="cx"> """ prefs = schema.ns("osaf.framework.MasterPassword", view).masterPasswordPrefs </span><span class="lines">@@ -85,7 +92,7 @@ </span><span class="cx"> if Util.yesNo(window, _(u'Set Master password?'), _(u'Anyone who gets access to your data can view your account passwords. Do you want to protect your account passwords by encrypting them with the master password?')): </span><span class="rem">- change(view, window) </span><span class="add">+ waitForDeferred(change(view, window)) </span><span class="cx"> class MasterPassword(object): </span><span class="lines">@@ -99,9 +106,7 @@ </span><span class="cx"> @warning: If weak master passwords (like empty) are allowed, the encryption will not be of much help. """ </span><span class="rem">- # XXX This has a threading problem. The Timer thread could be in the - # XXX middle of clearing this while the main thread is setting new - # XXX values. </span><span class="add">+ @runInUIThread </span><span class="cx"> def getMasterPassword(self, view, window=None): """ Get the password. If needed, it will be asked from the user. </span><span class="lines">@@ -112,10 +117,13 @@ </span><span class="cx"> prefs = schema.ns("osaf.framework.MasterPassword", view).masterPasswordPrefs </span><span class="add">+ if not prefs.masterPassword: + return '' + </span><span class="cx"> # Return the cached password if we have it if hasattr(self, '_password'): # Reset timer </span><span class="rem">- self._setTimedPassword(self._password, prefs.timeout) </span><span class="add">+ self._setTimedPassword(self._password, prefs.timeout * 60) </span><span class="cx"> return self._password # Otherwise, let's ask the user... </span><span class="lines">@@ -134,7 +142,7 @@ </span><span class="cx"> again = False for item in password.Password.iterItems(view): try: </span><span class="rem">- item.decryptPassword(masterPassword=pword) # safe: using master password </span><span class="add">+ waitForDeferred(item.decryptPassword(masterPassword=pword)) </span><span class="cx"> break except password.UninitializedPassword: continue </span><span class="lines">@@ -156,30 +164,26 @@ </span><span class="cx"> self._setTimedPassword(pword, timeout * 60) return self._password </span><span class="add">+ @runInUIThread </span><span class="cx"> def clearMasterPassword(self): """ Clear the master password. """ if hasattr(self, '_password'): </span><span class="rem">- self.timer.cancel() # XXX this can hang on exit </span><span class="add">+ self.timer.cancel() </span><span class="cx"> del self._password </span><span class="rem">- del self.timer - </span><span class="add">+ del self.timer + + def _clear(self): + d = self.clearMasterPassword() + d.addCallback(lambda: True) + </span><span class="cx"> def _setTimedPassword(self, password, timeout): </span><span class="add">+ if hasattr(self, 'timer'): + self.timer.cancel() </span><span class="cx"> self._password = password </span><span class="rem">- self.timer = threading.Timer(timeout, self.clearMasterPassword) - - # XXX Other threads can exit without waiting for this; seems to solve shutdown hang. - # XXX However, this leads to a shutdown crash about 50% of the time (for some reason still successful exit value): - #Exception in thread Thread-1 (most likely raised during interpreter shutdown): - #Traceback (most recent call last): - # File ".../release/lib/python2.5/threading.py", line 460, in __bootstrap - # File ".../release/lib/python2.5/threading.py", line 623, in run - # File ".../release/lib/python2.5/threading.py", line 364, in wait - # File ".../release/lib/python2.5/threading.py", line 229, in wait - #<type 'exceptions.TypeError'>: 'NoneType' object is not callable - self.timer.setDaemon(True) - </span><span class="add">+ self.timer = threading.Timer(timeout, self._clear) + #self.timer.setDaemon(True) # Exception in thread Thread-1 (most likely raised during interpreter shutdown) </span><span class="cx"> self.timer.start() def _change(self, oldMaster, newMaster, view, prefs): </span><span class="lines">@@ -188,14 +192,14 @@ </span><span class="cx"> again = False for item in password.Password.iterItems(view): try: </span><span class="rem">- oldPassword = item.decryptPassword(masterPassword=oldMaster) # safe: supplying master password </span><span class="add">+ oldPassword = waitForDeferred(item.decryptPassword(masterPassword=oldMaster)) </span><span class="cx"> except password.UninitializedPassword: continue except password.DecryptionError: log.exception('Wrong old master password?') again = True break </span><span class="rem">- item.encryptPassword(oldPassword, masterPassword=newMaster) # safe: supplying master password </span><span class="add">+ waitForDeferred(item.encryptPassword(oldPassword, masterPassword=newMaster)) </span><span class="cx"> if again: return False </span><span class="lines">@@ -212,6 +216,7 @@ </span><span class="cx"> return True </span><span class="add">+ @runInUIThread </span><span class="cx"> def changeMasterPassword(self, view, window=None): </sp """ Change or set the master password. </span><span class="lines">@@ -516,7 +521,7 @@ </span><span class="cx"> # clear all passwords from osaf.framework import password for item in password.Password.iterItems(view): </span><span class="rem">- item.clear() </span><span class="add">+ waitForDeferred(item.clear()) </span><span class="cx"> # Turn off pref prefs = schema.ns("osaf.framework.MasterPassword", </span><span class="lines">@@ -528,7 +533,7 @@ </span><span class="cx"> view).passwordPrefs password =ot;>- change(view, window) </span><span class="add">+ waitForDeferred(change(view, window)) </span><span class="cx"> class MasterPassword(object): </span><span class="lines">@@ -99,9 +106,7 @@ </span><span class="cx"> @warning: If weak master passwords (like empty) are allowed, the encryption will not be of much help. &quot;&quot;&quot; </span><span class="rem">- # XXX This has a threading problem. Tview, window=None): </sp """ Change or set the master password. </span><span class="lines">@@ -516,7 +521,7 @@ </span><span class="cx"> # clear all passwords from osaf.framework import password for item in password.Password.iterItems(view): </span><span class="rem">- item.clear() </span><span class="add">+ waitForDeferred(item.clear()) </span><span class="cx"> # Turn off pref prefs = schema.ns("osaf.framework.MasterPassword", </span><span class="lines">@@ -528,7 +533,7 @@ </span><span class="cx"> view).passwordPrefs password = ''.join([string.printable[ord(c) % len(string.printable)] \ for c in os.urandom(16)]) </span><span class="rem">- prefs.dummyPassword.encryptPassword(password, masterPassword='') # safe: supplying master password </span><span class="add">+ waitForDeferred(prefs.dummyPassword.encryptPassword(password, masterPassword='')) </span><span class="cx"> except: try: log.exception('Failed to reset master password') </span></pre></div> <a id="branchespasswordparcelsosafframeworkpasswordpy"></a> <div class="modfile"><h4>Modified: branches/password/parcels/osaf/framework/password.py (13511 => 13512)</h4> <pre class="diff"> <span class="info">--- branches/password/parcels/osaf/framework/password.py 2007-03-16 20:39:21 UTC (rev 13511) +++ branches/password/parcels/osaf/framework/password.py 2007-03-16 22:05:38 UTC (rev 13512) </span><span class="lines">@@ -21,12 +21,24 @@ </span><span class="cx"> 'Password', ] </span><span class="add">+# discussion with pje, Grant about threads: +#http://wiki.osafoundation.org/script/getIrcTranscript.cgi?channel=chandler&startTime=1057&endTime=1157&date=20070315 +# TODO: callers of Password methods must deal with deferreds + </span><span class="cx"> # XXX share (all done?), imap, pop, smtp accounts </span><span class="rem">-# XXX when MasterPassword imported/used, chandler does not always quit; unit tests don't quit -# XXX asking for master password from background thread will probably break -# XXX - maybe ensure we have master password before bg thread starts, disable master timeout until bg thread finishes -# XXX - another option might be to ensure no account objects are used in threads, only account attribute values </span><span class="add">+# XXX flatten MasterPassword (don't think we need class) + </span><span class="cx"> # XXX if perf too slow: hmac-sha1, just one call to os.urandom, M2Crypto.EVP.pbkdf2 </span><span class="add">+# XXX minor improvement over waitForDeferred could be: +# def resultOfDeferred(d): +# try: +# result = d.result +# except AttributeError: +# raise AssertionError("Deferred has no result") +# else: +# if isinstance(result, Failure): +# result.raiseException() +# return result </span><span class="cx"> import os, hmac, string from binascii import hexlify, unhexlify </span><span class="lines">@@ -35,7 +47,7 @@ </span><span class="cx"> from application import schema from util import pbkdf2 from repository.util import Streams </span><span clnge the master password. </span><span class="add/////////////e
Mon, 12 Jan, 11:15
cosmo-...@osafoundation.org>
EHTX U @@ UUTER UFED @ UUR@
Tue, 12 Aug, 08:50
e
@@ URAW@8 UXX
Tue, 18 Feb, 17:56
e
n class="lines">@@ -99,9 +106,7 @@ </span><span class="cx"> @warning: If weak master passwords (like empty) are allowed, the encryption will not be of much help. """ </span><span class="rem">- # XXX This has a threading problem. The Timer thread could be in the - # XXX middle of clearing this while the main thread is setting new - # XXX values. </span><span class="add">+ @runInUIThread </span><span class="cx"> def getMasterPassword(self, view, window=None): """ Get the password. If needed, it will be asked from the user. </span><span class="lines">@@ -112,10 +117,13 @@ </span><span class="cx"> prefs = schema.ns("osaf.framework.MasterPassword", view).masterPasswordPrefs </span><span class="add">+ if not prefs.masterPassword: + return '' + </span><span class="cx"> # Return the cached password if we have it if hasattr(self, '_password'): # Reset timer </span><span class="rem">- self._setTimedPassword(self._password, prefs.timeout) </span><span class="add">+ self._setTimedPassword(self._password, prefs.timeout * 60) </span><span class="cx"> return self._password # Otherwise, let's ask the user... </span><span class="lines">@@ -134,7 +142,7 @@ </span><span class="cx"> again = False for item in password.Password.iterItems(view): try: </span><span class="rem">- item.decryptPassword(masterPassword=pword) # safe: using master password </span><span class="add">+ waitForDeferred(item.decryptPassword(masterPassword=pword)) </span><span class="cx"> break except password.UninitializedPassword: continue </span><span class="lines">@@ -156,30 +164,26 @@ </span><span class="cx"> self._setTimedPassword(pword, timeout * 60) return self._password </span><span class="add">+ @runInUIThread </span><span class="cx"> def clearMasterPassword(self): """ Clear the master password. """ if hasattr(self, '_password'): </span><span class="rem">- self.timer.cancel() # XXX this can hang on exit </span><span class="add">+ self.timer.cancel() </span><span class="cx"> del self._password </span><span class="rem">- del self.timer - </span><span class="add">+ del self.timer + + def _clear(self): + d = self.clearMasterPassword() + d.addCallback(lambda: True) + </span><span class="cx"> def _setTimedPassword(self, password, timeout): </span><span class="add">+ if hasattr(self, 'timer'): + self.timer.cancel() </span><span class="cx"> self._password = password </span><span class="rem">- self.timer = threading.Timer(timeout, self.clearMasterPassword) - - # XXX Other threads can exit without waiting for this; seems to solve shutdown hang. - # XXX However, this leads to a shutdown crash about 50% of the time (for some reason still successful exit value): - #Exception in thread Thread-1 (most likely raised during interpreter shutdown): - #Traceback (most recent call last): - # File ".../release/lib/python2.5/threading.py", line 460, in __bootstrap - # File ".../release/lib/python2.5/threading.py", line 623, in run - # File ".../release/lib/python2.5/threading.py", line 364, in wait - # File ".../release/lib/python2.5/threading.py", line 229, in wait - #<type 'exceptions.TypeError'>: 'NoneType' object is not callable - self.timer.setDaemon(True) - </span><span class="add">+ self.timer = threading.Timer(timeout, self._clear) + #self.timer.setDaemon(True) # Exception in thread Thread-1 (most likely raised during interpreter shutdown) </span><span class="cx"> self.timer.start() def _change(self, oldMaster, newMaster, view, prefs): </span><span class="lines">@@ -188,14 +192,14 @@ </span><span class="cx"> again = False for item in password.Password.iterItems(view): try: </span><span class="rem">- oldPassword = item.decryptPassword(masterPassword=oldMaster) # safe: supplying master password </span><span class="add">+ oldPassword = waitForDeferred(item.decryptPassword(masterPassword=oldMaster)) </span><span class="cx"> except password.UninitializedPassword: continue except password.DecryptionError: log.exception('Wrong old master password?') again = True break </span><span class="rem">- item.encryptPassword(oldPassword, masterPassword=newMaster) # safe: supplying master password </span><span class="add">+ waitForDeferred(item.encryptPassword(oldPassword, masterPassword=newMaster)) </span><span class="cx"> if again: return False </span><span class="lines">@@ -212,6 +216,7 @@ </span><span class="cx"> return True </span><span class="add">+ @runInUIThread </span><span class="cx"> def changeMasterPassword(self, view, window=None): </sp """ Change or set the master password. </span><span class="lines">@@ -516,7 +521,7 @@ </span><span class="cx"> # clear all passwords from osaf.framework import password for item in password.Password.iterItems(view): </span><span class="rem">- item.clear() </span><span class="add">+ waitForDeferred(item.clear()) </span><span class="cx"> # Turn off pref prefs = schema.ns("osaf.framework.MasterPassword", </span><span class="lines">@@ -528,7 +533,7 @@ </span><span class="cx"> view).passwordPrefs password = ''.join([string.printable[ord(c) % len(string.printable)] \ for c in os.urandom(16)]) </span><span class="rem">- prefs.dummyPassword.encryptPassword(password, masterPassword='') # safe: supplying master password </span><span class="add">+ waitForDeferred(prefs.dummyPassword.encryptPassword(password, masterPassword='')) </span><span class="cx"> except: try: log.exception('Failed to reset master password') </span></pre></div> <a id="branchespasswordparcelsosafframeworkpasswordpy"></a> <div class="modfile"><h4>Modified: branches/password/parcels/osaf/framework/password.py (13511 => 13512)</h4> <pre class="diff"> <span class="info">--- branches/password/parcels/osaf/framework/password.py 2007-03-16 20:39:21 UTC (rev 13511) +++ branches/password/parcels/osaf/framework/password.py 2007-03-16 22:05:38 UTC (rev 13512) </span><span class="lines">@@ -21,12 +21,24 @@ </span><span class="cx"> 'Password', ] </span><span class="add">+# discussion with pje, Grant about threads: +#http://wiki.osafoundation.org/script/getIrcTranscript.cgi?channel=chandler&startTime=1057&endTime=1157&date=20070315 +# TODO: callers of Password methods must deal with deferreds + </span><span class="cx"> # XXX share (all done?), imap, pop, smtp accounts </span><span class="rem">-# XXX when MasterPassword imported/used, chandler does not always quit; unit tests don't quit -# XXX asking for master password from background thread will probably break -# XXX - maybe ensure we have master password before bg thread starts, disable master timeout until bg thread finishes -# XXX - another option might be to ensure no account objects are used in threads, only account attribute values </span><span class="add">+# XXX flatten MasterPassword (don't think we need class) + </span><span class="cx"> # XXX if perf too slow: hmac-sha1, just one call to os.urandom, M2Crypto.EVP.pbkdf2 </span><span class="add">+# XXX minor improvement over waitForDeferred could be: +# def resultOfDeferred(d): +# try: +# result = d.result +# except AttributeError: +# raise AssertionError("Deferred has no result") +# else: +# if isinstance(result, Failure): +# result.raiseException() +# return result </span><span class="cx"> import os, hmac, string from binascii import hexlify, unhexlify </span><span class="lines">@@ -35,7 +47,7 @@ </span><span class="cx"> from application import schema from util import pbkdf2 from repository.util import Streams </span><span class="rem">-from osaf import Preferences </span><span class="add">+from osaf import Preferences, runInUIThread, waitForDeferred </span><span class="cx"> from osaf.framework import MasterPassword </span><span class="lines">@@ -96,7 +108,8 @@ </span><span class="cx"> schema.Text, doc = 'Salt to be used when deriving key from master password', ) </span><span class="rem">- </span><span class="add">+ + @runInUIThread </span><span class="cx"> def decryptPassword(self, masterPassword=None, window=None): """ Decrypt password and return it. </span><span class="lines">@@ -111,7 +124,7 @@ </span><span class="cx"> raise UninitializedPassword(_(u'Password has not been set')) if masterPassword is None: </span><span class="rem">- masterPassword = MasterPassword.get(self.itsView, window) </span><span class="add">+ masterPassword = waitForDeferred(MasterPassword.get(self.itsView, window)) </span><span class="cx"> # the crypto algorithms are unicode unfriendly if isinstance(masterPassword, unicode): </span><span class="lines">@@ -138,15 +151,16 @@ </span><span class="cx"> return unicode(ret, 'utf8') </span><span class="rem">- def encryptPassword(self, password, masterPassword=None): </span><span class="add">+ @runInUIThread + def encryptPassword(self, password, masterPassword=None, window=None): </span><span class="cx"> """ </span><span class="rem">- Store password encrypted. </span><span class="add">+ Encrypt and store password. </span><span class="cx"> @param password: The password to store @type param: str or unicode """ if masterPassword is None: </span><span class="rem">- masterPassword = MasterPassword.get(self.itsView) </span><span class="add">+ masterPassword = waitForDeferred(MasterPassword.get(self.itsView, window)) </span><span class="cx"> # the crypto algorithms are unicode unfriendly if isinstance(password, unicode): </span><span class="lines">@@ -178,6 +192,7 @@ </span><span class="cx"> # encrypt using AES (Rijndael) self.ciphertext = _encrypt(plaintext, encKey, self.iv) </span><span class="add">+ @runInUIThread </span><span class="cx"> def clear(self): try: del self.ciphertext </span><span class="lines">@@ -227,6 +242,6 @@ </span><span class="cx"> password = ''.join([string.printable[ord(c) % len(string.printable)] \ for c in os.urandom(16)]) </span><span class="rem">- dummyPassword.encryptPassword(password, masterPassword='') # safe: supplying master password </span><span class="add">+ waitForrem">- <preclass="diff"><spanclass="info">---trunk/internal/wx/tests/archive/archivetest.cpp2005-12-2104:15:49UTC(rev8786)+++trunk/internal/wx/tests/archive/archivetest.cpp2005-12-2117:48:59UTC(rev8787)</span><spanclass="lines">@@-2,7+2,7@@</span><spanclass="cx">//Name:tests/archive/archive.cpp//Purpose:Testthearchiveclasses//Author:MikeWetherell</span><spanclass="rem">-//RCS-ID:$Id:archivetest.cpp,v1.142005/12/1813:58:55MWExp$</span><spanclass="add">+//RCS-ID:$Id:archivetest.cpp,v1.152005/12/2101:23:17VZExp$</span><spanclass="cx">//Copyright:(c)2004MikeWetherell//Licence:wxWindowslicence///////////////////////////////////////////////////////////////////////////////</span><spanclass="lines">@@-1177,7+1177,7@@</span><spanclass="cx">stringTestId::MakeId(){m_seed=(m_seed*171)%30269;</span><spanclass="rem">-returnwxString::Format(_T(&quot;%-6d&quot;),m_seed).mb_str();</span><spanclass="add">+return(constchar*)wxString::Format(_T(&quot;%-6d&quot;),m_seed).mb_str();</span><spanclass="cx">}</span></pre></div></div></body></html>.org%3e"title="Previousbydate">
Tue, 18 Feb, 17:56
is
="rem">- self.timer.cancel() # XXX this can hang on exit </span><span class="add">+ self.timer.cancel() </span><span class="cx"> del self._password </span><span class="rem">- del self.timer - </span><span class="add">+ del self.timer + + def _clear(self): + d = self.clearMasterPassword() + d.addCallback(lambda: True) + </span><span class="cx"> def _setTimedPassword(self, password, timeout): </span><span class="add">+ if hasattr(self, 'timer'): + self.timer.cancel() </span><span class="cx"> self._password = password </span><span class="rem">- self.timer = threading.Timer(timeout, self.clearMasterPassword) - - # XXX Other threads can exit without waiting for this; seems to solve shutdown hang. - # XXX However, this leads to a shutdown crash about 50% of the time (for some reason still successful exit value): - #Exception in thread Thread-1 (most likely raised during interpreter shutdown): - #Traceback (most recent call last): - # File ".../release/lib/python2.5/threading.py", line 460, in __bootstrap - # File ".../release/lib/python2.5/threading.py", line 623, in run - # File ".../release/lib/python2.5/threading.py", line 364, in wait - # File ".../release/lib/python2.5/threading.py", line 229, in wait - #<type 'exceptions.TypeError'>: 'NoneType' object is not callable - self.timer.setDaemon(True) - </span><span class="add">+ self.timer = threading.Timer(timeout, self._clear) + #self.timer.setDaemon(True) # Exception in thread Thread-1 (most likely raised during interpreter shutdown) </span><span class="cx"> self.timer.start() def _change(self, oldMaster, newMaster, view, prefs): </span><span class="lines">@@ -188,14 +192,14 @@ </span><span class="cx"> again = False for item in password.Password.iterItems(view): try: </span><span class="rem">- oldPassword = item.decryptPassword(masterPassword=oldMaster) # safe: supplying master password </span><span class="add">+ oldPassword = waitForDeferred(item.decryptPassword(masterPassword=oldMaster)) </span><span class="cx"> except password.UninitializedPassword: continue except password.DecryptionError: log.exception('Wrong old master password?') again = True break </span><span class="rem">- item.encryptPassword(oldPassword, masterPassword=newMaster) # safe: supplying master password </span><span class="add">+ waitForDeferred(item.encryptPassword(oldPassword, masterPassword=newMaster)) </span><span class="cx"> if again: return False </span><span class="lines">@@ -212,6 +216,7 @@ </span><span class="cx"> return True </span><span class="add">+ @runInUIThread </span><span class="cx"> def changeMasterPassword(self, view, window=None): </sp """ Change or set the master password. </span><span class="lines">@@ -516,7 +521,7 @@ </span><span class="cx"> # clear all passwords from osaf.framework import password for item in password.Password.iterItems(view): </span><span class="rem">- item.clear() </span><span class="add">+ waitForDeferred(item.clear()) </span><span class="cx"> # Turn off pref prefs = schema.ns("osaf.framework.MasterPassword", </span><span class="lines">@@ -528,7 +533,7 @@ </span><span class="cx"> view).passwordPrefs password = ''.join([string.printable[ord(c) % len(string.printable)] \ for c in os.urandom(16)]) </span><span class="rem">- prefs.dummyPassword.encryptPassword(password, masterPassword='') # safe: supplying master password </span><span class="add">+ waitForDeferred(prefs.dummyPassword.encryptPassword(password, masterPassword='')) </span><span class="cx"> except: try: log.exception('Failed to reset master password') </span></pre></div> <a id="branchespasswordparcelsosafframeworkpasswordpy"></a> <div class="modfile"><h4>Modified: branches/password/parcels/osaf/framework/password.py (13511 => 13512)</h4> <pre class="diff"> <span class="info">--- branches/password/parcels/osaf/framework/password.py 2007-03-16 20:39:21 UTC (rev 13511) +++ branches/password/parcels/osaf/framework/password.py 2007-03-16 22:05:38 UTC (rev 13512) </span><span class="lines">@@ -21,12 +21,24 @@ </span><span class="cx"> 'Password', ] </span><span class="add">+# discussion with pje, Grant about threads: +#http://wiki.osafoundation.org/script/getIrcTranscript.cgi?channel=chandler&startTime=1057&endTime=1157&date=20070315 +# TODO: callers of Password methods must deal with deferreds + </span><span class="cx"> # XXX share (all done?), imap, pop, smtp accounts </span><span class="rem">-# XXX when MasterPassword imported/used, chandler does not always quit; unit tests don't quit -# XXX asking for master password from background thread will probably break -# XXX - maybe ensure we have master password before bg thread starts, disable master timeout until bg thread finishes -# XXX - another option might be to ensure no account objects are used in threads, only account attribute values </span><span class="add">+# XXX flatten MasterPassword (don't think we need class) + </span><span class="cx"> # XXX if perf too slow: hmac-sha1, just one call to os.urandom, M2Crypto.EVP.pbkdf2 </span><span class="add">+# XXX minor improvement over waitForDeferred could be: +# def resultOfDeferred(d): +# try: +# result = d.result +# except AttributeError: +# raise AssertionError("Deferred has no result") +# else: +# if isinstance(result, Failure): +# result.raiseException() +# return result </span><span class="cx"> import os, hmac, string from binascii import hexlify, unhexlify </span><span class="lines">@@ -35,7 +47,7 @@ </span><span class="cx"> from application import schema from util import pbkdf2 from repository.util import Streams </span><span class="rem">-from osaf import Preferences </span><span class="add">+from osaf import Preferences, runInUIThread, waitForDeferred </span><span class="cx"> from osaf.framework import MasterPassword </span><span class="lines">@@ -96,7 +108,8 @@ </span><span class="cx"> schema.Text, doc = 'Salt to be used when deriving key from master password', ) </span><span class="rem">- </span><span class="add">+ + @runInUIThread </span><span class="cx"> def decryptPassword(self, masterPassword=None, window=None): """ Decrypt password and return it. </span><span class="lines">@@ -111,7 +124,7 @@ </span><span class="cx"> raise UninitializedPassword(_(u'Password has not been set')) if masterPassword is None: </span><span class="rem">- masterPassword = MasterPassword.get(self.itsView, window) </span><span class="add">+ masterPassword = waitForDeferred(MasterPassword.get(self.itsView, window)) </span><span class="cx"> # the crypto algorithms are unicode unfriendly if isinstance(masterPassword, unicode): </span><span class="lines">@@ -138,15 +151,16 @@ </span><span class="cx"> return unicode(ret, 'utf8') </span><span class="rem">- def encryptPassword(self, password, masterPassword=None): </span><span class="add">+ @runInUIThread + def encryptPassword(self, password, masterPassword=None, window=None): </span><span class="cx"> """ </span><span class="rem">- Store password encrypted. </span><span class="add">+ Encrypt and store password. </span><span class="cx"> @param password: The password to store @type param: str or unicode """ if masterPassword is None: </span><span class="rem">- masterPassword = MasterPassword.get(self.itsView) </span><span class="add">+ masterPassword = waitForDeferred(MasterPassword.get(self.itsView, window)) </span><span class="cx"> # the crypto algorithms are unicode unfriendly if isinstance(password, unicode): </span><span class="lines">@@ -178,6 +192,7 @@ </span><span class="cx"> # encrypt using AES (Rijndael) self.ciphertext = _encrypt(plaintext, encKey, self.iv) </span><span class="add">+ @runInUIThread </span><span class="cx"> def clear(self): try: del self.ciphertext </span><span class="lines">@@ -227,6 +242,6 @@ </span><span class="cx"> password = ''.join([string.printable[ord(c) % len(string.printable)] \ for c in os.urandom(16)]) </span><span class="rem">- dummyPassword.encryptPassword(password, masterPassword='') # safe: supplying master password </span><span class="add">+ waitForrem">- <preclass="diff"><spanclass="info">---trunk/internal/wx/tests/archive/archivetest.cpp2005-12-2104:15:49UTC(rev8786)+++trunk/internal/wx/tests/archive/archivetest.cpp2005-12-2117:48:59UTC(rev8787)</span><spanclass="lines">@@-2,7+2,7@@</span><spanclass="cx">//Name:tests/archive/archive.cpp//Purpose:Testthearchiveclasses//Author:MikeWetherell</span><spanclass="rem">-//RCS-ID:$Id:archivetest.cpp,v1.142005/12/1813:58:55MWExp$</span><spanclass="add">+//RCS-ID:$Id:archivetest.cpp,v1.152005/12/2101:23:17VZExp$</span><spanclass="cx">//Copyright:(c)2004MikeWetherell//Licence:wxWindowslicence///////////////////////////////////////////////////////////////////////////////</span><spanclass="lines">@@-1177,7+1177,7@@</span><spanclass="cx">stringTestId::MakeId(){m_seed=(m_seed*171)%30269;</span><spanclass="rem">-returnwxString::Format(_T(&quot;%-6d&quot;),m_seed).mb_str();</span><spanclass="add">+return(constchar*)wxString::Format(_T(&quot;%-6d&quot;),m_seed).mb_str();</span><spanclass="cx">}</span></pre></div></div></body></html>.org%3e"title="Previousbydate">
Sun, 22 Jun, 20:09
is
="rem">- self.timer.cancel() # XXX this can hang on exit </span><span class="add">+ self.timer.cancel() </span><span class="cx"> del self._password </span><span class="rem">- del self.timer - </span><span class="add">+ del self.timer + + def _clear(self): + d = self.clearMasterPassword() + d.addCallback(lambda: True) + </span><span class="cx"> def _setTimedPassword(self, password, timeout): </span><span class="add">+ if hasattr(self, 'timer'): + self.timer.cancel() </span><span class="cx"> self._password = password </span><span class="rem">- self.timer = threading.Timer(timeout, self.clearMasterPassword) - - # XXX Other threads can exit without waiting for this; seems to solve shutdown hang. - # XXX However, this leads to a shutdown crash about 50% of the time (for some reason still successful exit value): - #Exception in thread Thread-1 (most likely raised during interpreter shutdown): - #Traceback (most recent call last): - # File ".../release/lib/python2.5/threading.py", line 460, in __bootstrap - # File ".../release/lib/python2.5/threading.py", line 623, in run - # File ".../release/lib/python2.5/threading.py", line 364, in wait - # File ".../release/lib/python2.5/threading.py", line 229, in wait - #<type 'exceptions.TypeError'>: 'NoneType' object is not callable - self.timer.setDaemon(True) - </span><span class="add">+ self.timer = threading.Timer(timeout, self._clear) + #self.timer.setDaemon(True) # Exception in thread Thread-1 (most likely raised during interpreter shutdown) </span><span class="cx"> self.timer.start() def _change(self, oldMaster, newMaster, view, prefs): </span><span class="lines">@@ -188,14 +192,14 @@ </span><span class="cx"> again = False for item in password.Password.iterItems(view): try: </span><span class="rem">- oldPassword = item.decryptPassword(masterPassword=oldMaster) # safe: supplying master password </span><span class="add">+ oldPassword = waitForDeferred(item.decryptPassword(masterPassword=oldMaster)) </span><span class="cx"> except password.UninitializedPassword: continue except password.DecryptionError: log.exception('Wrong old master password?') again = True break </span><span class="rem">- item.encryptPassword(oldPassword, masterPassword=newMaster) # safe: supplying master password </span><span class="add">+ waitForDeferred(item.encryptPassword(oldPassword, masterPassword=newMaster)) </span><span class="cx"> if again: return False </span><span class="lines">@@ -212,6 +216,7 @@ </span><span class="cx"> return True </span><span class="add">+ @runInUIThread </span><span class="cx"> def changeMasterPassword(self, view, window=None): </sp """ Change or set the master password. </span><span class="lines">@@ -516,7 +521,7 @@ </span><span class="cx"> # clear all passwords from osaf.framework import password for item in password.Password.iterItems(view): </span><span class="rem">- item.clear() </span><span class="add">+ waitForDeferred(item.clear()) </span><span class="cx"> # Turn off pref prefs = schema.ns("osaf.framework.MasterPassword", </span><span class="lines">@@ -528,7 +533,7 @@ </span><span class="cx"> view).passwordPrefs password = ''.join([string.printable[ord(c) % len(string.printable)] \ for c in os.urandom(16)]) </span><span class="rem">- prefs.dummyPassword.encryptPassword(password, masterPassword='') # safe: supplying master password </span><span class="add">+ waitForDeferred(prefs.dummyPassword.encryptPassword(password, masterPassword='')) </span><span class="cx"> except: try: log.exception('Failed to reset master password') </span></pre></div> <a id="branchespasswordparcelsosafframeworkpasswordpy"></a> <div class="modfile"><h4>Modified: branches/password/parcels/osaf/framework/password.py (13511 => 13512)</h4> <pre class="diff"> <span class="info">--- branches/password/parcels/osaf/framework/password.py 2007-03-16 20:39:21 UTC (rev 13511) +++ branches/password/parcels/osaf/framework/password.py 2007-03-16 22:05:38 UTC (rev 13512) </span><span class="lines">@@ -21,12 +21,24 @@ </span><span class="cx"> 'Password', ] </span><span class="add">+# discussion with pje, Grant about threads: +#http://wiki.osafoundation.org/script/getIrcTranscript.cgi?channel=chandler&startTime=1057&endTime=1157&date=20070315 +# TODO: callers of Password methods must deal with deferreds + </span><span class="cx"> # XXX share (all done?), imap, pop, smtp accounts </span><span class="rem">-# XXX when MasterPassword imported/used, chandler does not always quit; unit tests don't quit -# XXX asking for master password from background thread will probably break -# XXX - maybe ensure we have master password before bg thread starts, disable master timeout until bg thread finishes -# XXX - another option might be to ensure no account objects are used in threads, only account attribute values </span><span class="add">+# XXX flatten MasterPassword (don't think we need class) + </span><span class="cx"> # XXX if perf too slow: hmac-sha1, just one call to os.urandom, M2Crypto.EVP.pbkdf2 </span><span class="add">+# XXX minor improvement over waitForDeferred could be: +# def resultOfDeferred(d): +# try: +# result = d.result +# except AttributeError: +# raise AssertionError("Deferred has no result") +# else: +# if isinstance(result, Failure): +# result.raiseException() +# return result </span><span class="cx"> import os, hmac, string from binascii import hexlify, unhexlify </span><span class="lines">@@ -35,7 +47,7 @@ </span><span class="cx"> from application import schema from util import pbkdf2 from repository.util import Streams </span><span class="rem">-from osaf import Preferences </span><span class="add">+from osaf import Preferences, runInUIThread, waitForDeferred </span><span class="cx"> from osaf.framework import MasterPassword </span><span class="lines">@@ -96,7 +108,8 @@ </span><span class="cx"> schema.Text, doc = 'Salt to be used when deriving key from master password', ) </span><span class="rem">- </span><span class="add">+ + @runInUIThread </span><span class="cx"> def decryptPassword(self, masterPassword=None, window=None): """ Decrypt password and return it. </span><span class="lines">@@ -111,7 +124,7 @@ </span><span class="cx"> raise UninitializedPassword(_(u'Password has not been set')) if masterPassword is None: </span><span class="rem">- masterPassword = MasterPassword.get(self.itsView, window) </span><span class="add">+ masterPassword = waitForDeferred(MasterPassword.get(self.itsView, window)) </span><span class="cx"> # the crypto algorithms are unicode unfriendly if isinstance(masterPassword, unicode): </span><span class="lines">@@ -138,15 +151,16 @@ </span><span class="cx"> return unicode(ret, 'utf8') </span><span class="rem">- def encryptPassword(self, password, masterPassword=None): </span><span class="add">+ @runInUIThread + def encryptPassword(self, password, masterPassword=None, window=None): </span><span class="cx"> """ </span><span class="rem">- Store password encrypted. </span><span class="add">+ Encrypt and store password. </span><span class="cx"> @param password: The password to store @type param: str or unicode """ if masterPassword is None: </span><span class="rem">- masterPassword = MasterPassword.get(self.itsView) </span><span class="add">+ masterPassword = waitForDeferred(MasterPassword.get(self.itsView, window)) </span><span class="cx"> # the crypto algorithms are unicode unfriendly if isinstance(password, unicode): </span><span class="lines">@@ -178,6 +192,7 @@ </span><span class="cx"> # encrypt using AES (Rijndael) self.ciphertext = _encrypt(plaintext, encKey, self.iv) </span><span class="add">+ @runInUIThread </span><span class="cx"> def clear(self): try: del self.ciphertext </span><span class="lines">@@ -227,6 +242,6 @@ </span><span class="cx"> password = ''.join([string.printable[ord(c) % len(string.printable)] \ for c in os.urandom(16)]) </span><span class="rem">- dummyPassword.encryptPassword(password, masterPassword='') # safe: supplying master password </span><span class="add">+ waitForrem">- <preclass="diff"><spanclass="info">---trunk/internal/wx/tests/archive/archivetest.cpp2005-12-2104:15:49UTC(rev8786)+++trunk/internal/wx/tests/archive/archivetest.cpp2005-12-2117:48:59UTC(rev8787)</span><spanclass="lines">@@-2,7+2,7@@</span><spanclass="cx">//Name:tests/archive/archive.cpp//Purpose:Testthearchiveclasses//Author:MikeWetherell</span><spanclass="rem">-//RCS-ID:$Id:archivetest.cpp,v1.142005/12/1813:58:55MWExp$</span><spanclass="add">+//RCS-ID:$Id:archivetest.cpp,v1.152005/12/2101:23:17VZExp$</span><spanclass="cx">//Copyright:(c)2004MikeWetherell//Licence:wxWindowslicence///////////////////////////////////////////////////////////////////////////////</span><spanclass="lines">@@-1177,7+1177,7@@</span><spanclass="cx">stringTestId::MakeId(){m_seed=(m_seed*171)%30269;</span><spanclass="rem">-returnwxString::Format(_T(&quot;%-6d&quot;),m_seed).mb_str();</span><spanclass="add">+return(constchar*)wxString::Format(_T(&quot;%-6d&quot;),m_seed).mb_str();</span><spanclass="cx">}</span></pre></div></div></body></html>.org%3e"title="Previousbydate">
Sun, 22 Jun, 20:09
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
ja...@wordzoo.com
/tr> <tr> <td class="box"><a href="/archives/commits/200701.mbox/thread" title="Browse January 2007 archives">Jan 2007</a></td><td class="msgcount">272</td> </tr> <tr> <td class="box"><a href="/archives/commits/200612.mbox/thread" title="Browse December 2006 archives">Dec 2006</a></td><td class="msgcount">292</td> </tr> <tr> <td class="box"><a href="/archives/commits/200611.mbox/thread" title="Browse November 2006 archives">Nov 2006</a></td><td class="msgcount">304</td> </tr> <tr> <td class="box"><a href="/archives/commits/200610.mbox/thread" title="Browse October 2006 archives">Oct 2006</a></td><td class="msgcount">302</td> </tr> <tr> <td class="box"><a href="/archives/commits/200609.mbox/thread" title="Browse September 2006 archives">Sep 2006</a></td><td class="msgcount">318</td> </tr> <tr> <td class="box"><a href="/archives/commits/200608.mbox/thread" title="Browse August 2006 archives">Aug 2006</a></td><td class="msgcount">326</td> </tr> <tr> <td class="box"><a href="/archives/commits/200607.mbox/thread" title="Browse July 2006 archives">Jul 2006</a></td><td class="msgcount">253</td> </tr> <tr> <td class="box"><a href="/archives/commits/200606.mbox/thread" title="Browse June 2006 archives">Jun 2006</a></td><td class="msgcount">303</td> </tr> <tr> <td class="box"><a href="/archives/commits/200605.mbox/thread" title="Browse May 2006 archives">May 2006</a></td><td class="msgcount">316</td> </tr> <tr> <td class="box"><a href="/archives/commits/200604.mbox/thread" title="Browse April 2006 archives">Apr 2006</a></td><td class="msgcount">437</td> </tr> <tr> <td class="box"><a href="/archives/commits/200603.mbox/thread" title="Browse March 2006 archives">Mar 2006</a></td><td class="msgcount">476</td> </tr> <tr> <td class="box"><a href="/archives/commits/200602.mbox/thread" title="Browse February 2006 archives">Feb 2006</a></td><td class="msgcount">379</td> </tr> <tr> <td class="box"><a href="/archives/commits/200601.mbox/thread" title="Browse January 2006 archives">Jan 2006</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200512.mbox/thread" title="Browse December 2005 archives">Dec 2005</a></td><td class="msgcount">498</td> </tr> <tr> <td class="box"><a href="/archives/commits/200511.mbox/thread" title="Browse November 2005 archives">Nov 2005</a></td><td class="msgcount">429</td> </tr> <tr> <td class="box"><a href="/archives/commits/200510.mbox/thread" title="Browse October 2005 archives">Oct 2005</a></td><td class="msgcount">506</td> </tr> <tr> <td class="box"><a href="/archives/commits/200509.mbox/thread" title="Browse September 2005 archives">Sep 2005</a></td><td class="msgcount">626</td> </tr> <tr> <td class="box"><a href="/archives/commits/200508.mbox/thread" title="Browse August 2005 archives">Aug 2005</a></td><td class="msgcount">632</td> </tr> <tr id="boxactive"> <td class="box"><a href="/archives/commits/200507.mbox/thread" title="Browse July 2005 archives">Jul 2005</a></td><td class="msgcount">491</td> </tr> <tr> <td class="box"><a href="/archives/commits/200506.mbox/thread" title="Browse June 2005 archives">Jun 2005</a></td><td class="msgcount">404</td> </tr> <tr> <td class="box"><a href="/archives/commits/200505.mbox/thread" title="Browse May 2005 archives">May 2005</a></td><td class="msgcount">490</td> </tr> <tr> <td class="box"><a href="/archives/commits/200504.mbox/thread" title="Browse April 2005 archives">Apr 2005</a></td><td class="msgcount">361</td> </tr> <tr> <td class="box"><a href="/archives/commits/200503.mbox/thread" title="Browse March 2005 archives">Mar 2005</a></td><td class="msgcount">388</td> </tr> <tr> <td class="box"><a href="/archives/commits/200502.mbox/thread" title="Browse February 2005 archives">Feb 2005</a></td><td class="msgcount">440</td> </tr> <tr> <td class="box"><a href="/archives/commits/200501.mbox/thread" title="Browse January 2005 archives">Jan 2005</a></td><td class="msgcount">241</td> </tr> <tr> <td class="box"><a href="/archives/commits/200412.mbox/thread" title="Browse December 2004 archives">Dec 2004</a></td><td class="msgcount">162</td> </tr> <tr> <td class="box"><a href="/archives/commits/200411.mbox/thread" title="Browse November 2004 archives">Nov 2004</a></td><td class="msgcount">131</td> </tr> <tr> <td class="box"><a href="/archives/commits/200410.mbox/thread" title="Browse October 2004 archives">Oct 2004</a></td><td class="msgcount">231</td> </tr> <tr>andlerproject.org/wikihome /chandler-users Chandler wiki: http://chandlerproject.org/wikihome
Thu, 24 Apr, 14:24
m.@osafoundation.org>
class="lines">@@ -99,9 +106,7 @@ </span><span class="cx"> @warning: If weak master passwords (like empty) are allowed, the encryption will not be of much help. """ </span><span class="rem">- # XXX This has a threading problem. The Timer thread could be in the - # XXX middle of clearing this while the main thread is setting new - # XXX values. </span><span class="add">+ @runInUIThread </span><span class="cx"> def getMasterPassword(self, view, window=None): """ Get the password. If needed, it will be asked from the user. </span><span class="lines">@@ -112,10 +117,13 @@ </span><span class="cx"> prefs = schema.ns("osaf.framework.MasterPassword", view).masterPasswordPrefs </span><span class="add">+ if not prefs.masterPassword: + return '' + </span><span class="cx"> # Return the cached password if we have it if hasattr(self, '_password'): # Reset timer </span><span class="rem">- self._setTimedPassword(self._password, prefs.timeout) </span><span class="add">+ self._setTimedPassword(self._password, prefs.timeout * 60) </span><span class="cx"> return self._password # Otherwise, let's ask the user... </span><span class="lines">@@ -134,7 +142,7 @@ </span><span class="cx"> again = False for item in password.Password.iterItems(view): try: </span><span class="rem">- item.decryptPassword(masterPassword=pword) # safe: using master password </span><span class="add">+ waitForDeferred(item.decryptPassword(masterPassword=pword)) </span><span class="cx"> break except password.UninitializedPassword: continue </span><span class="lines">@@ -156,30 +164,26 @@ </span><span class="cx"> self._setTimedPassword(pword, timeout * 60) return self._password </span><span class="add">+ @runInUIThread </span><span class="cx"> def clearMasterPassword(self): """ Clear the master password. """ if hasattr(self, '_password'): </span><span class="rem">- self.timer.cancel() # XXX this can hang on exit </span><span class="add">+ self.timer.cancel() </span><span class="cx"> del self._password </span><span class="rem">- del self.timer - </span><span class="add">+ del self.timer + + def _clear(self): + d = self.clearMasterPassword() + d.addCallback(lambda: True) + </span><span class="cx"> def _setTimedPassword(self, password, timeout): </span><span class="add">+ if hasattr(self, 'timer'): + self.timer.cancel() </span><span class="cx"> self._password = password </span><span class="rem">- self.timer = threading.Timer(timeout, self.clearMasterPassword) - - # XXX Other threads can exit without waiting for this; seems to solve shutdown hang. - # XXX However, this leads to a shutdown crash about 50% of the time (for some reason still successful exit value): - #Exception in thread Thread-1 (most likely raised during interpreter shutdown): - #Traceback (most recent call last): - # File ".../release/lib/python2.5/threading.py", line 460, in __bootstrap - # File ".../release/lib/python2.5/threading.py", line 623, in run - # File ".../release/lib/python2.5/threading.py", line 364, in wait - # File ".../release/lib/python2.5/threading.py", line 229, in wait - #<type 'exceptions.TypeError'>: 'NoneType' object is not callable - self.timer.setDaemon(True) - </span><span class="add">+ self.timer = threading.Timer(timeout, self._clear) + #self.timer.setDaemon(True) # Exception in thread Thread-1 (most likely raised during interpreter shutdown) </span><span class="cx"> self.timer.start() def _change(self, oldMaster, newMaster, v