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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
import QtQuick 2.0
import Ubuntu.Components 1.3
import Ubuntu.OnlineAccounts 0.1
Item {
id: root
signal finished
anchors.margins: units.gu(1)
height: contents.height
property var __account: account
property string __host: ""
property bool __busy: false
property string __hostError: i18n.dtr("account-plugins", "Invalid host URL")
Column {
id: contents
anchors { left: parent.left; right: parent.right }
spacing: units.gu(1)
Label {
id: errorLabel
anchors { left: parent.left; right: parent.right }
font.bold: true
color: UbuntuColors.red
wrapMode: Text.Wrap
visible: !__busy && text != ""
}
Label {
anchors { left: parent.left; right: parent.right }
text: i18n.dtr("account-plugins", "URL:")
}
TextField {
id: urlField
anchors { left: parent.left; right: parent.right }
placeholderText: i18n.dtr("account-plugins", "http://example.org")
focus: true
enabled: !__busy
inputMethodHints: Qt.ImhUrlCharactersOnly
}
Label {
anchors { left: parent.left; right: parent.right }
text: i18n.dtr("account-plugins", "Username:")
}
TextField {
id: usernameField
anchors { left: parent.left; right: parent.right }
placeholderText: i18n.dtr("account-plugins", "Your username")
enabled: !__busy
inputMethodHints: Qt.ImhNoAutoUppercase + Qt.ImhNoPredictiveText + Qt.ImhPreferLowercase
KeyNavigation.tab: passwordField
}
Label {
anchors { left: parent.left; right: parent.right }
text: i18n.dtr("account-plugins", "Password:")
}
TextField {
id: passwordField
anchors { left: parent.left; right: parent.right }
placeholderText: i18n.dtr("account-plugins", "Your password")
echoMode: TextInput.Password
enabled: !__busy
inputMethodHints: Qt.ImhSensitiveData
Keys.onReturnPressed: login()
}
Row {
id: buttons
anchors { left: parent.left; right: parent.right }
height: units.gu(5)
spacing: units.gu(1)
Button {
id: btnCancel
text: i18n.dtr("account-plugins", "Cancel")
height: parent.height
width: (parent.width / 2) - 0.5 * parent.spacing
onClicked: finished()
}
Button {
id: btnContinue
text: i18n.dtr("account-plugins", "Continue")
color: UbuntuColors.green
height: parent.height
width: (parent.width / 2) - 0.5 * parent.spacing
onClicked: login()
enabled: !__busy
}
}
}
ActivityIndicator {
anchors.centerIn: parent
running: __busy
}
Credentials {
id: creds
caption: account.provider.id
acl: [ "unconfined" ]
storeSecret: true
onCredentialsIdChanged: root.credentialsStored()
}
AccountService {
id: globalAccountSettings
objectHandle: account.accountServiceHandle
autoSync: false
}
function login() {
__host = cleanUrl(urlField.text)
var username = usernameField.text
var password = passwordField.text
errorLabel.text = ""
__busy = true
var host = __host
var tryHttp = false
if (__host.indexOf("http") != 0) {
host = "https://" + __host
tryHttp = true
}
checkAccount(host, username, password, function cb(success) {
console.log("callback called: " + success)
if (success) {
saveData(host, username, password)
} else if (tryHttp) {
host = "http://" + __host
tryHttp = false
checkAccount(host, username, password, cb)
} else {
__busy = false
}
})
}
function saveData(host, username, password) {
__host = host
var strippedHost = __host.replace(/^https?:\/\//, '')
account.updateDisplayName(username + '@' + strippedHost)
creds.userName = username
creds.secret = password
creds.sync()
}
function findChild(node, tagName) {
if (!node) return node;
var children = node.childNodes
for (var i = 0; i < children.length; i++) {
if (children[i].nodeName == tagName) {
return children[i]
}
}
return null
}
function checkAccount(host, username, password, callback) {
console.log("Trying host " + host + " as " + username + ':' + password)
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState === XMLHttpRequest.DONE) {
console.log("response: " + request.responseText)
if (request.status == 200) {
var root = request.responseXML ? request.responseXML.documentElement : null
var metaElement = findChild(root, "meta")
var statusElement = findChild(metaElement, "status")
if (statusElement && statusElement.childNodes.length > 0 &&
statusElement.childNodes[0].nodeValue == "ok") {
callback(true)
} else {
var statusCodeElement = findChild(metaElement, "statuscode")
var statusCode = (statusCodeElement && statusCodeElement.childNodes.length > 0) ?
statusCodeElement.childNodes[0].nodeValue : "999"
if (statusCode == "999") {
showError(__hostError)
} else {
showError(i18n.dtr("account-plugins", "Invalid username or password"))
}
callback(false)
}
} else {
showError(__hostError)
callback(false)
}
}
}
request.open("POST", host + "/ocs/v1.php/person/check", true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var body = "login=" + username + "&password=" + password
request.send(body);
}
function showError(message) {
if (!errorLabel.text) errorLabel.text = message
}
function credentialsStored() {
console.log("Credentials stored, id: " + creds.credentialsId)
if (creds.credentialsId == 0) return
globalAccountSettings.updateServiceEnabled(true)
globalAccountSettings.credentials = creds
globalAccountSettings.updateSettings({
"host": __host
})
account.synced.connect(finished)
account.sync()
__busy = false
}
// check host url for http
function cleanUrl(url) {
var host = url.trim()
// if the user typed trailing '/' or "index.php", strip that
return host.replace(/\/(index.php)?\/*$/, '')
}
}
|