Exemple #1
0
static void make_filename(const char* name)
{
  if (strchr(name, '/') != 0)
    respond("DUsername contains an illegal character");
  if (!str_copy2s(&filename, CRONTAB_DIR "/", name))
    respond("ZCould not produce filename");
}
Exemple #2
0
void make_username(const char* start, ssize_t len, const char* msgprefix)
{
  str_copyb(&username, start, len);
  if (local_name && str_findfirst(&username, AT) < 0) {
    str_catc(&username, AT);
    str_cats(&username, local_name);
  }
  str_copy2s(&msgstr, msgprefix, username.s);
  log_line(msgstr.s, msgstr.len);
}
Exemple #3
0
const char* temppath(const char* prefix, str* path)
{
  struct timeval tv;
  gettimeofday(&tv, 0);
  if (!str_copy2s(path, prefix, ".tmp.barch.") ||
      !str_catu(path, pid) ||
      !str_catc(path, '.') ||
      !str_catu(path, tv.tv_sec) ||
      !str_catc(path, '.') ||
      !str_catuw(path, tv.tv_usec, 6, '0'))
    die_oom(1);
  return path->s;
}
Exemple #4
0
const char* getprotoenv(const char* name)
{
  static str fullname;
  const char* env;
  if (proto == 0)
    if ((proto = getenv("PROTO")) == 0)
      proto = "TCP";
  if (name == 0 || *name == 0)
    return proto;
  wrap_str(str_copy2s(&fullname, proto, name));
  if ((env = getenv(fullname.s)) != 0
      && env[0] == 0)
    env = 0;
  return env;
}
Exemple #5
0
int main(int argc, char* argv[])
{
  str packet = {0,0,0};
  const char* s;
  uid_t euid = -1;
  const struct passwd* pw;

  if (chdir_bcron() != 0)
    respond("ZCould not change directory");

  if (argc > 1)
    fixup_argv = argv + 1;

  if ((s = ucspi_protocol()) == 0
      || (strcmp(s, "UNIX") != 0 && strcmp(s, "LOCAL") != 0)
      || (s = ucspi_getenv("REMOTEEUID")) == 0
      || (euid = strtoul(s, (char**)&s, 0)) == (unsigned)-1
      || *s != 0)
    respond("DConfiguration error: must be run from unixserver");
  if (!ibuf_getnetstring(&inbuf, &packet)
      || packet.len < 2)
    respond("ZInvalid input data or read error");
  /* Look up and validate username */
  username = packet.s + 1;
  if ((pw = getpwnam(username)) == 0)
    respond("DInvalid or unknown username");
  if (euid != 0 && euid != pw->pw_uid)
    respond("DUsername does not match invoking UID");
  if (!str_copy2s(&filename, CRONTAB_DIR "/", pw->pw_name))
    respond("ZCould not produce filename");
  logcmd(packet.s[0]);
  /* Execute the command. */
  switch (packet.s[0]) {
  case 'S': cmd_store(&packet); break;
  case 'L': cmd_list(); break;
  case 'R': cmd_remove(); break;
  case 'Y':
    if (euid != 0 && euid != getuid())
      respond("DOnly root or cron can list system crontabs");
    cmd_listsys();
    break;
  }
  respond("DInvalid command code");
  return 0;
}
Exemple #6
0
static void load_keys(const char* server)
{
  str path = {0,0,0};

  wrap_str(str_copy4s(&path, keydir, "/servers/", server, "."));
  if (!keylist_load_multi(&server_publics, path.s, 0) &&
      !keylist_load_multi(&server_publics, "server.", 0))
    die1sys(1, "Could not load server keys");

  if (!keylist_load_multi(&client_secrets, "", 0)) {
    wrap_str(str_copy2s(&path, keydir, "/"));
    if (!keylist_load_multi(&client_secrets, path.s, 0))
      die1sys(1, "Could not load sender keys");
  }

  if (!keylist_exchange_all(&shared_secrets, &server_publics, &client_secrets))
    die1(1, "No server keys matched any sender keys");
  
  str_free(&path);
}