Example #1
0
int
userlist_clnt_copy_user_info(struct userlist_clnt *clnt, int user_id,
                             int cnts_from, int cnts_to)
{
  struct userlist_pk_edit_field *out = 0;
  struct userlist_packet *in = 0;
  int r;
  size_t out_size, in_size = 0;
  void *void_in = 0;

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = ULS_COPY_USER_INFO;
  out->user_id = user_id;
  out->contest_id = cnts_from;
  out->serial = cnts_to;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &void_in)) < 0)
    return r;
  in = (struct userlist_packet *) void_in;
  if (in_size != sizeof(*in)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  r = in->id;
  xfree(in);
  return r;
}
Example #2
0
int
userlist_clnt_lookup_user(
        struct userlist_clnt *clnt,
        unsigned char const *login,
        int contest_id,
        int *p_user_id,
        unsigned char **p_name)
{
  struct userlist_pk_do_login *out = 0;
  struct userlist_pk_login_ok *in = 0;
  unsigned char *login_ptr, *name_ptr;
  int r, login_len;
  size_t out_size = 0, in_size = 0;
  void *void_in = 0;

  if (!login || !*login) return -ULS_ERR_INVALID_LOGIN;
  if ((login_len = strlen(login)) > 255) return -ULS_ERR_INVALID_SIZE;
  out_size = sizeof(*out) + login_len;
  out = alloca(out_size);
  memset(out, 0, out_size);
  login_ptr = out->data;
  out->request_id = ULS_LOOKUP_USER;
  out->contest_id = contest_id;
  out->login_length = login_len;
  out->password_length = 0;
  strcpy(login_ptr, login);
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &void_in)) < 0)
    return r;
  in = void_in;
  if (in->reply_id != ULS_LOGIN_OK && in->reply_id != ULS_LOGIN_COOKIE) {
    r = in->reply_id;
    goto cleanup;
  }
  if (in_size < sizeof(*in)) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  login_ptr = in->data;
  if (strlen(login_ptr) != in->login_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  name_ptr = login_ptr + in->login_len + 1;
  if (strlen(name_ptr) != in->name_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  if (in_size != sizeof(*in) + in->login_len + in->name_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  if (p_user_id) *p_user_id = in->user_id;
  if (p_name) *p_name = xstrdup(name_ptr);

  r = in->reply_id;
 cleanup:
  xfree(in);
  return r;
}
Example #3
0
int
userlist_clnt_map_contest(struct userlist_clnt *clnt,
                          int contest_id,
                          int *p_sem_key,
                          int *p_shm_key)
{
  struct userlist_pk_map_contest *out = 0;
  struct userlist_pk_contest_mapped *in = 0;
  int r;
  size_t out_size, in_size = 0;

  /* FIXME: check args? */

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = ULS_MAP_CONTEST;
  out->contest_id = contest_id;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, (void*) &in)) < 0)
    return r;
  if (in->reply_id != ULS_CONTEST_MAPPED) {
    r = in->reply_id;
    xfree(in);
    return r;
  }
  if (p_sem_key) *p_sem_key = in->sem_key;
  if (p_shm_key) *p_shm_key = in->shm_key;
  r = in->reply_id;
  xfree(in);
  return r;
}
Example #4
0
int
userlist_clnt_change_registration(struct userlist_clnt *clnt,
                                  int user_id,
                                  int contest_id,
                                  int new_status,
                                  int flags_cmd,
                                  unsigned int new_flags)
{
  struct userlist_pk_edit_registration *out = 0;
  struct userlist_packet *in = 0;
  int r;
  size_t out_size, in_size = 0;

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = ULS_EDIT_REGISTRATION;
  out->user_id = user_id;
  out->contest_id = contest_id;
  out->new_status = new_status;
  out->flags_cmd = flags_cmd;
  out->new_flags = new_flags;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, (void*) &in)) < 0)
    return r;
  if (in_size != sizeof(*in)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  r = in->id;
  xfree(in);
  return r;
}
Example #5
0
int
userlist_clnt_move_member(
        struct userlist_clnt *clnt,
        int cmd,
        int user_id,
        int contest_id,
        int serial,
        int new_role)
{
  struct userlist_pk_move_info *out = 0;
  struct userlist_packet *in = 0;
  int r;
  size_t out_size, in_size = 0;

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = cmd;
  out->user_id = user_id;
  out->contest_id = contest_id;
  out->serial = serial;
  out->new_role = new_role;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, (void*) &in)) < 0)
    return r;
  if (in_size != sizeof(*in)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  r = in->id;
  xfree(in);
  return r;
}
Example #6
0
int
userlist_clnt_logout(
        struct userlist_clnt *clnt,
        int cmd,
        const ej_ip_t *origin_ip,
        int ssl,
        ej_cookie_t cookie,
        ej_cookie_t client_key)
{
  struct userlist_pk_do_logout out;
  struct userlist_packet *in = 0;
  void *void_in = 0;
  size_t in_size = 0;
  int r;

  memset(&out, 0, sizeof(out));
  out.request_id = cmd;
  if (origin_ip) {
    out.origin_ip = *origin_ip;
  }
  out.ssl = ssl;
  out.cookie = cookie;
  out.client_key = client_key;
  if ((r = userlist_clnt_send_packet(clnt, sizeof(out), &out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &void_in)) < 0)
    return r;
  in = void_in;
  if (in_size != sizeof(*in) || in->id > 0) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  r = in->id;
  xfree(in);
  return r;
}
Example #7
0
int
userlist_clnt_set_info(struct userlist_clnt *clnt,
                       int uid, int contest_id, const unsigned char *info)
{
  struct userlist_pk_set_user_info *out;
  struct userlist_packet *in = 0;
  size_t out_size, in_size = 0;
  int r;

  ASSERT(clnt);
  ASSERT(clnt->fd >= 0);
  ASSERT(info);

  out_size = sizeof(*out) + strlen(info);
  out = (struct userlist_pk_set_user_info*) alloca(out_size);
  if (!out) return -ULS_ERR_OUT_OF_MEM;
  memset(out, 0, out_size);
  out->request_id = ULS_SET_USER_INFO;
  out->user_id = uid;
  out->contest_id = contest_id;
  strcpy(out->data, info);
  out->info_len = strlen(info);
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, (void*) &in)) < 0)
    return r;
  if (in_size != sizeof(*in)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  r = in->id;
  xfree(in);
  return r;
}
Example #8
0
int
userlist_clnt_notify(struct userlist_clnt *clnt, int cmd, int contest_id)
{
  struct userlist_pk_map_contest *out = 0;
  struct userlist_packet *in = 0;
  int r;
  size_t out_size, in_size = 0;
  void *void_in = 0;

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = cmd;
  out->contest_id = contest_id;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &void_in)) < 0)
    return r;
  in = (struct userlist_packet*) void_in;
  if (in_size != sizeof(*in)) {
    r = -ULS_ERR_PROTOCOL;
  } else {
    r = in->id;
  }
  xfree(in);
  return r;
}
Example #9
0
int
userlist_clnt_create_member(
        struct userlist_clnt *clnt,
        int user_id,
        int contest_id,
        int role)
{
  struct userlist_pk_edit_field *out = 0;
  struct userlist_packet *in = 0;
  struct userlist_pk_login_ok *in2 = 0;
  int r;
  size_t out_size, in_size = 0;
  void *void_in = 0;

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = ULS_CREATE_MEMBER;
  out->user_id = user_id;
  out->contest_id = contest_id;
  out->serial = role;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &void_in)) < 0)
    return r;
  in = (struct userlist_packet *) void_in;
  if (in_size < sizeof(*in)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  if (in->id < 0) {
    if (in_size != sizeof(*in)) {
      xfree(in);
      return -ULS_ERR_PROTOCOL;
    }
    r = in->id;
    xfree(in);
    return r;
  }
  if (in_size != sizeof(*in2)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  in2 = (struct userlist_pk_login_ok *) void_in;
  if (in2->reply_id != ULS_LOGIN_OK) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }

  r = in2->user_id;
  xfree(in);
  return r;
}
Example #10
0
int
userlist_clnt_get_xml_by_text(
        struct userlist_clnt *clnt,
        int cmd,
        const unsigned char *request_text,
        unsigned char **reply_text)
{
  size_t request_len, out_size, xml_len, in_size = 0;
  struct userlist_pk_set_user_info *out;
  void *in_void = 0;
  struct userlist_packet *in_gen = 0;
  struct userlist_pk_xml_data *in = 0;
  int r;

  if (!request_text) request_text = "";
  request_len = strlen(request_text);
  out_size = sizeof(*out) + request_len;
  XALLOCAZ(out, 1);
  out->request_id = cmd;
  out->info_len = request_len;
  memcpy(out->data, request_text, request_len + 1);
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &in_void)) < 0)
    return r;

  r = -ULS_ERR_PROTOCOL;
  in_gen = (struct userlist_packet*) in_void;
  if (!in_gen || in_size < sizeof(*in_gen)) goto cleanup;
  if (in_gen->id < 0) {
    r = in_gen->id;
    goto cleanup;
  }
  if (in_gen->id != ULS_XML_DATA) goto cleanup;
  if (in_size < sizeof(*in)) goto cleanup;

  in = (struct userlist_pk_xml_data*) in_gen;
  xml_len = strlen(in->data);
  if (xml_len != in->info_len) goto cleanup; 
  if (in_size != sizeof(*in) + xml_len) goto cleanup;

  if (reply_text) {
    *reply_text = xstrdup(in->data);
  }
  r = ULS_XML_DATA;

cleanup:
  xfree(in_void);
  return r;
}
Example #11
0
int
userlist_clnt_lookup_cookie(
        struct userlist_clnt *clnt,
        const ej_ip_t *origin_ip,
        int ssl,
        ej_cookie_t cookie,
        ej_cookie_t client_key,
        int *p_user_id,
        unsigned char **p_login,
        unsigned char **p_name,
        int *p_locale_id,
        int *p_contest_id)
{
  struct userlist_pk_check_cookie * data;
  struct userlist_pk_login_ok * answer = 0;
  void *void_answer = 0;
  int len;
  size_t anslen;
  int res;
  int r;

  len = sizeof (struct userlist_pk_check_cookie);
  data = alloca(len);
  memset(data, 0, len);
  data->request_id = ULS_CHECK_COOKIE;
  if (origin_ip) {
    data->origin_ip = *origin_ip;
  }
  data->ssl = ssl;
  //  data->contest_id = contest_id;
  data->cookie = cookie;
  data->client_key = client_key;
  if ((r = userlist_clnt_send_packet(clnt,len,data)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt,&anslen,&void_answer)) < 0)
    return r;
  answer = void_answer;
  if (answer->reply_id == ULS_LOGIN_COOKIE) {
    *p_user_id = answer->user_id;
    *p_locale_id = answer->locale_id;
    *p_login = xstrdup(answer->data);
    *p_name = xcalloc(1,answer->name_len + 1);
    *p_contest_id = answer->contest_id;
    strcpy(*p_name,answer->data + answer->login_len + 1);
  }
  res = answer->reply_id;
  xfree(answer);
  return res;
}
Example #12
0
int
userlist_clnt_generate_team_passwd(
        struct userlist_clnt *clnt,
        int cmd,
        int contest_id,
        int out_fd)
{
  struct userlist_pk_map_contest *out = 0;
  struct userlist_packet *in = 0;
  int r;
  size_t out_size, in_size = 0;
  int pfd[2], pp[2];
  char b;

  if (cmd != ULS_GENERATE_TEAM_PASSWORDS && cmd != ULS_GENERATE_PASSWORDS) {
    return -ULS_ERR_PROTOCOL;
  }

  if (pipe(pp) < 0) {
    err("pipe() failed: %s", os_ErrorMsg());
    return -ULS_ERR_WRITE_ERROR;
  }
  pfd[0] = out_fd;
  pfd[1] = pp[1];

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = cmd;
  out->contest_id = contest_id;
  if ((r = userlist_clnt_pass_fd(clnt, 2, pfd)) < 0) return r;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, (void*) &in)) < 0)
    return r;
  r = in->id;
  xfree(in);
  if (r < 0) return r;

  close(pfd[1]);
  r = read(pp[0], &b, 1);
  if (r > 0) return -ULS_ERR_PROTOCOL;
  if (r < 0) return -ULS_ERR_READ_ERROR;
  return 0;
}
Example #13
0
int
userlist_clnt_register_contest(
        struct userlist_clnt *clnt,
        int cmd,
        int user_id,
        int contest_id,
        const ej_ip_t *ip,
        int ssl_flag)
{
  struct userlist_pk_register_contest *out;
  struct userlist_packet *in = 0;
  int r;
  size_t out_size, in_size = 0;

  /*
  if (cmd != ULS_REGISTER_CONTEST && cmd != ULS_PRIV_REGISTER_CONTEST)
    return -ULS_ERR_PROTOCOL;
  */

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  if (!out) return -ULS_ERR_OUT_OF_MEM;
  out->request_id = cmd;
  out->user_id = user_id;
  out->contest_id = contest_id;
  if (ip) {
    out->ip = *ip;
  }
  out->ssl_flag = ssl_flag;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, (void*) &in)) < 0)
    return r;
  if (in_size != sizeof(*in)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  r = in->id;
  xfree(in);
  return r;
}
Example #14
0
int
userlist_clnt_get_database(struct userlist_clnt *clnt,
                           int cmd,
                           int contest_id,
                           unsigned char **p_info)
{
  struct userlist_pk_dump_database out_pkt;
  struct userlist_pk_xml_data *in_pkt = 0;
  size_t in_size;
  int info_len;
  int r;

#if !defined PYTHON
  ASSERT(clnt);
  ASSERT(clnt->fd >= 0);
#endif

  memset(&out_pkt, 0, sizeof(out_pkt));
  out_pkt.request_id = cmd;
  out_pkt.contest_id = contest_id;
  if ((r = userlist_clnt_send_packet(clnt, sizeof(out_pkt), &out_pkt)) < 0)
    return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, (void*) &in_pkt)) < 0)
    return -r;
  if (!in_size || !in_pkt) return -1;
  if (in_pkt->reply_id != ULS_TEXT_DATA) {
    r = in_pkt->reply_id;
    xfree(in_pkt);
    return r;
  }
  if (in_size <= sizeof(struct userlist_pk_xml_data)) return -1;
  info_len = strlen(in_pkt->data);
  if (info_len != in_pkt->info_len) {
    xfree(in_pkt);
    return -ULS_ERR_PROTOCOL;
  }
  *p_info = xstrdup(in_pkt->data);
  xfree(in_pkt);
  return ULS_TEXT_DATA;
}
Example #15
0
int
userlist_clnt_priv_login(
        struct userlist_clnt *clnt,
        int cmd,
        const ej_ip_t *origin_ip,
        ej_cookie_t client_key,
        int ssl,
        int contest_id,
        int locale_id,
        int role,
        unsigned char const *login,
        unsigned char const *passwd,
        int *p_user_id,
        ej_cookie_t *p_cookie,
        ej_cookie_t *p_client_key,
        int *p_priv_level,
        unsigned char **p_name)
{
  struct userlist_pk_do_login *out = 0;
  struct userlist_pk_login_ok *in = 0;
  unsigned char *login_ptr, *passwd_ptr, *name_ptr;
  int r, login_len, passwd_len;
  size_t out_size, in_size = 0;
  void *void_in = 0;

  if (!login || !*login) return -ULS_ERR_INVALID_LOGIN;
  if (!passwd || !*passwd) return -ULS_ERR_INVALID_PASSWORD;
  if ((login_len = strlen(login)) > 255) return -ULS_ERR_INVALID_SIZE;
  if ((passwd_len = strlen(passwd)) > 255) return -ULS_ERR_INVALID_SIZE;
  out_size = sizeof(*out) + login_len + passwd_len;
  out = alloca(out_size);
  memset(out, 0, out_size);
  login_ptr = out->data;
  passwd_ptr = login_ptr + login_len + 1;
  out->request_id = cmd;
  if (origin_ip) {
    out->origin_ip = *origin_ip;
  }
  out->client_key = client_key;
  out->ssl = ssl;
  out->contest_id = contest_id;
  out->locale_id = locale_id;
  out->role = role;
  out->login_length = login_len;
  out->password_length = passwd_len;
  strcpy(login_ptr, login);
  strcpy(passwd_ptr, passwd);
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &void_in)) < 0)
    return r;
  in = void_in;
  if (in->reply_id < 0) {
    r = in->reply_id;
    goto cleanup;
  }
  if (in->reply_id != ULS_LOGIN_OK && in->reply_id != ULS_LOGIN_COOKIE) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  if (in_size < sizeof(*in)) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  login_ptr = in->data;
  if (strlen(login_ptr) != in->login_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  name_ptr = login_ptr + in->login_len + 1;
  if (strlen(name_ptr) != in->name_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  if (in_size != sizeof(*in) + in->login_len + in->name_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  if (p_user_id) *p_user_id = in->user_id;
  if (p_cookie) *p_cookie = in->cookie;
  if (p_client_key) *p_client_key = in->client_key;
  if (p_priv_level) *p_priv_level = in->priv_level;
  if (p_name) *p_name = xstrdup(name_ptr);

  r = in->reply_id;
 cleanup:
  xfree(in);
  return r;
}
Example #16
0
int
userlist_clnt_create_user_2(
        struct userlist_clnt *clnt,
        int cmd,
        const struct userlist_pk_create_user_2 *params,
        const unsigned char *login_str,
        const unsigned char *email_str,
        const unsigned char *reg_password_str,
        const unsigned char *cnts_password_str,
        const unsigned char *cnts_name_str,
        int *p_user_id)
{
  if (!params) return -ULS_ERR_PROTOCOL;
  if (!login_str) login_str = "";
  if (!email_str) email_str = "";
  if (!reg_password_str) reg_password_str = "";
  if (!cnts_password_str) cnts_password_str = "";
  if (!cnts_name_str) cnts_name_str = "";

  size_t login_len = strlen(login_str);
  if (login_len > MAX_LEN) return -ULS_ERR_PROTOCOL;
  size_t email_len = strlen(email_str);
  if (email_len > MAX_LEN) return -ULS_ERR_PROTOCOL;
  size_t reg_password_len = strlen(reg_password_str);
  if (reg_password_len > MAX_LEN) return -ULS_ERR_PROTOCOL;
  size_t cnts_password_len = strlen(cnts_password_str);
  if (cnts_password_len > MAX_LEN) return -ULS_ERR_PROTOCOL;
  size_t cnts_name_len = strlen(cnts_name_str);
  if (cnts_name_len > MAX_LEN) return -ULS_ERR_PROTOCOL;

  size_t out_size = sizeof(struct userlist_pk_create_user_2) + login_len + email_len + reg_password_len + cnts_password_len + cnts_name_len;
  if (out_size > MAX_SIZE) return -ULS_ERR_PROTOCOL;

  struct userlist_pk_create_user_2 *out = (struct userlist_pk_create_user_2*) xcalloc(out_size, 1);
  unsigned char *login_ptr = out->data;
  unsigned char *email_ptr = login_ptr + login_len + 1;
  unsigned char *reg_password_ptr = email_ptr + email_len + 1;
  unsigned char *cnts_password_ptr = reg_password_ptr + reg_password_len + 1;
  unsigned char *cnts_name_ptr = cnts_password_ptr + cnts_password_len + 1;

  out->request_id = cmd;
  out->login_len = login_len;
  out->email_len = email_len;
  out->send_email_flag = params->send_email_flag;
  out->confirm_email_flag = params->confirm_email_flag;
  out->random_password_flag = params->random_password_flag;
  out->reg_password_len = reg_password_len;
  out->use_sha1_flag = params->use_sha1_flag;
  out->is_privileged_flag = params->is_privileged_flag;
  out->is_invisible_flag = params->is_invisible_flag;
  out->is_banned_flag = params->is_banned_flag;
  out->is_locked_flag = params->is_locked_flag;
  out->show_login_flag = params->show_login_flag;
  out->show_email_flag = params->show_email_flag;
  out->read_only_flag = params->read_only_flag;
  out->never_clean_flag = params->never_clean_flag;
  out->simple_registration_flag = params->simple_registration_flag;
  out->contest_id = params->contest_id;
  out->cnts_status = params->cnts_status;
  out->cnts_is_invisible_flag = params->cnts_is_invisible_flag;
  out->cnts_is_banned_flag = params->cnts_is_banned_flag;
  out->cnts_is_locked_flag = params->cnts_is_locked_flag;
  out->cnts_is_incomplete_flag = params->cnts_is_incomplete_flag;
  out->cnts_is_disqualified_flag = params->cnts_is_disqualified_flag;
  out->cnts_use_reg_passwd_flag = params->cnts_use_reg_passwd_flag;
  out->cnts_set_null_passwd_flag = params->cnts_set_null_passwd_flag;
  out->cnts_random_password_flag = params->cnts_random_password_flag;
  out->cnts_password_len = cnts_password_len;
  out->cnts_use_sha1_flag = params->cnts_use_sha1_flag;
  out->cnts_name_len = cnts_name_len;
  out->group_id = params->group_id;

  memcpy(login_ptr, login_str, login_len + 1);
  memcpy(email_ptr, email_str, email_len + 1);
  memcpy(reg_password_ptr, reg_password_str, reg_password_len + 1);
  memcpy(cnts_password_ptr, cnts_password_str, cnts_password_len + 1);
  memcpy(cnts_name_ptr, cnts_name_str, cnts_name_len + 1);

  int r = 0;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;

  size_t in_size = 0;
  void *void_in = 0;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &void_in)) < 0)
    return r;
  struct userlist_packet *in = (struct userlist_packet *) void_in;
  struct userlist_pk_login_ok *uin = 0;
  if (in_size < sizeof(*in)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  if (in->id == ULS_LOGIN_OK) {
    uin = (struct userlist_pk_login_ok*) in;
    if (in_size != sizeof(*uin)) {
      xfree(in);
      return -ULS_ERR_PROTOCOL;
    }
    if (p_user_id) *p_user_id = uin->user_id;
    xfree(in);
    return ULS_LOGIN_OK;
  }

  if (in_size != sizeof(*in)) {
    xfree(in);
    return -ULS_ERR_PROTOCOL;
  }
  r = in->id;
  xfree(in);
  return r;
}
Example #17
0
int
userlist_clnt_get_cookie(
        struct userlist_clnt *clnt,
        int cmd,
        const ej_ip_t *origin_ip,
        int ssl,
        ej_cookie_t cookie,
        ej_cookie_t client_key,
        int *p_user_id,
        int *p_contest_id,
        int *p_locale_id,
        int *p_priv_level,
        int *p_role,
        int *p_team_login,
        int *p_reg_status,
        int *p_reg_flags,
        unsigned char **p_login,
        unsigned char **p_name)
{
  struct userlist_pk_check_cookie *out = 0;
  struct userlist_pk_login_ok *in = 0;
  int r;
  size_t out_size, in_size = 0;
  unsigned char *login_ptr, *name_ptr;
  void *void_in = 0;

  if (!clnt) return -ULS_ERR_NO_CONNECT;
  if (!cookie) return -ULS_ERR_NO_COOKIE;

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = cmd;
  if (origin_ip) {
    out->origin_ip = *origin_ip;
  }
  out->ssl = ssl;
  out->contest_id = 0;
  out->cookie = cookie;
  out->client_key = client_key;
  out->priv_level = 0;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &void_in)) < 0)
    return r;
  in = void_in;
  if (in->reply_id < 0) {
    r = in->reply_id;
    goto cleanup;
  }
  if (in->reply_id != ULS_LOGIN_COOKIE || in_size < sizeof(*in)) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  login_ptr = in->data;
  if (strlen(login_ptr) != in->login_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  name_ptr = login_ptr + in->login_len + 1;
  if (strlen(name_ptr) != in->name_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  if (in_size != sizeof(*in) + in->login_len + in->name_len) {
    r = -ULS_ERR_PROTOCOL;
    goto cleanup;
  }
  if (p_user_id) *p_user_id = in->user_id;
  if (p_locale_id) *p_locale_id = in->locale_id;
  if (p_contest_id) *p_contest_id = in->contest_id;
  if (p_priv_level) *p_priv_level = in->priv_level;
  if (p_role) *p_role = in->role;
  if (p_team_login) *p_team_login = in->team_login;
  if (p_reg_status) *p_reg_status = in->reg_status;
  if (p_reg_flags) *p_reg_flags = in->reg_flags;
  if (p_login) *p_login = xstrdup(login_ptr);
  if (p_name) *p_name = xstrdup(name_ptr);

  r = in->reply_id;
 cleanup:
  xfree(in);
  return r;


}
Example #18
0
int
userlist_clnt_register_new_2(
    struct userlist_clnt *clnt,
    const ej_ip_t *origin_ip,
    int ssl,
    int contest_id,
    int locale_id,
    int action,
    unsigned char const *login,
    unsigned char const *email,
    const unsigned char *self_url,
    int *p_user_id,
    unsigned char **p_login,
    unsigned char **p_passwd)
{
    struct userlist_pk_register_new *data;
    struct userlist_pk_new_password *answer;
    unsigned char *p;
    void *v_ans;
    short *s_ans;
    int len, login_len, email_len, self_url_len;
    size_t anslen;
    int res;
    int r;

    if (!login) login = "";
    if (!email) email = "";
    if (!self_url) self_url = "";
    login_len = strlen(login);
    email_len = strlen(email);
    self_url_len = strlen(self_url);

    len = sizeof(struct userlist_pk_register_new)
          + login_len + email_len + self_url_len;
    data = alloca(len);
    memset(data, 0, len);
    data->request_id = ULS_REGISTER_NEW_2;
    if (origin_ip) {
        data->origin_ip = *origin_ip;
    }
    data->ssl = ssl;
    data->contest_id = contest_id;
    data->locale_id = locale_id;
    data->action = action;
    data->login_length = login_len;
    data->email_length = email_len;
    data->self_url_length = self_url_len;
    p = data->data;
    strcpy(p, login);
    p += login_len + 1;
    strcpy(p, email);
    p += email_len + 1;
    strcpy(p, self_url);
    if ((r = userlist_clnt_send_packet(clnt,len,data)) < 0) return r;
    if ((r = userlist_clnt_read_and_notify(clnt,&anslen,(void*) &v_ans)) < 0)
        return r;
    if (anslen < sizeof(short)) goto protocol_error;
    s_ans = (short*) v_ans;
    if (*s_ans < 0) {
        res = *s_ans;
        xfree(v_ans);
        return res;
    }
    if (*s_ans != ULS_PASSWORD) goto protocol_error;
    answer = (struct userlist_pk_new_password*) v_ans;
    if (anslen < sizeof(*answer)) goto protocol_error;
    if (sizeof(*answer) + answer->login_len + answer->passwd_len != anslen)
        goto protocol_error;
    if (strlen(answer->data) != answer->login_len) goto protocol_error;
    if (strlen(answer->data + answer->login_len + 2) != answer->passwd_len)
        goto protocol_error;

    if (p_user_id) *p_user_id = answer->user_id;
    if (p_login) *p_login = xstrdup(answer->data);
    if (p_passwd) *p_passwd = xstrdup(answer->data + answer->login_len + 2);
    xfree(answer);
    return ULS_PASSWORD;

protocol_error:
    xfree(v_ans);
    return -ULS_ERR_PROTOCOL;
}
Example #19
0
int
userlist_clnt_list_users_2(
        struct userlist_clnt *clnt,
        int cmd,
        int contest_id,
        int group_id,
        const unsigned char *filter,
        int offset,
        int count,
        unsigned char **p_info)
{
  struct userlist_pk_list_users_2 *out = 0;
  struct userlist_pk_xml_data *in = 0;
  struct userlist_packet *in_generic = 0;
  void *in_void = 0;
  int filter_len = 0, r;
  size_t out_size, in_size = 0;

  if (!filter) filter = "";
  filter_len = strlen(filter);
  if (filter_len < 0 || filter_len > MAX_FILTER_LEN)
    return -ULS_ERR_PROTOCOL;

  out_size = sizeof(*out) + filter_len;
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = cmd;
  out->contest_id = contest_id;
  out->group_id = group_id;
  out->filter_len = filter_len;
  out->offset = offset;
  out->count = count;
  memcpy(out->data, filter, filter_len + 1);

  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &in_void)) < 0)
    return r;

  if (in_size < sizeof(*in_generic)) {
    xfree(in_void); in_void = 0;
    return -ULS_ERR_PROTOCOL;
  }
  in_generic = (struct userlist_packet *) in_void; in_void = 0;
  if (in_generic->id < 0) {
    r = in_generic->id;
    xfree(in_generic); in_generic = 0;
    return r;
  }
  if (in_generic->id != ULS_XML_DATA) {
    r = in_generic->id;
    xfree(in_generic); in_generic = 0;
    return -ULS_ERR_PROTOCOL;
  }
  if (in_size < sizeof(*in)) {
    xfree(in_generic); in_generic = 0;
    return -ULS_ERR_PROTOCOL;
  }
  in = (struct userlist_pk_xml_data*) in_generic; in_generic = 0;
  if (in->info_len > MAX_XML_LEN) {
    xfree(in); in = 0;
    return -ULS_ERR_PROTOCOL;
  }
  if (in->info_len != strlen(in->data)) {
    xfree(in); in = 0;
    return -ULS_ERR_PROTOCOL;
  }
  *p_info = xstrdup(in->data);
  xfree(in); in = 0;

  return ULS_XML_DATA;
}
Example #20
0
int
userlist_clnt_import_csv_users(
        struct userlist_clnt *clnt,
        int cmd,
        int contest_id,
        int separator,
        int flags,
        const unsigned char *csv_text,
        unsigned char **p_log)
{
  struct userlist_pk_edit_field *out = 0;
  struct userlist_packet *in_dflt = 0;
  struct userlist_pk_xml_data *in = 0;
  size_t text_len, out_size, in_size = 0, log_len;
  void *in_void = 0;
  int r;

#if !defined PYTHON
  ASSERT(clnt);
  ASSERT(clnt->fd >= 0);
#endif

  if (!csv_text) csv_text = "";
  text_len = strlen(csv_text);
  if (text_len >= 1024 * 1024 * 1024) return -ULS_ERR_PROTOCOL;
  out_size = sizeof(*out) + text_len;
  out = (struct userlist_pk_edit_field*) alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = cmd;
  out->contest_id = contest_id;
  out->serial = flags;
  out->field = separator;
  out->value_len = text_len;
  memcpy(out->data, csv_text, text_len + 1);
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &in_void)) < 0)
    return r;
  if (in_size < sizeof(*in_dflt)) {
    xfree(in_void);
    return -ULS_ERR_PROTOCOL;
  }
  in_dflt = (struct userlist_packet*) in_void;
  if (in_dflt->id < 0) {
    r = in_dflt->id;
    xfree(in_void);
    return r;
  }
  if (in_dflt->id != ULS_TEXT_DATA && in_dflt->id != ULS_TEXT_DATA_FAILURE) {
    xfree(in_void);
    return -ULS_ERR_PROTOCOL;
  }
  if (in_size < sizeof(*in)) {
    xfree(in_void);
    return -ULS_ERR_PROTOCOL;
  }
  in = (struct userlist_pk_xml_data*) in_void;
  log_len = strlen(in->data);
  if (log_len != in->info_len) {
    xfree(in_void);
    return -ULS_ERR_PROTOCOL;
  }
  if (sizeof(*in) + log_len != in_size) {
    xfree(in_void);
    return -ULS_ERR_PROTOCOL;
  }
  if (p_log) *p_log = xstrdup(in->data);
  r = in->reply_id;
  xfree(in_void);
  return r;
}
Example #21
0
int
userlist_clnt_recover_passwd_2(
        struct userlist_clnt *clnt,
        int cmd,
        const ej_ip_t *ip,
        int ssl_flag,
        int contest_id,
        ej_cookie_t cookie,
        int *p_user_id,
        int *p_regstatus,
        unsigned char **p_login,
        unsigned char **p_name,
        unsigned char **p_passwd)
{
  struct userlist_pk_check_cookie *out;
  void *in1 = 0;
  struct userlist_packet *in2;
  struct userlist_pk_new_password *in;
  size_t out_size, in_size, login_len, name_len, passwd_len, packet_len;
  int r;
  unsigned char *login_ptr, *name_ptr, *passwd_ptr;

  out_size = sizeof(*out);
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = cmd;
  if (ip) {
    out->origin_ip = *ip;
  }
  out->ssl = ssl_flag;
  out->contest_id = contest_id;
  out->cookie = cookie;
  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &in1)) < 0)
    return r;
  if (in_size < sizeof(*in2)) goto protocol_error;
  in2 = (struct userlist_packet*) in1;
  if (in2->id < 0) {
    r = in2->id;
    xfree(in1);
    return r;
  }
  if (in2->id != ULS_NEW_PASSWORD) goto protocol_error;
  if (in_size < sizeof(*in)) goto protocol_error;
  in = (struct userlist_pk_new_password *) in1;
  login_ptr = in->data;
  login_len = strlen(login_ptr);
  if (login_len != in->login_len) goto protocol_error;
  name_ptr = login_ptr + login_len + 1;
  name_len = strlen(name_ptr);
  if (name_len != in->name_len) goto protocol_error;
  passwd_ptr = name_ptr + name_len + 1;
  passwd_len = strlen(passwd_ptr);
  if (passwd_len != in->passwd_len) goto protocol_error;
  packet_len = sizeof(*in);
  packet_len += login_len + name_len + passwd_len;
  if (packet_len != in_size) goto protocol_error;

  if (p_user_id) *p_user_id = in->user_id;
  if (p_regstatus) *p_regstatus = in->regstatus;
  if (p_login) *p_login = xstrdup(login_ptr);
  if (p_name) *p_name = xstrdup(name_ptr);
  if (p_passwd) *p_passwd = xstrdup(passwd_ptr);

  xfree(in1);
  return ULS_NEW_PASSWORD;

 protocol_error:
  xfree(in1);
  return -ULS_ERR_PROTOCOL;

}
Example #22
0
int
userlist_clnt_get_count(
        struct userlist_clnt *clnt,
        int cmd,
        int contest_id,
        int group_id,
        const unsigned char *filter,
        long long *p_count)
{
  struct userlist_pk_list_users_2 *out = 0;
  struct userlist_pk_count *in = 0;
  struct userlist_packet *in_generic = 0;
  void *in_void = 0;
  int filter_len = 0, r;
  size_t out_size, in_size = 0;
  long long count = 0;

  if (!filter) filter = "";
  filter_len = strlen(filter);
  if (filter_len < 0 || filter_len > MAX_FILTER_LEN)
    return -ULS_ERR_PROTOCOL;

  out_size = sizeof(*out) + filter_len;
  out = alloca(out_size);
  memset(out, 0, out_size);
  out->request_id = cmd;
  out->contest_id = contest_id;
  out->group_id = group_id;
  out->filter_len = filter_len;
  memcpy(out->data, filter, filter_len + 1);

  if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r;
  if ((r = userlist_clnt_read_and_notify(clnt, &in_size, &in_void)) < 0)
    return r;

  if (in_size < sizeof(*in_generic)) {
    xfree(in_void); in_void = 0;
    return -ULS_ERR_PROTOCOL;
  }
  in_generic = (struct userlist_packet *) in_void; in_void = 0;
  if (in_generic->id < 0) {
    r = in_generic->id;
    xfree(in_generic); in_generic = 0;
    return r;
  }
  if (in_generic->id != ULS_COUNT) {
    r = in_generic->id;
    xfree(in_generic); in_generic = 0;
    return -ULS_ERR_PROTOCOL;
  }
  if (in_size != sizeof(*in)) {
    xfree(in_generic); in_generic = 0;
    return -ULS_ERR_PROTOCOL;
  }
  in = (struct userlist_pk_count*) in_generic; in_generic = 0;
  count = in->count;
  if (count < 0) {
    xfree(in); in = 0;
    return -ULS_ERR_PROTOCOL;
  }
  xfree(in); in = 0;
  if (p_count) *p_count = count;

  return ULS_COUNT;
}