/* tinymail.c * Andrew Daviel, TRIUMF, July 2007 * suid wrapper for tinymail.pl */ #include #include #include #include #include void head() { printf ("Status: 500\nContent-Type: text/plain\n\n") ; } int main (int argc, char **argv) { struct passwd *upasswd ; char *name ; char *dir ; uid_t uid ; gid_t gid ; int s ; char *https ; https = getenv("HTTPS") ; if (https == NULL) { head() ; printf("Error: not a secure (SSL) connection\n") ; exit (-1) ; } name = getenv("REMOTE_USER") ; if (name == NULL) { head() ; printf("Error: Not authenticated (no REMOTE_USER)\n") ; exit (-1) ; } upasswd = getpwnam(name) ; if (upasswd == NULL) { head ; printf("Error: No such user %s\n", name) ; exit (-1) ; } uid = upasswd->pw_uid ; gid = upasswd->pw_gid ; dir = upasswd->pw_dir ; // printf("uid %d gid %d dir %s\n",uid,gid,dir) ; if (uid <= 100) { head ; printf("Error: UID < 100 not allowed\n") ; exit (-1) ; } // if (setgid (0)) { // head() ; // perror("Error: setgid") ; // exit(-1) ; // } if (setgid (gid)) { head() ; perror("Error: setgid") ; exit(-1) ; } if (setuid (uid)) { head() ; perror("Error: setuid") ; exit(-1) ; } if (execvp("./tinymail.pl",argv)) { head() ; perror("Error executing Perl script") ; exit(-1) ; } }