~renatofilho/account-polld/query-calendars

« back to all changes in this revision

Viewing changes to accounts/accounts.c

  • Committer: Sergio Schvezov
  • Date: 2014-07-11 17:51:21 UTC
  • mfrom: (1.1.7 daemon)
  • Revision ID: sergio.schvezov@canonical.com-20140711175121-58zw4krnvbhf2lf7
Bootstrapping project layout

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "_cgo_export.h"
 
2
#include <stdio.h>
 
3
#include <string.h>
 
4
#include <unistd.h>
 
5
 
 
6
#include <glib.h>
 
7
#include <libaccounts-glib/accounts-glib.h>
 
8
#include <libsignon-glib/signon-glib.h>
 
9
 
 
10
typedef struct _AuthContext AuthContext;
 
11
struct _AuthContext {
 
12
    AgManager *manager;
 
13
    char *service_name;
 
14
    AgAccountService *account_service;
 
15
    AgAuthData *auth_data;
 
16
    SignonAuthSession *session;
 
17
 
 
18
    GVariant *auth_params;
 
19
    GVariant *session_data;
 
20
};
 
21
 
 
22
static void login_cb(GObject *source, GAsyncResult *result, void *user_data) {
 
23
    SignonAuthSession *session = (SignonAuthSession *)source;
 
24
    AuthContext *ctx = (AuthContext *)user_data;
 
25
 
 
26
    GError *error = NULL;
 
27
    ctx->session_data = signon_auth_session_process_finish(session, result, &error);
 
28
 
 
29
    g_object_unref(ctx->session);
 
30
    ctx->session = NULL;
 
31
 
 
32
    if (error != NULL) {
 
33
        fprintf(stderr, "Authentication failed: %s\n", error->message);
 
34
        g_error_free(error);
 
35
        return;
 
36
    }
 
37
 
 
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);
 
44
 
 
45
    authLogin(ctx, client_id, client_secret, access_token);
 
46
}
 
47
 
 
48
static void login_service(AuthContext *ctx) {
 
49
    ctx->auth_data = ag_account_service_get_auth_data(ctx->account_service);
 
50
 
 
51
    GError *error = NULL;
 
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);
 
55
    if (error != NULL) {
 
56
        fprintf(stderr, "Could not set up auth session: %s\n", error->message);
 
57
        g_error_free(error);
 
58
        return;
 
59
    }
 
60
 
 
61
    GVariantBuilder builder;
 
62
    g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
 
63
    g_variant_builder_add(
 
64
        &builder, "{sv}",
 
65
        SIGNON_SESSION_DATA_UI_POLICY,
 
66
        g_variant_new_int32(SIGNON_POLICY_NO_USER_INTERACTION));
 
67
 
 
68
    ctx->auth_params = g_variant_ref_sink(
 
69
        ag_auth_data_get_login_parameters(
 
70
            ctx->auth_data, g_variant_builder_end(&builder)));
 
71
 
 
72
    signon_auth_session_process_async(
 
73
        ctx->session,
 
74
        ctx->auth_params,
 
75
        ag_auth_data_get_mechanism(ctx->auth_data),
 
76
        NULL, /* cancellable */
 
77
        login_cb, ctx);
 
78
}
 
79
 
 
80
static void logout_service(AuthContext *ctx) {
 
81
    if (ctx->session_data) {
 
82
        g_variant_unref(ctx->session_data);
 
83
        ctx->session_data = NULL;
 
84
    }
 
85
    if (ctx->auth_params) {
 
86
        g_variant_unref(ctx->auth_params);
 
87
        ctx->auth_params = NULL;
 
88
    }
 
89
    if (ctx->session) {
 
90
        signon_auth_session_cancel(ctx->session);
 
91
        g_object_unref(ctx->session);
 
92
        ctx->session = NULL;
 
93
    }
 
94
    if (ctx->auth_data) {
 
95
        g_object_unref(ctx->auth_data);
 
96
        ctx->auth_data = NULL;
 
97
    }
 
98
    if (ctx->account_service) {
 
99
        g_object_unref(ctx->account_service);
 
100
        ctx->account_service = NULL;
 
101
    }
 
102
 
 
103
    authLogin(ctx, NULL, NULL, NULL);
 
104
}
 
105
 
 
106
static void lookup_account_service(AuthContext *ctx) {
 
107
    GList *account_services = ag_manager_get_enabled_account_services(ctx->manager);
 
108
    GList *tmp;
 
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);
 
114
            break;
 
115
        }
 
116
    }
 
117
    g_list_foreach(account_services, (GFunc)g_object_unref, NULL);
 
118
    g_list_free(account_services);
 
119
 
 
120
    if (ctx->account_service != NULL) {
 
121
        login_service(ctx);
 
122
    }
 
123
}
 
124
 
 
125
static void account_enabled_cb(AgManager *manager, guint account_id, void *user_data) {
 
126
    AuthContext *ctx = (AuthContext *)user_data;
 
127
 
 
128
    printf("enabled_cb account_id=%u\n", account_id);
 
129
 
 
130
    if (ctx->account_service != NULL &&
 
131
        !ag_account_service_get_enabled(ctx->account_service)) {
 
132
        logout_service(ctx);
 
133
    }
 
134
    lookup_account_service(ctx);
 
135
}
 
136
 
 
137
static gboolean
 
138
setup_context(void *user_data) {
 
139
    AuthContext *ctx = (AuthContext *)user_data;
 
140
 
 
141
    lookup_account_service(ctx);
 
142
    g_signal_connect(ctx->manager, "enabled-event",
 
143
                     G_CALLBACK(account_enabled_cb), ctx);
 
144
    return FALSE;
 
145
}
 
146
 
 
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);
 
151
 
 
152
    g_idle_add(setup_context, ctx);
 
153
    return ctx;
 
154
}