45 |
#include <mailutils/iterator.h> |
#include <mailutils/iterator.h> |
46 |
#include <mailutils/mutil.h> |
#include <mailutils/mutil.h> |
47 |
#include <mailutils/parse822.h> |
#include <mailutils/parse822.h> |
48 |
|
#include <mailutils/mu_auth.h> |
49 |
|
|
50 |
#include "mu_asprintf.h" |
#include "mu_asprintf.h" |
51 |
|
|
265 |
mu_get_homedir (void) |
mu_get_homedir (void) |
266 |
{ |
{ |
267 |
char *homedir = getenv ("HOME"); |
char *homedir = getenv ("HOME"); |
268 |
if (!homedir) |
if (homedir) |
269 |
|
homedir = strdup (homedir); |
270 |
|
else |
271 |
{ |
{ |
272 |
struct passwd *pwd; |
struct mu_auth_data *auth = mu_get_auth_by_uid (getuid ()); |
273 |
|
if (!auth) |
|
pwd = mu_getpwuid (getuid ()); |
|
|
if (!pwd) |
|
274 |
return NULL; |
return NULL; |
275 |
homedir = pwd->pw_dir; |
homedir = strdup (auth->dir); |
276 |
|
mu_auth_data_free (auth); |
277 |
} |
} |
278 |
return homedir; |
return homedir; |
279 |
} |
} |
369 |
strcat (s, p); |
strcat (s, p); |
370 |
free (--p); |
free (--p); |
371 |
p = s; |
p = s; |
372 |
|
free (homedir); |
373 |
} |
} |
374 |
else |
else |
375 |
{ |
{ |
376 |
struct passwd *pw; |
struct mu_auth_data *auth; |
377 |
char *s = p; |
char *s = p; |
378 |
char *name; |
char *name; |
379 |
while (*s && *s != delim[0]) |
while (*s && *s != delim[0]) |
381 |
name = calloc (s - p + 1, 1); |
name = calloc (s - p + 1, 1); |
382 |
memcpy (name, p, s - p); |
memcpy (name, p, s - p); |
383 |
name [s - p] = '\0'; |
name [s - p] = '\0'; |
384 |
pw = mu_getpwnam (name); |
|
385 |
|
auth = mu_get_auth_by_name (name); |
386 |
free (name); |
free (name); |
387 |
if (pw) |
if (auth) |
388 |
{ |
{ |
389 |
char *buf = calloc (strlen (pw->pw_dir) + strlen (s) + 1, 1); |
char *buf = calloc (strlen (auth->dir) + strlen (s) + 1, 1); |
390 |
strcpy (buf, pw->pw_dir); |
strcpy (buf, auth->dir); |
391 |
strcat (buf, s); |
strcat (buf, s); |
392 |
free (--p); |
free (--p); |
393 |
p = buf; |
p = buf; |
394 |
|
mu_auth_data_free (auth); |
395 |
} |
} |
396 |
else |
else |
397 |
p--; |
p--; |
446 |
return p; |
return p; |
447 |
} |
} |
448 |
|
|
|
/* getpwd support: */ |
|
|
|
|
|
static list_t _app_getpwnam = NULL; |
|
|
|
|
|
void |
|
|
mu_register_getpwnam (struct passwd *(*fun) __P((const char *))) |
|
|
{ |
|
|
mu_register_retriever (&_app_getpwnam, (mu_retrieve_fp)fun); |
|
|
} |
|
|
|
|
|
struct passwd * |
|
|
mu_getpwnam (const char *name) |
|
|
{ |
|
|
struct passwd *p = getpwnam (name); |
|
|
return p ? p : mu_retrieve (_app_getpwnam, (void*) name); |
|
|
} |
|
|
|
|
|
/* getpwuid support: */ |
|
|
|
|
|
static list_t _app_getpwuid = NULL; |
|
|
|
|
|
void |
|
|
mu_register_getpwuid (struct passwd *(*fun) __P((uid_t *))) |
|
|
{ |
|
|
mu_register_retriever (&_app_getpwuid, (mu_retrieve_fp)fun); |
|
|
} |
|
|
|
|
|
struct passwd * |
|
|
mu_getpwuid (uid_t uid) |
|
|
{ |
|
|
struct passwd *p = getpwuid (uid); |
|
|
return p ? p : mu_retrieve (_app_getpwuid, &uid); |
|
|
} |
|
|
|
|
|
/* Virtual domains */ |
|
|
|
|
|
int mu_virtual_domain; |
|
|
|
|
|
#ifdef USE_VIRTUAL_DOMAINS |
|
|
|
|
|
struct passwd * |
|
|
getpwnam_virtual (const char *u) |
|
|
{ |
|
|
struct passwd *pw = NULL; |
|
|
FILE *pfile; |
|
|
size_t i = 0, len = strlen (u), delim = 0; |
|
|
char *filename; |
|
|
|
|
|
mu_virtual_domain = 0; |
|
|
for (i = 0; i < len && delim == 0; i++) |
|
|
if (u[i] == '!' || u[i] == ':' || u[i] == '@') |
|
|
delim = i; |
|
|
|
|
|
if (delim == 0) |
|
|
return NULL; |
|
|
|
|
|
filename = malloc (strlen (SITE_VIRTUAL_PWDDIR) + |
|
|
strlen (&u[delim + 1]) + 2 /* slash and null byte */); |
|
|
if (filename == NULL) |
|
|
return NULL; |
|
|
|
|
|
sprintf (filename, "%s/%s", SITE_VIRTUAL_PWDDIR, &u[delim + 1]); |
|
|
pfile = fopen (filename, "r"); |
|
|
free (filename); |
|
|
|
|
|
if (pfile) |
|
|
while ((pw = fgetpwent (pfile)) != NULL) |
|
|
{ |
|
|
if (strlen (pw->pw_name) == delim && !strncmp (u, pw->pw_name, delim)) |
|
|
{ |
|
|
mu_virtual_domain = 1; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
return pw; |
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
449 |
int |
int |
450 |
mu_get_host_name (char **host) |
mu_get_host_name (char **host) |
451 |
{ |
{ |
913 |
char * |
char * |
914 |
mu_expand_path_pattern (const char *pattern, const char *username) |
mu_expand_path_pattern (const char *pattern, const char *username) |
915 |
{ |
{ |
|
char *homedir = NULL; |
|
916 |
const char *p, *startp; |
const char *p, *startp; |
917 |
char *q; |
char *q; |
918 |
char *path; |
char *path; |
919 |
int len = 0; |
int len = 0; |
920 |
|
struct mu_auth_data *auth = NULL; |
921 |
|
|
922 |
for (p = pattern; *p; p++) |
for (p = pattern; *p; p++) |
923 |
{ |
{ |
929 |
break; |
break; |
930 |
|
|
931 |
case 'h': |
case 'h': |
932 |
if (!homedir) |
if (!auth) |
933 |
{ |
{ |
934 |
struct passwd *pwd = mu_getpwnam (username); |
auth = mu_get_auth_by_name (username); |
935 |
if (!pwd) |
if (!auth) |
936 |
return NULL; |
return NULL; |
|
homedir = pwd->pw_dir; |
|
937 |
} |
} |
938 |
len += strlen (homedir); |
len += strlen (auth->dir); |
939 |
break; |
break; |
940 |
|
|
941 |
case '%': |
case '%': |
967 |
break; |
break; |
968 |
|
|
969 |
case 'h': |
case 'h': |
970 |
strcpy (q, homedir); |
strcpy (q, auth->dir); |
971 |
q += strlen (homedir); |
q += strlen (auth->dir); |
972 |
break; |
break; |
973 |
|
|
974 |
case '%': |
case '%': |
987 |
q += strlen (startp); |
q += strlen (startp); |
988 |
} |
} |
989 |
*q = 0; |
*q = 0; |
990 |
|
if (auth) |
991 |
|
mu_auth_data_free (auth); |
992 |
return path; |
return path; |
993 |
} |
} |