|
s="cx">{//registertheeventsthatwillreturnthedockmenuEventTypeSpectbEventList[]=</span><spanclass="lines">@@-365,7+364,7@@</span><spanclass="cx">#endifInstallApplicationEventHandler(m_eventupp,</span><spanclass="rem">-GetEventTypeCount(tbEventList),tbEventList,</span><spanclass="add">+GetEventTypeCount(tbEventList),tbEventList,</span><spanclass="cx">this,&amp;m_eventHandlerRef);wxASSERT(err==noErr);}</span><spanclass="lines">@@-382,13+381,13@@</span><spanclass="cx">DisposeEventHandlerUPP(m_eventupp);//restoreoldiconandmenutothedock</span><spanclass="rem">-RemoveIcon();</span><spanclass="add">+RemoveIcon();</span><spanclass={</span><spanclass="lines">@@-231,22+230,22@@</span><spanclass="cx">item-&gt;Check(!item-&gt;IsChecked());//sendthewxEventtothewxMenu</span><spanclass="rem">-item-&gt;GetMenu()-&gt;SendEvent(id,-item-&gt;IsCheckable()?-item-&gt;IsChecked():-1</span><spanclass="add">+itemthedockeventhandler</span><spanclass="cx">//togetthemenuforthedock//-----------------------------------------------------------------------------wxMenu*wxDockTaskBarIcon::DoCreatePopupMenu()</span><spanclass="lines">@@-404,7+403,7@@</span><spanclass="cx">m_pMenu-&gt;SetInvokingWindow(m_menuEventWindow);}</span><spanclass="rem">-//thereturnherecanbeoneofthreethings</span><spanclass="add">+//thereturnherecanbeoneofthreethings</span><spanclass="cx">//(inorderofpriority)://1)UserpassedamenufromCreatePopupMenuoverride//2)menusenttoandcopiedfromPopupMenu</span><spanclass="lines">@@-419,8+418,8@@</span><spanclass="cx">//Returnswhetherornotthedockisnotusingthedefaultimage//----------------005/12/1508:55:15vellExp$</span><spanclass="add">+//RCS-ID:$Id:window.cpp,v1.2732005/12/2116:12:48VZExp$</span><spanclass="cx">//Copyright:(c)StefanCsomor//Licence:wxWindowslicence/////////////////////////////////////////////////////////////////////////////</span><spanclass="lines">@@-3268,6+3268,8@@</span><spanclass="cx">if(event.GetEventType()==wxEVT_RIGHT_DOWN){//copiedfromwxGTK:CS</span><spanclass="add">+//VZ:shouldn'twemovethistobaseclassthen?+</span><spanclass="cx">//generatea&quot;contextmenu&quot;event:thisissimilartowxEVT_RIGHT_DOWN//exceptthat://</span></pre></div><aid="trunkinternalwxtestsarchivearchivetestcpp"></a><divclass="modfile"><h4>Modified:trunk/internal/wx/tests/archive/archivetest.cpp(8786=>8787)</h4><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"> |
Sat, 14 Jun, 16:51 |
|
;, 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"> |
Sat, 14 Jun, 16:51 |
|
;, 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"> |
Sat, 14 Jun, 16:51 |
|
d.
"""
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"> |
Wed, 18 Jul, 13:20 |
|
d.
"""
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"> |
Wed, 18 Jul, 13:20 |
| <andy-glew-pub...@sbcglobal.net> |
se 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
|
Tue, 21 May, 04:29 |
| <andy-glew-pub...@sbcglobal.net> |
se 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
|
Tue, 21 May, 04:29 |
| <joelfin...@hotmail.com> |
rd:
- 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 = ''.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, 26 Jul, 16:21 |
| <...@pobox.com> |
ets 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 = ''.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, 06 Jun, 02:39 |
| <...@pobox.com> |
ets 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 = ''.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, 06 Jun, 02:39 |
| <...@pobox.com> |
ets 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 = ''.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, 06 Jun, 02:39 |
| Parlante |
> <td class="box"><a href="/archives/commits/200703.mbox/thread" title="Browse March 2007 archives">Mar 2007</a></td><td class="msgcount">475</td>
</tr>
<tr> <td class="box"><a href="/archives/commits/200702.mbox/thread" title="Browse February 2007 archives">Feb 2007</a></td><td class="msgcount">325</td>
</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">< |