1
#include "_cgo_export.h"
7
#include <libaccounts-glib/accounts-glib.h>
8
#include <libsignon-glib/signon-glib.h>
10
typedef struct _AuthContext AuthContext;
14
AgAccountService *account_service;
15
AgAuthData *auth_data;
16
SignonAuthSession *session;
18
GVariant *auth_params;
19
GVariant *session_data;
22
static void login_cb(GObject *source, GAsyncResult *result, void *user_data) {
23
SignonAuthSession *session = (SignonAuthSession *)source;
24
AuthContext *ctx = (AuthContext *)user_data;
27
ctx->session_data = signon_auth_session_process_finish(session, result, &error);
29
g_object_unref(ctx->session);
33
fprintf(stderr, "Authentication failed: %s\n", error->message);
38
char *client_id = NULL;
39
char *client_secret = NULL;
40
char *access_token = NULL;
41
g_variant_lookup(ctx->auth_params, "ClientId", "&s", &client_id);
42
g_variant_lookup(ctx->auth_params, "ClientSecret", "&s", &client_secret);
43
g_variant_lookup(ctx->session_data, "AccessToken", "&s", &access_token);
45
authLogin(ctx, client_id, client_secret, access_token);
48
static void login_service(AuthContext *ctx) {
49
ctx->auth_data = ag_account_service_get_auth_data(ctx->account_service);
52
ctx->session = signon_auth_session_new(
53
ag_auth_data_get_credentials_id(ctx->auth_data),
54
ag_auth_data_get_method(ctx->auth_data), &error);
56
fprintf(stderr, "Could not set up auth session: %s\n", error->message);
61
GVariantBuilder builder;
62
g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
63
g_variant_builder_add(
65
SIGNON_SESSION_DATA_UI_POLICY,
66
g_variant_new_int32(SIGNON_POLICY_NO_USER_INTERACTION));
68
ctx->auth_params = g_variant_ref_sink(
69
ag_auth_data_get_login_parameters(
70
ctx->auth_data, g_variant_builder_end(&builder)));
72
signon_auth_session_process_async(
75
ag_auth_data_get_mechanism(ctx->auth_data),
76
NULL, /* cancellable */
80
static void logout_service(AuthContext *ctx) {
81
if (ctx->session_data) {
82
g_variant_unref(ctx->session_data);
83
ctx->session_data = NULL;
85
if (ctx->auth_params) {
86
g_variant_unref(ctx->auth_params);
87
ctx->auth_params = NULL;
90
signon_auth_session_cancel(ctx->session);
91
g_object_unref(ctx->session);
95
g_object_unref(ctx->auth_data);
96
ctx->auth_data = NULL;
98
if (ctx->account_service) {
99
g_object_unref(ctx->account_service);
100
ctx->account_service = NULL;
103
authLogin(ctx, NULL, NULL, NULL);
106
static void lookup_account_service(AuthContext *ctx) {
107
GList *account_services = ag_manager_get_enabled_account_services(ctx->manager);
109
for (tmp = account_services; tmp != NULL; tmp = tmp->next) {
110
AgAccountService *acct_svc = AG_ACCOUNT_SERVICE(tmp->data);
111
AgService *service = ag_account_service_get_service(acct_svc);
112
if (!strcmp(ctx->service_name, ag_service_get_name(service))) {
113
ctx->account_service = g_object_ref(acct_svc);
117
g_list_foreach(account_services, (GFunc)g_object_unref, NULL);
118
g_list_free(account_services);
120
if (ctx->account_service != NULL) {
125
static void account_enabled_cb(AgManager *manager, guint account_id, void *user_data) {
126
AuthContext *ctx = (AuthContext *)user_data;
128
printf("enabled_cb account_id=%u\n", account_id);
130
if (ctx->account_service != NULL &&
131
!ag_account_service_get_enabled(ctx->account_service)) {
134
lookup_account_service(ctx);
138
setup_context(void *user_data) {
139
AuthContext *ctx = (AuthContext *)user_data;
141
lookup_account_service(ctx);
142
g_signal_connect(ctx->manager, "enabled-event",
143
G_CALLBACK(account_enabled_cb), ctx);
147
AuthContext *watch_for_service(const char *service_name) {
148
AuthContext *ctx = g_new0(AuthContext, 1);
149
ctx->manager = ag_manager_new();
150
ctx->service_name = g_strdup(service_name);
152
g_idle_add(setup_context, ctx);