Example #1
0
/*
 * Get mailbox's status.
 */
int
request_status(const char *server, const char *port, const char *user,
    const char *mbox, unsigned int *exists, unsigned int *recent,
    unsigned int *unseen, unsigned int *uidnext)
{
	int t, 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 (s->protocol == PROTOCOL_IMAP4REV1) {
		t = imap_status(s, m, "MESSAGES RECENT UNSEEN UIDNEXT");
		if ((r = response_status(s, t, exists, recent, unseen, uidnext)) == -1)
			goto fail;
	} else {
		t = imap_examine(s, m);
		if ((r = response_examine(s, t, exists, recent)) == -1)
			goto fail;
	}

	return r;
fail:
	close_connection(s);
	session_destroy(s);

	return -1;
}
Example #2
0
void handle_public_server(const void * req) {
  TEXT_MESSAGE *tm = (TEXT_MESSAGE*)req;

  response_status(tm->from_id, SERVER_DESC.server_msgid);

  local_send_msg(tm);
}
Example #3
0
		bool send_response( icap::Response * response, psocksxx::iosockstream * socket ) throw() {

			bool r_success = true;

			icap::ResponseHeader * header;

			// grab the response header
			header = response->header();

			// response status
			std::string line = header->protocol();
			line.append( " " );
			line.append( itoa( header->status() ) );
			line.append( " " );
			line.append( response_status( header->status() ) );

			r_success = send_line( line, socket );

			// response headers
			if ( r_success ) {
				r_success = send_headers( header, socket );
			}

			// response content (if there are any)
			if ( r_success ) {

				// req-hdr
				if ( response->payload().req_header.size() > 0 ) {
					send_data( response->payload().req_header, socket );
				}

				// red-body
				if ( response->payload().req_body.size() > 0 ) {
					send_chunked( response->payload().req_body, socket );
				}

				// res-hdr
				if ( response->payload().res_header.size() > 0 ) {
					send_data( response->payload().res_header, socket );
				}

				// res-body
				if ( response->payload().res_body.size() > 0 ) {
					send_chunked( response->payload().res_body, socket );
				}

			}

			// flush-out socket stream buffer
			socket->flush();

			return r_success;

		}
Example #4
0
void handle_change_room(const void * req) {
  CHANGE_ROOM_REQUEST* crr = (CHANGE_ROOM_REQUEST*) req;

repository_lock();

  change_room(crr->client_name, crr->room_name);

  response_status(crr->client_msgid, 202);

repository_unlock();

}
Example #5
0
/*
 * Get mailbox's status.
 */
int
request_status(session *ssn, const char *mbox, unsigned int *exists, unsigned
    int *recent, unsigned int *unseen, unsigned int *uidnext)
{
	int t, r;
	const char *m;

	m = apply_namespace(mbox, ssn->ns.prefix, ssn->ns.delim);

	if (ssn->protocol == PROTOCOL_IMAP4REV1) {
		TRY(t = send_request(ssn,
		    "STATUS \"%s\" (MESSAGES RECENT UNSEEN UIDNEXT)", m));
		TRY(r = response_status(ssn, t, exists, recent, unseen,
		    uidnext));
	} else {
		TRY(t = send_request(ssn, "EXAMINE \"%s\"", m));
		TRY(r = response_examine(ssn, t, exists, recent));
	}

	return r;
}
Example #6
0
void handle_login(const void * req) {
  CLIENT_REQUEST * cr = (CLIENT_REQUEST*) req;
  int i;
  int ok = 1;

repository_lock();

  if (strlen(cr->client_name) >= MAX_NAME_SIZE) {
    response_status(cr->client_msgid, 400);

    ok = 0;
  }

  if (ok)
  for (i = 0; i < strlen(cr->client_name); i++) {
    if (!isprint(cr->client_name[i])) {
      response_status(cr->client_msgid, 400);

      ok = 0;

      break;
    }
  }

  if (ok && SERVER_DESC.clients >= SERVER_CAPACITY) {
    response_status(cr->client_msgid, 503);

    ok = 0;
  }

  if (ok)
  for (i = 0; i < GLOBAL_REPO->active_clients; i++) {
    if (strcmp(GLOBAL_REPO->clients[i].name, cr->client_name) == 0) {
      response_status(cr->client_msgid, 409);
      ok = 0;
      break;
    }
  }

  if (ok) {
    CLIENT desc;
    strcpy(desc.name, cr->client_name);
    desc.server_id = SERVER_DESC.server_msgid;

    repository_client_add(desc);
    local_client_add(desc, cr->client_msgid);

    SERVER_DESC.clients++;

    for (i = 0; i < GLOBAL_REPO->active_servers; i++) {
      if (GLOBAL_REPO->servers[i].server_msgid == SERVER_DESC.server_msgid) {
        GLOBAL_REPO->servers[i].clients++;
        break;
      }
    }

    change_room(desc.name, "");

    response_status(cr->client_msgid, 201);
  }

repository_unlock();

  if (ok)
    log_write("LOGGED_IN@%d: %s\n", SERVER_DESC.server_msgid, cr->client_name);
}