added EtcPasswd
authoradam <adam@megacz.com>
Tue, 3 Aug 2004 07:25:13 +0000 (07:25 +0000)
committeradam <adam@megacz.com>
Tue, 3 Aug 2004 07:25:13 +0000 (07:25 +0000)
darcs-hash:20040803072513-5007d-b55224330be3161b57c7075bc409ac8e6032da22.gz

src/org/ibex/crypto/EtcPasswd.java [new file with mode: 0644]

diff --git a/src/org/ibex/crypto/EtcPasswd.java b/src/org/ibex/crypto/EtcPasswd.java
new file mode 100644 (file)
index 0000000..3673427
--- /dev/null
@@ -0,0 +1,48 @@
+package org.ibex.crypto;
+import org.ibex.util.*;
+import java.util.*;
+import java.io.*;
+
+/**
+ *  Right now this is a big fat hack; at some point it would be nice
+ *  to try lots of different techniques (JNI/getpwent(),
+ *  Runtime.exec(),
+ *  http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libcrypt/crypt-md5.c
+ *
+ *  Also, this currently assumes that the user has MD5 passwords
+ *  enabled and OpenSSL installed.
+ */
+public class EtcPasswd {
+    public static boolean verify(String user, String pass) {
+        try {
+            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/etc/passwd-")));
+            for(String s = br.readLine(); s != null; s = br.readLine()) {
+                StringTokenizer st = new StringTokenizer(s, ":");
+                if (!user.equals(st.nextToken())) continue;
+                try {
+                    String stuff = st.nextToken();
+                    StringTokenizer st2 = new StringTokenizer(stuff, "$");
+                    st2.nextToken();
+                    String salt = st2.nextToken();
+                    Process p =
+                        Runtime.getRuntime().exec(new String[] {
+                            "/usr/bin/openssl",
+                            "passwd",
+                            "-1",
+                            "-stdin",
+                            "-salt",
+                            salt });
+                    PrintWriter pw = new PrintWriter(p.getOutputStream());
+                    pw.println(pass);
+                    pw.flush();
+                    pw.close();
+                    BufferedReader br2 = new BufferedReader(new InputStreamReader(p.getInputStream()));
+                    String recrypt = br2.readLine();
+                    p.waitFor();
+                    if (recrypt.equals(stuff)) return true;
+                } catch (Exception e) { Log.warn(EtcPasswd.class, e); }
+            }
+        } catch (Exception e) { Log.warn(EtcPasswd.class, e); }
+        return false;
+    }
+}