| 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) { |