OSDN Git Service

add ACS webapp, sql, htdocs
[acs/acs.git] / webapp / lib / class / ACSSystem.class.php
diff --git a/webapp/lib/class/ACSSystem.class.php b/webapp/lib/class/ACSSystem.class.php
new file mode 100644 (file)
index 0000000..15eec5e
--- /dev/null
@@ -0,0 +1,352 @@
+<?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;
+
+       }
+
+}
+?>