int actions_setuser(const char *userid) { char userbuf[1024], *user, *domain = NULL; size_t size = 1024, len; int result; char *sieve_dir = (char *) xzmalloc(size+1); sieved_userid = xstrdup(userid); user = (char *) userid; if (config_virtdomains && strchr(user, '@')) { /* split the user and domain */ strlcpy(userbuf, userid, sizeof(userbuf)); user = userbuf; if ((domain = strrchr(user, '@'))) *domain++ = '\0'; } len = strlcpy(sieve_dir, sieve_dir_config, size); if (domain) { char dhash = (char) dir_hash_c(domain, config_fulldirhash); len += snprintf(sieve_dir+len, size-len, "%s%c/%s", FNAME_DOMAINDIR, dhash, domain); } if (sieved_userisadmin) { strlcat(sieve_dir, "/global", size); } else { char hash = (char) dir_hash_c(user, config_fulldirhash); snprintf(sieve_dir+len, size-len, "/%c/%s", hash, user); } result = chdir(sieve_dir); if (result != 0) { result = cyrus_mkdir(sieve_dir, 0755); if (!result) result = mkdir(sieve_dir, 0755); if (!result) result = chdir(sieve_dir); if (result) { syslog(LOG_ERR, "mkdir %s: %m", sieve_dir); free(sieve_dir); return TIMSIEVE_FAIL; } } free(sieve_dir); return TIMSIEVE_OK; }
/* Create filename corresponding to DAV DB for userid */ EXPORTED void dav_getpath_byuserid(struct buf *fname, const char *userid) { char c, *domain; buf_reset(fname); if (config_virtdomains && (domain = strchr(userid, '@'))) { char d = (char) dir_hash_c(domain+1, config_fulldirhash); *domain = '\0'; /* split user@domain */ c = (char) dir_hash_c(userid, config_fulldirhash); buf_printf(fname, "%s%s%c/%s%s%c/%s%s", config_dir, FNAME_DOMAINDIR, d, domain+1, FNAME_USERDIR, c, userid, FNAME_DAVSUFFIX); *domain = '@'; /* reassemble user@domain */ } else { c = (char) dir_hash_c(userid, config_fulldirhash); buf_printf(fname, "%s%s%c/%s%s", config_dir, FNAME_USERDIR, c, userid, FNAME_DAVSUFFIX); } }
char *seen_getpath(const char *userid) { char *fname = xmalloc(strlen(config_dir) + sizeof(FNAME_DOMAINDIR) + sizeof(FNAME_USERDIR) + strlen(userid) + sizeof(FNAME_SEENSUFFIX) + 10); char c, *domain; if (config_virtdomains && (domain = strchr(userid, '@'))) { char d = (char) dir_hash_c(domain+1, config_fulldirhash); *domain = '\0'; /* split user@domain */ c = (char) dir_hash_c(userid, config_fulldirhash); sprintf(fname, "%s%s%c/%s%s%c/%s%s", config_dir, FNAME_DOMAINDIR, d, domain+1, FNAME_USERDIR, c, userid, FNAME_SEENSUFFIX); *domain = '@'; /* reassemble user@domain */ } else { c = (char) dir_hash_c(userid, config_fulldirhash); sprintf(fname, "%s%s%c/%s%s", config_dir, FNAME_USERDIR, c, userid, FNAME_SEENSUFFIX); } return fname; }
EXPORTED const char *user_sieve_path(const char *user) { static char sieve_path[2048]; char hash, *domain; if (config_virtdomains && (domain = strchr(user, '@'))) { char d = (char) dir_hash_c(domain+1, config_fulldirhash); *domain = '\0'; /* split user@domain */ hash = (char) dir_hash_c(user, config_fulldirhash); snprintf(sieve_path, sizeof(sieve_path), "%s%s%c/%s/%c/%s", config_getstring(IMAPOPT_SIEVEDIR), FNAME_DOMAINDIR, d, domain+1, hash, user); *domain = '@'; /* reassemble user@domain */ } else { hash = (char) dir_hash_c(user, config_fulldirhash); snprintf(sieve_path, sizeof(sieve_path), "%s/%c/%s", config_getstring(IMAPOPT_SIEVEDIR), hash, user); } return sieve_path; }
static int user_renamesieve(char *olduser, char *newuser) { char hash, *domain; char oldpath[2048], newpath[2048]; int r; /* oh well */ if(config_getswitch(IMAPOPT_SIEVEUSEHOMEDIR)) return 0; if (config_virtdomains && (domain = strchr(olduser, '@'))) { char d = (char) dir_hash_c(domain+1, config_fulldirhash); *domain = '\0'; /* split user@domain */ hash = (char) dir_hash_c(olduser, config_fulldirhash); snprintf(oldpath, sizeof(oldpath), "%s%s%c/%s/%c/%s", config_getstring(IMAPOPT_SIEVEDIR), FNAME_DOMAINDIR, d, domain+1, hash, olduser); *domain = '@'; /* reassemble user@domain */ } else { hash = (char) dir_hash_c(olduser, config_fulldirhash); snprintf(oldpath, sizeof(oldpath), "%s/%c/%s", config_getstring(IMAPOPT_SIEVEDIR), hash, olduser); } if (config_virtdomains && (domain = strchr(newuser, '@'))) { char d = (char) dir_hash_c(domain+1, config_fulldirhash); *domain = '\0'; /* split user@domain */ hash = (char) dir_hash_c(newuser, config_fulldirhash); snprintf(newpath, sizeof(newpath), "%s%s%c/%s/%c/%s", config_getstring(IMAPOPT_SIEVEDIR), FNAME_DOMAINDIR, d, domain+1, hash, newuser); *domain = '@'; /* reassemble user@domain */ } else { hash = (char) dir_hash_c(newuser, config_fulldirhash); snprintf(newpath, sizeof(newpath), "%s/%c/%s", config_getstring(IMAPOPT_SIEVEDIR), hash, newuser); } /* rename sieve directory * * XXX this doesn't rename sieve scripts */ r = rename(oldpath, newpath); if (r < 0) { if (errno == ENOENT) { syslog(LOG_WARNING, "error renaming %s to %s: %m", oldpath, newpath); /* but maybe the user doesn't have any scripts ? */ r = 0; } else if (errno == EXDEV) { syslog(LOG_ERR, "error renaming %s to %s: different filesystems", oldpath, newpath); /* doh! need to copy entire directory tree */ } else { syslog(LOG_ERR, "error renaming %s to %s: %m", oldpath, newpath); } } return r; }