http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.16.tar.gz
[xscreensaver] / driver / passwd-kerberos.c
index 1fbe2af9576930004241b858b0a850f60a05e4a9..398fc3c29e5112d7fa35cc467f19f395cdf6b39d 100644 (file)
@@ -1,7 +1,6 @@
 /* kpasswd.c --- verify kerberos passwords.
  * written by Nat Lanza (magus@cs.cmu.edu) for
- * xscreensaver, Copyright (c) 1993-1997, 1998, 2000, 2003
- *  Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 
 /* I'm not sure if this is exactly the right test...
    Might __APPLE__ be defined if this is apple hardware, but not
    an Apple OS?
 
-   Thanks to Jan Kujawa <kujawa@ultranet.com> for the MacOS X code.
+   Thanks to Alexei Kosut <akosut@stanford.edu> for the MacOS X code.
  */
 #ifdef __APPLE__
 # define HAVE_DARWIN
@@ -161,12 +161,14 @@ kerberos_lock_init (int argc, char **argv, Bool verbose_p)
    we are. Calling it ive_got_your_local_function_right_here_buddy()
    would have been rude.
  */
+#ifndef HAVE_DARWIN
 static int 
 key_to_key(char *user, char *instance, char *realm, char *passwd, C_Block key)
 {
   memcpy(key, passwd, sizeof(des_cblock));
   return (0);
 }
+#endif /* !HAVE_DARWIN */
 
 /* Called to see if the user's typed password is valid. We do this by asking
    the kerberos server for a ticket and checking to see if it gave us one.
@@ -190,6 +192,7 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
     C_Block mitkey;
     Bool success;
     char *newtkfile;
+    int fh = -1;
 
     /* temporarily switch to a new ticketfile.
        I'm not using tmpnam() because it isn't entirely portable.
@@ -197,7 +200,19 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
     newtkfile = malloc(80 * sizeof(char));
     memset(newtkfile, 0, sizeof(newtkfile));
 
-    sprintf(newtkfile, "/tmp/xscrn-%i", getpid());
+    sprintf(newtkfile, "/tmp/xscrn-%i.XXXXXX", getpid());
+
+    if( (fh = mkstemp(newtkfile)) < 0)
+    {
+        free(newtkfile);
+        return(False);
+    }
+    if( fchmod(fh, 0600) < 0)
+    {
+        free(newtkfile);
+        return(False);
+    }
+
 
     krb_set_tkt_string(newtkfile);
 
@@ -220,6 +235,7 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
     krb_set_tkt_string(tk_file);
     free(newtkfile);
     memset(mitkey, 0, sizeof(mitkey));
+    close(fh); /* #### tom: should the file be removed? */
     
 
     /* Did we verify successfully? */