コード例 #1
0
ファイル: dialogs.py プロジェクト: hj91/cspace
 def __init__(self, parent, reactor, profile, addContactCallback,
              closeCallback):
     QDialog.__init__(self, parent)
     self.ui = Ui_AddContactDialog()
     self.ui.setupUi(self)
     self.reactor = reactor
     self.profile = profile
     self.addContactCallback = addContactCallback
     self.closeCallback = closeCallback
     self.fetchOp = None
     self.fetchError = False
     self.origStatus = self.ui.keyIdStatus.text()
     self.connect(self.ui.keyId, SIGNAL('textChanged(const QString&)'),
                  self._onKeyIdChanged)
     self.connect(self.ui.keyId, SIGNAL('returnPressed()'),
                  self._onKeyIdReturn)
     self.connect(self.ui.keyId, SIGNAL('clicked()'),
                  self._onFetchKeyClicked)
     self.connect(self.ui.fetchKeyButton, SIGNAL('clicked()'),
                  self._onFetchKeyClicked)
     self.connect(self.ui.publicKey, SIGNAL('textChanged()'),
                  self._onPublicKeyChanged)
     self.connect(self.ui.contactName,
                  SIGNAL('textChanged(const QString&)'),
                  self._onContactNameChanged)
     self.connect(self.ui.contactName, SIGNAL('returnPressed()'),
                  self._onContactNameReturn)
     self.connect(self.ui.addContactButton, SIGNAL('clicked()'),
                  self._onAddContactClicked)
     self.connect(self.ui.cancelButton, SIGNAL('clicked()'), self.close)
     self._updateUI()
コード例 #2
0
ファイル: dialogs.py プロジェクト: AchillesA/cspace
 def __init__( self, parent, reactor, profile, addContactCallback,
         closeCallback ) :
     QDialog.__init__( self, parent )
     self.ui = Ui_AddContactDialog()
     self.ui.setupUi( self )
     self.reactor = reactor
     self.profile = profile
     self.addContactCallback = addContactCallback
     self.closeCallback = closeCallback
     self.fetchOp = None
     self.fetchError = False
     self.origStatus = self.ui.keyIdStatus.text()
     self.connect( self.ui.keyId,
             SIGNAL('textChanged(const QString&)'),
             self._onKeyIdChanged )
     self.connect( self.ui.keyId, SIGNAL('returnPressed()'),
             self._onKeyIdReturn )
     self.connect( self.ui.keyId, SIGNAL('clicked()'),
             self._onFetchKeyClicked )
     self.connect( self.ui.fetchKeyButton, SIGNAL('clicked()'),
             self._onFetchKeyClicked )
     self.connect( self.ui.publicKey, SIGNAL('textChanged()'),
             self._onPublicKeyChanged )
     self.connect( self.ui.contactName,
             SIGNAL('textChanged(const QString&)'),
             self._onContactNameChanged )
     self.connect( self.ui.contactName, SIGNAL('returnPressed()'),
             self._onContactNameReturn )
     self.connect( self.ui.addContactButton, SIGNAL('clicked()'),
             self._onAddContactClicked )
     self.connect( self.ui.cancelButton, SIGNAL('clicked()'),
             self.close )
     self._updateUI()
コード例 #3
0
ファイル: dialogs.py プロジェクト: AchillesA/cspace
class AddContactDialog( QDialog ) :
    def __init__( self, parent, reactor, profile, addContactCallback,
            closeCallback ) :
        QDialog.__init__( self, parent )
        self.ui = Ui_AddContactDialog()
        self.ui.setupUi( self )
        self.reactor = reactor
        self.profile = profile
        self.addContactCallback = addContactCallback
        self.closeCallback = closeCallback
        self.fetchOp = None
        self.fetchError = False
        self.origStatus = self.ui.keyIdStatus.text()
        self.connect( self.ui.keyId,
                SIGNAL('textChanged(const QString&)'),
                self._onKeyIdChanged )
        self.connect( self.ui.keyId, SIGNAL('returnPressed()'),
                self._onKeyIdReturn )
        self.connect( self.ui.keyId, SIGNAL('clicked()'),
                self._onFetchKeyClicked )
        self.connect( self.ui.fetchKeyButton, SIGNAL('clicked()'),
                self._onFetchKeyClicked )
        self.connect( self.ui.publicKey, SIGNAL('textChanged()'),
                self._onPublicKeyChanged )
        self.connect( self.ui.contactName,
                SIGNAL('textChanged(const QString&)'),
                self._onContactNameChanged )
        self.connect( self.ui.contactName, SIGNAL('returnPressed()'),
                self._onContactNameReturn )
        self.connect( self.ui.addContactButton, SIGNAL('clicked()'),
                self._onAddContactClicked )
        self.connect( self.ui.cancelButton, SIGNAL('clicked()'),
                self.close )
        self._updateUI()

    def _showError( self, msg ) :
        QMessageBox.critical( self, 'Error', msg )

    def _readData( self ) :
        self.keyId = unicode(self.ui.keyId.text()).encode('utf8')
        self.pemPublicKey = unicode(self.ui.publicKey.toPlainText()).encode('utf8')
        self.contactName = unicode(self.ui.contactName.text()).encode('utf8')

    def _updateUI( self ) :
        self._readData()
        if self.fetchOp :
            self.ui.keyIdStatus.setText( 'Fetching public key...' )
            self.ui.keyId.setEnabled( False )
            self.ui.fetchKeyButton.setEnabled( False )
            self.ui.publicKey.setEnabled( False )
            self.ui.contactName.setEnabled( False )
            self.ui.addContactButton.setEnabled( False )
            return
        if self.fetchError :
            self.ui.keyIdStatus.setText( 'Error fetching key. Check KeyID.' )
        else :
            self.ui.keyIdStatus.setText( self.origStatus )
        self.ui.keyId.setEnabled( True )
        self.ui.publicKey.setEnabled( True )
        self.ui.contactName.setEnabled( True )
        self.ui.fetchKeyButton.setEnabled( bool(self.keyId) )
        self.ui.addContactButton.setEnabled( bool(self.pemPublicKey)
                and bool(self.contactName) )

    def _onKeyIdChanged( self, text ) :
        self.fetchError = False
        self._updateUI()

    def _onKeyIdReturn( self ) :
        self.ui.fetchKeyButton.click()

    def _fetchKey( self, keyId, callback=None ) :
        def onFetchKey( responseCode, data ) :
            if responseCode != 200 :
                op.notify( None )
                return
            inp = StringIO.StringIO( data )
            name = inp.readline().strip()
            pemPublicKey = inp.read()
            if name and not isValidUserName(name) :
                op.notify( None )
                return
            op.notify( (name,pemPublicKey) )
        httpOp = HttpRequest( self.reactor ).get(
                'http://cspace.in/pubkey/%s' % keyId,
                onFetchKey )
        op = AsyncOp( callback, httpOp.cancel )
        return op

    def _onFetchKeyClicked( self ) :
        try :
            int(self.keyId)
        except ValueError :
            self._showError( 'Invalid KeyID' )
            self.ui.keyId.setFocus()
            self.ui.keyId.selectAll()
            return
        self.ui.publicKey.clear()
        self.ui.contactName.clear()
        self.fetchError = False
        self.fetchOp = self._fetchKey( self.keyId, self._onKeyFetched )
        self._updateUI()

    def _onKeyFetched( self, result ) :
        self.fetchOp = None
        if result is None :
            self.fetchError = True
            self._updateUI()
            self.ui.keyId.setFocus()
            self.ui.keyId.selectAll()
            return
        self.fetchError = False
        name,pemPublicKey = result
        self.ui.contactName.setText( name )
        self.ui.publicKey.setPlainText( pemPublicKey )
        self._updateUI()
        self.ui.contactName.setFocus()
        self.ui.contactName.selectAll()

    def _onPublicKeyChanged( self ) :
        self.fetchError = False
        self._updateUI()

    def _onContactNameChanged( self, text ) :
        self.fetchError = False
        self._updateUI()

    def _onContactNameReturn( self ) :
        self.ui.addContactButton.click()

    def _onAddContactClicked( self ) :
        k = RSAKey()
        try :
            k.fromPEM_PublicKey( self.pemPublicKey )
        except RSAError :
            self._showError( 'Invalid public key.' )
            self.ui.publicKey.setFocus()
            self.ui.publicKey.selectAll()
            return
        if not isValidUserName(self.contactName) :
            self._showError( 'Only lowercase alphabets(a-z), ' +
                    'digits(0-9), and underscore(\'_\') are allowed ' +
                    'in the contact name.' )
            self.ui.contactName.setFocus()
            self.ui.contactName.selectAll()
            return
        contact = self.profile.getContactByPublicKey( k )
        if contact :
            self._showError( 'This public key is already present in ' +
                    'your contact list as \'%s\'.' % contact.name )
            self.ui.publicKey.setFocus()
            self.ui.publicKey.selectAll()
            return
        contact = self.profile.getContactByName( self.contactName )
        if contact :
            self._showError( 'This name is already present in your ' +
                    'contact list.\nPlease choose a different name.' )
            self.ui.contactName.setFocus()
            self.ui.contactName.selectAll()
            return
        contact = Contact( k, self.contactName )
        self.addContactCallback( contact )
        self.accept()

    def done( self, r ) :
        QDialog.done( self, r )
        self.close()

    def closeEvent( self, ev ) :
        if self.fetchOp :
            self.fetchOp.cancel()
            self.fetchOp = None
        if self.closeCallback :
            self.closeCallback()
            self.closeCallback = None
        delaygc( self )
        QDialog.closeEvent( self, ev )
コード例 #4
0
ファイル: dialogs.py プロジェクト: hj91/cspace
class AddContactDialog(QDialog):
    def __init__(self, parent, reactor, profile, addContactCallback,
                 closeCallback):
        QDialog.__init__(self, parent)
        self.ui = Ui_AddContactDialog()
        self.ui.setupUi(self)
        self.reactor = reactor
        self.profile = profile
        self.addContactCallback = addContactCallback
        self.closeCallback = closeCallback
        self.fetchOp = None
        self.fetchError = False
        self.origStatus = self.ui.keyIdStatus.text()
        self.connect(self.ui.keyId, SIGNAL('textChanged(const QString&)'),
                     self._onKeyIdChanged)
        self.connect(self.ui.keyId, SIGNAL('returnPressed()'),
                     self._onKeyIdReturn)
        self.connect(self.ui.keyId, SIGNAL('clicked()'),
                     self._onFetchKeyClicked)
        self.connect(self.ui.fetchKeyButton, SIGNAL('clicked()'),
                     self._onFetchKeyClicked)
        self.connect(self.ui.publicKey, SIGNAL('textChanged()'),
                     self._onPublicKeyChanged)
        self.connect(self.ui.contactName,
                     SIGNAL('textChanged(const QString&)'),
                     self._onContactNameChanged)
        self.connect(self.ui.contactName, SIGNAL('returnPressed()'),
                     self._onContactNameReturn)
        self.connect(self.ui.addContactButton, SIGNAL('clicked()'),
                     self._onAddContactClicked)
        self.connect(self.ui.cancelButton, SIGNAL('clicked()'), self.close)
        self._updateUI()

    def _showError(self, msg):
        QMessageBox.critical(self, 'Error', msg)

    def _readData(self):
        self.keyId = unicode(self.ui.keyId.text()).encode('utf8')
        self.pemPublicKey = unicode(
            self.ui.publicKey.toPlainText()).encode('utf8')
        self.contactName = unicode(self.ui.contactName.text()).encode('utf8')

    def _updateUI(self):
        self._readData()
        if self.fetchOp:
            self.ui.keyIdStatus.setText('Fetching public key...')
            self.ui.keyId.setEnabled(False)
            self.ui.fetchKeyButton.setEnabled(False)
            self.ui.publicKey.setEnabled(False)
            self.ui.contactName.setEnabled(False)
            self.ui.addContactButton.setEnabled(False)
            return
        if self.fetchError:
            self.ui.keyIdStatus.setText('Error fetching key. Check KeyID.')
        else:
            self.ui.keyIdStatus.setText(self.origStatus)
        self.ui.keyId.setEnabled(True)
        self.ui.publicKey.setEnabled(True)
        self.ui.contactName.setEnabled(True)
        self.ui.fetchKeyButton.setEnabled(bool(self.keyId))
        self.ui.addContactButton.setEnabled(
            bool(self.pemPublicKey) and bool(self.contactName))

    def _onKeyIdChanged(self, text):
        self.fetchError = False
        self._updateUI()

    def _onKeyIdReturn(self):
        self.ui.fetchKeyButton.click()

    def _fetchKey(self, keyId, callback=None):
        def onFetchKey(responseCode, data):
            if responseCode != 200:
                op.notify(None)
                return
            inp = StringIO.StringIO(data)
            name = inp.readline().strip()
            pemPublicKey = inp.read()
            if name and not isValidUserName(name):
                op.notify(None)
                return
            op.notify((name, pemPublicKey))

        httpOp = HttpRequest(self.reactor).get(
            'http://cspace.in/pubkey/%s' % keyId, onFetchKey)
        op = AsyncOp(callback, httpOp.cancel)
        return op

    def _onFetchKeyClicked(self):
        try:
            int(self.keyId)
        except ValueError:
            self._showError('Invalid KeyID')
            self.ui.keyId.setFocus()
            self.ui.keyId.selectAll()
            return
        self.ui.publicKey.clear()
        self.ui.contactName.clear()
        self.fetchError = False
        self.fetchOp = self._fetchKey(self.keyId, self._onKeyFetched)
        self._updateUI()

    def _onKeyFetched(self, result):
        self.fetchOp = None
        if result is None:
            self.fetchError = True
            self._updateUI()
            self.ui.keyId.setFocus()
            self.ui.keyId.selectAll()
            return
        self.fetchError = False
        name, pemPublicKey = result
        self.ui.contactName.setText(name)
        self.ui.publicKey.setPlainText(pemPublicKey)
        self._updateUI()
        self.ui.contactName.setFocus()
        self.ui.contactName.selectAll()

    def _onPublicKeyChanged(self):
        self.fetchError = False
        self._updateUI()

    def _onContactNameChanged(self, text):
        self.fetchError = False
        self._updateUI()

    def _onContactNameReturn(self):
        self.ui.addContactButton.click()

    def _onAddContactClicked(self):
        k = RSAKey()
        try:
            k.fromPEM_PublicKey(self.pemPublicKey)
        except RSAError:
            self._showError('Invalid public key.')
            self.ui.publicKey.setFocus()
            self.ui.publicKey.selectAll()
            return
        if not isValidUserName(self.contactName):
            self._showError('Only lowercase alphabets(a-z), ' +
                            'digits(0-9), and underscore(\'_\') are allowed ' +
                            'in the contact name.')
            self.ui.contactName.setFocus()
            self.ui.contactName.selectAll()
            return
        contact = self.profile.getContactByPublicKey(k)
        if contact:
            self._showError('This public key is already present in ' +
                            'your contact list as \'%s\'.' % contact.name)
            self.ui.publicKey.setFocus()
            self.ui.publicKey.selectAll()
            return
        contact = self.profile.getContactByName(self.contactName)
        if contact:
            self._showError('This name is already present in your ' +
                            'contact list.\nPlease choose a different name.')
            self.ui.contactName.setFocus()
            self.ui.contactName.selectAll()
            return
        contact = Contact(k, self.contactName)
        self.addContactCallback(contact)
        self.accept()

    def done(self, r):
        QDialog.done(self, r)
        self.close()

    def closeEvent(self, ev):
        if self.fetchOp:
            self.fetchOp.cancel()
            self.fetchOp = None
        if self.closeCallback:
            self.closeCallback()
            self.closeCallback = None
        delaygc(self)
        QDialog.closeEvent(self, ev)