libpurple/plugins/wincred/wincred.c

changeset 43074
0ff905ef6259
parent 43027
581af7cd0603
child 43087
7607f319161f
equal deleted inserted replaced
43073:b97e5e85b97d 43074:0ff905ef6259
58 *****************************************************************************/ 58 *****************************************************************************/
59 59
60 static gunichar2 * 60 static gunichar2 *
61 wincred_get_target_name(PurpleAccount *account, GError **error) 61 wincred_get_target_name(PurpleAccount *account, GError **error)
62 { 62 {
63 PurpleContactInfo *info = NULL;
64 gchar target_name_utf8[WINCRED_MAX_TARGET_NAME]; 63 gchar target_name_utf8[WINCRED_MAX_TARGET_NAME];
65 gunichar2 *target_name_utf16; 64 gunichar2 *target_name_utf16;
66 65
67 g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL); 66 g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
68 67
69 info = PURPLE_CONTACT_INFO(account);
70
71 g_snprintf(target_name_utf8, WINCRED_MAX_TARGET_NAME, "libpurple_%s_%s", 68 g_snprintf(target_name_utf8, WINCRED_MAX_TARGET_NAME, "libpurple_%s_%s",
72 purple_account_get_protocol_id(account), 69 purple_account_get_protocol_id(account),
73 purple_contact_info_get_username(info)); 70 purple_account_get_username(account));
74 71
75 target_name_utf16 = 72 target_name_utf16 =
76 g_utf8_to_utf16(target_name_utf8, -1, NULL, NULL, error); 73 g_utf8_to_utf16(target_name_utf8, -1, NULL, NULL, error);
77 74
78 if (target_name_utf16 == NULL) { 75 if (target_name_utf16 == NULL) {
108 if (!CredReadW(target_name, CRED_TYPE_GENERIC, 0, &credential)) { 105 if (!CredReadW(target_name, CRED_TYPE_GENERIC, 0, &credential)) {
109 DWORD error_code = GetLastError(); 106 DWORD error_code = GetLastError();
110 107
111 if (error_code == ERROR_NOT_FOUND) { 108 if (error_code == ERROR_NOT_FOUND) {
112 if (purple_debug_is_verbose()) { 109 if (purple_debug_is_verbose()) {
113 PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
114 purple_debug_misc("keyring-wincred", 110 purple_debug_misc("keyring-wincred",
115 "No password found for account %s\n", 111 "No password found for account %s\n",
116 purple_contact_info_get_username(info)); 112 purple_account_get_username(account));
117 } 113 }
118 error = g_error_new(PURPLE_WINCRED_ERROR, 114 error = g_error_new(PURPLE_WINCRED_ERROR,
119 error_code, 115 error_code,
120 _("Password not found.")); 116 _("Password not found."));
121 } else if (error_code == ERROR_NO_SUCH_LOGON_SESSION) { 117 } else if (error_code == ERROR_NO_SUCH_LOGON_SESSION) {
155 _("Cannot read password (unicode error).")); 151 _("Cannot read password (unicode error)."));
156 g_task_return_error(task, error); 152 g_task_return_error(task, error);
157 g_object_unref(task); 153 g_object_unref(task);
158 return; 154 return;
159 } else { 155 } else {
160 PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
161 purple_debug_misc("keyring-wincred", 156 purple_debug_misc("keyring-wincred",
162 _("Got password for account %s.\n"), 157 _("Got password for account %s.\n"),
163 purple_contact_info_get_username(info)); 158 purple_account_get_username(account));
164 } 159 }
165 160
166 g_task_return_pointer(task, password, g_free); 161 g_task_return_pointer(task, password, g_free);
167 g_object_unref(task); 162 g_object_unref(task);
168 } 163 }
182 PurpleAccount *account, 177 PurpleAccount *account,
183 const gchar *password, 178 const gchar *password,
184 GCancellable *cancellable, 179 GCancellable *cancellable,
185 GAsyncReadyCallback callback, gpointer data) 180 GAsyncReadyCallback callback, gpointer data)
186 { 181 {
187 PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
188 GTask *task = NULL; 182 GTask *task = NULL;
189 GError *error = NULL; 183 GError *error = NULL;
190 const char *username_utf8 = NULL; 184 const char *username_utf8 = NULL;
191 gunichar2 *target_name = NULL; 185 gunichar2 *target_name = NULL;
192 gunichar2 *username_utf16 = NULL; 186 gunichar2 *username_utf16 = NULL;
202 g_task_return_error(task, error); 196 g_task_return_error(task, error);
203 g_object_unref(task); 197 g_object_unref(task);
204 return; 198 return;
205 } 199 }
206 200
207 username_utf8 = purple_contact_info_get_username(info); 201 username_utf8 = purple_account_get_username(account);
208 username_utf16 = g_utf8_to_utf16(username_utf8, -1, NULL, NULL, &error); 202 username_utf16 = g_utf8_to_utf16(username_utf8, -1, NULL, NULL, &error);
209 if (username_utf16 == NULL) { 203 if (username_utf16 == NULL) {
210 g_free(target_name); 204 g_free(target_name);
211 purple_debug_error("keyring-wincred", "Couldn't convert username"); 205 purple_debug_error("keyring-wincred", "Couldn't convert username");
212 g_task_return_error(task, error); 206 g_task_return_error(task, error);
248 error = g_error_new(PURPLE_WINCRED_ERROR, error_code, 242 error = g_error_new(PURPLE_WINCRED_ERROR, error_code,
249 _("Cannot store password (error %lx)."), error_code); 243 _("Cannot store password (error %lx)."), error_code);
250 } 244 }
251 } else { 245 } else {
252 purple_debug_misc("keyring-wincred", "Password updated for account %s.", 246 purple_debug_misc("keyring-wincred", "Password updated for account %s.",
253 purple_contact_info_get_username(info)); 247 username_utf8);
254 } 248 }
255 249
256 g_free(target_name); 250 g_free(target_name);
257 g_free(username_utf16); 251 g_free(username_utf16);
258 g_free(password_utf16); 252 g_free(password_utf16);
295 g_object_unref(task); 289 g_object_unref(task);
296 return; 290 return;
297 } 291 }
298 292
299 if (CredDeleteW(target_name, CRED_TYPE_GENERIC, 0)) { 293 if (CredDeleteW(target_name, CRED_TYPE_GENERIC, 0)) {
300 PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
301
302 purple_debug_misc("keyring-wincred", "Password for account %s removed", 294 purple_debug_misc("keyring-wincred", "Password for account %s removed",
303 purple_contact_info_get_username(info)); 295 purple_account_get_username(account));
304 g_task_return_boolean(task, TRUE); 296 g_task_return_boolean(task, TRUE);
305 } else { 297 } else {
306 DWORD error_code = GetLastError(); 298 DWORD error_code = GetLastError();
307 299
308 if (error_code == ERROR_NOT_FOUND) { 300 if (error_code == ERROR_NOT_FOUND) {

mercurial