Newer
Older
import QtQuick.Dialogs 1.2
import QtQuick.Extras 1.2
import Qt.labs.platform 1.1
ApplicationWindow {
id: app
visible: false
property var allowEmptyPass
Connections {
target: jsonModel
onDataChanged: {
ctx = JSON.parse(jsonModel.getJson());
// FIXME -- we need to inform the backend that we've already seen
// this. Otherwise this keeps popping randonmly on state changes.
console.debug(jsonModel.getJson())
donate.visible = true
}
console.debug(jsonModel.getJson())
console.debug("DEBUG: should display login")
if ( ctx.errors == "nohelpers" ) {
showInitFailure(qsTr("Could not find helpers. Please check your installation"))
} else if ( ctx.errors == "nopolkit" ) {
showInitFailure(qsTr("Could not find polkit agent."))
} else {
showInitFailure()
if (ctx.donateURL) {
donateItem.visible = true
}
console.debug("ERRORS:", ctx.errors)
if (msg == undefined) {
if (ctx.errors == 'bad_auth_502' || ctx.errors == 'bad_auth_timeout') {
msg = qsTr("Oops! The authentication service seems down. Please try again later")
initFailure.title = qsTr("Service Error")
}
else if (ctx.errors == 'bad_auth') {
if (allowEmptyPass) {
// For now, this is a libraryVPN, so we can be explicit about what credentials are here.
// Another option to consider is to customize the error strings while vendoring.
//: Incorrect library card number
msg = qsTr("Please check your Patron ID")
} else {
msg = qsTr("Could not log in with those credentials, please retry")
}
initFailure.title = qsTr("Login Error")
} else {
//: %1 -> application name
//: %2 -> error string
msg = qsTr("Got an error starting %1: %2").arg(ctx.appName).arg(ctx.errors)
}
}
initFailure.text = msg
initFailure.visible = true
}
function shouldAllowEmptyPass() {
let obj = JSON.parse(providers.getJson())
let active = obj['default']
let allProviders = obj['providers']
for (let i = 0; i < allProviders.length; i++) {
if (allProviders[i]['name'] === active) {
return (allProviders[i]['authEmptyPass'] === 'true')
}
}
return false
console.debug("DEBUG: Pre-seeded providers:");
/* TODO get appVisible flag from backend */
}
function toHuman(st) {
switch(st) {
case "off":
//: %1 -> application name
//: %1 -> application name
//: %1 -> application name
return qsTr("Connecting to %1").arg(ctx.appName);
//: %1 -> application name
return qsTr("Stopping %1").arg(ctx.appName);
//: %1 -> application name
return qsTr("%1 blocking internet").arg(ctx.appName); // TODO failed is not handed yet
}
}
property var icons: {
"off": "qrc:/assets/icon/png/black/vpn_off.png",
"on": "qrc:/assets/icon/png/black/vpn_on.png",
"wait": "qrc:/assets/icon/png/black/vpn_wait_0.png",
"blocked": "qrc:/assets/icon/png/black/vpn_blocked.png",
}
// this looks like a widget bug. middle click (reasons 3 or 4)
// produce a segfault when trying to call menu.open()
// left and right click seem to be working fine, so let's ignore this for now.
switch (reason) {
case SystemTrayIcon.Unknown:
console.debug("activated: unknown event")
case SystemTrayIcon.Context:
console.debug("activated: context")
/* segfaults in osx and linux */
if (Qt.platform.os === "windows") {
menu.open()
}
case SystemTrayIcon.DoubleClick:
console.debug("activated: double click")
if (Qt.platform.os === "windows") {
menu.open()
}
case SystemTrayIcon.Trigger:
console.debug("activated: left click")
if (Qt.platform.os === "windows") {
menu.open()
}
case SystemTrayIcon.MiddleClick:
}
Component.onCompleted: {
icon.source = icons["off"]
tooltip = qsTr("Checking status...")
console.debug("systray init completed")
if (systrayVisible) {
show();
if (Qt.platform.os === "windows") {
showNotification(appname + " is up and running. Please use system tray icon to control it.");
}
}
}
// Helper to show notification messages
function showNotification(msg) {
console.log("Going to show notification message: ", msg);
if (supportsMessages) {
showMessage(appname, msg, null, 15000);
} else {
console.log("System doesn't support systray notifications");
StateGroup {
id: vpn
state: ctx ? ctx.status : ""
states: [
State { name: "initializing" },
State {
name: "off"
PropertyChanges { target: systray; tooltip: toHuman("off"); icon.source: icons["off"] }
PropertyChanges { target: statusItem; text: toHuman("off") }
},
State {
name: "on"
PropertyChanges { target: systray; tooltip: toHuman("on"); icon.source: icons["on"] }
PropertyChanges { target: statusItem; text: toHuman("on") }
},
State {
name: "starting"
PropertyChanges { target: systray; tooltip: toHuman("connecting"); icon.source: icons["wait"] }
PropertyChanges { target: statusItem; text: toHuman("connecting") }
},
State {
name: "stopping"
PropertyChanges { target: systray; tooltip: toHuman("stopping"); icon.source: icons["wait"] }
PropertyChanges { target: statusItem; text: toHuman("stopping") }
PropertyChanges { target: systray; tooltip: toHuman("failed"); icon.source: icons["blocked"] }
PropertyChanges { target: statusItem; text: toHuman("failed") }
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
}
]
}
MenuItem {
id: statusItem
text: qsTr("Checking status...")
enabled: false
}
MenuItem {
text: {
if (vpn.state == "failed")
qsTr("Reconnect")
else
qsTr("Turn on")
}
onTriggered: {
backend.switchOn()
}
visible: ctx ? (ctx.status == "off" || ctx.status == "failed") : false
}
MenuItem {
text: {
if (ctx && ctx.status == "starting")
qsTr("Cancel")
else
qsTr("Turn off")
}
onTriggered: {
backend.switchOff()
}
visible: ctx ? (ctx.status == "on" || ctx.status == "starting" || ctx.status == "failed") : false
}
MenuSeparator {}
MenuItem {
text: qsTr("About...")
onTriggered: { about.visible = true }
text: qsTr("Help...")
onTriggered: {
console.debug(Qt.resolvedUrl(ctx.helpURL));
Qt.openUrlExternally(Qt.resolvedUrl(ctx.helpURL))
}
}
MenuItem {
text: qsTr("Report a bug...")
onTriggered: {
Qt.openUrlExternally(Qt.resolvedUrl("https://0xacab.org/leap/bitmask-vpn/issues"))
}
}
MenuSeparator {}
MenuItem {
text: qsTr("Quit")
onTriggered: backend.quit()
}
}
}
AboutDialog {
id: about
visible: false
}
LoginOKDialog{
id: loginOk
visible: false
}
MessageDialog {
id: errorStartingVPN
buttons: MessageDialog.Ok
modality: Qt.NonModal
title: qsTr("Error starting VPN")
text: ""
detailedText: ""
visible: false
MessageDialog {
id: authAgent
buttons: MessageDialog.Ok
modality: Qt.NonModal
title: qsTr("Missing authentication agent")
text: qsTr("Could not find a polkit authentication agent. Please run one and try again.")
visible: false
FailDialog {