From a8f13c327e2b8062ee7bf526d821611930ceb7b4 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 14 Mar 2008 18:14:55 +0000 Subject: [PATCH] Added the script --- scripts/gpgcheck3.php | 242 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 scripts/gpgcheck3.php diff --git a/scripts/gpgcheck3.php b/scripts/gpgcheck3.php new file mode 100644 index 0000000..72f7325 --- /dev/null +++ b/scripts/gpgcheck3.php @@ -0,0 +1,242 @@ + + + This file is part of CAcert. + + CAcert has been released under the CAcert Source License + which can be found included with these source files or can + be downloaded from the internet from the following address: + http://www.cacert.org/src-lic.php + + CAcert is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A + PARTICULAR PURPOSE. See the License for more details. +*/ + require_once("../includes/mysql.php"); //general.php"); + + echo("Content-Type: text/csv; charset=utf-8"); + +function mb_replace($str, $match, $replacement) { + if ($match == "") { return $str; } + $mlen = mb_strlen($match, "UTF-8"); + while (($pos = mb_strpos($str, $match, 0, "UTF-8")) != "") { + //print "$str, $match, $replacement, $pos\n"; + $str = mb_substr($str, 0, $pos, "UTF-8") + . ":" . $replacement . ":" + . mb_substr($str, $pos + $mlen, + mb_strlen($str, "UTF-8") - $pos - $mlen, + "UTF-8"); + //$pos = mb_strpos($str, $match, 0, "UTF-8"); + //print "$str, $match, $replacement, $pos\n"; + } + $replacement .= "__C_A_S_E__M_I_S_M_A_T_C_H"; + while ($_GET['case'] + && ($pos = mb_stripos($str, $match, 0, "UTF-8")) != "") { + $str = mb_substr($str, 0, $pos, "UTF-8") + . ":" . $replacement . ":" + . mb_substr($str, $pos + $mlen, + mb_strlen($str, "UTF-8") - $pos - $mlen, + "UTF-8"); + } + return $str; +} + +function deUmlaut($str) { + return iconv("UTF-8", "US-ASCII//TRANSLIT", + mb_convert_encoding($str, "UTF-8")); +} + +function deUmlaut2($str) { + return mb_ereg_replace(iconv("ISO-8859-1", "UTF-8", "Ä"), "Ae", + mb_ereg_replace(iconv("ISO-8859-1", "UTF-8", "Ö"), "Oe", + mb_ereg_replace(iconv("ISO-8859-1", "UTF-8", "Ü"), "Ue", + mb_ereg_replace(iconv("ISO-8859-1", "UTF-8", "ä"), "ae", + mb_ereg_replace(iconv("ISO-8859-1", "UTF-8", "ö"), "oe", + mb_ereg_replace(iconv("ISO-8859-1", "UTF-8", "ü"), "ue", + mb_ereg_replace(iconv("ISO-8859-1", "UTF-8", "ß"), "ss", + mb_convert_encoding($str, "UTF-8")))))))); +} + +function csvize($str) { + if (strpos($str, "\"") != "" || strpos($str, ",") != "") { + return "\"" . str_replace("\"", "\"\"", $str) . "\""; + } + return $str; +} + mb_regex_encoding("UTF-8"); + + $res = mysql_query("SELECT id, memid FROM gpg WHERE crt != ''"); + if (!$res) { + echo "Query FROM gpg failed!\n"; + exit; + } + + $keys = array(); + while ($row = mysql_fetch_row($res)) { + array_push($keys, $row); + } + mysql_free_result($res); + + foreach ($keys as $key) { + $crt = "../crt/gpg-" . $key[0] . ".crt"; + if (!is_file($crt)) { + echo "Missing cert $crt!\n"; + continue; + } + + $res = mysql_query("SELECT fname, mname, lname, suffix FROM users WHERE id = " . $key[1]); + if (!$res) { + echo "Query FROM users failed!\n"; + exit; + } + $user = mysql_fetch_assoc($res); + if (!$user) { + echo "User #" . $key[1] . " not found?!\n"; + continue; + } + mysql_free_result($res); + + $res = mysql_query("SELECT email FROM email WHERE hash = '' AND memid = " . $key[1]); + if (!$res) { + echo "Query FROM email failed!\n"; + exit; + } + $addrs = array(); + while ($addr = mysql_fetch_row($res)) { + array_push($addrs, $addr[0]); + } + mysql_free_result($res); + + $gpg = `gpg --with-colons --homedir /tmp $crt 2>/dev/null`; + //echo "gpg says\n".htmlspecialchars($gpg); + foreach (explode("\n", $gpg) as $line) { + $bits = explode(":", $line); + if ($bits[0] != "pub" && $bits[0] != "uid") { + continue; + } + $match = false; + $problem = ""; + $uid = " ".preg_replace('~\\\\x([0-9a-f])([0-9a-f])~ei', 'chr(hexdec("\\1\\2"))', $bits[9]); + //print "$uid\n"; + if (iconv("UTF-8", "UTF-8", $uid)) { + $uid = mb_ereg_replace("\\\\", "\\x5c", $uid); + $uid = mb_ereg_replace("\\:", "\\x3a", $uid); + } else { + if ($tmp = iconv("ISO-8859-1", "UTF-8", $uid)) { + $problem = ":BAD_ENCODING:"; + $uid = $tmp; + $uid = mb_ereg_replace("\\\\", "\\x5c", + $uid); + $uid = mb_ereg_replace("\\:", "\\x3a", + $uid); + } else { + $problem = ":UNKNOWN_ENCODING:"; + $uid = $bits[9]; + } + } + //print "$uid\n"; + foreach ($addrs as $addr) { + //print "$uid, $addr\n"; + //print mb_convert_encoding($addr, "UTF-8")."\n"; + $uid = mb_replace($uid, + mb_convert_encoding($addr, + "UTF-8"), + "V_A_L_I_D__E_M_A_I_L"); + } + //print "$uid\n"; + $uid = mb_replace($uid, + mb_convert_encoding($user['lname'], + "UTF-8"), + "L_N_A_M_E"); + $uid = mb_replace($uid, + mb_convert_encoding($user['fname'], + "UTF-8"), + "F_N_A_M_E"); + $uid = mb_replace($uid, + mb_convert_encoding($user['mname'], + "UTF-8"), + "M_N_A_M_E"); + $uid = mb_replace($uid, + mb_convert_encoding($user['suffix'], + "UTF-8"), + "S_U_F_F_I_X"); + $uid = mb_replace($uid, deUmlaut($user['lname']), + "L_N_A_M_E__U_M_L_A_U_T"); + $uid = mb_replace($uid, deUmlaut($user['fname']), + "F_N_A_M_E__U_M_L_A_U_T"); + $uid = mb_replace($uid, deUmlaut($user['mname']), + "M_N_A_M_E__U_M_L_A_U_T"); + $uid = mb_replace($uid, deUmlaut($user['suffix']), + "S_U_F_F_I_X__U_M_L_A_U_T"); +//print deUmlaut2($user['lname'])."\n"; + $uid = mb_replace($uid, deUmlaut2($user['lname']), + "L_N_A_M_E__U_M_L_A_U_T"); + $uid = mb_replace($uid, deUmlaut2($user['fname']), + "F_N_A_M_E__U_M_L_A_U_T"); + $uid = mb_replace($uid, deUmlaut2($user['mname']), + "M_N_A_M_E__U_M_L_A_U_T"); + $uid = mb_replace($uid, deUmlaut2($user['suffix']), + "S_U_F_F_I_X__U_M_L_A_U_T"); + if (strlen($user['mname']) > 0) { + $uid = mb_replace($uid, + mb_convert_encoding(substr($user['mname'], 0, 1) . ".", + "UTF-8"), + "M_N_A_M_E__I_N_I_T_I_A_L"); + } + if (strlen($user['fname']) > 0) { + $uid = mb_replace($uid, + mb_convert_encoding(substr($user['fname'], 0, 1) . ".", + "UTF-8"), + "F_N_A_M_E__I_N_I_T_I_A_L"); + } + $nameRegEx = "^ (:F_N_A_M_E([^:]*):\s+" + . "(:M_N_A_M_E([^:]*):\s+)?" + . ":L_N_A_M_E([^:]*):" + . "(\s+:S_U_F_F_I_X([^:]*):)?)?" + . "(\s*\(.*\))?" // optional comment + . "(\s*?)?" + . "\$"; + if (!mb_ereg_search_init($uid, $nameRegEx)) { + $problem .= ":REGEX_FAILED:"; + } + $res = mb_ereg_search_regs(); + if ($res) { + $match = true; + if ($res[8] != "") { + $problem .= ":UNPARSED_COMMENT:"; + } + if ($res[2] != "") { + $problem .= ":".$res[2].":"; + } + if ($res[4] != "") { + $problem .= ":".$res[4].":"; + } + if ($res[5] != "") { + $problem .= ":".$res[5].":"; + } + if ($res[7] != "") { + $problem .= ":".$res[7].":"; + } +//print $res[0].",".$res[1].",".$res[2].",".$res[3].",".$res[4]."," +// .$res[5].",".$res[6].",".$res[7].",".$res[8].",".$res[9]."," +// .$res[10]."\n"; + } else { + $problem = ":MISMATCH:$problem"; + } + if (!$match || $problem != "") { + print $key[0] . "," . csvize($problem) . "," + . csvize($uid) . "," + . csvize(preg_replace('/([^ -~])/ei', '"\\\\x".sprintf("%02x", ord("\\1"))', $bits[9])) . "," + . mb_convert_encoding(csvize($user['fname']), "UTF-8") . "," + . mb_convert_encoding(csvize($user['mname']), "UTF-8") . "," + . mb_convert_encoding(csvize($user['lname']), "UTF-8") . "," + . mb_convert_encoding(csvize($user['suffix']), "UTF-8"); + foreach ($addrs as $addr) { + print "," . mb_convert_encoding(csvize($addr), "UTF-8"); + } + print "\n"; + } + } + } + +?>