282785e23d34445332998fc356a68d1f0cafd594
[platform/upstream/connman.git] / test / simple-agent
1 #!/usr/bin/python
2
3 import gobject
4
5 import dbus
6 import dbus.service
7 import dbus.mainloop.glib
8 import sys
9
10 class Canceled(dbus.DBusException):
11         _dbus_error_name = "net.connman.Error.Canceled"
12
13 class LaunchBrowser(dbus.DBusException):
14         _dbus_error_name = "net.connman.Agent.Error.LaunchBrowser"
15
16 class Agent(dbus.service.Object):
17         name = None
18         ssid = None
19         identity = None
20         passphrase = None
21         wpspin = None
22         username = None
23         password = None
24
25         @dbus.service.method("net.connman.Agent",
26                                         in_signature='', out_signature='')
27         def Release(self):
28                 print("Release")
29                 mainloop.quit()
30
31         def input_passphrase(self):
32                 response = {}
33
34                 if not self.identity and not self.passphrase and not self.wpspin:
35                         print("Service credentials requested, type cancel to cancel")
36                         args = input('Answer: ')
37
38                         for arg in args.split():
39                                 if arg.startswith("cancel"):
40                                         response["Error"] = arg
41                                 if arg.startswith("Identity="):
42                                         identity = arg.replace("Identity=", "", 1)
43                                         response["Identity"] = identity
44                                 if arg.startswith("Passphrase="):
45                                         passphrase = arg.replace("Passphrase=", "", 1)
46                                         response["Passphrase"] = passphrase
47                                 if arg.startswith("WPS="):
48                                         wpspin = arg.replace("WPS=", "", 1)
49                                         response["WPS"] = wpspin
50                                         break
51                 else:
52                         if self.identity:
53                                 response["Identity"] = self.identity
54                         if self.passphrase:
55                                 response["Passphrase"] = self.passphrase
56                         if self.wpspin:
57                                 response["WPS"] = self.wpspin
58
59                 return response
60
61         def input_username(self):
62                 response = {}
63
64                 if not self.username and not self.password:
65                         print("User login requested, type cancel to cancel")
66                         print("or browser to login through the browser by yourself.")
67                         args = input('Answer: ')
68
69                         for arg in args.split():
70                                 if arg.startswith("cancel") or arg.startswith("browser"):
71                                         response["Error"] = arg
72                                 if arg.startswith("Username="):
73                                         username = arg.replace("Username=", "", 1)
74                                         response["Username"] = username
75                                 if arg.startswith("Password="):
76                                         password = arg.replace("Password=", "", 1)
77                                         response["Password"] = password
78                 else:
79                         if self.username:
80                                 response["Username"] = self.username
81                         if self.password:
82                                 response["Password"] = self.password
83
84                 return response
85
86         def input_hidden(self):
87                 response = {}
88
89                 if not self.name and not self.ssid:
90                         args = input('Answer ')
91
92                         for arg in args.split():
93                                 if arg.startswith("Name="):
94                                         name = arg.replace("Name=", "", 1)
95                                         response["Name"] = name
96                                         break
97                                 if arg.startswith("SSID="):
98                                         ssid = arg.replace("SSID", "", 1)
99                                         response["SSID"] = ssid
100                                         break
101                 else:
102                         if self.name:
103                                 response["Name"] = self.name
104                         if self.ssid:
105                                 response["SSID"] = self.ssid
106
107                 return response
108
109         @dbus.service.method("net.connman.Agent",
110                                         in_signature='oa{sv}',
111                                         out_signature='a{sv}')
112         def RequestInput(self, path, fields):
113                 print("RequestInput (%s,%s)" % (path, fields))
114
115                 response = {}
116
117                 if "Name" in fields:
118                         response.update(self.input_hidden())
119                 if "Passphrase" in fields:
120                         response.update(self.input_passphrase())
121                 if "Username" in fields:
122                         response.update(self.input_username())
123
124                 if "Error" in response:
125                         if response["Error"] == "cancel":
126                                 raise Canceled("canceled")
127                                 return
128                         if response["Error"] == "browser":
129                                 raise LaunchBrowser("launch browser")
130                                 return
131
132                 print("returning (%s)" % (response))
133
134                 return response
135
136         @dbus.service.method("net.connman.Agent",
137                                         in_signature='os',
138                                         out_signature='')
139         def RequestBrowser(self, path, url):
140                 print("RequestBrowser (%s,%s)" % (path, url))
141
142                 print("Please login through the given url in a browser")
143                 print("Then press enter to accept or some text to cancel")
144
145                 args = input('> ')
146
147                 if len(args) > 0:
148                         raise Canceled("canceled")
149
150                 return
151
152         @dbus.service.method("net.connman.Agent",
153                                         in_signature='os',
154                                         out_signature='')
155         def ReportError(self, path, error):
156                 print("ReportError %s, %s" % (path, error))
157                 retry = input("Retry service (yes/no): ")
158                 if (retry == "yes"):
159                         class Retry(dbus.DBusException):
160                                 _dbus_error_name = "net.connman.Agent.Error.Retry"
161
162                         raise Retry("retry service")
163                 else:
164                         return
165
166
167         @dbus.service.method("net.connman.Agent",
168                                         in_signature='', out_signature='')
169         def Cancel(self):
170                 print("Cancel")
171
172 class VpnAgent(dbus.service.Object):
173         name = None
174         host = None
175         cookie = None
176         username = None
177         password = None
178
179         @dbus.service.method("net.connman.vpn.Agent",
180                                         in_signature='', out_signature='')
181         def Release(self):
182                 print("Release VPN agent")
183
184         def input_cookie(self):
185                 response = {}
186
187                 if not self.cookie:
188                         print("VPN credentials requested, type cancel to cancel")
189                         args = input('Answer: ')
190
191                         for arg in args.split():
192                                 if arg.startswith("cancel"):
193                                         response["Error"] = arg
194                                 if arg.startswith("Cookie="):
195                                         cookie = arg.replace("Cookie=", "", 1)
196                                         response["OpenConnect.Cookie"] = cookie
197                 else:
198                         if self.cookie:
199                                 response["OpenConnect.Cookie"] = self.cookie
200
201                 return response
202
203         def input_username(self):
204                 response = {}
205
206                 if not self.username and not self.password:
207                         print("User login requested, type cancel to cancel")
208                         args = input('Answer: ')
209
210                         for arg in args.split():
211                                 if arg.startswith("cancel"):
212                                         response["Error"] = arg
213                                 if arg.startswith("Username="):
214                                         username = arg.replace("Username=", "", 1)
215                                         response["Username"] = username
216                                 if arg.startswith("Password="):
217                                         password = arg.replace("Password=", "", 1)
218                                         response["Password"] = password
219                 else:
220                         if self.username:
221                                 response["Username"] = self.username
222                         if self.password:
223                                 response["Password"] = self.password
224
225                 return response
226
227         @dbus.service.method("net.connman.vpn.Agent",
228                                         in_signature='oa{sv}',
229                                         out_signature='a{sv}')
230         def RequestInput(self, path, fields):
231                 print("RequestInput (%s,%s)" % (path, fields))
232
233                 response = {}
234
235                 if "OpenConnect.Cookie" in fields:
236                         response.update(self.input_cookie())
237                 if "Username" in fields or "Password" in fields:
238                         response.update(self.input_username())
239
240                 if "Error" in response:
241                         if response["Error"] == "cancel":
242                                 raise Canceled("canceled")
243                                 return
244
245                 print("returning (%s)" % (response))
246
247                 return response
248
249         @dbus.service.method("net.connman.vpn.Agent",
250                                         in_signature='os',
251                                         out_signature='')
252         def ReportError(self, path, error):
253                 print("ReportError %s, %s" % (path, error))
254                 retry = input("Retry service (yes/no): ")
255                 if (retry == "yes"):
256                         class Retry(dbus.DBusException):
257                                 _dbus_error_name = "net.connman.vpn.Agent.Error.Retry"
258
259                         raise Retry("retry service")
260                 else:
261                         return
262
263
264         @dbus.service.method("net.connman.vpn.Agent",
265                                         in_signature='', out_signature='')
266         def Cancel(self):
267                 print("Cancel")
268
269 def vpnNameOwnerChanged(proxy):
270         if proxy:
271                 print("vpnd is connected to system bus")
272                 try:
273                         path = "/test/vpn_agent"
274                         vpn_manager = dbus.Interface(bus.get_object('net.connman.vpn',
275                                                                     "/"),
276                                                      'net.connman.vpn.Manager')
277                         vpn_manager.RegisterAgent(path)
278                 except:
279                         print("vpn agent is not registered")
280         else:
281                 print("vpnd is disconnected from system bus")
282                 vpn_manager = None
283
284 def print_usage():
285         print("Usage:")
286         print("For hidden service:")
287         print("%s Name=<hidden service name> [SSID=<hidden ssid>]" % (sys.argv[0]))
288         print("For EAP/WPA input:")
289         print("%s Identity=<identity> Passphrase=<passphrase> WPS=<wpspin>" % (sys.argv[0]))
290         print("For WISPr login, L2TP or PPTP input:")
291         print("%s Username=<username> Password=<password>" % (sys.argv[0]))
292         print("For OpenConnect input:")
293         print("%s Cookie=<string>" % (sys.argv[0]))
294         print("Help: %s help" % (sys.argv[0]))
295         sys.exit(1)
296
297 if __name__ == '__main__':
298         if len(sys.argv) == 2 and sys.argv[1] == "help":
299                 print_usage()
300
301         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
302
303         bus = dbus.SystemBus()
304         manager = dbus.Interface(bus.get_object('net.connman', "/"),
305                                         'net.connman.Manager')
306
307         path = "/test/agent"
308         object = Agent(bus, path)
309
310         try:
311                 vpn_manager = dbus.Interface(bus.get_object('net.connman.vpn', "/"),
312                                             'net.connman.vpn.Manager')
313                 vpn_path = "/test/vpn_agent"
314                 vpn_object = VpnAgent(bus, vpn_path)
315         except:
316                 vpn_manager = None
317                 print("net.connman.vpn is not present")
318
319         if len(sys.argv) >= 2:
320                 for arg in sys.argv[1:]:
321                         if arg.startswith("Name="):
322                                 object.name = arg.replace("Name=", "", 1)
323                         elif arg.startswith("SSID="):
324                                 object.ssid = arg.replace("SSID=", "", 1)
325                         elif arg.startswith("Identity="):
326                                 object.identity = arg.replace("Identity=", "", 1)
327                         elif arg.startswith("Passphrase="):
328                                 object.passphrase = arg.replace("Passphrase=", "", 1)
329                         elif arg.startswith("WPS="):
330                                 object.wpspin = arg.replace("WPS=", "", 1)
331                         elif arg.startswith("Username="):
332                                 object.username = arg.replace("Username=", "", 1)
333                                 vpn_object.username = arg.replace("Username=", "", 1)
334                         elif arg.startswith("Password="):
335                                 object.password = arg.replace("Password=", "", 1)
336                                 vpn_object.password = arg.replace("Password=", "", 1)
337                         elif arg.startswith("Cookie="):
338                                 vpn_object.cookie = arg.replace("Cookie=", "", 1)
339                         else:
340                                 print_usage()
341
342         try:
343                 manager.RegisterAgent(path)
344         except:
345                 print("Cannot register connman agent.")
346
347         if vpn_manager != None:
348                 try:
349                         vpn_manager.RegisterAgent(vpn_path)
350                         bus.watch_name_owner('net.connman.vpn', vpnNameOwnerChanged)
351                 except:
352                         "Cannot register vpn agent"
353
354         mainloop = gobject.MainLoop()
355         mainloop.run()
356
357         #manager.UnregisterAgent(path)