import repository from arizona
[raven.git] / apps / ravenpublish / ravengui_passphrase.py
1 import sys
2 import traceback
3
4 from PyQt4.QtCore import *
5 from PyQt4.QtGui import *
6
7 PassPhraseEventType = QEvent.registerEventType()
8 PassPhraseReceiver = None
9 MainThreadId = None
10
11 class PassPhraseEvent(QEvent):
12     def __init__(self, passphrase, wasIncorrect):
13         QEvent.__init__(self, PassPhraseEventType)
14         self.sem = QSemaphore()
15         self.passphrase = passphrase
16         self.wasIncorrect = wasIncorrect
17
18     def set_passphrase(self, passphrase):
19         self.passphrase = passphrase
20
21     def signal(self):
22         self.sem.release()
23
24     def wait(self):
25         self.sem.acquire()
26
27 # passphrase callback for SFA
28 glo_passphrase = None
29 def ask_passphrase(kp, pkstring, x):
30    try:
31        from sfa.trust.certificate import test_passphrase
32        global glo_passphrase\r
33 \r
34        incorrect = False\r
35        while True:\r
36           # if our currently cached passphrase is good, use it.\r
37           if (glo_passphrase) and (test_passphrase(pkstring, glo_passphrase)):\r
38               break\r
39 \r
40           ppe = PassPhraseEvent(glo_passphrase, incorrect)\r
41 \r
42           if (QThread.currentThreadId() == MainThreadId):\r
43               # if we're in the main thread, just call the handler. If we\r
44               # post and wait on it, then we'd deadlock.\r
45               #print "mainthread"\r
46               PassPhraseReceiver.event(ppe)\r
47           else:\r
48               # We're in some other thread. Send the event to the main thread's\r
49               # handler. The main thread will wake up and deal with it while\r
50               # we're sleeping on ppe.wait below.\r
51               #print "post event"\r
52               QCoreApplication.postEvent(PassPhraseReceiver, ppe)\r
53 \r
54           ppe.wait()\r
55 \r
56           glo_passphrase = ppe.passphrase\r
57 \r
58           # inform user of the error of his ways\r
59           incorrect = not test_passphrase(pkstring, glo_passphrase)\r
60 \r
61        return glo_passphrase
62    except:
63        # pyOpenSSL tends to hide these. we want to see them.
64        print "Exception inside of ask_passphrase:"
65        traceback.print_exc(file=sys.stdout)
66        print "-----------------------------------"
67        raise
68
69 def setup(receiver):
70     global PassPhraseReceiver, MainThreadId
71
72     try:
73         from sfa.trust.certificate import set_passphrase_callback as sfa_set_passphrase_callback\r
74         sfa_set_passphrase_callback(ask_passphrase)
75         #print "passphrase callback installed"
76     except ImportError:
77         # older SFA do not support set_passphrase_callback
78         print "SFA does not support set_passphrase_callback; passphrases will not be supported"
79         return
80
81     PassPhraseReceiver = receiver
82     MainThreadId = QThread.currentThreadId()
83