/* * Open mailbox in read-write mode. */ int request_select(session *ssn, const char *mbox) { int t, r; const char *m; m = apply_namespace(mbox, ssn->ns.prefix, ssn->ns.delim); TRY(t = send_request(ssn, "SELECT \"%s\"", m)); TRY(r = response_select(ssn, t)); if (r == STATUS_OK) ssn->selected = xstrdup(mbox); return r; }
/* * Open mailbox in read-write mode. */ int request_select(const char *server, const char *port, const char *user, const char *mbox) { int r; session *s; const char *m; if (!(s = session_find(server, port, user))) return -1; m = apply_namespace(mbox, s->ns.prefix, s->ns.delim); if ((r = response_select(s, imap_select(s, m))) == -1) goto fail; return r; fail: close_connection(s); session_destroy(s); return -1; }
/* * Connect to the server, login to the IMAP server, get it's capabilities, get * the namespace of the mailboxes. */ int request_login(session **ssnptr, const char *server, const char *port, const char *ssl, const char *user, const char *pass) { int t, r, rg = -1, rl = -1; session *ssn = *ssnptr; if (*ssnptr && (*ssnptr)->socket != -1) return STATUS_PREAUTH; if (!*ssnptr) { ssn = *ssnptr = session_new(); ssn->server = server; ssn->port = port; ssn->username = user; ssn->password = pass; if (strlen(ssl) != 0) ssn->sslproto = ssl; } else { debug("recovering connection: %s://%s@%s:%s/%s\n", ssn->sslproto ?"imaps" : "imap", ssn->username, ssn->server, ssn->port, ssn->selected ? ssn->selected : ""); } if (open_connection(ssn) == -1) goto fail; CHECK(rg = response_greeting(ssn)); if (opts.debug) { CHECK(t = send_request(ssn, "NOOP")); CHECK(response_generic(ssn, t)); } CHECK(t = send_request(ssn, "CAPABILITY")); CHECK(response_capability(ssn, t)); if (!ssn->sslproto && ssn->capabilities & CAPABILITY_STARTTLS && get_option_boolean("starttls")) { CHECK(t = send_request(ssn, "STARTTLS")); CHECK(r = response_generic(ssn, t)); if (r == STATUS_OK) { if (open_secure_connection(ssn) == -1) goto fail; CHECK(t = send_request(ssn, "CAPABILITY")); CHECK(response_capability(ssn, t)); } } if (rg != STATUS_PREAUTH) { if (ssn->capabilities & CAPABILITY_CRAMMD5 && get_option_boolean("crammd5")) { unsigned char *in, *out; CHECK(t = send_request(ssn, "AUTHENTICATE CRAM-MD5")); CHECK(r = response_authenticate(ssn, t, &in)); if (r == STATUS_CONTINUE) { if ((out = auth_cram_md5(ssn->username, ssn->password, in)) == NULL) goto abort; CHECK(send_continuation(ssn, (char *)(out), strlen((char *)(out)))); xfree(out); CHECK(rl = response_generic(ssn, t)); } else goto abort; } if (rl != STATUS_OK) { CHECK(t = send_request(ssn, "LOGIN \"%s\" \"%s\"", ssn->username, ssn->password)); CHECK(rl = response_generic(ssn, t)); } if (rl == STATUS_NO) { error("username %s or password rejected at %s\n", ssn->username, ssn->server); close_connection(ssn); session_destroy(ssn); return STATUS_NO; } } else { rl = STATUS_PREAUTH; } CHECK(t = send_request(ssn, "CAPABILITY")); CHECK(response_capability(ssn, t)); if (ssn->capabilities & CAPABILITY_NAMESPACE && get_option_boolean("namespace")) { CHECK(t = send_request(ssn, "NAMESPACE")); CHECK(response_namespace(ssn, t)); } if (ssn->selected) { CHECK(t = send_request(ssn, "SELECT \"%s\"", apply_namespace(ssn->selected, ssn->ns.prefix, ssn->ns.delim))); CHECK(response_select(ssn, t)); } return rl; abort: close_connection(ssn); fail: session_destroy(ssn); return -1; }