32
32
public class SharingAccounts {
33
private Ag.Manager manager = null;
35
public SharingAccounts() {
36
manager = new Ag.Manager.for_service_type("sharing");
39
public SharingAccount? get_account_for_provider(string provider) {
33
private static Ag.Manager manager = null;
34
private string provider_name;
35
private Ag.AccountService[] all_accounts;
37
public SharingAccounts(string provider_name) {
38
if (manager == null) {
39
manager = new Ag.Manager.for_service_type("sharing");
41
manager.enabled_event.connect(on_account_enabled);
43
this.provider_name = provider_name;
44
all_accounts = get_accounts();
47
private void on_account_enabled(uint account_id) {
48
/* To keep the implementation simple, just rebuild the account
49
* list from scratch */
50
all_accounts = get_accounts();
53
private Ag.AccountService[] get_accounts() {
40
54
GLib.List<Ag.AccountService> accounts =
41
55
manager.get_enabled_account_services();
57
Ag.AccountService[] list = {};
43
59
foreach (Ag.AccountService account_service in accounts) {
44
60
Ag.Account account = account_service.get_account();
45
if (account.get_provider_name() == provider) {
61
if (account.get_provider_name() == provider_name) {
62
list += account_service;
68
public bool has_enabled_accounts() {
69
return all_accounts.length > 0;
72
public string[] list_account_names() {
74
foreach (Ag.AccountService account_service in all_accounts) {
75
names += account_service.get_account().get_display_name();
80
public SharingAccount? find_account(string? account_name) {
81
foreach (Ag.AccountService account_service in all_accounts)
82
if (account_service.get_account().get_display_name() == account_name) {
46
83
return new SharingAccount(account_service);
90
public abstract class UOAPublishingService : Object, Spit.Pluggable, Spit.Publishing.Service {
91
private SharingAccounts account_manager;
93
public UOAPublishingService(string provider_name) {
94
account_manager = new SharingAccounts(provider_name);
97
public virtual int get_pluggable_interface(int min_host_interface, int max_host_interface) {
98
return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
99
Spit.Publishing.CURRENT_INTERFACE);
102
public abstract unowned string get_id();
104
public abstract unowned string get_pluggable_name();
106
public abstract void get_info(ref Spit.PluggableInfo info);
108
public virtual void activation(bool enabled) {
111
public abstract Spit.Publishing.Publisher create_publisher(string? account_name, Spit.Publishing.PluginHost host);
113
public abstract Spit.Publishing.Publisher.MediaType get_supported_media();
115
public SharingAccount? find_account(string? account_name) {
116
return account_manager.find_account(account_name);
119
public bool is_enabled() {
120
return account_manager.has_enabled_accounts();
123
public string[] list_account_names() {
124
return account_manager.list_account_names();
128
public class UOAPublisherAuthenticator : Object {
129
private weak Spit.Publishing.PluginHost host = null;
130
private Signon.AuthSession auth_session = null;
131
private SharingAccount account = null;
132
private bool firstLoginAttempt = true;
133
private string welcome_message = null;
135
public UOAPublisherAuthenticator(SharingAccount account,
136
Spit.Publishing.PluginHost host,
137
string welcome_message)
140
this.account = account;
141
this.welcome_message = welcome_message;
144
public signal void authenticated(owned HashTable<string,Value?> session_data);
146
public void authenticate() {
147
debug("ACTION: authentication requested.");
152
public HashTable<string,Value?>? get_authentication_data() {
153
if (account == null) return null;
154
string mechanism = null;
155
return account.get_session_parameters(out mechanism);
158
private void do_authentication() {
159
debug("ACTION: authenticating.");
161
HashTable<string,Value?> data = null;
162
string mechanism = null;
164
if (account != null) {
166
auth_session = account.create_auth_session();
167
data = account.get_session_parameters(out mechanism);
168
debug("Got account data");
169
} catch (GLib.Error e) {
170
warning("EVENT: couldn't create session for account: %s",
176
warning ("No account authentication data");
177
host.post_error(new Spit.Publishing.PublishingError.SERVICE_ERROR(
178
"Error while accessing the account"));
182
if (firstLoginAttempt) {
183
firstLoginAttempt = false;
184
data.insert("UiPolicy", (int)Signon.SessionDataUiPolicy.NO_USER_INTERACTION);
186
var windowId = host.get_dialog_xid();
188
data.insert("WindowId", (uint)windowId);
192
auth_session.process(data, mechanism, on_processed);
193
host.set_service_locked(true);
196
private void on_processed(Signon.AuthSession self, owned HashTable<string,Value?>? session_data, GLib.Error error){
197
host.set_service_locked(false);
199
debug("got error: %s", error.message);
200
if (error is Signon.Error.USER_INTERACTION) {
201
debug("User interaction!");
202
do_show_service_welcome_pane();
204
host.post_error(new Spit.Publishing.PublishingError.SERVICE_ERROR("Authentication failed"));
209
authenticated(session_data);
212
private void do_show_service_welcome_pane() {
213
debug("ACTION: showing service welcome pane.");
215
host.install_welcome_pane(welcome_message, on_service_welcome_login);
218
private void on_service_welcome_login() {
219
debug("EVENT: user clicked 'Login' in welcome pane.");