blob: 01c82baf446e885d8de6cf9101f4eb75f13af752 [file] [log] [blame]
#!/usr/bin/python
import gobject
import dbus
import dbus.service
import dbus.mainloop.glib
import sys
class Canceled(dbus.DBusException):
_dbus_error_name = "net.connman.Error.Canceled"
class LaunchBrowser(dbus.DBusException):
_dbus_error_name = "net.connman.Agent.Error.LaunchBrowser"
class Agent(dbus.service.Object):
name = None
ssid = None
identity = None
passphrase = None
wpspin = None
username = None
password = None
@dbus.service.method("net.connman.Agent",
in_signature='', out_signature='')
def Release(self):
print("Release")
mainloop.quit()
def input_passphrase(self):
response = {}
if not self.identity and not self.passphrase and not self.wpspin:
print "Service credentials requested, type cancel to cancel"
args = raw_input('Answer: ')
for arg in args.split():
if arg.startswith("cancel"):
response["Error"] = arg
if arg.startswith("Identity="):
identity = arg.replace("Identity=", "", 1)
response["Identity"] = identity
if arg.startswith("Passphrase="):
passphrase = arg.replace("Passphrase=", "", 1)
response["Passphrase"] = passphrase
if arg.startswith("WPS="):
wpspin = arg.replace("WPS=", "", 1)
response["WPS"] = wpspin
break
else:
if self.identity:
response["Identity"] = self.identity
if self.passphrase:
response["Passphrase"] = self.passphrase
if self.wpspin:
response["WPS"] = self.wpspin
return response
def input_username(self):
response = {}
if not self.username and not self.password:
print "User login requested, type cancel to cancel"
print "or browser to login through the browser by yourself."
args = raw_input('Answer: ')
for arg in args.split():
if arg.startswith("cancel") or arg.startswith("browser"):
response["Error"] = arg
if arg.startswith("Username="):
username = arg.replace("Username=", "", 1)
response["Username"] = username
if arg.startswith("Password="):
password = arg.replace("Password=", "", 1)
response["Password"] = password
else:
if self.username:
response["Username"] = self.username
if self.password:
response["Password"] = self.password
return response
def input_hidden(self):
response = {}
if not self.name and not self.ssid:
args = raw_input('Answer ')
for arg in args.split():
if arg.startswith("Name="):
name = arg.replace("Name=", "", 1)
response["Name"] = name
break
if arg.startswith("SSID="):
ssid = arg.replace("SSID", "", 1)
response["SSID"] = ssid
break
else:
if self.name:
response["Name"] = self.name
if self.ssid:
response["SSID"] = self.ssid
return response
@dbus.service.method("net.connman.Agent",
in_signature='oa{sv}',
out_signature='a{sv}')
def RequestInput(self, path, fields):
print "RequestInput (%s,%s)" % (path, fields)
response = {}
if fields.has_key("Name"):
response.update(self.input_hidden())
if fields.has_key("Passphrase"):
response.update(self.input_passphrase())
if fields.has_key("Username"):
response.update(self.input_username())
if response.has_key("Error"):
if response["Error"] == "cancel":
raise Canceled("canceled")
return
if response["Error"] == "browser":
raise LaunchBrowser("launch browser")
return
print "returning (%s)" % (response)
return response
@dbus.service.method("net.connman.Agent",
in_signature='os',
out_signature='')
def RequestBrowser(self, path, url):
print "RequestBrowser (%s,%s)" % (path, url)
print "Please login through the given url in a browser"
print "Then press enter to accept or some text to cancel"
args = raw_input('> ')
if len(args) > 0:
raise Canceled("canceled")
return
@dbus.service.method("net.connman.Agent",
in_signature='os',
out_signature='')
def ReportError(self, path, error):
print "ReportError %s, %s" % (path, error)
retry = raw_input("Retry service (yes/no): ")
if (retry == "yes"):
class Retry(dbus.DBusException):
_dbus_error_name = "net.connman.Agent.Error.Retry"
raise Retry("retry service")
else:
return
@dbus.service.method("net.connman.Agent",
in_signature='', out_signature='')
def Cancel(self):
print "Cancel"
class VpnAgent(dbus.service.Object):
name = None
host = None
cookie = None
username = None
password = None
@dbus.service.method("net.connman.vpn.Agent",
in_signature='', out_signature='')
def Release(self):
print("Release VPN agent")
def input_cookie(self):
response = {}
if not self.cookie:
print "VPN credentials requested, type cancel to cancel"
args = raw_input('Answer: ')
for arg in args.split():
if arg.startswith("cancel"):
response["Error"] = arg
if arg.startswith("Cookie="):
cookie = arg.replace("Cookie=", "", 1)
response["OpenConnect.Cookie"] = cookie
else:
if self.cookie:
response["OpenConnect.Cookie"] = self.cookie
return response
def input_username(self):
response = {}
if not self.username and not self.password:
print "User login requested, type cancel to cancel"
args = raw_input('Answer: ')
for arg in args.split():
if arg.startswith("cancel"):
response["Error"] = arg
if arg.startswith("Username="):
username = arg.replace("Username=", "", 1)
response["Username"] = username
if arg.startswith("Password="):
password = arg.replace("Password=", "", 1)
response["Password"] = password
else:
if self.username:
response["Username"] = self.username
if self.password:
response["Password"] = self.password
return response
@dbus.service.method("net.connman.vpn.Agent",
in_signature='oa{sv}',
out_signature='a{sv}')
def RequestInput(self, path, fields):
print "RequestInput (%s,%s)" % (path, fields)
response = {}
if fields.has_key("OpenConnect.Cookie"):
response.update(self.input_cookie())
if fields.has_key("Username") or fields.has_key("Password"):
response.update(self.input_username())
if response.has_key("Error"):
if response["Error"] == "cancel":
raise Canceled("canceled")
return
print "returning (%s)" % (response)
return response
@dbus.service.method("net.connman.vpn.Agent",
in_signature='os',
out_signature='')
def ReportError(self, path, error):
print "ReportError %s, %s" % (path, error)
retry = raw_input("Retry service (yes/no): ")
if (retry == "yes"):
class Retry(dbus.DBusException):
_dbus_error_name = "net.connman.vpn.Agent.Error.Retry"
raise Retry("retry service")
else:
return
@dbus.service.method("net.connman.vpn.Agent",
in_signature='', out_signature='')
def Cancel(self):
print "Cancel"
def vpnNameOwnerChanged(proxy):
if proxy:
print("vpnd is connected to system bus")
try:
path = "/test/vpn_agent"
vpn_manager = dbus.Interface(bus.get_object('net.connman.vpn',
"/"),
'net.connman.vpn.Manager')
vpn_manager.RegisterAgent(path)
except:
print "vpn agent is not registered"
else:
print("vpnd is disconnected from system bus")
vpn_manager = None
def print_usage():
print "Usage:"
print "For hidden service:"
print "%s Name=<hidden service name> [SSID=<hidden ssid>]" % (sys.argv[0])
print "For EAP/WPA input:"
print "%s Identity=<identity> Passphrase=<passphrase> WPS=<wpspin>" % (sys.argv[0])
print "For WISPr login, L2TP or PPTP input:"
print "%s Username=<username> Password=<password>" % (sys.argv[0])
print "For OpenConnect input:"
print "%s Cookie=<string>" % (sys.argv[0])
print "Help: %s help" % (sys.argv[0])
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) == 2 and sys.argv[1] == "help":
print_usage()
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object('net.connman', "/"),
'net.connman.Manager')
path = "/test/agent"
object = Agent(bus, path)
try:
vpn_manager = dbus.Interface(bus.get_object('net.connman.vpn', "/"),
'net.connman.vpn.Manager')
vpn_path = "/test/vpn_agent"
vpn_object = VpnAgent(bus, vpn_path)
except:
vpn_manager = None
print "net.connman.vpn is not present"
if len(sys.argv) >= 2:
for arg in sys.argv[1:]:
if arg.startswith("Name="):
object.name = arg.replace("Name=", "", 1)
elif arg.startswith("SSID="):
object.ssid = arg.replace("SSID=", "", 1)
elif arg.startswith("Identity="):
object.identity = arg.replace("Identity=", "", 1)
elif arg.startswith("Passphrase="):
object.passphrase = arg.replace("Passphrase=", "", 1)
elif arg.startswith("WPS="):
object.wpspin = arg.replace("WPS=", "", 1)
elif arg.startswith("Username="):
object.username = arg.replace("Username=", "", 1)
vpn_object.username = arg.replace("Username=", "", 1)
elif arg.startswith("Password="):
object.password = arg.replace("Password=", "", 1)
vpn_object.password = arg.replace("Password=", "", 1)
elif arg.startswith("Cookie="):
vpn_object.cookie = arg.replace("Cookie=", "", 1)
else:
print_usage()
try:
manager.RegisterAgent(path)
except:
print "Cannot register connman agent."
if vpn_manager != None:
try:
vpn_manager.RegisterAgent(vpn_path)
bus.watch_name_owner('net.connman.vpn', vpnNameOwnerChanged)
except:
"Cannot register vpn agent"
mainloop = gobject.MainLoop()
mainloop.run()
#manager.UnregisterAgent(path)