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"); }
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); }
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; }
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; }
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; }
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); }