Merge from debian.
[hcoop/debian/courier-authlib.git] / authdaemon.c
CommitLineData
d9898ee8 1/*
0fde1ce3 2** Copyright 2000-2008 Double Precision, Inc. See COPYING for
d9898ee8 3** distribution information.
4*/
5
6#include "auth.h"
7#include "authstaticlist.h"
8#include "courierauthsasl.h"
9#include "authwait.h"
10#include "courierauthdebug.h"
11#include <stdlib.h>
12#include <stdio.h>
13#include <string.h>
14#include <signal.h>
15#include <unistd.h>
16#include <errno.h>
17#include <sys/time.h>
18#include <sys/select.h>
19#include "numlib/numlib.h"
20
0fde1ce3 21static const char rcsid[]="$Id: authdaemon.c,v 1.18 2008/06/29 16:39:24 mrsam Exp $";
d9898ee8 22
23extern int authdaemondo(const char *authreq,
24 int (*func)(struct authinfo *, void *), void *arg);
25
26extern void auth_daemon_enumerate( void(*cb_func)(const char *name,
27 uid_t uid,
28 gid_t gid,
29 const char *homedir,
30 const char *maildir,
31 const char *options,
32 void *void_arg),
33 void *void_arg);
34
35
36int auth_generic(const char *service,
37 const char *authtype,
38 char *authdata,
39 int (*callback_func)(struct authinfo *, void *),
40 void *callback_arg)
41{
42 char tbuf[NUMBUFSIZE];
43 size_t l=strlen(service)+strlen(authtype)+strlen(authdata)+2;
44 char *n=libmail_str_size_t(l, tbuf);
45 char *buf=malloc(strlen(n)+l+20);
46 int rc;
47
48 courier_authdebug_login_init();
49
50 if (!buf)
51 return 1;
52
53 strcat(strcat(strcpy(buf, "AUTH "), n), "\n");
54 strcat(strcat(buf, service), "\n");
55 strcat(strcat(buf, authtype), "\n");
56 strcat(buf, authdata);
57
0fde1ce3 58 rc=strcmp(authtype, "EXTERNAL") == 0
59 ? auth_getuserinfo(service, authdata, callback_func,
60 callback_arg)
61 : authdaemondo(buf, callback_func, callback_arg);
d9898ee8 62 free(buf);
63
64 if (courier_authdebug_login_level)
65 {
66 struct timeval t;
67
68 /* short delay to try and allow authdaemond's courierlogger
69 to finish writing; otherwise items can appear out of order */
70 t.tv_sec = 0;
71 t.tv_usec = 100000;
72 select(0, 0, 0, 0, &t);
73 }
74
75 return rc;
76}
77
78int auth_callback_default(struct authinfo *ainfo)
79{
80 if (ainfo->address == NULL)
81 {
82 fprintf(stderr, "WARN: No address!!\n");
83 return (-1);
84 }
85
86 if (ainfo->sysusername)
87 libmail_changeusername(ainfo->sysusername,
88 &ainfo->sysgroupid);
89 else if (ainfo->sysuserid)
90 libmail_changeuidgid(*ainfo->sysuserid,
91 ainfo->sysgroupid);
92 else
93 {
94 fprintf(stderr, "WARN: %s: No UID/GID!!\n", ainfo->address);
95 return (-1);
96 }
97
98 if (!ainfo->homedir)
99 {
100 errno=EINVAL;
101 fprintf(stderr, "WARN: %s: No homedir!!\n", ainfo->address);
102 return (1);
103 }
104
105 if (chdir(ainfo->homedir))
106 {
107 fprintf(stderr, "WARN: %s: chdir(%s) failed!!\n",
108 ainfo->address, ainfo->homedir);
109 perror("WARN: error");
110 return (1);
111 }
112
113 return 0;
114}