6
from gi.repository import GLib
7
from gi.repository import GObject
8
from gi.repository import Accounts
9
from gi.repository import Signon
12
__gtype__ = GObject.type_from_name('GStrv')
16
self.manager = Accounts.Manager()
18
def list_accounts(self, args):
19
accounts = self.manager.list()
25
for account_id in accounts:
26
account = self.manager.get_account(account_id)
27
enabledness = 'enabled' if account.get_enabled() else 'disabled'
28
print('account: id %s, %s, provider: %s' % (account_id, enabledness, account.get_provider_name()))
32
def show_account(self, args):
34
account = self.manager.get_account(args.account)
36
print >> sys.stderr, 'Account "%s" not found' % args.account
39
enabledness = 'enabled' if account.get_enabled() else 'disabled'
40
print('account: id %s, %s, provider: %s' % (account.id, enabledness, account.get_provider_name()))
41
print(' Global settings:')
42
i = account.get_settings_iter(None)
43
self.enumerate_settings(i)
45
# enumerate services and their settings
46
services = account.list_services()
48
service = Accounts.AccountService.new(account, s)
49
print(' Settings for %s' % (s.get_name(),))
50
i = service.get_settings_iter(None)
51
self.enumerate_settings(i)
55
def create_account(self, args):
57
account = self.manager.create_account(args.provider)
58
account.set_enabled(not args.disabled)
59
for setting in args.s:
60
(name, value) = self.parse_setting(setting)
61
account.set_value(name, value)
62
account.store(self.on_account_stored, None)
64
def edit_account(self, args):
66
account = self.manager.get_account(args.account)
68
print >> sys.stderr, 'Account "%s" not found' % args.account
70
self.account = account
73
service = self.manager.get_service(args.service)
75
print >> sys.stderr, 'Service "%s" not found' % args.service
77
account.select_service(service)
80
account.set_enabled(True)
82
account.set_enabled(False)
84
for setting in args.s:
85
(name, value) = self.parse_setting(setting)
86
account.set_value(name, value)
88
for setting in args.u:
89
account.set_value(setting, None)
91
if args.username is not None or args.password is not None or args.caption:
92
value = GObject.Value()
93
value.init(GObject.TYPE_UINT)
94
signon_id = account.get_value(args.signon_id_field, value)
95
if signon_id != Accounts.SettingSource.NONE:
96
self.identity = Signon.Identity.new_from_db(value.get_uint())
97
self.identity.query_info(self.on_info_ready, None)
99
self.identity = Signon.Identity.new()
100
info = Signon.IdentityInfo.new()
101
self.write_signon_info(info)
103
account.store(self.on_account_stored, None)
106
def on_info_ready(self, identity, info, error, userdata):
108
print >> sys.stderr, 'Couldn\'t get identity info'
111
self.write_signon_info(info)
114
def write_signon_info(self, info):
115
if self.args.username is not None:
116
info.set_username(self.args.username)
117
if self.args.caption or self.args.username:
118
info.set_caption(self.args.caption or self.args.username)
119
if self.args.password is not None or info.get_id() == 0:
120
info.set_secret(self.args.password or '', True)
122
self.identity.store_credentials_with_info(info,
123
self.on_credentials_stored, self.account)
126
def on_credentials_stored(self, identity, id, error, account):
127
print('On credentials stored', id)
128
account.set_value(self.args.signon_id_field, int(id))
129
account.store(self.on_account_stored, None)
133
def delete_account(self, args):
135
account = self.manager.get_account(args.account)
137
print >> sys.stderr, 'Account "%s" not found' % args.account
141
account.store(self.on_account_stored_deleted, None)
144
def login_identity(self, args):
146
for parameter in args.p:
147
(key, value) = self.parse_setting(parameter)
148
session_data[key] = value
150
self.login(args.identity, args.method, args.mechanism,session_data)
153
def login_account(self, args):
155
account = self.manager.get_account(args.account)
157
print >> sys.stderr, 'Account "%s" not found' % args.account
159
self.account = account
163
service = self.manager.get_service(args.service)
165
print >> sys.stderr, 'Service "%s" not found' % args.service
168
account_service = Accounts.AccountService.new(account, service)
169
auth_data = account_service.get_auth_data()
170
identity = auth_data.get_credentials_id()
171
method = auth_data.get_method()
172
mechanism = auth_data.get_mechanism()
173
session_data = auth_data.get_parameters()
175
# last, add session data from the command line
176
for parameter in args.p:
177
(key, value) = self.parse_setting(parameter)
178
session_data[key] = value
180
self.login(identity, method, mechanism, session_data)
183
def login(self, identity, method, mechanism, session_data):
185
self.session = Signon.AuthSession.new(identity, method)
187
self.session = Signon.AuthSession.new(0, method)
190
self.session.process(session_data, mechanism,
191
self.login_process_cb, None)
194
def load_auth_parameters(self, iterator, parameters):
196
(ok, key, value) = iterator.next()
198
allsettings[key] = value
199
(ok, key, value) = iterator.next()
201
for (key, value) in allsettings.iteritems():
202
# if the param key itself contains a '/', assume it's a list
204
(key, item_id) = key.split('/', 1)
205
if not item_id.startswith('item'):
207
if not parameters.has_key(key):
209
parameters[key].append(value)
211
parameters[key] = value
214
def login_process_cb(self, session, reply, error, userdata):
216
print >> sys.stderr, 'Got authentication error:', error.message
219
print('Got reply: ', reply)
223
def on_account_stored_deleted(self, account, error, userdata):
227
print >> sys.stderr, 'Error occurred: ', error.message
230
def on_account_stored(self, account, error, userdata):
232
if 'print_id' in self.args and self.args.print_id:
233
print('%s' % (account.id))
235
print('OK %s' % (account.id))
237
print >> sys.stderr, 'Error occurred: ', error.message
240
def enumerate_settings(self, iterator):
242
(ok, key, value) = iterator.next()
244
settings.append((key, value))
245
(ok, key, value) = iterator.next()
248
for (key, value) in settings:
249
print(' %s: %s (%s)' % (key, value, type(value)))
251
def parse_setting(self, setting):
252
(name, value_str) = setting.split('=')
254
(type, name) = name.split(':')
259
value = int(value_str)
261
value = GObject.Value()
262
value.init(GObject.TYPE_UINT)
263
value.set_uint(int(value_str))
265
value = bool(value_str)
269
value = GStrv(eval(value_str))
272
app = AccountConsole()
274
parser = argparse.ArgumentParser(description='Command-line tool for account handling')
275
subparsers = parser.add_subparsers(title='Valid actions')
277
subparser = subparsers.add_parser('list',
278
help='List existing accounts')
279
subparser.set_defaults(func=app.list_accounts)
281
subparser = subparsers.add_parser('show',
282
help='Show an account\'s settings')
283
subparser.add_argument('account', type=int,
284
help='Id of the account')
285
subparser.set_defaults(func=app.show_account)
287
subparser = subparsers.add_parser('create',
288
help='Create a new account')
289
subparser.add_argument('provider',
290
help='Provider name (see /usr/share/accounts/providers)')
291
subparser.add_argument('--disabled', action='store_true',
292
help='Create the account in disabled state')
293
subparser.add_argument('--print-id', action='store_true',
294
help='Print the account ID on stdout')
295
subparser.add_argument('-s', action='append', default=[],
296
help='Add a service setting, in the form [<type>:]<name>=<value>')
297
subparser.set_defaults(func=app.create_account)
299
subparser = subparsers.add_parser('edit',
300
help='Edit an existing account')
301
subparser.add_argument('account', type=int,
302
help='Id of the account')
303
subparser.add_argument('--disable', action='store_true',
304
help='Disable the account')
305
subparser.add_argument('--enable', action='store_true',
306
help='Enable the account')
307
subparser.add_argument('--service', type=str,
308
help='Operates on the given service')
309
subparser.add_argument('-s', action='append', default=[], metavar='SETTING',
310
help='Add or changes a service setting, in the form [<type>:]<name>=<value>')
311
subparser.add_argument('-u', action='append', default=[],
312
metavar='SETTING_NAME', help='Unset a setting')
313
subparser.add_argument('--signon-id-field', type=str, default='CredentialsId',
314
help='Name of the key holding the SignOn ID')
315
subparser.add_argument('--caption', type=str,
316
help='SignOn caption (username description)')
317
subparser.add_argument('--username', type=str,
318
help='SignOn username')
319
subparser.add_argument('--password', type=str,
320
help='SignOn password')
321
subparser.set_defaults(func=app.edit_account)
323
subparser = subparsers.add_parser('delete',
324
help='Deletes an existing account')
325
subparser.add_argument('account', type=int,
326
help='Id of the account')
327
subparser.set_defaults(func=app.delete_account)
329
subparser = subparsers.add_parser('signon_login',
330
help='Authenticate the given identity')
331
subparser.add_argument('identity', type=int,
332
help='Id of the SignOn identity')
333
subparser.add_argument('method', type=str,
334
help='Authentication method')
335
subparser.add_argument('mechanism', type=str,
336
help='Authentication mechanism')
337
subparser.add_argument('-p', action='append', default=[], metavar='PARAMETER',
338
help='Session parameter, in the form [<type>:]<name>=<value>')
339
subparser.set_defaults(func=app.login_identity)
341
subparser = subparsers.add_parser('login',
342
help='Authenticate the given identity')
343
subparser.add_argument('account', type=int,
344
help='Id of the SignOn identity')
345
subparser.add_argument('--service', type=str,
346
help='Account service')
347
subparser.add_argument('--signon-id-field', type=str, default='CredentialsId',
348
help='Name of the key holding the SignOn ID')
349
mm = subparser.add_argument_group()
350
mm.add_argument('--method', type=str,
351
help='Authentication method')
352
mm.add_argument('--mechanism', type=str,
353
help='Authentication mechanism')
354
subparser.add_argument('-p', action='append', default=[], metavar='PARAMETER',
355
help='Session parameter, in the form [<type>:]<name>=<value>')
356
subparser.set_defaults(func=app.login_account)
358
args = parser.parse_args()
360
main_loop = GLib.MainLoop()
361
GLib.idle_add(args.func, args)