Helpviewer/Passwords/PasswordReader.py

changeset 1685
7640d5500966
child 1686
bd756cb42d5b
equal deleted inserted replaced
1683:ef9a9e86269e 1685:7640d5500966
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a class to read login data files.
8 """
9
10 from PyQt4.QtCore import QXmlStreamReader, QIODevice, QFile, QCoreApplication, QUrl
11
12 from .LoginForm import LoginForm
13
14
15 class PasswordReader(QXmlStreamReader):
16 """
17 Class implementing a reader object for login data files.
18 """
19 def __init__(self):
20 """
21 Constructor
22 """
23 super().__init__()
24
25 def read(self, fileNameOrDevice):
26 """
27 Public method to read an XBEL bookmark file.
28
29 @param fileNameOrDevice name of the file to read (string)
30 or reference to the device to read (QIODevice)
31 @return tuple containing the logins, forms and never URLs
32 """
33 self.__logins = {}
34 self.__loginForms = {}
35 self.__never = []
36
37 if isinstance(fileNameOrDevice, QIODevice):
38 self.setDevice(fileNameOrDevice)
39 else:
40 f = QFile(fileNameOrDevice)
41 if not f.exists():
42 return self.__logins, self.__loginForms, self.__never
43 f.open(QFile.ReadOnly)
44 self.setDevice(f)
45
46 while not self.atEnd():
47 self.readNext()
48 if self.isStartElement():
49 version = self.attributes().value("version")
50 if self.name() == "Password" and \
51 (not version or version == "1.0"):
52 self.__readPasswords()
53 else:
54 self.raiseError(QCoreApplication.translate(
55 "PasswordReader",
56 "The file is not a Passwords version 1.0 file."))
57
58 return self.__logins, self.__loginForms, self.__never
59
60 def __readPasswords(self):
61 """
62 Private method to read and parse the login data file.
63 """
64 if not self.isStartElement() and self.name() != "xbel":
65 return
66
67 while not self.atEnd():
68 self.readNext()
69 if self.isEndElement():
70 break
71
72 if self.isStartElement():
73 if self.name() == "Logins":
74 self.__readLogins()
75 elif self.name() == "Forms":
76 self.__readForms()
77 elif self.name() == "Nevers":
78 self.__readNevers()
79 else:
80 self.__skipUnknownElement()
81
82 def __readLogins(self):
83 """
84 Private method to read the login information.
85 """
86 if not self.isStartElement() and self.name() != "Logins":
87 return
88
89 while not self.atEnd():
90 self.readNext()
91 if self.isEndElement():
92 if self.name() == "Login":
93 continue
94 else:
95 break
96
97 if self.isStartElement():
98 if self.name() == "Login":
99 attributes = self.attributes()
100 key = attributes.value("key")
101 user = attributes.value("user")
102 password = attributes.value("password")
103 self.__logins[key] = (user, password)
104 else:
105 self.__skipUnknownElement()
106
107 def __readForms(self):
108 """
109 Private method to read the forms information.
110 """
111 if not self.isStartElement() and self.name() != "Forms":
112 return
113
114 while not self.atEnd():
115 self.readNext()
116 if self.isStartElement():
117 if self.name() == "Form":
118 attributes = self.attributes()
119 key = attributes.value("key")
120 form = LoginForm()
121 form.url = QUrl(attributes.value("url"))
122 form.name = attributes.value("name")
123 form.hasAPassword = attributes.value("password") == "yes"
124 elif self.name() == "Elements":
125 continue
126 elif self.name() == "Element":
127 attributes = self.attributes()
128 name = attributes.value("name")
129 value = attributes.value("value")
130 form.elements.append((name, value))
131 else:
132 self.__skipUnknownElement()
133
134 if self.isEndElement():
135 if self.name() == "Form":
136 self.__loginForms[key] = form
137 continue
138 elif self.name() in ["Elements", "Element"]:
139 continue
140 else:
141 break
142
143 def __readNevers(self):
144 """
145 Private method to read the never URLs.
146 """
147 if not self.isStartElement() and self.name() != "Nevers":
148 return
149
150 while not self.atEnd():
151 self.readNext()
152 if self.isEndElement():
153 if self.name() == "Never":
154 continue
155 else:
156 break
157
158 if self.isStartElement():
159 if self.name() == "Never":
160 self.__never.append(self.attributes().value("url"))
161 else:
162 self.__skipUnknownElement()
163
164 def __skipUnknownElement(self):
165 """
166 Private method to skip over all unknown elements.
167 """
168 if not self.isStartElement():
169 return
170
171 while not self.atEnd():
172 self.readNext()
173 if self.isEndElement():
174 break
175
176 if self.isStartElement():
177 self.__skipUnknownElement()

eric ide

mercurial