File: login.py

package info (click to toggle)
releaseforge 1.1-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 2,088 kB
  • ctags: 1,239
  • sloc: python: 13,801; makefile: 68; sh: 32
file content (164 lines) | stat: -rw-r--r-- 5,165 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/usr/bin/env python

from qt import *
from loginBA import LoginBA
from workerThread import WorkerThread
import logging
from constants import EVENT_LOGIN
from messageQueue import mainMessageQueue
from loginSettings import LoginSettings
import os
from help import Help
try:
    from base64 import b32encode, b32decode
except ImportError:
    from python24.base64 import b32encode, b32decode


debug = logging.getLogger("login").debug
error = logging.getLogger("login").error

class Login(LoginBA):
    def __init__(self, parent, data_path, login_func, autologin, *args):
        """
        Initialize the login dialog
        
        parent: parent window
        data_path: path of releaseforge data directory
        login_func: function to invoke on login success
        autologin: attempt to automatically login (w/o displaying this dialog)
        """
        
        apply(LoginBA.__init__,(self,) + args)
        self.parent = parent
        self.data_path = data_path
        self.autologin = autologin
        
        self.setCaption(self.server_name_ + " Login")
        self.groupBox.setTitle(self.server_name_ + " Login")
        
        self.settings = LoginSettings(data_path)
        username = self.settings[self.username_]
        password = self.settings[self.password_]
        try:
            if password: password = b32decode(password)
        except:
            QMessageBox.warning(self, "Password Reset",
                                "Could not decode your saved password."
                                "You will need to re-enter it.")
            password = ""
        
        
        self.usernameLineEdit.setText(username)
        self.passwordLineEdit.setText(password)
        rememberMe = self.settings[self.remember_password_]
        if rememberMe.lower() in ('1', 'true'):
            self.rememberCheckBox.setChecked(True)
        self.login_func = login_func
        self.thread = None

        try_autologin = False
        if username and password:
            self.buttonOk.setFocus()
            if self.autologin:
                try_autologin = True
        elif username: self.passwordLineEdit.setFocus()
        
        if try_autologin:
            self.username = username
            self.password = password
            self.remember = True
            self.login()
        else:
            self.show()



    def customEvent(self, event):
        if event.type() != EVENT_LOGIN: return
        
        response = event.data()
        debug("customEvent: %s", response)
        self.setCursor(Qt.arrowCursor)
        self.parent.setCursor(Qt.arrowCursor)
        self.parent.statusBar().clear()
        self.setEnabled(True)
        #self.parent.setCursor(Qt.arrowCursor)
        if not response:
            if self.autologin: self.show()
            QMessageBox.critical(self, "Login Failed",
                                 "Unable to login to %s.\n" 
                                 "Please verify your username and password." % self.server_name_)
            self.enableElements()
            return

        settings = self.settings
        settings[self.username_] = self.username
        settings[self.remember_password_] = self.remember
        if self.remember:
            settings[self.password_] = b32encode(self.password)
        else:
            settings[self.password_] = ""

        settings.saveSettings()
            
        self.parent.emit(PYSIGNAL(self.signal_), (response,) )
        LoginBA.accept(self)


    def __del__(self):
        if self.thread:
            t = self.thread
            running = t.running()
            t.stop()
            if not t.finished():
                t.wait()

    def help(self):
        self._help = Help(self, "login.html")
        

    def disableElements(self):
        self.enableElements(False)


    def enableElements(self, enable=True):
        self.usernameLineEdit.setEnabled(enable)
        self.passwordLineEdit.setEnabled(enable)
        self.rememberCheckBox.setEnabled(enable)
        self.buttonOk.setEnabled(enable)

        
    def reject(self):
        if self.thread: self.thread.stop()
        mainMessageQueue.put("%s login cancelled" % self.server_name_)
        LoginBA.reject(self)
        
        
    def accept(self):
        self.username = str(self.usernameLineEdit.text())
        self.password = str(self.passwordLineEdit.text())
        self.remember = bool(self.rememberCheckBox.isChecked()) # True/False

        if not self.username or not self.password:
            QMessageBox.critical(self, "Login Failed",
                                 "You must supply a valid username and password.\n")
            return

        self.disableElements()

        self.login()


    def login(self):
        self.setCursor(Qt.waitCursor)
        self.parent.setCursor(Qt.waitCursor)
        mainMessageQueue.put("Authenticating user")

        self.thread = WorkerThread(self,
                                   EVENT_LOGIN,
                                   self.login_func,
                                   self.username,
                                   self.password)
        self.thread.start()