#!/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)
