int camel_nntp_auth_authenticate (CamelNNTPStore *store, CamelException *ex) { CamelService *service = CAMEL_SERVICE (store); CamelSession *session = camel_service_get_session (service); int resp; if (!service->url->authmech && !service->url->passwd) { gchar *prompt; prompt = camel_session_build_password_prompt ( "NNTP", service->url->user, service->url->host); service->url->passwd = camel_session_get_password ( session, prompt, TRUE, service, "password", ex); g_free (prompt); if (!service->url->passwd) { camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL, "You didn\'t enter a password."); resp = 666; goto done; } } /* first send username */ resp = camel_nntp_command (store, ex, NULL, "AUTHINFO USER %s", service->url->user); if (resp == NNTP_AUTH_REJECTED) { camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _("Server rejected username")); goto done; } else if (resp != NNTP_AUTH_CONTINUE) { camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _("Failed to send username to server")); goto done; } /* then send the username if the server asks for it */ resp = camel_nntp_command (store, ex, NULL, "AUTHINFO PASS %s", service->url->passwd); if (resp == NNTP_AUTH_REJECTED) { camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _("Server rejected username/password")); goto done; } done: if (service->url->passwd) { /* let's be paranoid */ memset (service->url->passwd, 0, strlen (service->url->passwd)); g_free (service->url->passwd); service->url->passwd = NULL; } return resp; }
static CamelFolder * diary_decode_folder (CamelDiscoDiary *diary) { CamelFolder *folder; char *name; if (camel_file_util_decode_string (diary->file, &name) == -1) return NULL; folder = g_hash_table_lookup (diary->folders, name); if (!folder) { CamelException ex; char *msg; camel_exception_init (&ex); folder = camel_store_get_folder (CAMEL_STORE (diary->store), name, 0, &ex); if (folder) g_hash_table_insert (diary->folders, name, folder); else { msg = g_strdup_printf (_("Could not open `%s':\n%s\nChanges made to this folder will not be resynchronized."), name, camel_exception_get_description (&ex)); camel_exception_clear (&ex); camel_session_alert_user (camel_service_get_session (CAMEL_SERVICE (diary->store)), CAMEL_SESSION_ALERT_WARNING, msg, FALSE); g_free (msg); g_free (name); } } else g_free (name); return folder; }
void camel_disco_diary_log (CamelDiscoDiary *diary, CamelDiscoDiaryAction action, ...) { va_list ap; int status; d(printf("diary log: %s\n", diary->file?"ok":"no file!")); /* You may already be a loser. */ if (!diary && !diary->file) return; status = camel_file_util_encode_uint32 (diary->file, action); if (status == -1) goto lose; va_start (ap, action); switch (action) { case CAMEL_DISCO_DIARY_FOLDER_EXPUNGE: { CamelFolder *folder = va_arg (ap, CamelFolder *); GPtrArray *uids = va_arg (ap, GPtrArray *); d(printf(" folder expunge '%s'\n", folder->full_name)); status = camel_file_util_encode_string (diary->file, folder->full_name); if (status != -1) status = diary_encode_uids (diary, uids); break; } case CAMEL_DISCO_DIARY_FOLDER_APPEND: { CamelFolder *folder = va_arg (ap, CamelFolder *); char *uid = va_arg (ap, char *); d(printf(" folder append '%s'\n", folder->full_name)); status = camel_file_util_encode_string (diary->file, folder->full_name); if (status != -1) status = camel_file_util_encode_string (diary->file, uid); break; } case CAMEL_DISCO_DIARY_FOLDER_TRANSFER: { CamelFolder *source = va_arg (ap, CamelFolder *); CamelFolder *destination = va_arg (ap, CamelFolder *); GPtrArray *uids = va_arg (ap, GPtrArray *); gboolean delete_originals = va_arg (ap, gboolean); d(printf(" folder transfer '%s' to '%s'\n", source->full_name, destination->full_name)); status = camel_file_util_encode_string (diary->file, source->full_name); if (status == -1) break; status = camel_file_util_encode_string (diary->file, destination->full_name); if (status == -1) break; status = diary_encode_uids (diary, uids); if (status == -1) break; status = camel_file_util_encode_uint32 (diary->file, delete_originals); break; } default: g_assert_not_reached (); break; } va_end (ap); lose: if (status == -1) { char *msg; msg = g_strdup_printf (_("Could not write log entry: %s\n" "Further operations on this server " "will not be replayed when you\n" "reconnect to the network."), g_strerror (errno)); camel_session_alert_user (camel_service_get_session (CAMEL_SERVICE (diary->store)), CAMEL_SESSION_ALERT_ERROR, msg, FALSE); g_free (msg); fclose (diary->file); diary->file = NULL; } }
static gboolean groupwise_auth_loop (CamelService *service, GCancellable *cancellable, GError **error) { CamelSession *session = camel_service_get_session (service); CamelStore *store = CAMEL_STORE (service); CamelGroupwiseStore *groupwise_store = CAMEL_GROUPWISE_STORE (store); CamelGroupwiseStorePrivate *priv = groupwise_store->priv; gboolean authenticated = FALSE; gchar *uri; guint32 prompt_flags = CAMEL_SESSION_PASSWORD_SECRET; EGwConnectionErrors errors = {E_GW_CONNECTION_STATUS_INVALID_OBJECT, NULL}; if (priv->use_ssl && !g_str_equal (priv->use_ssl, "never")) uri = g_strconcat ("https://", priv->server_name, ":", priv->port, "/soap", NULL); else uri = g_strconcat ("http://", priv->server_name, ":", priv->port, "/soap", NULL); service->url->passwd = NULL; while (!authenticated) { if (!service->url->passwd && !(store->flags & CAMEL_STORE_PROXY)) { gchar *prompt; prompt = camel_session_build_password_prompt ( "GroupWise", service->url->user, service->url->host); service->url->passwd = camel_session_get_password (session, service, "Groupwise", prompt, "password", prompt_flags, error); g_free (prompt); if (!service->url->passwd) { g_set_error ( error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("You did not enter a password.")); return FALSE; } } priv->cnc = e_gw_connection_new_with_error_handler (uri, priv->user, service->url->passwd, &errors); if (!E_IS_GW_CONNECTION(priv->cnc) && priv->use_ssl && g_str_equal (priv->use_ssl, "when-possible")) { gchar *http_uri = g_strconcat ("http://", uri + 8, NULL); priv->cnc = e_gw_connection_new (http_uri, priv->user, service->url->passwd); g_free (http_uri); } if (!E_IS_GW_CONNECTION (priv->cnc)) { if (errors.status == E_GW_CONNECTION_STATUS_INVALID_PASSWORD) { /* We need to un-cache the password before prompting again */ prompt_flags |= CAMEL_SESSION_PASSWORD_REPROMPT; g_free (service->url->passwd); service->url->passwd = NULL; } else { g_set_error ( error, CAMEL_SERVICE_ERROR, CAMEL_SERVICE_ERROR_UNAVAILABLE, "%s", errors.description ? errors.description : _("You must be working online to complete this operation")); return FALSE; } } else authenticated = TRUE; } return TRUE; }
static gboolean groupwise_auth_loop (CamelService *service, CamelException *ex) { CamelSession *session = camel_service_get_session (service); CamelStore *store = CAMEL_STORE (service); CamelGroupwiseStore *groupwise_store = CAMEL_GROUPWISE_STORE (store); CamelGroupwiseStorePrivate *priv = groupwise_store->priv; gboolean authenticated = FALSE; char *uri; EGwConnectionErrors errors; if (priv->use_ssl && !g_str_equal (priv->use_ssl, "never")) uri = g_strconcat ("https://", priv->server_name, ":", priv->port, "/soap", NULL); else uri = g_strconcat ("http://", priv->server_name, ":", priv->port, "/soap", NULL); service->url->passwd = NULL; while (!authenticated) { if (!service->url->passwd && !(store->flags & CAMEL_STORE_PROXY)) { char *prompt; prompt = camel_session_build_password_prompt ( "GroupWise", service->url->user, service->url->host); service->url->passwd = camel_session_get_password (session, service, "Groupwise", prompt, "password", CAMEL_SESSION_PASSWORD_SECRET, ex); g_free (prompt); if (!service->url->passwd) { camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL, _("You did not enter a password.")); return FALSE; } } priv->cnc = e_gw_connection_new_with_error_handler (uri, priv->user, service->url->passwd, &errors); if (!E_IS_GW_CONNECTION(priv->cnc) && priv->use_ssl && g_str_equal (priv->use_ssl, "when-possible")) { char *http_uri = g_strconcat ("http://", uri + 8, NULL); priv->cnc = e_gw_connection_new (http_uri, priv->user, service->url->passwd); g_free (http_uri); } if (!E_IS_GW_CONNECTION(priv->cnc)) { if (errors.status == E_GW_CONNECTION_STATUS_INVALID_PASSWORD) { /* We need to un-cache the password before prompting again */ camel_session_forget_password (session, service, "Groupwise", "password", ex); g_free (service->url->passwd); service->url->passwd = NULL; camel_exception_clear (ex); } else { camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, g_strdup (errors.description)); return FALSE; } } else authenticated = TRUE; } return TRUE; }
/* We setup the download info's in a hashtable, if we later * need to build the gui, we insert them in to add them. */ GCancellable * mail_receive_service (CamelService *service) { struct _send_info *info; struct _send_data *data; CamelFolder *local_outbox; const gchar *uid; EMailSession *session; send_info_t type = SEND_INVALID; g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL); session = (EMailSession *)camel_service_get_session (service); uid = camel_service_get_uid (service); data = setup_send_data (session); info = g_hash_table_lookup (data->active, uid); if (info != NULL) return info->cancellable; type = get_receive_type (service); if (type == SEND_INVALID || type == SEND_SEND) return NULL; info = g_malloc0 (sizeof (*info)); info->type = type; info->session = g_object_ref (session); info->service = g_object_ref (service); info->keep_on_server = mail_get_keep_on_server (service); info->cancellable = camel_operation_new (); info->data = data; info->state = SEND_ACTIVE; info->timeout_id = 0; g_signal_connect ( info->cancellable, "status", G_CALLBACK (operation_status), info); d(printf("Adding new info %p\n", info)); g_hash_table_insert (data->active, g_strdup(uid), info); switch (info->type) { case SEND_RECEIVE: mail_fetch_mail ( CAMEL_STORE (service), CAMEL_FETCH_OLD_MESSAGES, -1, E_FILTER_SOURCE_INCOMING, mail_provider_fetch_lock, mail_provider_fetch_unlock, mail_provider_fetch_inbox_folder, info->cancellable, receive_get_folder, info, receive_status, info, receive_done, info); break; case SEND_SEND: /* todo, store the folder in info? */ local_outbox = e_mail_session_get_local_folder ( session, E_MAIL_LOCAL_FOLDER_OUTBOX); mail_send_queue ( info->session, local_outbox, CAMEL_TRANSPORT (service), E_FILTER_SOURCE_OUTGOING, info->cancellable, receive_get_folder, info, receive_status, info, send_done, info); break; case SEND_UPDATE: receive_update_got_store (CAMEL_STORE (service), info); break; default: g_return_val_if_reached (NULL); } return info->cancellable; }
/* called when a uri is renamed in a store */ static void mail_vfolder_rename_folder (CamelStore *store, const gchar *old_folder_name, const gchar *new_folder_name) { ERuleContext *rule_context; EFilterRule *rule; const gchar *source; CamelVeeFolder *vf; CamelSession *session; gint changed = 0; gchar *old_uri; gchar *new_uri; d(printf("vfolder rename uri: %s to %s\n", cfrom, cto)); if (context == NULL) return; if (folder_is_spethal (store, old_folder_name)) return; if (folder_is_spethal (store, new_folder_name)) return; g_return_if_fail (mail_in_main_thread ()); session = camel_service_get_session (CAMEL_SERVICE (store)); old_uri = e_mail_folder_uri_build (store, old_folder_name); new_uri = e_mail_folder_uri_build (store, new_folder_name); G_LOCK (vfolder); rule_context = E_RULE_CONTEXT (context); /* see if any rules directly reference this removed uri */ rule = NULL; while ((rule = e_rule_context_next_rule (rule_context, rule, NULL))) { EMVFolderRule *vf_rule = EM_VFOLDER_RULE (rule); source = NULL; while ((source = em_vfolder_rule_next_source (vf_rule, source))) { /* Remove all sources that match, ignore changed events though * because the adduri call above does the work async */ if (e_mail_folder_uri_equal (session, old_uri, source)) { vf = g_hash_table_lookup (vfolder_hash, rule->name); if (!vf) { g_warning ("vf is NULL for %s\n", rule->name); continue; } g_signal_handlers_disconnect_matched ( rule, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, rule_changed, vf); em_vfolder_rule_remove_source (vf_rule, source); em_vfolder_rule_add_source (vf_rule, new_uri); g_signal_connect ( vf_rule, "changed", G_CALLBACK (rule_changed), vf); changed++; source = NULL; } } } G_UNLOCK (vfolder); if (changed) { const gchar *config_dir; gchar *user; d(printf("Vfolders updated from renamed folder\n")); config_dir = mail_session_get_config_dir (); user = g_build_filename (config_dir, "vfolders.xml", NULL); e_rule_context_save ((ERuleContext *) context, user); g_free (user); } g_free (old_uri); g_free (new_uri); }