--- /dev/null
+<?php
+// $Id: ACSSystem.class.php,v 2.0 2009/06/24 16:30:00 acs Exp $
+
+
+/*
+ * System¥¯¥é¥¹
+ */
+class ACSSystem {
+
+ /**
+ * ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¤ò¹¹¿·¤¹¤ë
+ *
+ * @param $new_user_id ¿·µ¬¥æ¡¼¥¶ID
+ * @param $new_passwd ¿·µ¬¥Ñ¥¹¥ï¡¼¥É
+ * @return À®¸ù(true) / ¼ºÇÔ(false)
+ */
+ function update_passwd($new_user_id, $new_passwd) {
+ $ret = 1;
+ $entry_array = array(); // ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¥¨¥ó¥È¥êÊÝ»ýÇÛÎó
+
+ if (!is_writable(ACS_PASSWD_FILE)) {
+ return 0;
+ }
+
+ // ¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß
+ $data_arr = file(ACS_PASSWD_FILE);
+ foreach ($data_arr as $line) {
+ list($user_id, $passwd) = explode(':', trim($line));
+ // ¥æ¡¼¥¶¾ðÊó(user_info)¤¬Â¸ºß¤¹¤ë¥æ¡¼¥¶ID¤Î¤ßÊݸÂоݤȤ¹¤ë
+ if (ACSUser::get_user_info_row_by_user_id($user_id)) {
+ $entry_array[$user_id] = $passwd;
+ }
+ }
+
+ // ¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É
+ if ($new_passwd != '') {
+ $new_passwd = crypt($new_passwd);
+ }
+ $entry_array[$new_user_id] = $new_passwd;
+
+ // ¥Õ¥¡¥¤¥ë¥ª¡¼¥×¥ó
+ if (($fp = fopen(ACS_PASSWD_FILE, 'w')) === false) {
+ return 0;
+ }
+ flock($fp, LOCK_EX);
+
+ foreach ($entry_array as $user_id => $passwd) {
+ // ¶õ¤Î¥Ñ¥¹¥ï¡¼¥É¤Ï½üµî
+ if ($passwd != '') {
+ fwrite($fp, "$user_id:$passwd\n");
+ }
+ }
+
+ // ¥Õ¥¡¥¤¥ë¥¯¥í¡¼¥º
+ fclose($fp);
+ return $ret;
+ }
+
+ /**
+ * ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¤«¤é»ØÄê¤Î¥æ¡¼¥¶ID¤Î¥¨¥ó¥È¥ê¤òºï½ü¤¹¤ë
+ *
+ * @param $delete_user_id ºï½ü¤¹¤ë¥æ¡¼¥¶ID
+ * @return À®¸ù(true) / ¼ºÇÔ(false)
+ */
+ function delete_passwd($delete_user_id) {
+ $ret = 1;
+ $entry_array = array(); // ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¥¨¥ó¥È¥êÊÝ»ýÇÛÎó
+
+ if (!is_writable(ACS_PASSWD_FILE)) {
+ return 0;
+ }
+
+ // ¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß
+ $data_arr = file(ACS_PASSWD_FILE);
+ foreach ($data_arr as $line) {
+ list($user_id, $passwd) = explode(':', trim($line));
+ // ºï½ü¤¹¤ë¥æ¡¼¥¶ID¤Ï¥¹¥¥Ã¥×
+ if ($user_id == $delete_user_id) {
+ continue;
+ }
+ // ¥æ¡¼¥¶¾ðÊó(user_info)¤¬Â¸ºß¤¹¤ë¥æ¡¼¥¶ID¤Î¤ßÊݸÂоݤȤ¹¤ë
+ if (ACSUser::get_user_info_row_by_user_id($user_id)) {
+ $entry_array[$user_id] = $passwd;
+ }
+ }
+
+ // ¥Õ¥¡¥¤¥ë¥ª¡¼¥×¥ó
+ if (($fp = fopen(ACS_PASSWD_FILE, 'w')) === false) {
+ return 0;
+ }
+ flock($fp, LOCK_EX);
+
+ foreach ($entry_array as $user_id => $passwd) {
+ // ¶õ¤Î¥Ñ¥¹¥ï¡¼¥É¤Ï½üµî
+ if ($passwd != '') {
+ fwrite($fp, "$user_id:$passwd\n");
+ }
+ }
+
+ // ¥Õ¥¡¥¤¥ë¥¯¥í¡¼¥º
+ fclose($fp);
+ return $ret;
+ }
+
+ /**
+ * ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë(.htpasswd)¤Ë¸ºß¤¹¤ë¥æ¡¼¥¶ID¤«¤É¤¦¤«
+ *
+ * @param $target_user_id ÂоݤΥ桼¥¶ID
+ * @return ¸ºß¤¹¤ë(true) / ¸ºß¤·¤Ê¤¤(false)
+ */
+ function is_htpasswd_user($target_user_id) {
+
+ $ret = false;
+
+ // ¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß
+ $data_arr = file(ACS_PASSWD_FILE);
+ foreach ($data_arr as $line) {
+ list($user_id, $passwd) = explode(':', trim($line));
+ if ($user_id != '' && $target_user_id == $user_id) {
+ $ret = true;
+ break;
+ }
+ }
+
+ return $ret;
+ }
+
+
+ /**
+ * ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ëǧ¾Ú
+ *
+ * @param $input_user_id ÆþÎϥ桼¥¶ID
+ * @param $input_passwd ÆþÎϥѥ¹¥ï¡¼¥É
+ * @return À®¸ù(true) / ¼ºÇÔ(false)
+ */
+ function check_passwd_by_htpasswd($input_user_id, $input_passwd) {
+
+ // ¥¨¥¹¥±¡¼¥×½èÍý
+ $filepassword = "";
+
+ // ¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß
+ $data_arr = file(ACS_PASSWD_FILE);
+ foreach ($data_arr as $line) {
+
+ list($user_id, $passwd) = explode(':', trim($line));
+
+ // ¥æ¡¼¥¶¾ðÊó(user_info)¤¬Â¸ºß¤¹¤ë¥æ¡¼¥¶ID¤Î¤ßÊݸÂоݤȤ¹¤ë
+ if ($input_user_id == $user_id) {
+
+ if(crypt($input_passwd, $passwd) == $passwd){
+ // OK¢ª¥Þ¥¤¥Ú¡¼¥¸¤Ø
+ return 0;
+ }
+
+ // °Å¹æ·Á¼°¤ÎÈæ³Ó
+ if (ACSSystem::verify_passwd_by_hash($input_passwd, $passwd) == 0) {
+ return 0;
+ }
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * °Å¹æ²½ºÑ¤ß¥Ñ¥¹¥ï¡¼¥É¤òǧ¾Ú¤¹¤ë(À©¸æ)
+ *
+ * @param $input_passwd ÆþÎϥѥ¹¥ï¡¼¥É
+ * @param $get_hash ¥Ï¥Ã¥·¥å
+ * @return ǧ¾ÚÀ®¸ù(true) / ǧ¾Ú¼ºÇÔ(false)
+ */
+ function verify_passwd_by_hash($input_passwd, $get_hash) {
+
+ // SSHA·Á¼°¤ÎÈæ³Ó
+ if (ACSSystem::verify_passwd_by_ssha($input_passwd, $get_hash) == 0) {
+ return 0;
+ }
+
+ // SHA·Á¼°¤ÎÈæ³Ó
+ if (ACSSystem::verify_passwd_by_sha($input_passwd, $get_hash) == 0) {
+ return 0;
+ }
+
+ return -1;
+
+ }
+
+ /**
+ * °Å¹æ²½ºÑ¤ß¥Ñ¥¹¥ï¡¼¥É¤òǧ¾Ú¤¹¤ë(SSHA)
+ *
+ * @param $input_passwd ÆþÎϥѥ¹¥ï¡¼¥É
+ * @param $ssha_hash ¥Ï¥Ã¥·¥å(SSHA)
+ * @return À®¸ù(true) / ¼ºÇÔ(false)
+ */
+ function verify_passwd_by_ssha($input_passwd, $ssha_hash) {
+
+ // Verify SSHA hash
+ $rep_hash = ereg_replace("{SSHA}", "", $ssha_hash);
+
+ // base64_encode
+ $ohash = base64_decode($rep_hash);
+ $osalt = substr($ohash, 20);
+ $ohash = substr($ohash, 0, 20);
+
+ // PHP¤Î¥Ð¡¼¥¸¥ç¥ó¤Ë¤è¤êʬ´ô
+ if(function_exists('sha1')) {
+ $nhash = pack("H*", sha1($input_passwd . $osalt));
+ } else if(function_exists('mHash')) {
+ $nhash = mHash(MHASH_SHA1, $input_passwd . $osalt);
+ } else {
+ return -1;
+ }
+
+ // ¥Ï¥Ã¥·¥åƱ»Î¤¬¹çÃפ¹¤ë¤«
+ if ($ohash == $nhash) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+
+ /**
+ * °Å¹æ²½ºÑ¤ß¥Ñ¥¹¥ï¡¼¥É¤òǧ¾Ú¤¹¤ë(SHA)
+ *
+ * @param $input_passwd ÆþÎϥѥ¹¥ï¡¼¥É
+ * @param $sha_hash ¥Ï¥Ã¥·¥å
+ * @return À®¸ù(true) / ¼ºÇÔ(false)
+ */
+ function verify_passwd_by_sha($input_passwd, $sha_hash) {
+
+ // Verify SHA hash
+ $rep_hash = ereg_replace("{SHA}", "", $sha_hash);
+
+ // PHP¤Î¥Ð¡¼¥¸¥ç¥ó¤Ë¤è¤êʬ´ô
+ // base64_encode
+ if(function_exists('sha1')) {
+ $nhash = base64_encode(pack("H*", sha1($input_passwd)));
+ } else if(function_exists('mHash')) {
+ $nhash = base64_encode(mHash(MHASH_SHA1, $input_passwd));
+ } else {
+ return -1;
+ }
+
+ // ¥Ï¥Ã¥·¥åƱ»Î¤¬¹çÃפ¹¤ë¤«
+ if ($rep_hash == $nhash) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+
+ /**
+ * ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¤Î¥æ¡¼¥¶ID¤òÆþ¤ìÂؤ¨¤ë
+ *
+ * @param $new_user_id ¿·µ¬¥æ¡¼¥¶ID
+ * @param $old_user_id µì¥æ¡¼¥¶ID
+ * @return ½èÍýÀ®¸ù(true) / ½èÍý¼ºÇÔ(false)
+ */
+ function update_passwd_with_userid($new_user_id, $old_user_id) {
+ $ret = 1;
+ $entry_array = array(); // ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¥¨¥ó¥È¥êÊÝ»ýÇÛÎó
+
+ // ½ñ¤¹þ¤ß²Äǽ¥Á¥§¥Ã¥¯
+ if (!is_writable(ACS_PASSWD_FILE)) {
+ return 0;
+ }
+
+ // ¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß
+ $data_arr = file(ACS_PASSWD_FILE);
+ foreach ($data_arr as $line) {
+ list($user_id, $passwd) = explode(':', trim($line));
+ $entry_array[$user_id] = $passwd;
+ }
+
+ // ¥Õ¥¡¥¤¥ë¥ª¡¼¥×¥ó
+ if (($fp = fopen(ACS_PASSWD_FILE, 'w')) === false) {
+ return 0;
+ }
+ flock($fp, LOCK_EX);
+ foreach ($entry_array as $user_id => $passwd) {
+ // ¶õ¤Î¥Ñ¥¹¥ï¡¼¥É¤Ï½üµî
+ if ($passwd != '') {
+ if ($old_user_id == $user_id) {
+ // ¸Å¤¤¥æ¡¼¥¶ID¤ò¿·¤·¤¤¥æ¡¼¥¶ID¤ËÊѹ¹
+ fwrite($fp, "$new_user_id:$passwd\n");
+ } else {
+ // Âоݥ桼¥¶°Ê³°¤Ï½ñ¤Ä¾¤¹¤À¤±
+ fwrite($fp, "$user_id:$passwd\n");
+ }
+ }
+ }
+
+ // ¥Õ¥¡¥¤¥ë¥¯¥í¡¼¥º
+ fclose($fp);
+ return $ret;
+ }
+
+ /**
+ * ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¤òǧ¾Ú¤¹¤ë
+ *
+ * @param $input_user_id ÆþÎϥ桼¥¶ID
+ * @param $input_passwd ÆþÎϥѥ¹¥ï¡¼¥É
+ * @return ¥Þ¥Ã¥Á¤¹¤ë¥æ¡¼¥¶ID / NULL
+ */
+ function check_passwd($input_user_id, $input_passwd) {
+ // ¥¨¥¹¥±¡¼¥×½èÍý
+ $input_user_id = trim($input_user_id);
+ $input_passwd = trim($input_passwd);
+ $filepassword = "";
+
+ /* LDAP¤Ø¤Îǧ¾Ú(LDAP¤ò»ÈÍѤ¹¤ë¾ì¹ç) */
+ if (USE_LDAP_SYSTEM == "1") {
+ $ret_id = ACSLDAP::check_passwd_by_ldap($input_user_id, $input_passwd);
+ if ($ret_id != null) {
+ return $ret_id;
+ }
+ }
+
+ /* ¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¤È¤Îǧ¾Ú */
+ $ret = ACSSystem::check_passwd_by_htpasswd($input_user_id, $input_passwd);
+ if ($ret == 0) {
+ // ÆþÎϥ桼¥¶ID¤òÊÖµÑ
+ return $input_user_id;
+ }
+
+ // NULL¤òÊÖµÑ
+ return NULL;
+ }
+
+ /**
+ * ³°Éô¥·¥¹¥Æ¥à¤È¤ÎÀܳ¥Á¥§¥Ã¥¯
+ * LDAP¤Ê¤É³°Éô¥·¥¹¥Æ¥à¤«¤é¥æ¡¼¥¶¾ðÊó¤ò¼èÆÀ¤¹¤ë¾ì¹ç¡¢
+ * Àܳ¥Á¥§¥Ã¥¯¤ò¹Ô¤¦
+ *
+ * @return ÀܳÀ®¸ù(true) / Àܳ¼ºÇÔ(false)
+ */
+ function check_connect_outside() {
+
+ if (USE_LDAP_SYSTEM != "1") {
+ // ³°Éô¥·¥¹¥Æ¥à¤ËÀܳ¤·¤Ê¤¤¾ì¹ç¤ÏÌäÂê¤Ê¤¤
+ return 0;
+ }
+
+ // LDAP¤ËÀܳ¤¹¤ë»ÅÍͤξì¹ç
+ if (!ACSLDAP::connect_ldap()) {
+ return -1;
+ }
+ return 0;
+
+ }
+
+}
+?>