char *auth_daemon(const char *service, const char *authtype, char *authdata, int issession, void (*callback_func)(struct authinfo *, void *), void *callback_arg) { char tbuf[NUMBUFSIZE]; size_t l=strlen(service)+strlen(authtype)+strlen(authdata)+1; char *n=libmail_str_size_t(l, tbuf); char *buf=malloc(strlen(n)+l+20); int rc; struct authdaemon_info ai; if (!buf) { perror("malloc"); errno=EACCES; return (0); } strcat(strcat(strcpy(buf, "AUTH "), n), "\n"); strcat(strcat(buf, service), "\n"); strcat(strcat(buf, authtype), "\n"); strcat(buf, authdata); ai.username=NULL; ai.callback_func=callback_func; ai.callback_arg=callback_arg; rc=authdaemondo(buf, callback, &ai); free(buf); if (rc < 0) { errno=EPERM; return (0); } if (rc > 0) { errno=EACCES; return (0); } return (ai.username); }
int auth_getuserinfo(const char *service, const char *uid, int (*callback)(struct authinfo *, void *), void *arg) { char *buf=malloc(strlen(service)+strlen(uid)+20); int rc; if (!buf) { perror("malloc"); return (1); } strcat(strcat(strcat(strcat(strcpy(buf, "PRE . "), service), " "), uid), "\n"); rc=authdaemondo(buf, callback, arg); free(buf); return (rc); }
int auth_generic(const char *service, const char *authtype, char *authdata, int (*callback_func)(struct authinfo *, void *), void *callback_arg) { char tbuf[NUMBUFSIZE]; size_t l=strlen(service)+strlen(authtype)+strlen(authdata)+2; char *n=libmail_str_size_t(l, tbuf); char *buf=malloc(strlen(n)+l+20); int rc; courier_authdebug_login_init(); if (!buf) return 1; strcat(strcat(strcpy(buf, "AUTH "), n), "\n"); strcat(strcat(buf, service), "\n"); strcat(strcat(buf, authtype), "\n"); strcat(buf, authdata); rc=strcmp(authtype, "EXTERNAL") == 0 ? auth_getuserinfo(service, authdata, callback_func, callback_arg) : authdaemondo(buf, callback_func, callback_arg); free(buf); if (courier_authdebug_login_level) { struct timeval t; /* short delay to try and allow authdaemond's courierlogger to finish writing; otherwise items can appear out of order */ t.tv_sec = 0; t.tv_usec = 100000; select(0, 0, 0, 0, &t); } return rc; }