• R/O
  • SSH
  • HTTPS

slwebtunnel: Commit


Commit MetaInfo

Révision6 (tree)
l'heure2007-12-03 19:26:21
Auteurcattaka

Message de Log

ベータ1。

Change Summary

Modification

--- slwebtunnel/trunk/license.txt (nonexistent)
+++ slwebtunnel/trunk/license.txt (revision 6)
@@ -0,0 +1,33 @@
1+Copyright 2007 Takao Sumitomo. All rights reserved.
2+
3+Redistribution and use in source and binary forms,
4+ with or without modification, are permitted provided
5+ that the following conditions are met:
6+
7+ 1. Redistributions of source code must retain the
8+ above copyright notice, this list of conditions
9+ and the following disclaimer.
10+ 2. Redistributions in binary form must reproduce
11+ the above copyright notice, this list of conditions
12+ and the following disclaimer in the documentation
13+ and/or other materials provided with the distribution.
14+
15+THIS SOFTWARE IS PROVIDED ``AS IS''
16+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18+AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19+IN NO EVENT SHALL CONTRIBUTORS BE
20+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28+OF THE POSSIBILITY OF SUCH DAMAGE.
29+
30+The views and conclusions contained in the software
31+and documentation are those of the authors and should not be
32+interpreted as representing official policies,
33+either expressed or implied.
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/mysql/slwtcreatedb.sql (nonexistent)
+++ slwebtunnel/trunk/mysql/slwtcreatedb.sql (revision 6)
@@ -0,0 +1,75 @@
1+DROP TABLE IF EXISTS MESSAGE_LOG;
2+DROP TABLE IF EXISTS AGENT_LIST;
3+DROP TABLE IF EXISTS LOGIN_LIST;
4+DROP TABLE IF EXISTS SL_AGENT;
5+DROP TABLE IF EXISTS USER_INFO;
6+DROP TABLE IF EXISTS CHANNEL_INFO;
7+DROP TABLE IF EXISTS TRANSMIT_QUEUE;
8+DROP TABLE IF EXISTS SEQ_QUEUE_NUMBER;
9+DROP TABLE IF EXISTS SEQ_USER_NUMBER;
10+DROP TABLE IF EXISTS SLWEBTUNNEL_SYSTEM;
11+
12+
13+CREATE TABLE SLWEBTUNNEL_SYSTEM (
14+ LAST_LOGDUMP DATETIME NOT NULL
15+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
16+INSERT INTO SLWEBTUNNEL_SYSTEM(LAST_LOGDUMP) VALUES (NOW());
17+
18+CREATE TABLE SEQ_USER_NUMBER (ID INT NOT NULL);
19+INSERT INTO SEQ_USER_NUMBER VALUES (0);
20+
21+CREATE TABLE SEQ_QUEUE_NUMBER (ID INT NOT NULL);
22+INSERT INTO SEQ_QUEUE_NUMBER VALUES (0);
23+
24+CREATE TABLE CHANNEL_INFO(
25+ CHANNEL_NUMBER INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
26+ CHANNEL_NAME VARCHAR(100) NOT NULL,
27+ LAST_UPDATE DATETIME NOT NULL,
28+ LAST_CLEANUP DATETIME NOT NULL,
29+ OWNER_ID CHAR(20) UNIQUE NOT NULL,
30+ PASSWORD CHAR(50) NOT NULL,
31+ UUID CHAR(36)
32+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
33+
34+CREATE TABLE USER_INFO(
35+ USER_NUMBER INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
36+ USER_ID CHAR(20) UNIQUE NOT NULL,
37+ USER_NAME VARCHAR(100) NOT NULL,
38+ PASSWORD VARCHAR(50) NOT NULL
39+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
40+
41+CREATE TABLE SL_AGENT(
42+ AGENT_NAME CHAR(100) PRIMARY KEY NOT NULL
43+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
44+
45+CREATE TABLE LOGIN_LIST(
46+ USER_NUMBER INTEGER NOT NULL REFERENCES USER_INFO(USER_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE,
47+ CHANNEL_NUMBER INTEGER NOT NULL REFERENCES CHANNEL_INFO(CHANNEL_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE,
48+ LAST_UPDATE DATETIME NOT NULL,
49+ PRIMARY KEY (USER_NUMBER,CHANNEL_NUMBER)
50+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
51+
52+CREATE TABLE AGENT_LIST(
53+AGENT_NAME CHAR(100) NOT NULL,
54+CHANNEL_NUMBER INTEGER NOT NULL REFERENCES CHANNEL_INFO(CHANNEL_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE,
55+ PRIMARY KEY (AGENT_NAME,CHANNEL_NUMBER)
56+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
57+
58+
59+CREATE TABLE MESSAGE_LOG(
60+ NUMERICAL_ORDER INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
61+ USER_NUMBER INTEGER REFERENCES USER_INFO(USER_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE,
62+ AGENT_NAME CHAR(100) REFERENCES SL_AGENT(AGENT_NAME) ON DELETE CASCADE ON UPDATE CASCADE,
63+ CHANNEL_NUMBER INTEGER NOT NULL REFERENCES CHANNEL_INFO(CHANNEL_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE,
64+ INSERT_TIME DATETIME NOT NULL,
65+ MESSAGE VARCHAR(300) NOT NULL
66+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
67+
68+
69+CREATE TABLE TRANSMIT_QUEUE(
70+ QUEUE_NUMBER INTEGER PRIMARY KEY NOT NULL,
71+ CHANNEL_NUMBER INTEGER NOT NULL,
72+ NEXT_QUEUE_NUMBER INTEGER,
73+ BODY VARCHAR(2000) NOT NULL,
74+ INSERT_DATE DATETIME NOT NULL
75+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/slwtlanguage.php (nonexistent)
+++ slwebtunnel/trunk/src/slwtlanguage.php (revision 6)
@@ -0,0 +1,81 @@
1+<?php
2+/*
3+ * SLWebTunnel
4+ * Language File
5+ * $Id$
6+ * Created on 2007/11/09
7+ *
8+ */
9+
10+ //Page text
11+ define('PAGETEXT_TITLE', 'SlWebTunnel');
12+ define('PAGETEXT_SELECTCHANNEL', 'チャンネル選択画面');
13+ define('PAGETEXT_DISPLAYLOG', 'ログ表示画面');
14+ define('PAGETEXT_LOGIN', 'ログイン画面');
15+ define('PAGETEXT_LOGINPROCESS', 'ログイン処理ページ');
16+ define('PAGETEXT_LOGOUTPROCESS', 'ログアウト処理ページ');
17+ define('PAGETEXT_SETUPTUNNEL', 'トンネル設定ページ');
18+ define('PAGETEXT_TUNNEL', 'トンネルページ');
19+
20+ define('PAGETEXT_BUTTON_SELECT', '選択');
21+ define('PAGETEXT_BUTTON_LOGIN', 'ログイン');
22+ define('PAGETEXT_BUTTON_LOGOUT', 'ログアウト');
23+ define('PAGETEXT_BUTTON_SUBMIT', '送信');
24+ define('PAGETEXT_BUTTON_RELOAD', '更新');
25+ define('PAGETEXT_BUTTON_BACK', '戻る');
26+ define('PAGETEXT_BUTTON_INSERT', '追加');
27+ define('PAGETEXT_BUTTON_DELETE', '削除');
28+ define('PAGETEXT_BUTTON_UPDATE', '更新');
29+
30+ define('PAGETEXT_USERID', 'ユーザID');
31+ define('PAGETEXT_USERNAME', 'ユーザ名');
32+ define('PAGETEXT_PASSWORD', 'パスワード');
33+
34+ //Message
35+ define('MSG_ERROR_DB_CONNECTION', 'データベースへの接続に失敗しました。');
36+ define('MSG_ERROR_DB_SELECT', 'データベースの検索に失敗しました。');
37+ define('MSG_ERROR_DB_UPDATE', 'データベースの更新に失敗しました。');
38+ define('MSG_UNKNOWN_COMMAND', '不明なコマンドが指定されました。');
39+
40+ //Admin Page
41+ define('ADMPAGETEXT_TITLE', 'SLWebTunnel管理');
42+ define('ADMPAGETEXT_LOGIN', 'ログイン画面');
43+ define('ADMPAGETEXT_MENU', 'メニュー画面');
44+ define('ADMPAGETEXT_EDIT_CHANNEL', 'チャンネル編集画面');
45+ define('ADMPAGETEXT_VIEW_LOG', 'ログ閲覧画面');
46+ define('ADMPAGETEXT_CHECK_CONFIG', '設定チェック画面');
47+ define('ADMPAGETEXT_RESET_DB', 'DBリセット画面');
48+ define('ADMPAGETEXT_EXEC_RESULT', '実行結果');
49+ define('ADMPAGETEXT_SUCCEED', '成功');
50+ define('ADMPAGETEXT_FAILED', '失敗');
51+ define('ADMPAGETEXT_OWNER_ID', 'オーナーID');
52+ define('ADMPAGETEXT_PASSWORD', 'パスワード');
53+ define('ADMPAGETEXT_LAST_UPDATE', '最終更新日');
54+ define('ADMPAGETEXT_LOG_FILE_LIST', 'ログファイル一覧');
55+ define('ADMPAGETEXT_LOG_FILE_CONTENT', 'ログ内容');
56+
57+
58+ //Admin Message
59+ define('ADMMSG_PUSH_TO_RESET_DB', '送信ボタンを押すとデータベースのリセットが実行されます。');
60+ define('ADMMSG_GETTING_CHANNEL_INFO_FAILED', 'チャンネル情報の取得に失敗しました。');
61+ define('ADMMSG_INSERT_CHANNEL_SUCCEED', 'チャンネルの追加に成功しました。');
62+ define('ADMMSG_UPDATE_CHANNEL_SUCCEED', 'チャンネルの更新に成功しました。');
63+ define('ADMMSG_DELETE_CHANNEL_SUCCEED', 'チャンネルの削除に成功しました。');
64+ define('ADMMSG_NO_CHANNEL_NUMBER', 'チャンネル番号がありません。');
65+ define('ADMMSG_NO_OWNER_ID', 'オーナーIDがありません。');
66+ define('ADMMSG_NO_PASSKEY', 'パスワードがありません。');
67+ define('ADMMSG_DB_CONNECTION', 'データベースへの接続:');
68+ define('ADMMSG_TABLE_EXISTS', 'テーブルの存在確認:');
69+ define('ADMMSG_LOG_DUMP_DIR_EXISTS', 'ログ出力先の存在確認:');
70+ define('ADMMSG_LOG_DUMP_DIR_IS_DIR', 'ログ出力先がディレクトリであるか確認:');
71+ define('ADMMSG_LOG_DUMP_DIR_WRITABLE', 'ログ出力先の書き込み権限確認:');
72+ define('ADMMSG_RESET_DB_IS_SUCCEED', 'データベースの初期化に成功しました。');
73+ define('ADMMSG_RESET_DB_IS_FAILED', 'データベースの初期化に失敗しました。');
74+ define('ADMMSG_DATAFILE_EXISTS', 'データファイルの存在確認:');
75+ define('ADMMSG_DATAFILE_WRITABLE', 'データファイルの書き込み権限確認:');
76+
77+ define('ADMMSG_LOGIN_SUCCEED', 'ログインに成功しました。');
78+ define('ADMMSG_LOGIN_FAILED', 'ログインに失敗しました。');
79+
80+
81+?>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/slwtcommonfunc.php (nonexistent)
+++ slwebtunnel/trunk/src/slwtcommonfunc.php (revision 6)
@@ -0,0 +1,148 @@
1+<?php
2+/*
3+ * SlWebTunnel
4+ * Common functions
5+ * $Id$
6+ * Created on 2007/10/20
7+ *
8+ */
9+ function isBlank($arg) {
10+ if ($arg == NULL) {
11+ return TRUE;
12+ } else if ($arg == '') {
13+ return TRUE;
14+ }
15+ return FALSE;
16+ }
17+
18+ function generateRandomId() {
19+ return strval(microtime(TRUE));
20+ }
21+
22+ class TransmitQueueBuilder{
23+ var $pdo;
24+ var $channelNumber;
25+
26+ var $currentQueueNumber;
27+ var $buf;
28+ var $bufLength;
29+ var $totalLength;
30+
31+ function TransmitQueueBuilder($pdo, $channelNumber) {
32+ $this->pdo = $pdo;
33+ $this->channelNumber = $channelNumber;
34+ $this->currentQueueNumber = $this->pdo->getNextSeqTransmitQueue();
35+ $this->firstQueueNumber = $this->currentQueueNumber;
36+ $this->buf = "";
37+ $this->bufLength = 0;
38+ $this->totallength = 0;
39+ }
40+ function append($arg) {
41+ $argLength = strlen($arg) + strlen(HTTP_DELIMITER);
42+ if ($this->bufLength + $argLength >= MAX_HTTP_SIZE) {
43+ $this->flushBuffer();
44+ }
45+ $this->buf .= $arg.HTTP_DELIMITER;
46+ $this->bufLength += $argLength;
47+ $this->totalLength += $argLength;
48+ }
49+ function flushBuffer() {
50+ if ($this->bufLength > 0) {
51+ $nextQueueNumber = $this->pdo->getNextSeqTransmitQueue();
52+ $this->pdo->insertTransmitQueue($this->channelNumber, $this->currentQueueNumber, NULL, $this->buf);
53+ $this->currentQueueNumber = $nextQueueNumber;
54+ $this->buf = "";
55+ $this->bufLength = 0;
56+ }
57+ }
58+ function getTotalLength() {
59+ return $this->totalLength;
60+ }
61+ function getFirstQueueNumber() {
62+ return $this->firstQueueNumber;
63+ }
64+ function dispose() {
65+ $this->pdo = null;
66+ }
67+ }
68+
69+ function escapeString($arg, $target) {
70+ return str_replace($target, "\\".$target."\\", $arg);
71+ }
72+
73+ function unescapeSting($arg, $target) {
74+ return str_replace("\\".$target."\\", $target, $arg);
75+ }
76+
77+ function explodeEscaped($arg, $delim) {
78+ $tmpStrs = explode($delim.$delim, $arg);
79+ $result = array();
80+
81+ foreach($tmpStrs as $tmpStr){
82+ $result[] = unescapeSting($tmpStr, $delim);
83+ }
84+ return $result;
85+ }
86+
87+ function implodeEscaped($ary, $delim) {
88+ $tmpStrs = array();
89+ foreach($ary as $tmpStr){
90+ $tmpStrs[] = escapeString($tmpStr, $delim);
91+ }
92+ return implode($delim.$delim, $tmpStrs);
93+ }
94+ function displayMessages() {
95+ global $displayItems;
96+ if (count($displayItems['MESSAGE']) > 0) {
97+ $result = "<font color=\"RED\">\n";
98+ foreach($displayItems['MESSAGE'] as $message) {
99+ $result .= $message."<br/>\n";
100+ }
101+ $result .= "</font>\n";
102+ $result .= "<hr/>\n";
103+ return $result;
104+ } else {
105+ return "";
106+ }
107+ }
108+ function outputLog($channelNumber, $ary) {
109+ global $logDumpEnabled, $logDumpDir, $logDumpFilePrefix;
110+ if ($logDumpEnabled) {
111+ $strDate = date("Ymd");
112+ $fp = fopen($logDumpDir."/".$logDumpFilePrefix.$channelNumber."_".$strDate.".log", "a");
113+ if ($fp && flock($fp, LOCK_EX)) {
114+ return fputcsv($fp, $ary, ",");
115+ }
116+ }
117+ }
118+ function strDateToTime($str) {
119+ $ary = strptime($str, "%Y/%m/%d %H:%M:%S");
120+ return mktime ($ary[tm_hour], $ary[tm_min], $ary[tm_sec], $ary[tm_mon]+1, $ary[tm_mday], $ary[tm_year] + 1900);
121+ }
122+
123+ function isMobile() {
124+ if( preg_match( "/DoCoMo/", $_SERVER['HTTP_USER_AGENT'] ) ) {
125+ return true;
126+ } elseif( preg_match( "/J-PHONE/", $_SERVER['HTTP_USER_AGENT'] ) ) {
127+ return true;
128+ } elseif( preg_match( "/UP\.Browser/", $_SERVER['HTTP_USER_AGENT'] ) ) {
129+ return true;
130+ } else {
131+ return false;
132+ }
133+ }
134+
135+ function includeView($viewFile) {
136+ global $displayItems, $script, $channelNumber;
137+ $scriptParams = array();
138+ if (!isBlank($channelNumber)) {
139+ $scriptParams[] = PARAM_CHANNEL_NUMBER."=".$channelNumber;
140+ }
141+ if (isMobile() & !isBlank(session_id())) {
142+ $scriptParams[] = "PHPSESSID=".session_id();
143+ }
144+ $script = htmlspecialchars($_SERVER['PHP_SELF'])."?".implode("&", $scriptParams);
145+ include($viewFile);
146+ }
147+
148+?>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/slwtdatamanager.php (nonexistent)
+++ slwebtunnel/trunk/src/slwtdatamanager.php (revision 6)
@@ -0,0 +1,914 @@
1+<?php
2+/*
3+ * SlWebTunnel
4+ * Manage data functions
5+ * $Id$
6+ * Created on 2007/10/20
7+ *
8+ */
9+ require_once 'slwebtunnel.ini.php';
10+
11+
12+
13+ class SlwtDataManager {
14+ var $pdo;
15+ var $tblSlwebtunnelSystem;
16+ var $tblUserInfo;
17+ var $tblChannelInfo;
18+ var $tblTransmitQueue;
19+ var $tblSeqQueueNumber;
20+ var $tblSeqUserNumber;
21+ var $tblSlAgent;
22+ var $tblLoginList;
23+ var $tblAgentList;
24+ var $tblMessageLog;
25+
26+ function SlwtDataManager() {
27+ global $tblPrefix;
28+ $this->tblSlwebtunnelSystem = $tblPrefix . "SLWEBTUNNEL_SYSTEM";
29+ $this->tblUserInfo = $tblPrefix . "USER_INFO";
30+ $this->tblChannelInfo = $tblPrefix . "CHANNEL_INFO";
31+ $this->tblTransmitQueue = $tblPrefix . "TRANSMIT_QUEUE";
32+ $this->tblSeqQueueNumber = $tblPrefix . "SEQ_QUEUE_NUMBER";
33+ $this->tblSeqUserNumber = $tblPrefix . "SEQ_USER_NUMBER";
34+ $this->tblSlAgent = $tblPrefix . "SL_AGENT";
35+ $this->tblLoginList = $tblPrefix . "LOGIN_LIST";
36+ $this->tblAgentList = $tblPrefix . "AGENT_LIST";
37+ $this->tblMessageLog = $tblPrefix . "MESSAGE_LOG";
38+ }
39+
40+ function initialize() {
41+ try {
42+ $this->pdo = new PDO(DATA_SOURCE_NAME, DATA_SOURCE_USER, DATA_SOURCE_PASS);
43+ //$this->pdo = new PDO(DATA_SOURCE_NAME, DATA_SOURCE_USER, DATA_SOURCE_PASS, array(PDO::ATTR_PERSISTENT => true));
44+ return true;
45+ } catch(PDOException $e){
46+ return false;
47+ }
48+ }
49+
50+ function dispose () {
51+ $this->pdo = NULL;
52+ }
53+
54+ function beginTransaction() {
55+ $this->pdo->beginTransaction();
56+ }
57+
58+ function commit() {
59+ $this->pdo->commit();
60+ }
61+
62+ /**
63+ * Search UserName from Channel.
64+ *
65+ * return Exists->TRUE, otherwise->FALSE
66+ */
67+ function checkUserNameExistence($channelId, $userName) {
68+ try {
69+ $stmt = $this->pdo->prepare("SELECT COUNT(A.USER_NUMBER) AS NUM FROM " . $this->tblLoginList . " AS A LEFT JOIN " . $this->tblUserInfo . " AS B ON A.USER_NUMBER = B.USER_NUMBER WHERE A.CHANNEL_NUMBER=? AND B.USER_NAME=?");
70+ $stmt->bindParam(1, $channelId);
71+ $stmt->bindParam(2, $userName);
72+ $result = FALSE;
73+ if ($stmt->execute()) {
74+ $row = $stmt->fetch();
75+ if ($row) {
76+ if ($row["NUM"] > 0)
77+ $result = TRUE;
78+ }
79+ }
80+ $stmt->closeCursor();
81+ return $result;
82+ } catch(PDOException $e){
83+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
84+ }
85+ }
86+
87+ /**
88+ * Create new user account. This function insert to USER_INFO table.
89+ *
90+ * return Success->array of userinfo, otherwise->FALSE
91+ */
92+ function createUser($userId, $username, $password) {
93+ if (strlen($username) > MAX_USERNAME_LENGTH
94+ || strlen($password) > MAX_PASSWORD_LENGTH) {
95+ return FALSE;
96+ }
97+
98+ // exec insert
99+ try {
100+ $stmt = $this->pdo->prepare("INSERT INTO " . $this->tblUserInfo . "(USER_ID, USER_NAME, PASSWORD)" .
101+ " VALUES(?, ?, ?)");
102+ $stmt->bindParam(1, $userId);
103+ $stmt->bindParam(2, $username);
104+ $stmt->bindParam(3, $password);
105+ if (!$stmt->execute() || $stmt->rowCount() == 0) {
106+ return FALSE;
107+ } else {
108+ return TRUE;
109+ }
110+ } catch(PDOException $e){
111+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
112+ }
113+ }
114+
115+ /**
116+ * Insert user to LOGIN_LIST and LOGIN_LOG
117+ * return succeed->TRUE, otherwise->FALSE
118+ */
119+ function loginUser($channelNumber, $userId, $remoteAddress) {
120+ $userinfo = null;
121+ try {
122+ $stmt = $this->pdo->prepare("SELECT USER_NUMBER, USER_ID, USER_NAME" .
123+ " FROM " . $this->tblUserInfo . " WHERE USER_ID=?");
124+ $stmt->bindParam(1, $userId);
125+ $userinfo = FALSE;
126+ if ($stmt->execute()) {
127+ $row = $stmt->fetch();
128+ if ($row) {
129+ $userinfo = array(
130+ USERINFO_USER_NUMBER => $row["USER_NUMBER"] ,
131+ USERINFO_USER_ID => $row["USER_ID"] ,
132+ USERINFO_USER_NAME => $row["USER_NAME"] ,
133+ );
134+ }
135+ }
136+ $stmt->closeCursor();
137+ } catch(PDOException $e){
138+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
139+ }
140+ if ($userinfo) {
141+ $userNumber = $userinfo["USER_NUMBER"];
142+ try {
143+ $stmt = $this->pdo->prepare("INSERT INTO " . $this->tblLoginList . "(USER_NUMBER, CHANNEL_NUMBER, LAST_UPDATE)" .
144+ " VALUES(?, ?, NOW())");
145+ $stmt->bindParam(1, $userNumber);
146+ $stmt->bindParam(2, $channelNumber);
147+ if ($stmt->execute() && $stmt->rowCount() > 0) {
148+ outputLog($channelNumber, array(date("Y/m/d H:m:s"),"Login", CODE_WEB, $userinfo[USERINFO_USER_NAME], $remoteAddress));
149+ return $userinfo;
150+ }
151+ return FALSE;
152+ } catch(PDOException $e){
153+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
154+ }
155+ }
156+ }
157+
158+ /**
159+ * Delete user from LOGIN_LIST
160+ * return succeed->TRUE, otherwise->FALSE
161+ */
162+ function logoutUser($channelNumber, $userNumber) {
163+ try {
164+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblLoginList .
165+ " WHERE USER_NUMBER = ? AND CHANNEL_NUMBER=?");
166+ $stmt->bindParam(1, $userNumber);
167+ $stmt->bindParam(2, $channelNumber);
168+ if ($stmt->execute() && $stmt->rowCount() > 0) {
169+ return TRUE;
170+ } else {
171+ return FALSE;
172+ }
173+ } catch(PDOException $e){
174+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
175+ }
176+ }
177+
178+ /**
179+ * Update LOGIN_LIST.LAST_UPDATE of user by NOW().
180+ * If user was auto logouted, FALSE is returned.
181+ * return succeed->TRUE, otherwise->FALSE
182+ */
183+ function updateUserLoginState($channelNumber, $userNumber) {
184+ try {
185+ $stmt = $this->pdo->prepare("SELECT USER_NUMBER FROM " . $this->tblLoginList .
186+ " WHERE USER_NUMBER = ? AND CHANNEL_NUMBER=?");
187+ $stmt->bindParam(1, $userNumber);
188+ $stmt->bindParam(2, $channelNumber);
189+ $stmt->execute();
190+ $goflag = ($stmt->fetch() != NULL);
191+ $stmt->closeCursor();
192+ if ($goflag) {
193+ $stmt = $this->pdo->prepare("UPDATE " . $this->tblLoginList . " SET LAST_UPDATE=NOW()" .
194+ " WHERE USER_NUMBER = ? AND CHANNEL_NUMBER=?");
195+ $stmt->bindParam(1, $userNumber);
196+ $stmt->bindParam(2, $channelNumber);
197+ $stmt->execute();
198+ return TRUE;
199+ } else {
200+ return FALSE;
201+ }
202+ } catch(PDOException $e){
203+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
204+ }
205+ }
206+
207+ /**
208+ * Get log data for Web
209+ * return array of (INSERT_DATE, CODE, NAME, MESSAGE)
210+ */
211+ function getWebLogData($channelNumber, $limitRowNum) {
212+ try {
213+ $stmt = $this->pdo->prepare(
214+ "SELECT A.INSERT_TIME AS INSERT_TIME, A.MESSAGE AS MESSAGE, B.USER_NAME AS USER_NAME, A.AGENT_NAME AS AGENT_NAME".
215+ " FROM " . $this->tblMessageLog . " AS A".
216+ " LEFT OUTER JOIN " . $this->tblUserInfo . " AS B ON A.USER_NUMBER = B.USER_NUMBER".
217+ " WHERE A.CHANNEL_NUMBER=?".
218+ " ORDER BY A.NUMERICAL_ORDER DESC".
219+ " LIMIT ?"
220+ );
221+ $stmt->bindParam(1, $channelNumber);
222+ $stmt->bindParam(2, $limitRowNum, PDO::PARAM_INT);
223+ $result = array();
224+ if ($stmt->execute()) {
225+ while($row=$stmt->fetch()) {
226+ if ($row["USER_NAME"]) {
227+ $result[] = array(
228+ $row["INSERT_TIME"],
229+ CODE_WEB,
230+ $row["USER_NAME"],
231+ $row["MESSAGE"]);
232+ } else {
233+ $result[] = array(
234+ $row["INSERT_TIME"],
235+ CODE_SL,
236+ $row["AGENT_NAME"],
237+ $row["MESSAGE"]);
238+ }
239+ }
240+ }
241+ $stmt->closeCursor();
242+ return $result;
243+ } catch(PDOException $e){
244+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
245+ }
246+ }
247+
248+ /**
249+ * Get log data for Web, there were inserted after CHANNEL_INFO.LAST.UPDATE.
250+ * return array of (INSERT_DATE, NAME, MESSAGE)
251+ */
252+ function getSlLogData($channelNumber, $targetDate) {
253+ try {
254+ $stmt = $this->pdo->prepare(
255+ "SELECT A.INSERT_TIME AS INSERT_TIME, A.MESSAGE AS MESSAGE, B.USER_NAME AS USER_NAME" .
256+ " FROM " . $this->tblMessageLog . " AS A, " . $this->tblUserInfo . " AS B" .
257+ " WHERE CHANNEL_NUMBER=?" .
258+ " AND A.USER_NUMBER = B.USER_NUMBER" .
259+ " AND A.INSERT_TIME >= STR_TO_DATE(?, '%Y/%m/%d %H:%i:%s')" .
260+ " ORDER BY A.NUMERICAL_ORDER ASC");
261+ $stmt->bindParam(1, $channelNumber);
262+ $stmt->bindParam(2, $targetDate);
263+ $result = array();
264+ if ($stmt->execute()) {
265+ while($row=$stmt->fetch()) {
266+ $result[] = array($row["INSERT_TIME"], $row["USER_NAME"], $row["MESSAGE"]);
267+ }
268+ }
269+ $stmt->closeCursor();
270+ return $result;
271+ } catch(PDOException $e){
272+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
273+ }
274+ }
275+
276+ /**
277+ * Insert message into MESSAGE_LOG for SL.
278+ * If length of message is more than MAX_MESSAGE_LENGTH, message will be cut.
279+ * return succeed->TRUE, otherwise->FALSE
280+ */
281+ function insertSlMessage($channelNumber, $agentName, $message) {
282+ if (strlen($message) > MAX_MESSAGE_LENGTH) {
283+ $message = substr($message, 0, MAX_MESSAGE_LENGTH);
284+ }
285+
286+ try {
287+ $stmt = $this->pdo->prepare("INSERT INTO " . $this->tblMessageLog . "(CHANNEL_NUMBER, AGENT_NAME, MESSAGE, INSERT_TIME) VALUES (?, ?, ?, NOW())");
288+ $stmt->bindParam(1, $channelNumber);
289+ $stmt->bindParam(2, $agentName);
290+ $stmt->bindParam(3, $message);
291+ if ($stmt->execute() && $stmt->rowCount() > 0) {
292+ outputLog($channelNumber, array(date("Y/m/d H:m:s"), "Msg", "SL", $agentName, $message));
293+ return TRUE;
294+ } else {
295+ return FALSE;
296+ }
297+ } catch(PDOException $e){
298+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
299+ }
300+ }
301+
302+ /**
303+ * Insert message into MESSAGE_LOG for Web.
304+ * If length of message is more than MAX_MESSAGE_LENGTH, message will be cut.
305+ * return succeed->TRUE, otherwise->FALSE
306+ */
307+ function insertWebMessage($channelNumber, $userNumber, $userName, $message) {
308+ if (strlen($message) > MAX_MESSAGE_LENGTH) {
309+ $message = substr($message, 0, MAX_MESSAGE_LENGTH);
310+ }
311+
312+ try {
313+ $stmt = $this->pdo->prepare("INSERT INTO " . $this->tblMessageLog . "(CHANNEL_NUMBER, USER_NUMBER, MESSAGE, INSERT_TIME) VALUES (?, ?, ?, NOW())");
314+ $stmt->bindParam(1, $channelNumber);
315+ $stmt->bindParam(2, $userNumber);
316+ $stmt->bindParam(3, $message);
317+ if ($stmt->execute() && $stmt->rowCount() > 0) {
318+ outputLog($channelNumber, array(date("Y/m/d H:m:s"), "Msg", "Web", $userName, $message));
319+ return TRUE;
320+ } else {
321+ return FALSE;
322+ }
323+ } catch(PDOException $e){
324+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
325+ }
326+ }
327+
328+ /**
329+ * Delete AGENT_LIST.
330+ */
331+ function deleteAgentList($channelNumber) {
332+ try {
333+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblAgentList . " WHERE CHANNEL_NUMBER = ?");
334+ $stmt->bindParam(1, $channelNumber);
335+ if ($stmt->execute()) {
336+ return TRUE;
337+ } else {
338+ return FALSE;
339+ }
340+ } catch(PDOException $e){
341+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
342+ }
343+ }
344+
345+ /**
346+ * insert agent to AGENT_LIST.
347+ */
348+ function insertAgentList($channelNumber, $agentName) {
349+ try {
350+ $stmt = $this->pdo->prepare("INSERT INTO " . $this->tblSlAgent . "(AGENT_NAME) VALUES (?)");
351+ $stmt->bindParam(1, $agentName);
352+ $stmt->execute();
353+
354+ $stmt = $this->pdo->prepare("INSERT INTO " . $this->tblAgentList . " (AGENT_NAME, CHANNEL_NUMBER) VALUES (?, ?)");
355+ $stmt->bindParam(1, $agentName);
356+ $stmt->bindParam(2, $channelNumber);
357+ if ($stmt->execute() && $stmt->rowCount() > 0) {
358+ return TRUE;
359+ } else {
360+ return FALSE;
361+ }
362+ } catch(PDOException $e){
363+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
364+ }
365+ }
366+
367+
368+ /**
369+ * Getting username list FROM USER_LIST.
370+ * return array of username
371+ */
372+ function getLoginedUserList($channelNumber) {
373+ try {
374+ //Getting FROM USER_LIST
375+ $stmt = $this->pdo->prepare(
376+ "SELECT B.USER_NAME AS USER_NAME FROM " . $this->tblLoginList . " AS A, " . $this->tblUserInfo . " AS B" .
377+ " WHERE A.CHANNEL_NUMBER = ? AND A.USER_NUMBER = B.USER_NUMBER");
378+ $stmt->bindParam(1, $channelNumber);
379+ $result = array();
380+ if ($stmt->execute()) {
381+ while($row=$stmt->fetch()) {
382+ $result[] = $row["USER_NAME"];
383+ }
384+ }
385+ $stmt->closeCursor();
386+ return $result;
387+ } catch(PDOException $e){
388+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
389+ }
390+ }
391+
392+ /**
393+ * Getting agentname list FROM AGENT_LIST.
394+ * return array of agentname
395+ */
396+ function getLoginedAgentList($channelNumber) {
397+ try {
398+ //Getting FROM AGENT_LIST
399+ $stmt = $this->pdo->prepare(
400+ "SELECT AGENT_NAME FROM " . $this->tblAgentList . " WHERE CHANNEL_NUMBER = ?");
401+ $stmt->bindParam(1, $channelNumber);
402+ $result = array();
403+ if ($stmt->execute()) {
404+ while($row=$stmt->fetch()) {
405+ $result[] = $row["AGENT_NAME"];
406+ }
407+ }
408+ $stmt->closeCursor();
409+ return $result;
410+ } catch(PDOException $e){
411+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
412+ }
413+ }
414+
415+ /**
416+ * Getting ChannelList and Infomation.
417+ * return array of (ChannelNumber, ChannelName, UserNum, AgentNum)
418+ */
419+ function getChannelList() {
420+ try {
421+ //Getting FROM AGENT_LIST
422+ $stmt = $this->pdo->prepare(
423+ "SELECT A.CHANNEL_NUMBER AS CHANNEL_NUMBER, A.CHANNEL_NAME AS CHANNEL_NAME," .
424+ " IF (B.USER_NUM IS NOT NULL, B.USER_NUM, 0) AS USER_NUM," .
425+ " IF (C.AGENT_NUM IS NOT NULL, C.AGENT_NUM, 0) AS AGENT_NUM" .
426+ " FROM " . $this->tblChannelInfo . " AS A LEFT OUTER JOIN" .
427+ " (SELECT CHANNEL_NUMBER, COUNT(USER_NUMBER) AS USER_NUM FROM " . $this->tblLoginList . " GROUP BY CHANNEL_NUMBER) AS B" .
428+ " ON A.CHANNEL_NUMBER = B.CHANNEL_NUMBER LEFT OUTER JOIN" .
429+ " (SELECT CHANNEL_NUMBER, COUNT(AGENT_NAME) AS AGENT_NUM FROM " . $this->tblAgentList . " GROUP BY CHANNEL_NUMBER) AS C" .
430+ " ON A.CHANNEL_NUMBER = C.CHANNEL_NUMBER");
431+ $result = array();
432+ if ($stmt->execute()) {
433+ while($row=$stmt->fetch()) {
434+ $result[] = array(
435+ $row["CHANNEL_NUMBER"],
436+ $row["CHANNEL_NAME"],
437+ $row["USER_NUM"],
438+ $row["AGENT_NUM"]);
439+ }
440+ }
441+ $stmt->closeCursor();
442+ return $result;
443+ } catch(PDOException $e){
444+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
445+ }
446+ }
447+
448+ function getChannelNumber($ownerId) {
449+ $result = FALSE;
450+ try {
451+ $stmt = $this->pdo->prepare("SELECT CHANNEL_NUMBER FROM CHANNEL_INFO WHERE OWNER_ID=?");
452+ $stmt->bindParam(1, $ownerId);
453+ if ($stmt->execute()) {
454+ $row = $stmt->fetch();
455+ if ($row) {
456+ $result = $row["CHANNEL_NUMBER"];
457+ }
458+ }
459+ $stmt->closeCursor();
460+ return $result;
461+ } catch(PDOException $e){
462+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
463+ }
464+ }
465+
466+ /**
467+ * Get CHANNEL_INFO.LAST_UPDATE
468+ * return succedd->LAST_UPDATE, otherwise->FALSE
469+ */
470+ function getChannelInfoLastUpdate($channelNumber) {
471+ $result = FALSE;
472+ try {
473+ $stmt = $this->pdo->prepare("SELECT DATE_FORMAT(LAST_UPDATE, '%Y/%m/%d %H:%i:%s') AS LAST_UPDATE FROM " . $this->tblChannelInfo . " WHERE CHANNEL_NUMBER=?");
474+ $stmt->bindParam(1, $channelNumber);
475+ if ($stmt->execute()) {
476+ $row = $stmt->fetch();
477+ if ($row) {
478+ $result = $row["LAST_UPDATE"];
479+ }
480+ }
481+ $stmt->closeCursor();
482+ return $result;
483+ } catch(PDOException $e){
484+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
485+ }
486+ }
487+
488+ /**
489+ * Updating CHANNEL_INFO.LAST_UPDATE
490+ * return succeed->previous LAST_UPDATE, otherwise->FALSE
491+ */
492+ function updateChannel($channelNumber) {
493+ $result = $this->getChannelInfoLastUpdate($channelNumber);
494+ if ($result === FALSE) {
495+ return FALSE;
496+ }
497+
498+
499+ try {
500+ $stmt = $this->pdo->prepare("UPDATE " . $this->tblChannelInfo . " SET LAST_UPDATE=NOW() WHERE CHANNEL_NUMBER=?");
501+ $stmt->bindParam(1, $channelNumber);
502+ $stmt->execute();
503+ return $result;
504+ } catch(PDOException $e){
505+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
506+ }
507+ }
508+
509+ /**
510+ * Setup tunnel.
511+ * return succeed->TRUE, otherwise->FALSE
512+ */
513+ function setupTunnel($ownerId, $uuid, $password, $channelName) {
514+ try {
515+ $stmt = $this->pdo->prepare("SELECT UUID FROM " . $this->tblChannelInfo . " WHERE OWNER_ID=? AND PASSWORD=?");
516+ $stmt->bindParam(1, $ownerId);
517+ $stmt->bindParam(2, $password);
518+ $goflag = $stmt->execute() && ($stmt->fetch() != NULL);
519+ $stmt->closeCursor();
520+ if ($goflag) {
521+ $stmt = $this->pdo->prepare("UPDATE " . $this->tblChannelInfo . " SET UUID=?, LAST_UPDATE=NOW(),CHANNEL_NAME=? WHERE OWNER_ID=? AND PASSWORD=?");
522+ $stmt->bindParam(1, $uuid);
523+ $stmt->bindParam(2, $channelName);
524+ $stmt->bindParam(3, $ownerId);
525+ $stmt->bindParam(4, $password);
526+ $stmt->execute();
527+ return TRUE;
528+ } else {
529+ return FALSE;
530+ }
531+ } catch(PDOException $e){
532+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
533+ }
534+ }
535+
536+
537+ /**
538+ * Check whether tunnel is available.
539+ * return available->CHANNEL_NUMBER, otherwise->FALSE
540+ */
541+ function checkTunnelAvailable($ownerId, $uuid, $password) {
542+ try {
543+ $stmt = $this->pdo->prepare("SELECT CHANNEL_NUMBER FROM " . $this->tblChannelInfo . " WHERE OWNER_ID=? AND UUID=? AND PASSWORD=?");
544+ $stmt->bindParam(1, $ownerId);
545+ $stmt->bindParam(2, $uuid);
546+ $stmt->bindParam(3, $password);
547+ $channelNumber = FALSE;
548+ if ($stmt->execute()) {
549+ $row = $stmt->fetch();
550+ if ($row) {
551+ $channelNumber = $row["CHANNEL_NUMBER"];
552+ }
553+ }
554+ $stmt->closeCursor();
555+ return $channelNumber;
556+ } catch(PDOException $e){
557+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
558+ }
559+ }
560+
561+ function isTimeToCleanup($channelNumber) {
562+ try {
563+ $stmt = $this->pdo->prepare("SELECT CHANNEL_NUMBER FROM " . $this->tblChannelInfo . " WHERE CHANNEL_NUMBER = ? AND LAST_CLEANUP < DATE_ADD(NOW(), INTERVAL ? SECOND)");
564+ $stmt->bindParam(1, $channelNumber);
565+ $cleanupInterval = -CLEAN_UP_INTERVAL;
566+ $stmt->bindParam(2, $cleanupInterval);
567+ $goflag = $stmt->execute() && ($stmt->fetch() != NULL);
568+ $stmt->closeCursor();
569+ return $goflag;
570+ } catch(PDOException $e){
571+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
572+ }
573+ }
574+
575+ function execCleanup($channelNumber){
576+ global $logDumpInterval;
577+ try {
578+ //Updating LAST_CLEANUP
579+ $stmt = $this->pdo->prepare("UPDATE " . $this->tblChannelInfo . " SET LAST_CLEANUP=NOW() WHERE CHANNEL_NUMBER = ?");
580+ $stmt->bindParam(1, $channelNumber);
581+ if (!$stmt->execute()) {
582+ return FALSE;
583+ }
584+
585+ //Deleting users who passed more than AUTO_LOGOUT_INTERVAL.
586+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblLoginList . " WHERE CHANNEL_NUMBER = ? AND LAST_UPDATE < DATE_ADD(NOW(), INTERVAL ? SECOND)");
587+ $stmt->bindParam(1, $channelNumber);
588+ $autoLogoutInterval = -AUTO_LOGOUT_INTERVAL;
589+ $stmt->bindParam(2, $autoLogoutInterval);
590+ if (!$stmt->execute() || $stmt->rowCount() == 0) {
591+ return FALSE;
592+ }
593+ return TRUE;
594+ } catch(PDOException $e){
595+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
596+ }
597+ }
598+
599+ function isTimeToLogDump(){
600+ global $logDumpInterval;
601+ try {
602+ //Checking whether time is log dump
603+ $stmt = $this->pdo->prepare("SELECT LAST_LOGDUMP FROM " . $this->tblSlwebtunnelSystem . " WHERE LAST_LOGDUMP < DATE_ADD(NOW(), INTERVAL -? MINUTE)");
604+ $stmt->bindParam(1, $logDumpInterval, PDO::PARAM_INT);
605+ $goflag = $stmt->execute() && ($stmt->fetch() != NULL);
606+ $stmt->closeCursor();
607+ return $goflag;
608+ } catch(PDOException $e){
609+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
610+ }
611+ }
612+
613+ function execLogDump() {
614+ /*
615+ global $logDumpEnabled, $logDumpDir, $logDumpFilePrefix, $logDumpInterval;
616+ $goflag = FALSE;
617+ if ($logDumpEnabled) {
618+ $strDate = date("Ymd");
619+ $fp = fopen($logDumpDir."/".$logDumpFilePrefix.$strDate.".log", "a");
620+ if ($fp && flock($fp, LOCK_EX)) {
621+ try {
622+ $stmt = $this->pdo->prepare(
623+ "SELECT "M" AS FLAG, A.CHANNEL_NUMBER AS CHANNEL_NUMBER, A.INSERT_TIME AS INSERT_TIME, IF (B.USER_NAME IS NOT NULL, CONCAT("WEB:", B.USER_NAME), CONCAT("SL:", A.AGENT_NAME)) AS USER_NAME, A.MESSAGE AS MESSAGE"
624+ ." FROM " . $this->tblMessageLog . " AS A LEFT OUTER JOIN " . $this->tblUserInfo . " AS B ON A.USER_NUMBER = B.USER_NUMBER"
625+ ." WHERE A.INSERT_TIME < DATE_ADD(NOW(), INTERVAL -? MINUTE)"
626+ ." UNION ALL"
627+ ." SELECT "L" AS FLAG, A.CHANNEL_NUMBER AS CHANNEL_NUMBER, A.LOGIN_TIME, B.USER_NAME, A.REMOTE_ADDRESS AS MESSAGE"
628+ ." FROM " . $this->tblLoginLog . " AS A, " . $this->tblUserInfo . " AS B, (SELECT LAST_LOGDUMP FROM " . $this->tblSlwebtunnelSystem . " LIMIT 1) AS C"
629+ ." WHERE A.USER_NUMBER = B.USER_NUMBER"
630+ ." AND C.LAST_LOGDUMP <= A.LOGIN_TIME AND A.LOGIN_TIME < DATE_ADD(NOW(), INTERVAL -? MINUTE)"
631+ ." ORDER BY INSERT_TIME ASC");
632+ $stmt->bindParam(1, $logDumpInterval, PDO::PARAM_INT);
633+ $stmt->bindParam(2, $logDumpInterval, PDO::PARAM_INT);
634+ if ($stmt->execute()) {
635+ while($row = $stmt->fetch()) {
636+ $strDump = $row["FLAG"].":".$row["CHANNEL_NUMBER"].":".$row["INSERT_TIME"].":".$row["USER_NAME"].":".$row["MESSAGE"]."\n";
637+ fwrite($fp,$strDump);
638+ }
639+ }
640+ $stmt->closeCursor();
641+ fclose($fp);
642+ $goflag = TRUE;
643+ } catch(PDOException $e){
644+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
645+ }
646+ }
647+ } else {
648+ $goflag = TRUE;
649+ }
650+ if ($goflag) {
651+ try {
652+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblMessageLog . " WHERE INSERT_TIME < DATE_ADD(NOW(), INTERVAL -? MINUTE)");
653+ $stmt->bindParam(1, $logDumpInterval, PDO::PARAM_INT);
654+ $stmt->execute();
655+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblUserInfo . " WHERE USER_NUMBER NOT IN (SELECT USER_NUMBER FROM " . $this->tblLoginList . ")");
656+ $stmt->execute();
657+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblSlAgent . " WHERE AGENT_NAME NOT IN (SELECT AGENT_NAME FROM " . $this->tblAgentList . ")");
658+ $stmt->execute();
659+
660+ $stmt = $this->pdo->prepare("UPDATE " . $this->tblSlwebtunnelSystem . " SET LAST_LOGDUMP=NOW()");
661+ $stmt->execute();
662+ } catch(PDOException $e){
663+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
664+ }
665+ }
666+ */
667+ global $logDumpInterval;
668+ try {
669+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblMessageLog . " WHERE INSERT_TIME < DATE_ADD(NOW(), INTERVAL -? MINUTE)");
670+ $stmt->bindParam(1, $logDumpInterval, PDO::PARAM_INT);
671+ $stmt->execute();
672+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblUserInfo . " WHERE USER_NUMBER NOT IN (SELECT USER_NUMBER FROM " . $this->tblLoginList . ")");
673+ $stmt->execute();
674+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblSlAgent . " WHERE AGENT_NAME NOT IN (SELECT AGENT_NAME FROM " . $this->tblAgentList . ")");
675+ $stmt->execute();
676+
677+ $stmt = $this->pdo->prepare("UPDATE " . $this->tblSlwebtunnelSystem . " SET LAST_LOGDUMP=NOW()");
678+ $stmt->execute();
679+ } catch(PDOException $e){
680+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
681+ }
682+ }
683+
684+ function insertTransmitQueue($channelNumber, $queueNumber, $nextQueueNumber, $body) {
685+ try {
686+ $stmt = $this->pdo->prepare("INSERT INTO " . $this->tblTransmitQueue . "(CHANNEL_NUMBER, QUEUE_NUMBER, NEXT_QUEUE_NUMBER, BODY, INSERT_DATE) VALUES (?,?,?,?,NOW())");
687+ $stmt->bindParam(1, $channelNumber);
688+ $stmt->bindParam(2, $queueNumber);
689+ $stmt->bindParam(3, $nextQueueNumber);
690+ $stmt->bindParam(4, $body);
691+ if ($stmt->execute() && $stmt->rowCount() > 0) {
692+ return TRUE;
693+ }
694+ return FALSE;
695+ } catch(PDOException $e){
696+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
697+ }
698+ }
699+
700+ /**
701+ * Delete all TransmitQueue of channel
702+ */
703+ function deleteTransmitQueue($channelNumber) {
704+ try {
705+ $stmt = $this->pdo->prepare("DELETE FROM " . $this->tblTransmitQueue . " WHERE CHANNEL_NUMBER = ?");
706+ $stmt->bindParam(1, $channelNumber);
707+ return $stmt->execute();
708+ } catch(PDOException $e){
709+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
710+ }
711+ }
712+
713+ /**
714+ * Get NEXT_QUEUE_NUMBER and BODY
715+ */
716+ function getTransmitQueue($channelNumber, $queueNumber) {
717+ try {
718+ $stmt = $this->pdo->prepare("SELECT NEXT_QUEUE_NUMBER,BODY FROM " . $this->tblTransmitQueue . " WHERE CHANNEL_NUMBER = ? AND QUEUE_NUMBER = ?");
719+ $stmt->bindParam(1, $channelNumber);
720+ $stmt->bindParam(2, $queueNumber);
721+ $body = FALSE;
722+ if ($stmt->execute()) {
723+ $row = $stmt->fetch();
724+ if ($row) {
725+ $body = array($row["NEXT_QUEUE_NUMBER"], $row["BODY"]);
726+ }
727+ }
728+ $stmt->closeCursor();
729+ return $body;
730+ } catch(PDOException $e){
731+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
732+ }
733+ }
734+
735+ /**
736+ * get Sequence for UserId
737+ */
738+ function getNextUserNumber() {
739+ $stmt = $this->pdo->prepare("UPDATE " . $this->tblSeqUserNumber . " SET ID=LAST_INSERT_ID(ID+1)");
740+ try {
741+ if ($stmt->execute()) {
742+ $stmt = $this->pdo->prepare("SELECT LAST_INSERT_ID() AS ID");
743+ if ($stmt->execute()) {
744+ $row = $stmt->fetch();
745+ if ($row !== FALSE) {
746+ return $row["ID"];
747+ }
748+ }
749+ }
750+ return FALSE;
751+ } catch(PDOException $e){
752+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
753+ }
754+ }
755+
756+ /**
757+ * get Sequence for TransmitQueue
758+ */
759+ function getNextSeqTransmitQueue() {
760+ $stmt = $this->pdo->prepare("UPDATE " . $this->tblSeqQueueNumber . " SET ID=LAST_INSERT_ID(ID+1)");
761+ try {
762+ if ($stmt->execute()) {
763+ $stmt = $this->pdo->prepare("SELECT LAST_INSERT_ID() AS ID");
764+ if ($stmt->execute()) {
765+ $row = $stmt->fetch();
766+ if ($row !== FALSE) {
767+ return $row["ID"];
768+ }
769+ }
770+ }
771+ return FALSE;
772+ } catch(PDOException $e){
773+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
774+ }
775+ }
776+
777+ /**
778+ * Exec SQL file.
779+ * return array of (sql, successFlag, rouCount)
780+ */
781+ function execSqlFile($fileName) {
782+ global $tblPrefix;
783+ $strSqlFile = file_get_contents($fileName);
784+ $strSqls = explode(";", $strSqlFile);
785+ $results = array();
786+
787+ foreach($strSqls as $strSql) {
788+ $strSql = trim($strSql);
789+ if (!isBlank($strSql)) {
790+ $strSql = str_replace("\${tblPrefix}", $tblPrefix, $strSql);
791+ $stmt = $this->pdo->prepare($strSql);
792+ if ($stmt) {
793+ $r = $stmt->execute();
794+ $results[] = array($strSql, $r, $stmt->rowCount());
795+ } else {
796+ $results[] = array($strSql, false, "null");
797+ }
798+ }
799+ }
800+ return $results;
801+ }
802+
803+ /**
804+ * Initialize Database.
805+ * return array of (condition, successFlag, rouCount)
806+ */
807+ function initializeDatabase() {
808+ return $this->execSqlFile(CREATE_DB_SQL_FILE);
809+ }
810+
811+ /**
812+ * check Database.
813+ * reuturn array of (condition, successFlag)
814+ */
815+ function checkDatabase() {
816+ $result = array();
817+ if (!$this->initialize()) {
818+ $result[] = array(ADMMSG_DB_CONNECTION, false);
819+ return $result;
820+ }
821+ $result[] = array(ADMMSG_DB_CONNECTION, true);
822+
823+ $tblList = array($this->tblSlwebtunnelSystem,
824+ $this->tblUserInfo,
825+ $this->tblChannelInfo,
826+ $this->tblTransmitQueue,
827+ $this->tblSeqQueueNumber,
828+ $this->tblSeqUserNumber,
829+ $this->tblSlAgent,
830+ $this->tblLoginList,
831+ $this->tblAgentList,
832+ $this->tblMessageLog
833+ );
834+ foreach($tblList as $tblName) {
835+ try {
836+ $stmt = $this->pdo->prepare("SELECT COUNT(*) FROM " . $tblName);
837+ if ($stmt) {
838+ if ($stmt->execute()) {
839+ $stmt->closeCursor();
840+ $result[] = array($tblName, true);
841+ } else {
842+ $result[] = array($tblName, false);
843+ }
844+ } else {
845+ $result[] = array(ADMMSG_TABLE_EXISTS.$tblName, false);
846+ }
847+ } catch(PDOException $e){
848+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
849+ }
850+ }
851+ $this->dispose();
852+ return $result;
853+ }
854+
855+ /**
856+ * Get CHANNEL_INFO
857+ * return succedd->array of [CHANNEL_NUMBER, OWNER_ID, LAST_UPDATE], otherwise->FALSE
858+ */
859+ function getChannelInfoForAdmin() {
860+ $result = FALSE;
861+ try {
862+ $stmt = $this->pdo->prepare("SELECT CHANNEL_NUMBER, OWNER_ID, DATE_FORMAT(LAST_UPDATE, '%Y/%m/%d %H:%i:%s') AS LAST_UPDATE FROM " . $this->tblChannelInfo);
863+ $result = array();
864+ if ($stmt->execute()) {
865+ while ($row = $stmt->fetch()) {
866+ $result[] = array($row["CHANNEL_NUMBER"], $row["OWNER_ID"], $row["LAST_UPDATE"]);
867+ }
868+ }
869+ $stmt->closeCursor();
870+ return $result;
871+ } catch(PDOException $e){
872+ die(MSG_ERROR_DB_SELECT . ":" . $e->getMessage());
873+ }
874+ }
875+ function updateChannelInfoForAdmin($channelNumber, $ownerId, $passKey) {
876+ try {
877+ $stmt = $this->pdo->prepare("UPDATE ".$this->tblChannelInfo." SET OWNER_ID=?,PASSWORD=IF(?='',PASSWORD,?) WHERE CHANNEL_NUMBER=?");
878+ $stmt->bindParam(1, $ownerId, PDO::PARAM_STR);
879+ $stmt->bindParam(2, $passKey, PDO::PARAM_STR);
880+ $stmt->bindParam(3, $passKey, PDO::PARAM_STR);
881+ $stmt->bindParam(4, $channelNumber, PDO::PARAM_INT);
882+
883+ return ($stmt->execute() && $stmt->rowCount() > 0);
884+
885+ } catch(PDOException $e){
886+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
887+ }
888+ }
889+ function insertChannelInfoForAdmin($ownerId, $passKey) {
890+ try {
891+ $stmt = $this->pdo->prepare("INSERT INTO ".$this->tblChannelInfo."(CHANNEL_NAME, LAST_UPDATE, LAST_CLEANUP, OWNER_ID, PASSWORD)" .
892+ " VALUES ('', NOW(), NOW(), ?, ?)");
893+ $stmt->bindParam(1, $ownerId, PDO::PARAM_STR);
894+ $stmt->bindParam(2, $passKey, PDO::PARAM_STR);
895+
896+ return ($stmt->execute() && $stmt->rowCount() > 0);
897+
898+ } catch(PDOException $e){
899+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
900+ }
901+ }
902+ function deleteChannelInfoForAdmin($channelNumber) {
903+ try {
904+ $stmt = $this->pdo->prepare("DELETE FROM ".$this->tblChannelInfo." WHERE CHANNEL_NUMBER=?");
905+ $stmt->bindParam(1, $channelNumber, PDO::PARAM_INT);
906+
907+ return ($stmt->execute() && $stmt->rowCount() > 0);
908+
909+ } catch(PDOException $e){
910+ die(MSG_ERROR_DB_UPDATE . ":" . $e->getMessage());
911+ }
912+ }
913+ }
914+?>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/slwtdatamanfile.php (nonexistent)
+++ slwebtunnel/trunk/src/slwtdatamanfile.php (revision 6)
@@ -0,0 +1,995 @@
1+<?php
2+/*
3+ * SlWebTunnel
4+ * Manage data functions for File
5+ * $Id$
6+ * Created on 2007/11/10
7+ *
8+ */
9+
10+ require_once 'slwebtunnel.ini.php';
11+
12+
13+class DbTable
14+{
15+ var $rowSequence;
16+ var $labels;
17+ var $values;
18+ var $uniqueKeys;
19+ var $narrowKeys;
20+ var $updateFlag;
21+
22+ var $fileName;
23+ var $lock;
24+ var $fp;
25+ var $openFlag;
26+
27+ function DbTable($fileName, $lock)
28+ {
29+ $this->fileName = $fileName;
30+ $this->lock = $lock;
31+ $this->openFlag = false;
32+ }
33+
34+ function loadFile($uniqueKeys, $narrowKeys, $labels)
35+ {
36+ $this->rowSequence = 0;
37+ $this->labels = array();
38+ $this->values = array();
39+ $this->uniqueKeys = array();
40+ $this->narrowKeys = array();
41+
42+ foreach($uniqueKeys as $uk) {
43+ $this->uniqueKeys[$uk] = array();
44+ }
45+ foreach($narrowKeys as $nk) {
46+ $this->narrowKeys[$nk] = array();
47+ }
48+
49+ if ($this->lock) {
50+ $this->fp = fopen($this->fileName, 'r+');
51+ $goflag = flock($this->fp, LOCK_EX);
52+ } else {
53+ $this->fp = fopen($this->fileName, 'r');
54+ $goflag = flock($this->fp, LOCK_SH);
55+ }
56+
57+ if ($goflag)
58+ {
59+ $lt = fgetArray($this->fp);
60+ if ($lt !== FALSE)
61+ {
62+ //check key exsitence
63+ foreach($this->uniqueKeys as $uk => $v) {
64+ if (array_search($uk, $lt) === null) {
65+ //die("LabeldTable->load : uniqueKey '".$uk."' does not exist.");
66+ fclose($this->fp);
67+ return false;
68+ }
69+ }
70+ foreach($this->uniqueKeys as $nk => $v) {
71+ if (array_search($nk, $lt) === null) {
72+ //die("LabeldTable->load : narrowKey '".$nk."' does not exist.");
73+ fclose($this->fp);
74+ return false;
75+ }
76+ }
77+
78+ $this->labels = $lt;
79+ $this->addLabels($labels);
80+
81+ while(($data = fgetArray($this->fp)) !== FALSE)
82+ {
83+ $row = array();
84+ foreach($this->labels as $n => $l) {
85+ $row[$l] = $data[$n];
86+ }
87+
88+ $this->insert($row);
89+ }
90+ }
91+ else
92+ {
93+ $this->labels = array_merge($uniqueKeys, $narrowKeys,$labels);
94+ }
95+ if (!$this->lock) {
96+ flock($this->fp, LOCK_UN);
97+ fclose($this->fp);
98+ }
99+ $this->openFlag = true;
100+ $this->updateFlag = false;
101+ return TRUE;
102+ }
103+ else
104+ {
105+ die("Could not lock ".$this->fileName.".");
106+ }
107+ }
108+ function saveFile()
109+ {
110+ if (!$this->updateFlag) {
111+ if ($this->lock) {
112+ flock($this->fp, LOCK_UN);
113+ fclose($this->fp);
114+ }
115+ return TRUE;
116+ }
117+
118+ if ($this->lock) {
119+ $goflag = ftruncate ($this->fp, 0) && rewind($this->fp);
120+ } else {
121+ $this->fp = fopen($this->fileName, 'w');
122+ $goflag = flock($this->fp, LOCK_EX);
123+ }
124+
125+ if ($goflag)
126+ {
127+ fputArray($this->fp, $this->labels);
128+ $label_num = count($this->labels);
129+ foreach($this->values as $info)
130+ {
131+ $data = array();
132+ for ($i=0;$i<$label_num;$i++)
133+ {
134+ $data[$i] = $info[$this->labels[$i]];
135+ }
136+ fputArray($this->fp, $data);
137+ }
138+ flock($this->fp, LOCK_UN);
139+ fclose($this->fp);
140+ $this->openFlag = false;
141+ return TRUE;
142+ }
143+ else
144+ {
145+ //die("Could not lock ".$this->fileName." file");
146+ return false;
147+ }
148+ }
149+ function addLabels(array $lbs)
150+ {
151+ foreach($lbs as $l)
152+ {
153+ if (!in_array($l, $this->labels))
154+ {
155+ $this->labels[] = $l;
156+ }
157+ }
158+ }
159+ function getRow($n) {
160+ $v = $this->values[$n];
161+ if (is_array($v)) {
162+ return $v;
163+ } else {
164+ return null;
165+ }
166+ }
167+ function getRowAll() {
168+ return $this->values;
169+ }
170+ function getRows($ns) {
171+ $result = array();
172+ foreach($ns as $n) {
173+ $v = $this->values[$n];
174+ if (is_array($v)) {
175+ $result[$n] = $v;
176+ }
177+ }
178+ return $result;
179+ }
180+ function getRowByUniqueKey($uniqueKey, $keyValue) {
181+ return $this->getRow($this->selectByUniqueKey($uniqueKey, $keyValue));
182+ }
183+
184+ function getRowsByNarrowKey($narrowKey, $keyValue) {
185+ return $this->getRows($this->selectByNarrowKey($narrowKey, $keyValue));
186+ }
187+
188+ function selectByUniqueKey($uniqueKey, $keyValue) {
189+ $rowNum = $this->uniqueKeys[$uniqueKey][$keyValue];
190+ if ($rowNum !== null) {
191+ return $rowNum;
192+ } else {
193+ return -1;
194+ }
195+ }
196+ function selectByNarrowKey($narrowKey, $keyValue) {
197+ $ns = $this->narrowKeys[$narrowKey][$keyValue];
198+ if (is_array($ns)) {
199+ return $ns;
200+ } else {
201+ return array();
202+ }
203+ }
204+
205+ /**
206+ * insert row.
207+ * if uniqueKey is blank, Row will not be inserted.
208+ * return number of effected row(0 or 1)
209+ */
210+ function insert($row) {
211+ //check duplication
212+ foreach($this->uniqueKeys as $uk => $ukn) {
213+ if ($row[$uk] === null) {
214+ //die("UniqueKey is null : ".$uk);
215+ return 0;
216+ }
217+
218+ if ($ukn[$row[$uk]] !== null) {
219+ //die("Duplicated UniqueKey : ".$uk." => ".$row[$uk].".");
220+ return 0;
221+ }
222+ }
223+
224+ //exec insert
225+ foreach($this->uniqueKeys as $uk => $ukn) {
226+ $this->uniqueKeys[$uk][$row[$uk]] = $this->rowSequence;
227+ }
228+ foreach($this->narrowKeys as $nk => $nkns) {
229+ if ($row[$nk] !== null) {
230+ $this->narrowKeys[$nk][$row[$nk]][] = $this->rowSequence;
231+ }
232+ }
233+
234+ $this->updateFlag = true;
235+ $this->values[$this->rowSequence] = $row;
236+ $this->rowSequence++;
237+
238+ return 1;
239+ }
240+
241+ /**
242+ * update row.
243+ * if uniqueKey is blank or collide with other, Row will not be updated.
244+ * return number of effected row(0 or 1)
245+ */
246+ function update($rowNum, $values) {
247+ $updateUK = array_intersect_key($values, $this->uniqueKeys);
248+ $updateNK = array_intersect_key($values, $this->narrowKeys);
249+
250+ //check duplication, and update uniqueKey
251+ if (count($updateUK > 0)) {
252+ foreach($updateUK as $label => $value) {
253+ $c = $this->uniqueKeys[$label][$value];
254+ if ($c !== null && $rowNum != $c) {
255+ return 0;
256+ }
257+ }
258+ foreach($updateUK as $label => $value) {
259+ $currentValue = $this->values[$rowNum][$label];
260+ unset($this->uniqueKeys[$label][$currentValue]);
261+ $this->uniqueKeys[$label][$value] = $rowNum;
262+ }
263+ }
264+ //update narrowKey
265+ if (count($updateNK > 0)) {
266+ foreach($updateNK as $label => $value) {
267+ $currentValue = $this->values[$rowNum][$label];
268+ $n = array_search($rowNum, $this->narrowKeys[$label][$currentValue]);
269+ unset($this->narrowKeys[$label][$currentValue][$n]);
270+ $this->narrowKeys[$label][$value][] = $rowNum;
271+ }
272+ }
273+
274+ foreach($values as $label => $value) {
275+ $this->updateFlag = true;
276+ $this->values[$rowNum][$label] = $value;
277+ }
278+ return 1;
279+ }
280+
281+ /**
282+ * update row by uniqueKey.
283+ * if uniqueKey is blank or collide with other, Row will be not updated.
284+ * return number of effected row(0 or 1)
285+ */
286+ function updateByUniqueKey($uniqueKey, $keyValue, $values) {
287+ $rowNum = $this->uniqueKeys[$uniqueKey][$keyValue];
288+ if ($rowNum !== null) {
289+ return $this->update($rowNum, $values);
290+ }
291+ return 0;
292+ }
293+
294+ /*
295+ * delete row.
296+ * return number of effected row(0 or 1)
297+ */
298+ function delete($rowNum) {
299+ $row = $this->values[$rowNum];
300+ if ($row) {
301+ foreach($this->uniqueKeys as $uk => $ukn) {
302+ unset($this->uniqueKeys[$uk][$row[$uk]]);
303+ }
304+
305+ foreach($this->narrowKeys as $nk => $nkns) {
306+ $n = array_search($rowNum, $this->narrowKeys[$nk][$row[$nk]]);
307+ unset($this->narrowKeys[$nk][$row[$nk]][$n]);
308+ }
309+ $this->updateFlag = true;
310+ unset($this->values[$rowNum]);
311+ return 1;
312+ }
313+ return 0;
314+ }
315+
316+ function deleteByUniqueKey($uniqueKey, $keyValue) {
317+ $rowNum = $this->uniqueKeys[$uniqueKey][$keyValue];
318+ if ($rowNum === null) {
319+ return $this->delete($rowNum);
320+ } else {
321+ return 0;
322+ }
323+ }
324+ function deleteByNarrowKey($narrowKey, $keyValue) {
325+ $ns = $this->narrowKeys[$narrowKey][$keyValue];
326+ if (is_array($ns)) {
327+ $result = 0;
328+ foreach($ns as $n) {
329+ $result += $this->delete($n);
330+ }
331+ return $result;
332+ } else {
333+ return 0;
334+ }
335+ }
336+
337+ function deleteAll() {
338+ $num = count($this->values);
339+ foreach($this->uniqueKeys as $uk => $ukn) {
340+ $this->uniqueKeys[$uk] = array();
341+ }
342+
343+ foreach($this->narrowKeys as $nk => $nkns) {
344+ $this->narrowKeys[$nk] = array();
345+ }
346+ $this->values = array();
347+ $this->updateFlag = true;
348+ return $num;
349+ }
350+
351+ function getFileName() {
352+ return $this->fileName;
353+ }
354+ function getOpenFlag() {
355+ return $this->openFlag;
356+ }
357+}
358+
359+
360+function fgetArray($fp)
361+{
362+ $line = fgets($fp);
363+
364+ if ($line === FALSE) {
365+ return FALSE;
366+ }
367+ $line = str_replace("\n", '', $line);
368+ $result = explode(',,', $line);
369+ foreach($result as $k => $v) {
370+ $result[$k] = str_replace('\\,\\', ',', $v);
371+ }
372+
373+ return $result;
374+}
375+
376+function fputArray($fp, $values)
377+{
378+ $ary = array();
379+ foreach($values as $k => $v) {
380+ $t = str_replace(',', '\\,\\', $v);
381+ $t = str_replace("\n", " " ,$t);
382+ $ary[] = $t;
383+ }
384+ $str = implode(',,', $ary)."\n";
385+
386+ return fwrite($fp,$str);
387+}
388+
389+ class SlwtDataManager {
390+ var $tblSlwebtunnelSystem;
391+ var $tblUserInfo;
392+ var $tblChannelInfo;
393+ var $tblTransmitQueue;
394+ var $tblSlAgent;
395+ var $tblLoginList;
396+ var $tblAgentList;
397+ var $tblMessageLog;
398+
399+ var $initializedTime;
400+ var $initializedDate;
401+
402+ function SlwtDataManager() {
403+ global $tblPrefix;
404+ $dataFileDir = DATA_SOURCE_DIR;
405+ $this->tblSlwebtunnelSystem = new DbTable($dataFileDir."/".$tblPrefix . "SlWebTunnelSystem.txt", true);
406+ $this->tblUserInfo = new DbTable($dataFileDir."/".$tblPrefix . "UserInfo.txt", false);
407+ $this->tblChannelInfo = new DbTable($dataFileDir."/".$tblPrefix . "ChannelInfo.txt", false);
408+ $this->tblTransmitQueue = new DbTable($dataFileDir."/".$tblPrefix . "TransmitQueue.txt", false);
409+ $this->tblSlAgent = new DbTable($dataFileDir."/".$tblPrefix . "SlAgent.txt", false);
410+ $this->tblLoginList = new DbTable($dataFileDir."/".$tblPrefix . "LoginList.txt", false);
411+ $this->tblAgentList = new DbTable($dataFileDir."/".$tblPrefix . "AgentList.txt", false);
412+ $this->tblMessageLog = new DbTable($dataFileDir."/".$tblPrefix . "MessageLog.txt", false);
413+
414+ $this->initializedTime = time();
415+ $this->initializedDate = date("Y/m/d H:i:s", $this->initializedTime);
416+ }
417+
418+ function initialize() {
419+ $this->tblSlwebtunnelSystem->loadFile(array(), array(), array("LAST_LOGDUMP", "USER_NUMBER", "SEQ_USER_INFO", "SEQ_CHANNEL_INFO", "SEQ_TRANSMIT_QUEUE", "SEQ_MESSAGE_LOG"));
420+ $this->tblChannelInfo->loadFile(array("CHANNEL_NUMBER" , "OWNER_ID"), array(), array("CHANNEL_NAME", "LAST_UPDATE", "LAST_CLEANUP", "PASSWORD", "UUID"));
421+ $this->tblUserInfo->loadFile(array("USER_NUMBER", "USER_ID"), array(), array("USER_NAME", "PASSWORD"));
422+ $this->tblSlAgent->loadFile(array("AGENT_NAME"), array(), array());
423+ $this->tblLoginList->loadFile(array(), array("USER_NUMBER", "CHANNEL_NUMBER"), array("LAST_UPDATE"));
424+ $this->tblAgentList->loadFile(array(), array("AGENT_NAME", "CHANNEL_NUMBER"), array());
425+ $this->tblMessageLog->loadFile(array("NUMERICAL_ORDER"), array("CHANNEL_NUMBER","USER_NUMBER", "AGENT_NAME"), array( "INSERT_TIME", "MESSAGE"));
426+ $this->tblTransmitQueue->loadFile(array("QUEUE_NUMBER"), array("CHANNEL_NUMBER"), array("NEXT_QUEUE_NUMBER", "BODY", "INSERT_DATE"));
427+ return true;
428+ }
429+
430+ function dispose () {
431+ $this->tblChannelInfo->saveFile();
432+ $this->tblUserInfo->saveFile();
433+ $this->tblSlAgent->saveFile();
434+ $this->tblLoginList->saveFile();
435+ $this->tblAgentList->saveFile();
436+ $this->tblMessageLog->saveFile();
437+ $this->tblTransmitQueue->saveFile();
438+
439+ //tblSlwebtunnelSystem has to close last of tbls.
440+ $this->tblSlwebtunnelSystem->saveFile();
441+
442+ }
443+
444+ function beginTransaction() {
445+ }
446+
447+ function commit() {
448+ }
449+
450+ /**
451+ * Search UserName from Channel.
452+ *
453+ * return Exists->TRUE, otherwise->FALSE
454+ */
455+ function checkUserNameExistence($channelId, $userName) {
456+ $loginList = $this->tblLoginList->getRows($this->tblLoginList->selectByNarrowKey("CHANNEL_NUMBER", $channelId));
457+ foreach($loginList as $user) {
458+ $existUser = $this->tblUserInfo->getRow($this->tblUserInfo->selectByUniqueKey("USER_NUMBER" , $user['USER_NUMBER']));
459+ if (is_array($existUser) && $existUser['USER_NAME'] == $userName) {
460+ return true;
461+ }
462+ }
463+ return false;
464+ }
465+
466+ /**
467+ * Create new user account. This function insert to USER_INFO table.
468+ *
469+ * return Success->array of userinfo, otherwise->FALSE
470+ */
471+ function createUser($userId, $username, $password) {
472+ if (strlen($username) > MAX_USERNAME_LENGTH
473+ || strlen($password) > MAX_PASSWORD_LENGTH) {
474+ return FALSE;
475+ }
476+
477+ $userNumber = $this->getNextSeqUserInfo();
478+ // exec insert
479+ $this->tblUserInfo->insert(array("USER_NUMBER"=>$userNumber, "USER_ID"=>$userId, "USER_NAME"=>$username, "PASSWORD"=>$password));
480+ return true;
481+ }
482+
483+ /**
484+ * Insert user to LOGIN_LIST and LOGIN_LOG
485+ * return succeed->TRUE, otherwise->FALSE
486+ */
487+ function loginUser($channelNumber, $userId, $remoteAddress) {
488+ $userinfo = null;
489+ $row = $this->tblUserInfo->getRowByUniqueKey("USER_ID", $userId);
490+ if ($row) {
491+ $userinfo = array(
492+ USERINFO_USER_NUMBER => $row["USER_NUMBER"] ,
493+ USERINFO_USER_ID => $row["USER_ID"] ,
494+ USERINFO_USER_NAME => $row["USER_NAME"] ,
495+ );
496+ }
497+
498+ if ($userinfo) {
499+ $userNumber = $userinfo["USER_NUMBER"];
500+ $this->tblLoginList->insert(array("USER_NUMBER"=>$userNumber, "CHANNEL_NUMBER"=>$channelNumber, "LAST_UPDATE"=>$this->initializedDate));
501+ outputLog($channelNumber, array($this->initializedDate, "Login", CODE_WEB, $userinfo[USERINFO_USER_NAME], $remoteAddress));
502+ return $userinfo;
503+ }
504+ return false;
505+ }
506+
507+ /**
508+ * Delete user from LOGIN_LIST
509+ * return succeed->TRUE, otherwise->FALSE
510+ */
511+ function logoutUser($channelNumber, $userNumber) {
512+ $rows = $this->tblLoginList->getRowsByNarrowKey("USER_NUMBER", $userNumber);
513+ $rowNumber = -1;
514+ foreach($rows as $n => $row) {
515+ if ($row["CHANNEL_NUMBER"] == $channelNumber) {
516+ $rowNumber = $n;
517+ break;
518+ }
519+ }
520+ $this->tblLoginList->delete($rowNumber);
521+ }
522+
523+ /**
524+ * Update LOGIN_LIST.LAST_UPDATE of user by NOW().
525+ * If user was auto logouted, FALSE is returned.
526+ * return succeed->TRUE, otherwise->FALSE
527+ */
528+ function updateUserLoginState($channelNumber, $userNumber) {
529+ $rows = $this->tblLoginList->getRowsByNarrowKey("USER_NUMBER", $userNumber);
530+ $rowNumber = -1;
531+ foreach($rows as $n => $row) {
532+ if ($row["CHANNEL_NUMBER"] == $channelNumber) {
533+ $rowNumber = $n;
534+ break;
535+ }
536+ }
537+ if ($rowNumber == -1) {
538+ return false;
539+ }
540+ $this->tblLoginList->update($rowNumber, array("LAST_UPDATE" => $this->initializedDate));
541+ return true;
542+ }
543+
544+ /**
545+ * Get log data for Web
546+ * return array of (INSERT_DATE, CODE, NAME, MESSAGE)
547+ */
548+ function getWebLogData($channelNumber, $limitRowNum) {
549+ $rows = $this->tblMessageLog->getRowsByNarrowKey("CHANNEL_NUMBER", $channelNumber);
550+ $result = array();
551+ foreach($rows as $row) {
552+ $userNumber = $row["USER_NUMBER"];
553+ if (!isBlank($userNumber)) {
554+ $userInfo = $this->tblUserInfo->getRowByUniqueKey("USER_NUMBER", $userNumber);
555+ $result[] = array(
556+ $row["INSERT_TIME"],
557+ CODE_WEB,
558+ $userInfo["USER_NAME"],
559+ $row["MESSAGE"]);
560+ } else {
561+ $result[] = array(
562+ $row["INSERT_TIME"],
563+ CODE_SL,
564+ $row["AGENT_NAME"],
565+ $row["MESSAGE"]);
566+ }
567+ }
568+ $result = array_slice($result, - $limitRowNum);
569+ $result = array_reverse($result);
570+ return $result;
571+ }
572+
573+ /**
574+ * Get log data for Web, there were inserted after CHANNEL_INFO.LAST.UPDATE.
575+ * return array of (INSERT_DATE, NAME, MESSAGE)
576+ */
577+ function getSlLogData($channelNumber, $targetDate) {
578+ $rows = $this->tblMessageLog->getRowsByNarrowKey("CHANNEL_NUMBER", $channelNumber);
579+ $result = array();
580+
581+ $targetTime = strDateToTime($targetDate);
582+
583+ foreach($rows as $row) {
584+ $userNumber = $row["USER_NUMBER"];
585+
586+ $insertTime = strDateToTime($row["INSERT_TIME"]);
587+
588+ if (!isBlank($userNumber) && $targetTime <= $insertTime) {
589+ $userInfo = $this->tblUserInfo->getRowByUniqueKey("USER_NUMBER", $userNumber);
590+ $result[] = array(
591+ $row["INSERT_TIME"],
592+ $userInfo["USER_NAME"],
593+ $row["MESSAGE"]);
594+ }
595+ }
596+ return $result;
597+ }
598+
599+ /**
600+ * Insert message into MESSAGE_LOG for SL.
601+ * If length of message is more than MAX_MESSAGE_LENGTH, message will be cut.
602+ * return succeed->TRUE, otherwise->FALSE
603+ */
604+ function insertSlMessage($channelNumber, $agentName, $message) {
605+ if (strlen($message) > MAX_MESSAGE_LENGTH) {
606+ $message = substr($message, 0, MAX_MESSAGE_LENGTH);
607+ }
608+
609+ $this->tblMessageLog->insert(array(
610+ "NUMERICAL_ORDER" => $this->getNextSeqMessageLog(),
611+ "AGENT_NAME" => $agentName,
612+ "CHANNEL_NUMBER" => $channelNumber,
613+ "INSERT_TIME" => $this->initializedDate,
614+ "MESSAGE" => $message
615+ ));
616+ outputLog($channelNumber, array($this->initializedDate, "Msg", "SL", $agentName, $message));
617+ }
618+
619+ /**
620+ * Insert message into MESSAGE_LOG for Web.
621+ * If length of message is more than MAX_MESSAGE_LENGTH, message will be cut.
622+ * return succeed->TRUE, otherwise->FALSE
623+ */
624+ function insertWebMessage($channelNumber, $userNumber, $userName, $message) {
625+ if (strlen($message) > MAX_MESSAGE_LENGTH) {
626+ $message = substr($message, 0, MAX_MESSAGE_LENGTH);
627+ }
628+
629+ $this->tblMessageLog->insert(array(
630+ "NUMERICAL_ORDER" => $this->getNextSeqMessageLog(),
631+ "USER_NUMBER" => $userNumber,
632+ "CHANNEL_NUMBER" => $channelNumber,
633+ "INSERT_TIME" => $this->initializedDate,
634+ "MESSAGE" => $message
635+ ));
636+ outputLog($channelNumber, array($this->initializedDate, "Msg", "Web", $userName, $message));
637+ }
638+
639+ /**
640+ * Delete AGENT_LIST.
641+ */
642+ function deleteAgentList($channelNumber) {
643+ $this->tblAgentList->deleteByNarrowKey("CHANNEL_NUMBER", $channelNumber);
644+ }
645+
646+ /**
647+ * insert agent to AGENT_LIST.
648+ */
649+ function insertAgentList($channelNumber, $agentName) {
650+ $this->tblSlAgent->insert(array("AGENT_NAME" => $agentName));
651+ $this->tblAgentList->insert(array("AGENT_NAME" => $agentName, "CHANNEL_NUMBER" => $channelNumber));
652+
653+ return TRUE;
654+ }
655+
656+ /**
657+ * Getting username list FROM USER_LIST.
658+ * return array of username
659+ */
660+ function getLoginedUserList($channelNumber) {
661+ $loginList = $this->tblLoginList->getRowsByNarrowKey(CHANNEL_NUMBER, $channelNumber);
662+ $result = array();
663+ foreach($loginList as $user) {
664+ $row = $this->tblUserInfo->getRowByUniqueKey('USER_NUMBER', $user['USER_NUMBER']);
665+ if (is_array($row)) {
666+ $result[] = $row["USER_NAME"];
667+ }
668+ }
669+ return $result;
670+ }
671+
672+ /**
673+ * Getting agentname list FROM AGENT_LIST.
674+ * return array of agentname
675+ */
676+ function getLoginedAgentList($channelNumber) {
677+ $agentList = $this->tblAgentList->getRowsByNarrowKey(CHANNEL_NUMBER, $channelNumber);
678+ $result = array();
679+ foreach($agentList as $agent) {
680+ $result[] = $agent["AGENT_NAME"];
681+ }
682+ return $result;
683+ }
684+
685+ /**
686+ * Getting ChannelList and Infomation.
687+ * return array of (ChannelNumber, ChannelName, UserNum, AgentNum)
688+ */
689+ function getChannelList() {
690+ $channelInfo = $this->tblChannelInfo->getRowAll();
691+ $result = array();
692+ foreach($channelInfo as $channel) {
693+ $channelNumber = $channel["CHANNEL_NUMBER"];
694+ $channelName = $channel["CHANNEL_NAME"];
695+ $userNum = count($this->tblLoginList->selectByNarrowKey("CHANNEL_NUMBER", $channelNumber));
696+ $agentNum = count($this->tblAgentList->selectByNarrowKey("CHANNEL_NUMBER", $channelNumber));
697+ $result[] = array(
698+ $channelNumber,
699+ $channelName,
700+ $userNum,
701+ $agentNum);
702+ }
703+ return $result;
704+ }
705+
706+ function getChannelNumber($ownerId) {
707+ $channelInfo = $this->tblChannelInfo->getRowByUniqueKey("OWNER_ID", $ownerId);
708+ return $channelInfo["CHANNEL_NUMBER"];
709+ }
710+
711+ /**
712+ * Get CHANNEL_INFO.LAST_UPDATE
713+ * return succedd->LAST_UPDATE, otherwise->FALSE
714+ */
715+ function getChannelInfoLastUpdate($channelNumber) {
716+ $channelInfo = $this->tblChannelInfo->getRowByUniqueKey("CHANNEL_NUMBER", $channelNumber);
717+ return $channelInfo["LAST_UPDATE"];
718+ }
719+
720+ /**
721+ * Updating CHANNEL_INFO.LAST_UPDATE
722+ * return succeed->previous LAST_UPDATE, otherwise->FALSE
723+ */
724+ function updateChannel($channelNumber) {
725+ $rowNum = $this->tblChannelInfo->selectByUniqueKey("CHANNEL_NUMBER", $channelNumber);
726+ $row = $this->tblChannelInfo->getRow($rowNum);
727+ $result = $row["LAST_UPDATE"];
728+ $this->tblChannelInfo->update($rowNum, array("LAST_UPDATE" => $this->initializedDate));
729+
730+ return $result;
731+ }
732+
733+ /**
734+ * Setup tunnel.
735+ * return succeed->TRUE, otherwise->FALSE
736+ */
737+ function setupTunnel($ownerId, $uuid, $password, $channelName) {
738+ $rowNum = $this->tblChannelInfo->selectByUniqueKey("OWNER_ID", $ownerId);
739+ $row = $this->tblChannelInfo->getRow($rowNum);
740+ if ($row["PASSWORD"] != $password) {
741+ return false;
742+ }
743+ $this->tblChannelInfo->update($rowNum, array("UUID" => $uuid, "LAST_UPDATE"=>$this->initializedDate, "CHANNEL_NAME"=>$channelName));
744+ return true;
745+ }
746+
747+ /**
748+ * Check whether tunnel is available.
749+ * return available->CHANNEL_NUMBER, otherwise->FALSE
750+ */
751+ function checkTunnelAvailable($ownerId, $uuid, $password) {
752+ $rowNum = $this->tblChannelInfo->selectByUniqueKey("OWNER_ID", $ownerId);
753+ $row = $this->tblChannelInfo->getRow($rowNum);
754+ if ($row["UUID"] != $uuid || $row["PASSWORD"] != $password) {
755+ return false;
756+ }
757+ return $row["CHANNEL_NUMBER"];
758+ }
759+
760+ function isTimeToCleanup($channelNumber) {
761+ $rowNum = $this->tblChannelInfo->selectByUniqueKey("CHANNEL_NUMBER", $channelNumber);
762+ $row = $this->tblChannelInfo->getRow($rowNum);
763+ if ($row == null) {
764+ return false;
765+ }
766+ $lastCleanupSec = strDateToTime($row["LAST_CLEANUP"]);
767+ return ($lastCleanupSec < ($this->initializedTime - CLEAN_UP_INTERVAL));
768+ }
769+
770+ function execCleanup($channelNumber){
771+ $rowNum = $this->tblChannelInfo->selectByUniqueKey("CHANNEL_NUMBER", $channelNumber);
772+ if ($rowNum == -1) {
773+ return false;
774+ }
775+ $this->tblChannelInfo->update($rowNum, array("LAST_CLEANUP" => $this->initializedDate));
776+
777+ $loginList = $this->tblLoginList->selectByNarrowKey("CHANNEL_NUMBER", $channelNumber);
778+ foreach($loginList as $n) {
779+ $row = $this->tblLoginList->getRow($n);
780+ if ($row) {
781+ $lastCleanupSec = strDateToTime($row["LAST_UPDATE"]);
782+ if ($lastCleanupSec < ($this->initializedTime - AUTO_LOGOUT_INTERVAL)) {
783+ $this->tblLoginList->delete($n);
784+ }
785+ }
786+ }
787+ return TRUE;
788+ }
789+
790+ function isTimeToLogDump(){
791+ global $logDumpInterval;
792+ $row = $this->tblSlwebtunnelSystem->getRow(0);
793+ if ($row == null) {
794+ return false;
795+ }
796+ $lastLogdumpSec = strDateToTime($row["LAST_LOGDUMP"]);
797+
798+ return ($lastLogdumpSec < ($this->initializedTime - $logDumpInterval * 60));
799+ }
800+
801+ function execLogDump() {
802+ global $logDumpInterval;
803+ $messageLog = $this->tblMessageLog->getRowAll();
804+ if ($messageLog) {
805+ foreach ($messageLog as $n => $row) {
806+ $insertTimeSec = strDateToTime($row["INSERT_TIME"]);
807+ if ($insertTimeSec < $this->initializedTime - $logDumpInterval * 60) {
808+ $this->tblMessageLog->delete($n);
809+ }
810+ }
811+ }
812+
813+ $userInfo = $this->tblUserInfo->getRowAll();
814+ if ($userInfo) {
815+ foreach ($userInfo as $n => $row) {
816+ if (count($this->tblLoginList->selectByNarrowKey("USER_NUMBER", $row["USER_NUMBER"])) == 0
817+ && count($this->tblMessageLog->selectByNarrowKey("USER_NUMBER", $row["USER_NUMBER"])) == 0) {
818+
819+ $this->tblUserInfo->delete($n);
820+ }
821+ }
822+ }
823+
824+ $slAgent = $this->tblSlAgent->getRowAll();
825+ if ($slAgent) {
826+ foreach ($slAgent as $n => $row) {
827+ if (count($this->tblAgentList->selectByNarrowKey("AGENT_NAME", $row["AGENT_NAME"])) == 0
828+ && count($this->tblChannelInfo->selectByNarrowKey("AGENT_NAME", $row["AGENT_NAME"])) == 0) {
829+
830+ $this->tblSlAgent->delete($n);
831+ }
832+ }
833+ }
834+
835+ $this->tblSlwebtunnelSystem->update(0, array("LAST_LOGDUMP" => $this->initializedDate));
836+ }
837+
838+ function insertTransmitQueue($channelNumber, $queueNumber, $nextQueueNumber, $body) {
839+ $n = $this->tblTransmitQueue->insert(array("CHANNEL_NUMBER" => $channelNumber, "QUEUE_NUMBER" => $queueNumber, "NEXT_QUEUE_NUMBER" => $nextQueueNumber, "BODY" => $body, "INSERT_DATE" => $this->initializedDate));
840+ return ($n > 0);
841+ }
842+
843+ /**
844+ * Delete all TransmitQueue of channel
845+ */
846+ function deleteTransmitQueue($channelNumber) {
847+ $this->tblTransmitQueue->deleteByNarrowKey("CHANNEL_NUMBER", $channelNumber);
848+ }
849+
850+ /**
851+ * Get NEXT_QUEUE_NUMBER and BODY
852+ */
853+ function getTransmitQueue($channelNumber, $queueNumber) {
854+ $row = $this->tblTransmitQueue->getRowByUniqueKey("QUEUE_NUMBER", $queueNumber);
855+ if ($row) {
856+ if ($row["CHANNEL_NUMBER"] == $channelNumber) {
857+ return array($row["NEXT_QUEUE_NUMBER"], $row["BODY"]);
858+ }
859+ } else {
860+ return false;
861+ }
862+ }
863+
864+ /**
865+ * get Sequence for UserId
866+ */
867+ function getNextUserNumber() {
868+ $row = $this->tblSlwebtunnelSystem->getRow(0);
869+ $n = (int)($row["USER_NUMBER"]) + 1;
870+ $this->tblSlwebtunnelSystem->update(0, array("USER_NUMBER" => (string)$n));
871+
872+ return $n;
873+ }
874+
875+ /**
876+ * get Sequence for TransmitQueue
877+ */
878+ function getNextSeqTransmitQueue() {
879+ $row = $this->tblSlwebtunnelSystem->getRow(0);
880+ $n = (int)($row["SEQ_TRANSMIT_QUEUE"]) + 1;
881+ $this->tblSlwebtunnelSystem->update(0, array("SEQ_TRANSMIT_QUEUE" => (string)$n));
882+
883+ return $n;
884+ }
885+
886+ /**
887+ * get Sequence for UserInfo
888+ */
889+ function getNextSeqUserInfo() {
890+ $row = $this->tblSlwebtunnelSystem->getRow(0);
891+ $n = (int)($row["SEQ_USER_INFO"]) + 1;
892+ $this->tblSlwebtunnelSystem->update(0, array("SEQ_USER_INFO" => (string)$n));
893+
894+ return $n;
895+ }
896+
897+ /**
898+ * get Sequence for ChannelInfo
899+ */
900+ function getNextSeqChannelInfo() {
901+ $row = $this->tblSlwebtunnelSystem->getRow(0);
902+ $n = (int)($row["SEQ_CHANNEL_INFO"]) + 1;
903+ $this->tblSlwebtunnelSystem->update(0, array("SEQ_CHANNEL_INFO" => (string)$n));
904+
905+ return $n;
906+ }
907+
908+ /**
909+ * get Sequence for UserInfo
910+ */
911+ function getNextSeqMessageLog() {
912+ $row = $this->tblSlwebtunnelSystem->getRow(0);
913+ $n = (int)($row["SEQ_MESSAGE_LOG"]) + 1;
914+ $this->tblSlwebtunnelSystem->update(0, array("SEQ_MESSAGE_LOG" => (string)$n));
915+
916+ return $n;
917+ }
918+
919+
920+ /**
921+ * Initialize Database.
922+ * return array of (condition, successFlag, rouCount)
923+ */
924+ function initializeDatabase() {
925+ $result[] = array($this->tblSlwebtunnelSystem->getFileName(), true, $this->tblSlwebtunnelSystem->deleteAll());
926+ $this->tblSlwebtunnelSystem->insert(array("LAST_LOGDUMP" => $this->initializedDate, "USER_NUMBER" => 1, "SEQ_CHANNEL_INFO" => 1, "SEQ_USER_INFO" => 1, "SEQ_MESSAGE_LOG" => 1, "SEQ_TRANSMIT_QUEUE" => 1));
927+ $result[] = array($this->tblUserInfo->getFileName(), true, $this->tblUserInfo->deleteAll());
928+ $result[] = array($this->tblChannelInfo->getFileName(), true, $this->tblChannelInfo->deleteAll());
929+ $result[] = array($this->tblTransmitQueue->getFileName(), true, $this->tblTransmitQueue->deleteAll());
930+ $result[] = array($this->tblSlAgent->getFileName(), true, $this->tblSlAgent->deleteAll());
931+ $result[] = array($this->tblLoginList->getFileName(), true, $this->tblLoginList->deleteAll());
932+ $result[] = array($this->tblAgentList->getFileName(), true, $this->tblAgentList->deleteAll());
933+ $result[] = array($this->tblMessageLog->getFileName(), true, $this->tblMessageLog->deleteAll());
934+
935+ return $result;
936+ }
937+
938+ /**
939+ * check Database.
940+ * reuturn array of (condition, successFlag)
941+ */
942+ function checkDatabase() {
943+ $fileNames = array(
944+ $this->tblSlwebtunnelSystem->getFileName(),
945+ $this->tblUserInfo->getFileName(),
946+ $this->tblChannelInfo->getFileName(),
947+ $this->tblTransmitQueue->getFileName(),
948+ $this->tblSlAgent->getFileName(),
949+ $this->tblLoginList->getFileName(),
950+ $this->tblAgentList->getFileName(),
951+ $this->tblMessageLog->getFileName()
952+ );
953+
954+ $result = array();
955+ foreach($fileNames as $fileName) {
956+ $result[] = array(ADMMSG_DATAFILE_EXISTS.$fileName, file_exists($fileName));
957+ $result[] = array(ADMMSG_DATAFILE_WRITABLE.$fileName, is_writable($fileName));
958+ }
959+
960+ return $result;
961+ }
962+
963+ /**
964+ * Get CHANNEL_INFO
965+ * return succedd->array of [CHANNEL_NUMBER, OWNER_ID, LAST_UPDATE], otherwise->FALSE
966+ */
967+ function getChannelInfoForAdmin() {
968+ $rows = $this->tblChannelInfo->getRowAll();
969+ $result = array();
970+ if ($rows) {
971+ foreach($rows as $row) {
972+ $result[] = array($row["CHANNEL_NUMBER"], $row["OWNER_ID"], $row["LAST_UPDATE"]);
973+ }
974+ }
975+ return $result;
976+ }
977+
978+ function updateChannelInfoForAdmin($channelNumber, $ownerId, $passKey) {
979+ $rowNum = $this->tblChannelInfo->selectByUniqueKey("CHANNEL_NUMBER", $channelNumber);
980+ if (isBlank($passKey)) {
981+ return $this->tblChannelInfo->update($rowNum, array("OWNER_ID"=>$ownerId));
982+ } else {
983+ return $this->tblChannelInfo->update($rowNum, array("OWNER_ID"=>$ownerId,"PASSWORD"=>$passKey));
984+ }
985+ }
986+
987+ function insertChannelInfoForAdmin($ownerId, $passKey) {
988+ return $this->tblChannelInfo->insert(array("CHANNEL_NUMBER" => $this->getNextSeqChannelInfo(),"OWNER_ID"=>$ownerId,"PASSWORD"=>$passKey,"LAST_UPDATE"=>$this->initializedDate));
989+ }
990+ function deleteChannelInfoForAdmin($channelNumber) {
991+ $rowNum = $this->tblChannelInfo->selectByUniqueKey("CHANNEL_NUMBER", $channelNumber);
992+ return $this->tblChannelInfo->delete($rowNum);
993+ }
994+ }
995+?>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/slwebtunnel.ini.php (nonexistent)
+++ slwebtunnel/trunk/src/slwebtunnel.ini.php (revision 6)
@@ -0,0 +1,143 @@
1+<?php
2+/*
3+ * SlWebTunnel
4+ * Configuration and Definition
5+ * $Id$
6+ * Created on 2007/10/20
7+ *
8+ */
9+
10+ mb_internal_encoding("UTF-8");
11+ mb_http_output("UTF-8");
12+
13+ //Choose DataManager. mysql and datafile are available.
14+ $dataManagerType = "mysql";
15+ //$dataManagerType = "datafile";
16+
17+ //DB configuration(when dataManagerType = mysql)
18+ define('DATA_SOURCE_NAME', 'mysql:host=localhost;dbname=slwebtunnel');
19+ define('DATA_SOURCE_USER', 'slwebtunnel');
20+ define('DATA_SOURCE_PASS', 'slwebtunnel');
21+
22+ //DB configuration(when dataManagerType = datafile)
23+ define('DATA_SOURCE_DIR', './datafile');
24+
25+ //prefix of table_name;
26+ $tblPrefix = "";
27+
28+ //Administration
29+ $adminPassKey = "slwebtunnel";
30+
31+ //Configuration
32+ define('AUTO_LOGOUT_INTERVAL', 300);
33+ define('AUTO_RELOAD_INTERVAL', 30);
34+ define('CLEAN_UP_INTERVAL', 60);
35+
36+ //Page configuration
37+ $view_dir = "view";
38+
39+ //Log dump
40+ $logDumpEnabled = TRUE;
41+ $logDumpDir = "./log";
42+ $logDumpFilePrefix = "slwebtunnel";
43+ $logDumpInterval = 60; //minute
44+
45+
46+//=======================================================================
47+//Do not modify below line
48+
49+ //System
50+ define('DISPLAY_MESSAGE_NUM', 30);
51+ define('MAX_MESSAGE_LENGTH', 300);
52+ define('MAX_USERNAME_LENGTH', 100);
53+ define('MAX_PASSWORD_LENGTH', 20);
54+ define('CHARSET', 'UTF-8');
55+ define('URL_HOMEPAGE', '/');
56+ define('DISPLAY_MESSAGE_INTERVAL', 30);
57+ define('MAX_HTTP_SIZE', 2000);
58+ define('HTTP_DELIMITER', ',');
59+ define('CREATE_DB_SQL_FILE',"./createdbsql/mysql.sql");
60+
61+ //Session
62+ define('SESSION_USERINFO', 'USERINFO');
63+ define('USERINFO_USER_NUMBER', 'USER_NUMBER');
64+ define('USERINFO_USER_ID', 'USER_ID');
65+ define('USERINFO_USER_NAME', 'USER_NAME');
66+ define('USERINFO_CHANNEL_NUMBER', 'CHANNEL_NUMBER');
67+
68+ //Screen code for paramater
69+ define('COMMAND_SELECTCHANNEL', 'selectChannel');
70+ define('COMMAND_DISPLAYLOG', 'displayLog');
71+ define('COMMAND_CHAT', 'chat');
72+ define('COMMAND_LOGIN', 'login');
73+ define('COMMAND_LOGINPROCESS', 'loginProcess');
74+ define('COMMAND_LOGOUTPROCESS', 'logoutProcess');
75+ define('COMMAND_SETUPTUNNEL', 'setupTunnel');
76+ define('COMMAND_TUNNEL', 'tunnel');
77+
78+ //View file
79+ define('VIEW_SELECTCHANNEL', '/selectChannelView.php');
80+ define('VIEW_DISPLAYLOG', '/displayLogView.php');
81+ define('VIEW_CHAT', '/chatView.php');
82+ define('VIEW_LOGIN', '/loginView.php');
83+ define('VIEW_LOGINPROCESS', '/loginProcessView.php');
84+ define('VIEW_LOGOUTPROCESS', '/logoutProcessView.php');
85+ define('VIEW_SETUPTUNNEL', '/setupTunnelView.php');
86+ define('VIEW_TUNNEL', '/tunnelView.php');
87+
88+ //Code for DB and Function
89+ define('CODE_WEB', 1);
90+ define('CODE_SL', 2);
91+ define('CODE_ALL', 3);
92+
93+ //PARAMETERS
94+ define('PARAM_COMMAND', 'command');
95+ define('PARAM_CHANNEL_NUMBER', 'channelNumber');
96+ define('PARAM_ERROR_MESSAGE', 'errorMessage');
97+ define('PARAM_MESSAGE', 'message');
98+ define('PARAM_OWNER_ID', 'ownerId');
99+ define('PARAM_UUID', 'uuid');
100+ define('PARAM_PASS_KEY', 'passKey');
101+ define('PARAM_CHANNEL_NAME', 'channelName');
102+ define('PARAM_AGENT_LIST', 'agentList');
103+ define('PARAM_MESSAGE_LIST', 'messageList');
104+ define('PARAM_USER_ID', 'userId');
105+ define('PARAM_USER_NAME', 'userName');
106+ define('PARAM_PASSWORD', 'password');
107+ define('PARAM_QUEUE_NUMBER', 'queueNumber');
108+ define('PARAM_COMMUNICATION_MODE', 'commMode');
109+ define('PARAM_BODY', 'body');
110+
111+ //LSLFLAG
112+ define('LSLFLAG_USER_REFLESH', 'R');
113+ define('LSLFLAG_USERNAME', 'U');
114+ define('LSLFLAG_MESSAGE', 'M');
115+ define('LSLFLAG_NEXT', 'N');
116+ define('LSLFLAG_SUCCEED', 'S');
117+ define('LSLFLAG_FAILED', 'F');
118+ define('LSLFLAG_END', 'E');
119+
120+ //COMMUNICATION_MODE
121+ define('COMMUNICATION_MODE_SEND', 'S');
122+ define('COMMUNICATION_MODE_RECEIVE', 'R');
123+ define('COMMUNICATION_MODE_BOTH', 'B');
124+
125+ include_once("slwtlanguage.php");
126+ include_once("slwtcommonfunc.php");
127+
128+ if ($dataManagerType == "mysql") {
129+ include_once("slwtdatamanager.php");
130+ } else if ($dataManagerType == "datafile"){
131+ include_once("slwtdatamanfile.php");
132+ } else {
133+ die("unknown dataManagerType.");
134+ }
135+
136+ //Checks mobile for Session
137+ if (isMobile()) {
138+ ini_set('session.use_cookies', 0);
139+ } else {
140+ ini_set('session.use_cookies', 1);
141+ }
142+
143+?>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/slwebtunnel.php (nonexistent)
+++ slwebtunnel/trunk/src/slwebtunnel.php (revision 6)
@@ -0,0 +1,150 @@
1+<?php
2+/*
3+ * SlWebTunnel
4+ * Main page
5+ * $Id$
6+ * Created on 2007/10/20
7+ *
8+ */
9+ require_once 'slwebtunnel.ini.php';
10+
11+ //preparing grobal valiables
12+ $redoFlag = FALSE;
13+ $displayItems = array();
14+ $params = array_merge($_GET, $_POST);
15+
16+ $command = $params[PARAM_COMMAND];
17+ $channelNumber = $params[PARAM_CHANNEL_NUMBER];
18+ $ownerId = $params[PARAM_OWNER_ID];
19+
20+ //Initialize DataManager
21+ $dataManager = new SlwtDataManager();
22+ if (!$dataManager->initialize()) {
23+ die(MSG_ERROR_DB_CONNECTION);
24+ }
25+ //Checking channelId, if channelNumber is blank, Command is set COMMAND_SELECTCHANNEL
26+ if (isBlank($channelNumber)) {
27+ if ($ownerId) {
28+ $channelNumber = $dataManager->getChannelNumber($ownerId);
29+ if ($channelNumber !== FALSE) {
30+ header("HTTP/1.1 301 Moved Permanently");
31+ header("Location: " . $_SERVER['SCRIPT_NAME']."?channelNumber=" . $channelNumber);
32+ } else {
33+ header("HTTP/1.1 301 Moved Permanently");
34+ header("Location: " . $_SERVER['SCRIPT_NAME']);
35+ }
36+ } else {
37+ $command = COMMAND_SELECTCHANNEL;
38+ }
39+ } else {
40+ if (isBlank($command)) {
41+ $command = COMMAND_DISPLAYLOG;
42+ }
43+ }
44+
45+ //do cleanup
46+ if ($channelNumber != NULL) {
47+ if ($dataManager->isTimeToCleanup($channelNumber)) {
48+ $dataManager->beginTransaction();
49+ $dataManager->execCleanup($channelNumber);
50+ $dataManager->commit();
51+ }
52+ }
53+
54+ if ($dataManager->isTimeToLogDump()) {
55+ $dataManager->beginTransaction();
56+ $dataManager->execLogDump();
57+ $dataManager->commit();
58+ }
59+
60+ do {
61+ $redoFlag = FALSE;
62+
63+ //Proccess each page
64+ if ($command == COMMAND_DISPLAYLOG) {
65+ $displayItems['USER_LIST'] = $dataManager->getLoginedUserList($channelNumber);
66+ $displayItems['MESSAGE_LIST'] = $dataManager->getWebLogData($channelNumber, DISPLAY_MESSAGE_NUM);
67+ $displayItems['AGENT_LIST'] = $dataManager->getLoginedAgentList($channelNumber);
68+ $displayItems['LAST_UPDATE'] = $dataManager->getChannelInfoLastUpdate($channelNumber);
69+ $displayItems['LOGIN_FLAG'] = FALSE;
70+ $displayItems['CHANNEL_NUMBER'] = ($channelNumber);
71+ includeView($view_dir.VIEW_DISPLAYLOG);
72+ } elseif ($command == COMMAND_CHAT) {
73+ session_start();
74+ $paramMessage = $params[PARAM_MESSAGE];
75+ $userInfo = $_SESSION[SESSION_USERINFO];
76+ $redoFlag == FALSE;
77+ if ($userInfo == NULL) {
78+ $redoFlag = TRUE;
79+ $command = COMMAND_LOGOUTPROCESS;
80+ } else {
81+ $dataManager->beginTransaction();
82+ if ($dataManager->updateUserLoginState($channelNumber, $userInfo[USERINFO_USER_NUMBER]) == FALSE) {
83+ $dataManager->commit();
84+ $redoFlag = TRUE;
85+ $command = COMMAND_LOGOUTPROCESS;
86+ } else {
87+ $channelNumber = $userInfo['CHANNEL_NUMBER'];
88+ if (!isBlank($paramMessage)) {
89+ $dataManager->insertWebMessage($channelNumber, $userInfo[USERINFO_USER_NUMBER], $userInfo[USERINFO_USER_NAME], $paramMessage);
90+ }
91+ $dataManager->commit();
92+ $displayItems['MESSAGE_LIST'] = $dataManager->getWebLogData($channelNumber, DISPLAY_MESSAGE_NUM);
93+ $displayItems['USER_LIST'] = $dataManager->getLoginedUserList($channelNumber);
94+ $displayItems['USER_NAME'] = $userInfo[USERINFO_USER_NAME];
95+ $displayItems['AGENT_LIST'] = $dataManager->getLoginedAgentList($channelNumber);
96+ $displayItems['LAST_UPDATE'] = $dataManager->getChannelInfoLastUpdate($channelNumber);
97+ $displayItems['LOGIN_FLAG'] = TRUE;
98+ $displayItems['CHANNEL_NUMBER'] = ($channelNumber);
99+ includeView($view_dir.VIEW_DISPLAYLOG);
100+ }
101+
102+ }
103+ } elseif ($command == COMMAND_SELECTCHANNEL) {
104+ $displayItems['CHANNEL_LIST'] = $dataManager->getChannelList();
105+ includeView($view_dir.VIEW_SELECTCHANNEL);
106+ } elseif ($command == COMMAND_LOGIN) {
107+ includeView($view_dir.VIEW_LOGIN);
108+ } elseif ($command == COMMAND_LOGINPROCESS) {
109+ $paramUserName = $params[PARAM_USER_NAME];
110+ $redoFlag = TRUE;
111+ $command = COMMAND_LOGIN;
112+ if (!isBlank($paramUserName) && !$dataManager->checkUserNameExistence($channelNumber, $paramUserName)) {
113+ $dataManager->beginTransaction();
114+ $newUserId = "USER_".$dataManager->getNextUserNumber();
115+ if ($dataManager->createUser($newUserId, $paramUserName, "")) {
116+ $userInfo = $dataManager->loginUser($channelNumber, $newUserId, $_SERVER['REMOTE_ADDR']);
117+ if ($userInfo) {
118+ $userInfo[USERINFO_CHANNEL_NUMBER] = $channelNumber;
119+ session_start();
120+ $_SESSION[SESSION_USERINFO] = $userInfo;
121+ $command = COMMAND_CHAT;
122+ }
123+ }
124+ $dataManager->commit();
125+ }
126+ } elseif ($command == COMMAND_LOGOUTPROCESS) {
127+ session_start();
128+ $redoFlag = TRUE;
129+ $command = COMMAND_DISPLAYLOG;
130+ $userInfo = $_SESSION[SESSION_USERINFO];
131+ if ($userInfo) {
132+ $dataManager->beginTransaction();
133+ $dataManager->logoutUser($channelNumber, $userInfo[USERINFO_USER_NUMBER]);
134+ $dataManager->commit();
135+ unset($_SESSION[SESSION_USERINFO]);
136+ session_destroy();
137+ }
138+ } else {
139+ die(MSG_UNKNOWN_COMMAND);
140+ }
141+ } while($redoFlag);
142+
143+ $dataManager->dispose();
144+
145+ /* debug code
146+ print_r($_SESSION);
147+ print "<br>";
148+ print_r($params);
149+ */
150+?>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/slwtadmin.php (nonexistent)
+++ slwebtunnel/trunk/src/slwtadmin.php (revision 6)
@@ -0,0 +1,200 @@
1+<?php
2+/*
3+ * SlWebTunnel
4+ * Admin page
5+ * $Id$
6+ * Created on 2007/11/06
7+ *
8+ */
9+ require_once 'slwebtunnel.ini.php';
10+
11+ define('ADMPARM_ADMCMD', 'admcmd');
12+ define('ADMPARM_ADMPASSKEY', 'admpasskey');
13+ define('ADMPARM_ACTION', 'action');
14+ define('ADMPARM_CHANNEL_NUMBER','channelNumber');
15+ define('ADMPARM_OWNER_ID', 'ownerId');
16+ define('ADMPARM_PASSKEY', 'passKey');
17+ define('ADMPARM_LOG_NUMBER', 'logNumber');
18+ define('ADMPARM_LOG_FILE_NAME', 'logFileName');
19+ define('ADMPARM_EXEC_FLAG', 'execFlag');
20+
21+ define('ADMCMD_LOGIN', 'login');
22+ define('ADMCMD_LOGIN_PROCESS', 'loginProcess');
23+ define('ADMCMD_LOGOUT_PROCESS', 'logoutProcess');
24+ define('ADMCMD_MENU', 'menu');
25+ define('ADMCMD_EDIT_CHANNEL', 'editChannel');
26+ define('ADMCMD_VIEW_LOG', 'viewLog');
27+ define('ADMCMD_CHECK_CONFIG', 'checkConfig');
28+ define('ADMCMD_RESET_DB', 'resetDb');
29+
30+ define('ADMACT_ADD', 'add');
31+ define('ADMACT_DELETE', 'delete');
32+ define('ADMACT_MODIFY', 'modify');
33+
34+
35+ //View file
36+ define('ADMVIEW_LOGIN', './admview/admLoginView.php');
37+ define('ADMVIEW_MENU', './admview/admMenuView.php');
38+ define('ADMVIEW_EDIT_CHANNEL', './admview/admEditChannelView.php');
39+ define('ADMVIEW_VIEW_LOG', './admview/admViewLogView.php');
40+ define('ADMVIEW_CHECK_CONFIG', './admview/admCheckConfigView.php');
41+ define('ADMVIEW_RESET_DB', './admview/admResetDbView.php');
42+
43+ session_start();
44+
45+ //preparing grobal valiables
46+ $redoFlag = false;
47+ $displayItems = array();
48+ $displayItems['MESSAGE'] = array();
49+ $params = array_merge($_GET, $_POST);
50+
51+ $admcmd = $params[ADMPARM_ADMCMD];
52+ $loginFlag = false;
53+ if (session_id()) {
54+ if ($_SESSION["LOGIN_FLAG"]) {
55+ $loginFlag = true;
56+ }
57+ }
58+
59+ if ($loginFlag) {
60+ if (isBlank($admcmd) || $admcmd == ADMCMD_LOGIN || $admcmd == ADMCMD_LOGIN_PROCESS) {
61+ $admcmd = ADMCMD_MENU;
62+ }
63+ } else {
64+ if ($admcmd != ADMCMD_LOGIN_PROCESS) {
65+ $admcmd = ADMCMD_LOGIN;
66+ }
67+ }
68+
69+ do {
70+ $redoFlag = false;
71+ //Proccess each page
72+ if ($admcmd == ADMCMD_LOGIN) {
73+ include(ADMVIEW_LOGIN);
74+ } else if ($admcmd == ADMCMD_LOGIN_PROCESS) {
75+ $admPassKey = $params[ADMPARM_ADMPASSKEY];
76+ if ($admPassKey == $adminPassKey) {
77+ session_start();
78+ $loginFlag = true;
79+ $displayItems['MESSAGE'][] = ADMMSG_LOGIN_SUCCEED;
80+ $_SESSION["LOGIN_FLAG"] = true;
81+ $admcmd = ADMCMD_MENU;
82+ } else {
83+ $admcmd = ADMCMD_LOGIN;
84+ $displayItems['MESSAGE'][] = ADMMSG_LOGIN_FAILED;
85+ }
86+ $redoFlag = true;
87+ } else if ($admcmd == ADMCMD_LOGOUT_PROCESS) {
88+ $loginFlag = false;
89+ session_destroy();
90+ $admcmd = ADMCMD_LOGIN;
91+ $redoFlag = true;
92+ } else if ($admcmd == ADMCMD_MENU) {
93+ include(ADMVIEW_MENU);
94+ } else if ($admcmd == ADMCMD_EDIT_CHANNEL) {
95+ $dataManager = new SlwtDataManager();
96+ if ($dataManager->initialize()) {
97+ $action = $params[ADMPARM_ACTION];
98+ $channelNumber = $params[ADMPARM_CHANNEL_NUMBER];
99+ $ownerId = $params[ADMPARM_OWNER_ID];
100+ $passKey = $params[ADMPARM_PASSKEY];
101+
102+ if ($action == ADMACT_ADD) {
103+ if (!isBlank($ownerId) && !isBlank($passKey)) {
104+ $dataManager->insertChannelInfoForAdmin($ownerId, $passKey);
105+ $displayItems['MESSAGE'][] = ADMMSG_INSERT_CHANNEL_SUCCEED;
106+ } else {
107+ if (isBlank($ownerId)) {
108+ $displayItems['MESSAGE'][] = ADMMSG_NO_OWNER_ID;
109+ }
110+ if (isBlank($passKey)) {
111+ $displayItems['MESSAGE'][] = ADMMSG_NO_PASSKEY;
112+ }
113+ }
114+ } else if ($action == ADMACT_DELETE) {
115+ if (!isBlank($channelNumber)) {
116+ $dataManager->deleteChannelInfoForAdmin($channelNumber);
117+ $displayItems['MESSAGE'][] = ADMMSG_DELETE_CHANNEL_SUCCEED;
118+ } else {
119+ if (isBlank($channelNumber)) {
120+ $displayItems['MESSAGE'][] = ADMMSG_NO_OWNER_ID;
121+ }
122+ }
123+ } else if ($action == ADMACT_MODIFY) {
124+ if (!isBlank($channelNumber && !isBlank($ownerId))) {
125+ $dataManager->updateChannelInfoForAdmin($channelNumber, $ownerId, $passKey);
126+ $displayItems['MESSAGE'][] = ADMMSG_UPDATE_CHANNEL_SUCCEED;
127+ } else {
128+ if (isBlank($channelNumber)) {
129+ $displayItems['MESSAGE'][] = ADMMSG_NO_CHANNEL_NUMBER;
130+ }
131+ if (isBlank($ownerId)) {
132+ $displayItems['MESSAGE'][] = ADMMSG_NO_OWNER_ID;
133+ }
134+ }
135+ }
136+ $displayItems['CHANNEL_LIST'] = $dataManager->getChannelInfoForAdmin();
137+ } else {
138+ $displayItems['CHANNEL_LIST'] = false;
139+ $displayItems['MESSAGE'][] = ADMMSG_DB_CONNECTION_FAILED;
140+ }
141+ $dataManager->dispose();
142+ include(ADMVIEW_EDIT_CHANNEL);
143+ } else if ($admcmd == ADMCMD_VIEW_LOG) {
144+ $logNumber = $params[ADMPARM_LOG_NUMBER];
145+ $logFileName = $params[ADMPARM_LOG_FILE_NAME];
146+
147+ $tmps = scandir($logDumpDir);
148+ $fileList = array();
149+ foreach($tmps as $tmp) {
150+ if (ereg('^.*\.log$', $tmp)) {
151+ $fileList[] = $tmp;
152+ }
153+ }
154+ $displayItems['LOG_FILE_LIST'] = $fileList;
155+ $displayItems['LOG_CONTENT'] = null;
156+ if (!isBlank($logNumber) && $fileList[(int)$logNumber] == $logFileName) {
157+ $displayItems['LOG_CONTENT'] = file($logDumpDir."/".$fileList[(int)$logNumber]);
158+ }
159+
160+ include(ADMVIEW_VIEW_LOG);
161+ } else if ($admcmd == ADMCMD_CHECK_CONFIG) {
162+ $dataManager = new SlwtDataManager();
163+ $tblResult = $dataManager->checkDatabase();
164+ foreach($tblResult as $tbl) {
165+ $displayItems['CHECK_RESULT'][] = $tbl;
166+ }
167+ $displayItems['CHECK_RESULT'][] = array(ADMMSG_LOG_DUMP_DIR_EXISTS, file_exists($logDumpDir));
168+ $displayItems['CHECK_RESULT'][] = array(ADMMSG_LOG_DUMP_DIR_IS_DIR, is_dir($logDumpDir));
169+ $displayItems['CHECK_RESULT'][] = array(ADMMSG_LOG_DUMP_DIR_WRITABLE, is_writable($logDumpDir));
170+
171+ include(ADMVIEW_CHECK_CONFIG);
172+ } else if ($admcmd == ADMCMD_RESET_DB) {
173+ $execFlag = $params[ADMPARM_EXEC_FLAG];
174+ if ($execFlag) {
175+ $dataManager = new SlwtDataManager();
176+ if ($dataManager->initialize()) {
177+ $sqlResult = $dataManager->initializeDatabase();
178+ $displayItems['SQL_RESUIT'] = $sqlResult;
179+ $goflag = true;
180+ foreach($sqlResult as $r) {
181+ if ($r[1] === false) {
182+ $goflag = false;
183+ }
184+ }
185+ if ($goflag) {
186+ $displayItems['MESSAGE'][] = ADMMSG_RESET_DB_IS_SUCCEED;
187+ } else {
188+ $displayItems['MESSAGE'][] = ADMMSG_RESET_DB_IS_FAILED;
189+ }
190+ } else {
191+ $displayItems['SQL_RESUIT'] = null;
192+ $displayItems['MESSAGE'][] = MSG_ERROR_DB_CONNECTION;
193+ }
194+ $dataManager->dispose();
195+ }
196+ include(ADMVIEW_RESET_DB);
197+ }
198+ } while($redoFlag);
199+
200+?>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/createdbsql/mysql.sql (nonexistent)
+++ slwebtunnel/trunk/src/createdbsql/mysql.sql (revision 6)
@@ -0,0 +1,82 @@
1+DROP TABLE IF EXISTS ${tblPrefix}LOGIN_LOG;
2+DROP TABLE IF EXISTS ${tblPrefix}MESSAGE_LOG;
3+DROP TABLE IF EXISTS ${tblPrefix}AGENT_LIST;
4+DROP TABLE IF EXISTS ${tblPrefix}LOGIN_LIST;
5+DROP TABLE IF EXISTS ${tblPrefix}SL_AGENT;
6+DROP TABLE IF EXISTS ${tblPrefix}USER_INFO;
7+DROP TABLE IF EXISTS ${tblPrefix}TRANSMIT_QUEUE;
8+DROP TABLE IF EXISTS ${tblPrefix}CHANNEL_INFO;
9+DROP TABLE IF EXISTS ${tblPrefix}SEQ_QUEUE_NUMBER;
10+DROP TABLE IF EXISTS ${tblPrefix}SEQ_USER_NUMBER;
11+DROP TABLE IF EXISTS ${tblPrefix}SLWEBTUNNEL_SYSTEM;
12+
13+
14+CREATE TABLE ${tblPrefix}SLWEBTUNNEL_SYSTEM(
15+ LAST_LOGDUMP DATETIME NOT NULL
16+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
17+INSERT INTO ${tblPrefix}SLWEBTUNNEL_SYSTEM(LAST_LOGDUMP) VALUES (NOW());
18+
19+CREATE TABLE ${tblPrefix}SEQ_USER_NUMBER (ID INT NOT NULL);
20+INSERT INTO ${tblPrefix}SEQ_USER_NUMBER VALUES (0);
21+
22+CREATE TABLE ${tblPrefix}SEQ_QUEUE_NUMBER (ID INT NOT NULL);
23+INSERT INTO ${tblPrefix}SEQ_QUEUE_NUMBER VALUES (0);
24+
25+CREATE TABLE ${tblPrefix}CHANNEL_INFO(
26+ CHANNEL_NUMBER INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
27+ CHANNEL_NAME VARCHAR(100) NOT NULL,
28+ LAST_UPDATE DATETIME NOT NULL,
29+ LAST_CLEANUP DATETIME NOT NULL,
30+ OWNER_ID CHAR(20) UNIQUE NOT NULL,
31+ PASSWORD CHAR(50) NOT NULL,
32+ UUID CHAR(36)
33+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
34+
35+CREATE TABLE ${tblPrefix}USER_INFO(
36+ USER_NUMBER INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
37+ USER_ID CHAR(20) UNIQUE NOT NULL,
38+ USER_NAME VARCHAR(100) NOT NULL,
39+ PASSWORD VARCHAR(50) NOT NULL
40+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
41+
42+CREATE TABLE ${tblPrefix}SL_AGENT(
43+ AGENT_NAME CHAR(100) PRIMARY KEY NOT NULL
44+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
45+
46+CREATE TABLE ${tblPrefix}LOGIN_LIST(
47+ USER_NUMBER INTEGER NOT NULL,
48+ CHANNEL_NUMBER INTEGER NOT NULL,
49+ LAST_UPDATE DATETIME NOT NULL,
50+ PRIMARY KEY (USER_NUMBER,CHANNEL_NUMBER),
51+ CONSTRAINT FOREIGN KEY (USER_NUMBER) REFERENCES USER_INFO(USER_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE,
52+ CONSTRAINT FOREIGN KEY (CHANNEL_NUMBER) REFERENCES CHANNEL_INFO(CHANNEL_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE
53+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
54+
55+CREATE TABLE ${tblPrefix}AGENT_LIST(
56+ AGENT_NAME CHAR(100) NOT NULL,
57+ CHANNEL_NUMBER INTEGER NOT NULL,
58+ PRIMARY KEY (AGENT_NAME,CHANNEL_NUMBER),
59+ CONSTRAINT FOREIGN KEY (AGENT_NAME) REFERENCES SL_AGENT(AGENT_NAME) ON DELETE CASCADE ON UPDATE CASCADE,
60+ CONSTRAINT FOREIGN KEY (CHANNEL_NUMBER) REFERENCES CHANNEL_INFO(CHANNEL_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE
61+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
62+
63+CREATE TABLE ${tblPrefix}MESSAGE_LOG(
64+ NUMERICAL_ORDER INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
65+ USER_NUMBER INTEGER,
66+ AGENT_NAME CHAR(100),
67+ CHANNEL_NUMBER INTEGER NOT NULL,
68+ INSERT_TIME DATETIME NOT NULL,
69+ MESSAGE VARCHAR(300) NOT NULL,
70+ CONSTRAINT FOREIGN KEY (USER_NUMBER) REFERENCES USER_INFO(USER_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE,
71+ CONSTRAINT FOREIGN KEY (AGENT_NAME) REFERENCES SL_AGENT(AGENT_NAME) ON DELETE CASCADE ON UPDATE CASCADE,
72+ CONSTRAINT FOREIGN KEY (CHANNEL_NUMBER) REFERENCES CHANNEL_INFO(CHANNEL_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE
73+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
74+
75+CREATE TABLE ${tblPrefix}TRANSMIT_QUEUE(
76+ QUEUE_NUMBER INTEGER PRIMARY KEY NOT NULL,
77+ CHANNEL_NUMBER INTEGER NOT NULL,
78+ NEXT_QUEUE_NUMBER INTEGER,
79+ BODY VARCHAR(2000) NOT NULL,
80+ INSERT_DATE DATETIME NOT NULL,
81+ CONSTRAINT FOREIGN KEY (CHANNEL_NUMBER) REFERENCES CHANNEL_INFO(CHANNEL_NUMBER) ON DELETE CASCADE ON UPDATE CASCADE
82+) ENGINE = InnoDB DEFAULT CHARACTER SET utf8;
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/datafile/ChannelInfo.txt (nonexistent)
+++ slwebtunnel/trunk/src/datafile/ChannelInfo.txt (revision 6)
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/datafile/LoginList.txt (nonexistent)
+++ slwebtunnel/trunk/src/datafile/LoginList.txt (revision 6)
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/datafile/MessageLog.txt (nonexistent)
+++ slwebtunnel/trunk/src/datafile/MessageLog.txt (revision 6)
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/datafile/TransmitQueue.txt (nonexistent)
+++ slwebtunnel/trunk/src/datafile/TransmitQueue.txt (revision 6)
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/datafile/SlWebTunnelSystem.txt (nonexistent)
+++ slwebtunnel/trunk/src/datafile/SlWebTunnelSystem.txt (revision 6)
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/datafile/AgentList.txt (nonexistent)
+++ slwebtunnel/trunk/src/datafile/AgentList.txt (revision 6)
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/datafile/UserInfo.txt (nonexistent)
+++ slwebtunnel/trunk/src/datafile/UserInfo.txt (revision 6)
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/datafile/SlAgent.txt (nonexistent)
+++ slwebtunnel/trunk/src/datafile/SlAgent.txt (revision 6)
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/view/displayLogView.php (nonexistent)
+++ slwebtunnel/trunk/src/view/displayLogView.php (revision 6)
@@ -0,0 +1,92 @@
1+<?php
2+/*
3+ * $id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+ $errorMessage = $displayItems['ERROR_MESSAGE'];
8+ $loginFlag = $displayItems['LOGIN_FLAG'];
9+ $userName = $displayItems['USER_NAME'];
10+ $userList = $displayItems['USER_LIST'];
11+ $agentList = $displayItems['AGENT_LIST'];
12+ $messageList = $displayItems['MESSAGE_LIST']; //array of (INSER_TIME, WEB/SL_FLAG, USER_NAME, MESSAGE)
13+ $lastUpdate = $displayItems['LAST_UPDATE'];
14+?>
15+<html>
16+ <head>
17+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
18+ <title><?=PAGETEXT_TITLE?> - <?=PAGETEXT_DISPLAYLOG?></title>
19+ </head>
20+<script type="text/javascript">
21+<!--
22+ function execOnLoad() {
23+ <?php if ($loginFlag) { ?>
24+ document.getElementById("paramMessage").focus();
25+ <?php } ?>
26+ setTimeout(reloadPage, <?=AUTO_RELOAD_INTERVAL?> * 1000);
27+ }
28+ function reloadPage() {
29+ document.getElementById("formReload").submit();
30+ }
31+-->
32+</script>
33+<body onLoad="execOnLoad();">
34+ <h1><?=PAGETEXT_DISPLAYLOG?></h1>
35+ <?php if ($errorMessage) {?>
36+ <?php foreach($errorMessage as $item) {?>
37+ <?=htmlentities($item)?><br/>
38+ <?php } ?>
39+ <?php } ?>
40+
41+ <?php if ($loginFlag) {?>
42+ <form action="<?=$script?>" method="POST">
43+ <input type="hidden" name="<?=PARAM_COMMAND?>" value="<?=COMMAND_LOGOUTPROCESS?>"/>
44+ <input type="submit" value="<?=PAGETEXT_BUTTON_LOGOUT?>"/>
45+ </form>
46+ <?php } else { ?>
47+ <form action="<?=$script?>" method="POST">
48+ <input type="hidden" name="<?=PARAM_COMMAND?>" value="<?=COMMAND_LOGIN?>"/>
49+ <input type="submit" value="<?=PAGETEXT_BUTTON_LOGIN?>"/>
50+ </form>
51+ <?php } ?>
52+
53+ <?php if ($loginFlag) {?>
54+ <form action="<?=$script?>" method="POST">
55+ <?=htmlspecialchars($userName)?> <input type="text" name="<?=PARAM_MESSAGE?>" id="paramMessage"/>
56+ <br/>
57+ <input type="hidden" name="<?=PARAM_COMMAND?>" value="<?=COMMAND_CHAT?>"/>
58+ <input type="submit" value="<?=PAGETEXT_BUTTON_SUBMIT?>"/>
59+ </form>
60+ <?php } ?>
61+ <form action="<?=$script?>" method="POST" id="formReload">
62+ <?php if ($loginFlag) {?>
63+ <input type="hidden" name="<?=PARAM_COMMAND?>" value="<?=COMMAND_CHAT?>"/>
64+ <?php } else { ?>
65+ <input type="hidden" name="<?=PARAM_COMMAND?>" value="<?=COMMAND_DISPLAYLOG?>"/>
66+ <input type="submit" value="<?=PAGETEXT_BUTTON_RELOAD?>"/>
67+ <?php } ?>
68+ </form>
69+ <hr/>
70+ Web :
71+ <?php foreach($userList as $item) {?>
72+ <?=htmlspecialchars($item)?>,
73+ <?php } ?>
74+ <br/>
75+
76+ SL :
77+ <?php foreach($agentList as $item) {?>
78+ <?=htmlspecialchars($item)?>,
79+ <?php } ?>
80+ <br/>
81+
82+ Last update(SL) : <?=htmlspecialchars($lastUpdate)?>
83+ <hr/>
84+ <?php foreach($messageList as $item) {?>
85+ <?=htmlspecialchars($item[0])?> :
86+ <?=($item[1]==CODE_WEB)?'(WEB)':'(SL)'?> :
87+ <?=htmlspecialchars($item[2])?> :
88+ <?=htmlspecialchars($item[3])?>
89+ <br/>
90+ <?php } ?>
91+</body>
92+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/view/loginView.php (nonexistent)
+++ slwebtunnel/trunk/src/view/loginView.php (revision 6)
@@ -0,0 +1,26 @@
1+<?php
2+/*
3+ * $id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+?>
8+<html>
9+ <head>
10+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
11+ <title><?=PAGETEXT_TITLE?> - <?=PAGETEXT_LOGIN?></title>
12+ </head>
13+<body>
14+ <h1><?=PAGETEXT_LOGIN?></h1>
15+ <form action="<?=$script?>" method="POST">
16+ <?=PAGETEXT_USERNAME?><input type="text" name="<?=PARAM_USER_NAME?>"/>
17+ <input type="hidden" name="<?=PARAM_COMMAND?>" value="<?=COMMAND_LOGINPROCESS?>"/>
18+ <br/>
19+ <input type="submit" value="<?=PAGETEXT_BUTTON_LOGIN?>"/>
20+ </form>
21+ <form action="<?=$script?>" method="POST">
22+ <input type="hidden" name="<?=PARAM_COMMAND?>" value="<?=COMMAND_DISPLAYLOG?>"/>
23+ <input type="submit" value="<?=PAGETEXT_BUTTON_BACK?>"/>
24+ </form>
25+</body>
26+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/view/selectChannelView.php (nonexistent)
+++ slwebtunnel/trunk/src/view/selectChannelView.php (revision 6)
@@ -0,0 +1,21 @@
1+<?php
2+/*
3+ * $id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+ $channelList = $displayItems['CHANNEL_LIST'];
8+ //array of (CHANNEL_NUMBER, CHANNEL_NAME, USER_NUM, AGENT_NUM)
9+?>
10+<html>
11+ <head>
12+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
13+ <title><?=PAGETEXT_TITLE?> - <?=PAGETEXT_SELECTCHANNEL?></title>
14+ </head>
15+<body>
16+ <h1><?=PAGETEXT_SELECTCHANNEL?></h1>
17+ <?php foreach($channelList as $item) {?>
18+ <a href="?<?=PARAM_CHANNEL_NUMBER?>=<?=$item[0]?>"><?=htmlspecialchars($item[1])?> - Web(<?=$item[2]?>) SL(<?=$item[3]?>)</a><br/>
19+ <?php } ?>
20+</body>
21+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/tunnel.php (nonexistent)
+++ slwebtunnel/trunk/src/tunnel.php (revision 6)
@@ -0,0 +1,128 @@
1+<?php
2+/*
3+ * SlWebTunnel
4+ * Setup page
5+ * $Id$
6+ * Created on 2007/10/24
7+ *
8+ */
9+ require_once 'slwebtunnel.ini.php';
10+
11+ $params = array_merge($_GET);
12+ $rawPost = explodeEscaped(file_get_contents("php://input"), ",");
13+
14+ $command = $rawPost[0];
15+ $dataManager = new SlwtDataManager();
16+ if (!$dataManager->initialize()) {
17+ die(MSG_ERROR_DB_CONNECTION);
18+ }
19+
20+ if ($dataManager->isTimeToLogDump()) {
21+ $dataManager->beginTransaction();
22+ $dataManager->execLogDump();
23+ $dataManager->commit();
24+ }
25+
26+ if ($command == COMMAND_TUNNEL) {
27+ $paramOwnerId = $rawPost[1];
28+ $paramUuid = $rawPost[2];
29+ $paramPassKey = $rawPost[3];
30+ $paramCommunicationMode = $rawPost[4];
31+ $paramQueueNumber = $rawPost[5];
32+ $paramBody = array_slice($rawPost, 6);
33+
34+ $channelNumber = $dataManager->checkTunnelAvailable($paramOwnerId, $paramUuid, $paramPassKey);
35+
36+ if ($channelNumber !== FALSE && !isBlank($paramCommunicationMode)) {
37+ $dataManager->beginTransaction();
38+ if ($dataManager->isTimeToCleanup($channelNumber)) {
39+ $dataManager->execCleanup($channelNumber);
40+ }
41+
42+ $previousLastUpdate = $dataManager->updateChannel($channelNumber);
43+ $transmitQueue = NULL;
44+ if ($paramCommunicationMode == COMMUNICATION_MODE_SEND
45+ || $paramCommunicationMode == COMMUNICATION_MODE_BOTH) {
46+ $tokens = $paramBody;
47+ if(count(tokens) > 0 && $tokens[0] == LSLFLAG_SUCCEED) {
48+ foreach($tokens as $token) {
49+ $lslFlag = substr($token, 0, 1);
50+ $lslBody = substr($token, 1);
51+ if ($lslFlag == LSLFLAG_USER_REFLESH) {
52+ $dataManager->deleteAgentList($channelNumber);
53+ } else if ($lslFlag == LSLFLAG_USERNAME) {
54+ $dataManager->insertAgentList($channelNumber, $lslBody);
55+ } else if ($lslFlag == LSLFLAG_MESSAGE) {
56+ $tmpMsgTokens = explodeEscaped($lslBody, ":");
57+ $dataManager->insertSlMessage($channelNumber, $tmpMsgTokens[0], $tmpMsgTokens[1]);
58+ } else if ($lslFlag == LSLFLAG_NEXT) {
59+ break;
60+ } else if ($lslFlag == LSLFLAG_END) {
61+ break;
62+ }
63+ }
64+ }
65+ }
66+ if ($paramCommunicationMode == COMMUNICATION_MODE_RECEIVE
67+ || $paramCommunicationMode == COMMUNICATION_MODE_BOTH) {
68+
69+ if (isBlank($paramQueueNumber)) {
70+ $dataManager->deleteTransmitQueue($channelNumber);
71+
72+ //create TransmitQueue
73+ $tqb = new TransmitQueueBuilder($dataManager, $channelNumber);
74+ $tqb->append(LSLFLAG_USER_REFLESH);
75+ $loginedUserList = $dataManager->getLoginedUserList($channelNumber);
76+ foreach ($loginedUserList as $loginedUser) {
77+ $tqb->append(LSLFLAG_USERNAME.urlencode($loginedUser));
78+ }
79+ $messageList = $dataManager->getSlLogData($channelNumber, $previousLastUpdate);
80+ foreach ($messageList as $message) {
81+ $tqb->append(LSLFLAG_MESSAGE.urlencode($message[1]).":".urlencode($message[2]));
82+ }
83+ $tqb->flushBuffer();
84+ $paramQueueNumber = $tqb->getFirstQueueNumber();
85+ $tqb->dispose();
86+ }
87+ }
88+ $dataManager->commit();
89+ if ($paramCommunicationMode == COMMUNICATION_MODE_SEND) {
90+ print(LSLFLAG_SUCCEED. HTTP_DELIMITER. LSLFLAG_END);
91+ } else {
92+ $transmitQueue = $dataManager->getTransmitQueue($channelNumber, $paramQueueNumber);
93+ if ($transmitQueue) {
94+ print(LSLFLAG_SUCCEED.HTTP_DELIMITER.$transmitQueue[1]);
95+ if ($transmitQueue[0]) {
96+ print(LSLFLAG_NEXT.$transmitQueue[0]);
97+ } else {
98+ print(LSLFLAG_END);
99+ }
100+ } else {
101+ print(LSLFLAG_FAILED);
102+ }
103+ }
104+ } else {
105+ print(LSLFLAG_FAILED);
106+ }
107+
108+ } elseif ($command == COMMAND_SETUPTUNNEL) {
109+ $paramOwnerId = $rawPost[1];
110+ $paramUuid = $rawPost[2];
111+ $paramPassKey = $rawPost[3];
112+ $paramChannelName = $rawPost[4];
113+ if ($paramUuid && $paramUuid && $paramPassKey) {
114+ $dataManager->beginTransaction();
115+ if ($dataManager->setupTunnel($paramOwnerId, $paramUuid, $paramPassKey, $paramChannelName)) {
116+ print(LSLFLAG_SUCCEED);
117+ } else {
118+ print(LSLFLAG_FAILED);
119+ }
120+ $dataManager->commit();
121+ } else {
122+ print(LSLFLAG_FAILED);
123+ }
124+ }
125+
126+ $dataManager->dispose();
127+
128+?>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/admview/admViewLogView.php (nonexistent)
+++ slwebtunnel/trunk/src/admview/admViewLogView.php (revision 6)
@@ -0,0 +1,35 @@
1+<?php
2+/*
3+ * $Id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+ $logFileList = $displayItems['LOG_FILE_LIST'];
8+ $logContent = $displayItems['LOG_CONTENT']
9+?>
10+<html>
11+ <head>
12+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
13+ <title><?=ADMPAGETEXT_TITLE?> - <?=ADMPAGETEXT_VIEW_LOG?></title>
14+ </head>
15+<body>
16+ <?=displayMessages()?>
17+ <h1><?=ADMPAGETEXT_VIEW_LOG?></h1>
18+ <form method="POST">
19+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>" value="<?=ADMCMD_MENU?>"/>
20+ <input type="submit" value="<?=PAGETEXT_BUTTON_BACK?>"/>
21+ </form>
22+ <hr/>
23+ <h2><?=ADMPAGETEXT_LOG_FILE_LIST?></h2>
24+ <? foreach($logFileList as $n => $logFile) { ?>
25+ <a href="?<?=ADMPARM_ADMCMD?>=<?=ADMCMD_VIEW_LOG?>&<?=ADMPARM_LOG_NUMBER?>=<?=$n?>&<?=ADMPARM_LOG_FILE_NAME?>=<?=urlencode($logFile)?>"><?=urlencode($logFile)?></a><br/>
26+ <? } ?>
27+ <? if ($logContent) { ?>
28+ <hr/>
29+ <h2><?=ADMPAGETEXT_LOG_FILE_CONTENT?></h2>
30+ <? foreach($logContent as $line) { ?>
31+ <?=htmlspecialchars($line)?><br/>
32+ <? } ?>
33+ <? } ?>
34+</body>
35+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/admview/admEditChannelView.php (nonexistent)
+++ slwebtunnel/trunk/src/admview/admEditChannelView.php (revision 6)
@@ -0,0 +1,67 @@
1+<?php
2+/*
3+ * $Id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+ $channelList = $displayItems['CHANNEL_LIST'];
8+?>
9+<html>
10+ <head>
11+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
12+ <title><?=ADMPAGETEXT_TITLE?> - <?=ADMPAGETEXT_EDIT_CHANNEL?></title>
13+ </head>
14+<body>
15+ <?=displayMessages()?>
16+ <h1><?=ADMPAGETEXT_EDIT_CHANNEL?></h1>
17+ <form method="POST">
18+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>" value="<?=ADMCMD_MENU?>"/>
19+ <input type="submit" value="<?=PAGETEXT_BUTTON_BACK?>"/>
20+ </form>
21+ <?php if ($channelList === false) { ?>
22+ <?=ADMMSG_GETTING_CHANNEL_INFO_FAILED?>
23+ <?php } else { ?>
24+ <table>
25+ <tr>
26+ <th><?=ADMPAGETEXT_OWNER_ID?></th>
27+ <th><?=ADMPAGETEXT_PASSWORD?></th>
28+ <th><?=ADMPAGETEXT_LAST_UPDATE?></th>
29+ </tr>
30+ <?php foreach($channelList as $channelInfo) { ?>
31+ <tr>
32+ <form method="POST">
33+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>"value="<?=ADMCMD_EDIT_CHANNEL?>"/>
34+ <input type="hidden" name="<?=ADMPARM_ACTION?>"value="<?=ADMACT_MODIFY?>"/>
35+ <input type="hidden" name="<?=ADMPARM_CHANNEL_NUMBER?>" value="<?=htmlentities($channelInfo[0])?>"/>
36+ <td><input type="text" name="<?=ADMPARM_OWNER_ID?>" value="<?=htmlentities($channelInfo[1])?>"/></td>
37+ <td><input type="password" name="<?=ADMPARM_PASSKEY?>" value=""/></td>
38+ <td><?=htmlentities($channelInfo[2])?></td>
39+ <td><input type="submit" value="<?=PAGETEXT_BUTTON_UPDATE?>"/></td>
40+ </form>
41+ <form method="POST">
42+ <td>
43+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>"value="<?=ADMCMD_EDIT_CHANNEL?>"/>
44+ <input type="hidden" name="<?=ADMPARM_ACTION?>"value="<?=ADMACT_DELETE?>"/>
45+ <input type="hidden" name="<?=ADMPARM_CHANNEL_NUMBER?>" value="<?=htmlentities($channelInfo[0])?>"/>
46+ <input type="submit" value="<?=PAGETEXT_BUTTON_DELETE?>"/>
47+ </td>
48+ </form>
49+ </tr>
50+ <?php } ?>
51+ <tr>
52+ <form method="POST">
53+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>"value="<?=ADMCMD_EDIT_CHANNEL?>"/>
54+ <input type="hidden" name="<?=ADMPARM_ACTION?>"value="<?=ADMACT_ADD?>"/>
55+ <input type="hidden" name="<?=ADMPARM_CHANNEL_NUMBER?>" value=""/>
56+ <td><input type="text" name="<?=ADMPARM_OWNER_ID?>" value=""/></td>
57+ <td><input type="password" name="<?=ADMPARM_PASSKEY?>" value=""/></td>
58+ <td></td>
59+ <td><input type="submit" value="<?=PAGETEXT_BUTTON_INSERT?>"/></td>
60+ </form>
61+ <td>
62+ </td>
63+ </tr>
64+ </table>
65+ <?php } ?>
66+</body>
67+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/admview/admCheckConfigView.php (nonexistent)
+++ slwebtunnel/trunk/src/admview/admCheckConfigView.php (revision 6)
@@ -0,0 +1,36 @@
1+<?php
2+/*
3+ * $Id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+ $checkResult = $displayItems['CHECK_RESULT'];
8+?>
9+<html>
10+ <head>
11+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
12+ <title><?=ADMPAGETEXT_TITLE?> - <?=ADMPAGETEXT_CHECK_CONFIG?></title>
13+ </head>
14+<body>
15+ <?=displayMessages()?>
16+ <h1><?=ADMPAGETEXT_CHECK_CONFIG?></h1>
17+ <form method="POST">
18+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>" value="<?=ADMCMD_MENU?>"/>
19+ <input type="submit" value="<?=PAGETEXT_BUTTON_BACK?>"/>
20+ </form>
21+ <hr/>
22+ <h2><?=ADMPAGETEXT_EXEC_RESULT?></h2>
23+ <?php if (count($checkResult) > 0) { ?>
24+ <?php foreach($checkResult as $r) { ?>
25+ <?php if ($r[1]) { ?>
26+ <font color="BLUE"><?=htmlspecialchars($r[0])?></font>
27+ <?=ADMPAGETEXT_SUCCEED?><br/>
28+ <?php } else { ?>
29+ <font color="RED"><?=htmlspecialchars($r[0])?></font>
30+ <?=ADMPAGETEXT_FAILED?><br/>
31+ <?php } ?>
32+ <br/>
33+ <?php } ?>
34+ <?php } ?>
35+</body>
36+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/admview/admMenuView.php (nonexistent)
+++ slwebtunnel/trunk/src/admview/admMenuView.php (revision 6)
@@ -0,0 +1,25 @@
1+<?php
2+/*
3+ * $Id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+?>
8+<html>
9+ <head>
10+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
11+ <title><?=ADMPAGETEXT_TITLE?> - <?=ADMPAGETEXT_MENU?></title>
12+ </head>
13+<body>
14+ <?=displayMessages()?>
15+ <h1><?=ADMPAGETEXT_MENU?></h1>
16+ <form method="POST">
17+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>" value="<?=ADMCMD_LOGOUT_PROCESS?>"/>
18+ <input type="submit" value="<?=PAGETEXT_BUTTON_LOGOUT?>"/>
19+ </form>
20+ <a href="?<?=ADMPARM_ADMCMD?>=<?=ADMCMD_EDIT_CHANNEL?>"><?=ADMPAGETEXT_EDIT_CHANNEL?></a><br/>
21+ <a href="?<?=ADMPARM_ADMCMD?>=<?=ADMCMD_VIEW_LOG?>"><?=ADMPAGETEXT_VIEW_LOG?></a><br/>
22+ <a href="?<?=ADMPARM_ADMCMD?>=<?=ADMCMD_CHECK_CONFIG?>"><?=ADMPAGETEXT_CHECK_CONFIG?></a><br/>
23+ <a href="?<?=ADMPARM_ADMCMD?>=<?=ADMCMD_RESET_DB?>"><?=ADMPAGETEXT_RESET_DB?></a>
24+</body>
25+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/admview/admLoginView.php (nonexistent)
+++ slwebtunnel/trunk/src/admview/admLoginView.php (revision 6)
@@ -0,0 +1,21 @@
1+<?php
2+/*
3+ * $Id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+?>
8+<html>
9+ <head>
10+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
11+ <title><?=ADMPAGETEXT_TITLE?> - <?=ADMPAGETEXT_LOGIN?></title>
12+ </head>
13+<body>
14+ <h1><?=PAGETEXT_LOGIN?></h1>
15+ <form method="POST">
16+ <?=PAGETEXT_PASSWORD?><input type="password" name="<?=ADMPARM_ADMPASSKEY?>"/>
17+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>" value="<?=ADMCMD_LOGIN_PROCESS?>"/>
18+ <input type="submit" value="<?=PAGETEXT_BUTTON_LOGIN?>"/>
19+ </form>
20+</body>
21+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/src/admview/admResetDbView.php (nonexistent)
+++ slwebtunnel/trunk/src/admview/admResetDbView.php (revision 6)
@@ -0,0 +1,43 @@
1+<?php
2+/*
3+ * $Id$
4+ * Created on 2007/10/20
5+ *
6+ */
7+ $sqlResult = $displayItems['SQL_RESUIT'];
8+
9+?>
10+<html>
11+ <head>
12+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
13+ <title><?=ADMPAGETEXT_TITLE?> - <?=ADMPAGETEXT_RESET_DB?></title>
14+ </head>
15+<body>
16+ <?=displayMessages()?>
17+ <h1><?=ADMPAGETEXT_RESET_DB?></h1>
18+ <form method="POST">
19+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>" value="<?=ADMCMD_MENU?>"/>
20+ <input type="submit" value="<?=PAGETEXT_BUTTON_BACK?>"/>
21+ </form>
22+ <?=ADMMSG_PUSH_TO_RESET_DB?>
23+ <form method="POST">
24+ <input type="hidden" name="<?=ADMPARM_ADMCMD?>" value="<?=ADMCMD_RESET_DB?>"/>
25+ <input type="hidden" name="<?=ADMPARM_EXEC_FLAG?>" value="1"/>
26+ <input type="submit" value="<?=PAGETEXT_BUTTON_SUBMIT?>"/>
27+ </form>
28+ <?php if (count($sqlResult) > 0) { ?>
29+ <hr/>
30+ <h2><?=ADMPAGETEXT_EXEC_RESULT?></h2>
31+ <?php foreach($sqlResult as $r) { ?>
32+ <?php if ($r[1]) { ?>
33+ <font color="BLUE"><?=htmlspecialchars($r[0])?></font><br/>
34+ <?=ADMPAGETEXT_SUCCEED?>(<?=htmlspecialchars($r[2])?>)<br/>
35+ <?php } else { ?>
36+ <font color="RED"><?=htmlspecialchars($r[0])?></font><br/>
37+ <?=ADMPAGETEXT_FAILED?>(<?=htmlspecialchars($r[2])?>)<br/>
38+ <?php } ?>
39+ <br/>
40+ <?php } ?>
41+ <?php } ?>
42+</body>
43+</html>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/readme.txt (nonexistent)
+++ slwebtunnel/trunk/readme.txt (revision 6)
@@ -0,0 +1,81 @@
1+Copyright 2007 Takao Sumitomo. All rights reserved.
2+
3+ SLWebTunnel
4+ URL http://www.cattaka.net/
5+ $Id$
6+
7+◇概要
8+ Second LifeとWebチャットを繋ぎ、相互にチャットを行えるWebアプリです。
9+
10+◇動作確認環境
11+ Apache 1.3.37
12+ PHP 5.2.3
13+ MySQL 5.1.20
14+
15+◇ファイル一覧
16+ readme.txt このファイル。
17+ license.txt ライセンスについて。
18+ ./lsl/SLWebTunnel.lsl Second Life上で動作するクライアントのLSL。
19+ ./lsl/SLWebTunnel.cfg lsl用の設定notecardのテンプレート。
20+ ./slwebtunnel.php Web側のチャットのphpファイル。
21+ ./slwebtunnel.ini.php Web側の設定ファイル。
22+ ./slwtadmin.php 設定用
23+ ./tunnel.php SLのクライアント用のphp
24+ ./view/ 画面表示用のphpがあるディレクトリ。
25+ ./log/ デフォルトのログファイルの格納先。
26+ ./admview/ 管理画面表示用のphpがあるディレクトリ。
27+ ./<その他> 動作に必要なファイル群
28+
29+◇設置方法
30+ ◆Web側
31+ ./src/ディレクトリ以下のファイルをWebにアップロードします。
32+ 次にslwebtunnel.ini.phpを修正します。
33+ ・$dataManagerType
34+ データソースの種類を指定します。
35+ 現在MySql(mysql)とデータファイル(datafile)の2つが利用可能です。
36+ ○MySQLの場合の設定
37+ ・DATA_SOURCE_NAME
38+ MySQLのデータソースを指定します。
39+ ・DATA_SOURCE_USER
40+ MySQLのユーザーを指定します。
41+ ・DATA_SOURCE_PASS
42+ MySQLのパスワードを指定します。
43+ ○データファイルの場合の設定
44+ ・DATA_SOURCE_DIR
45+ MySQLのパスワードを指定します。
46+ ・$tblPrefix
47+ MySQLのテーブルに接頭辞を付ける場合は指定します。
48+ ・$adminPassKey
49+ 管理用パスワードを指定します。
50+ ・AUTO_LOGOUT_INTERVAL
51+ Webチャットの参加者がログアウトボタンを押さずにブラウザを閉じたとき、
52+ ログアウトしたと見なすまでの時間(秒)。
53+ ・AUTO_RELOAD_INTERVAL
54+ Webチャットの自動更新の間隔(秒)。
55+ ・CLEAN_UP_INTERVAL
56+ DB上から古くなったデータを削除する間隔(秒)。
57+ ・$logDumpDir
58+ ログファイルを出力するディレクトリ。
59+ Webブラウザでslwtadmin.phpにアクセスします。
60+ 上で設定した管理用パスワードでログインします。
61+ DBリセット画面からDBをリセットします。
62+ ここでデータベースの接続に失敗するならば
63+ slwebtunnel.ini.phpのMySQLのデータソースの設定を修正してください。
64+ 設定チェック画面で全て成功になっていることを確認します。
65+ チャンネル編集画面でオーナーID、パスワード入力してチャンネルを追加します。
66+ ◆Second Life側
67+ オブジェクトにスクリプトを作成しSLWebTunnel.lslの内容をコピー&ペーストします。
68+ SLWebTunnel.cfgという名前でノートカードを作成し、
69+ SLWebTunnel.cfgの内容をコピー&ペーストします。
70+ SLWebTunnel.cfgを修正します。
71+ ・channelName
72+ チャンネルの名前を記述します。
73+ ・ownerId
74+ 上で設定したオーナーIDを記述します。
75+ ・tunnelUrl
76+ tunnel.phpのURLを指定します。
77+ ・webUrl
78+ slwebtunnel.phpのURLを指定し、ownerIdを指定します。
79+ ・passKey
80+ 上で設定したオーナーIDを記述します。
81+ オブジェクトにタッチして開始します。
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
--- slwebtunnel/trunk/build.xml (nonexistent)
+++ slwebtunnel/trunk/build.xml (revision 6)
@@ -0,0 +1,25 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<project name="Bakutan" default="release" basedir=".">
3+ <target name="init">
4+ <fail unless="eclipse.running" message="Eclipse上でAntを実行してください"/>
5+ <!-- property name="version" value="0.04"/ -->
6+
7+ <property file="./workdir/version.properties"/>
8+ </target>
9+ <target name="release" depends="init">
10+ <fail unless="eclipse.running" message="Eclipse上でAntを実行してください"/>
11+ <mkdir dir="./workdir"/>
12+ <delete file="./workdir/SLWebTunnel.zip"/>
13+ <zip zipfile="./workdir/SLWebTunnel.zip">
14+ <fileset dir="./src">
15+ <include name="**"/>
16+ </fileset>
17+ <fileset dir="./">
18+ <include name="lsl/**"/>
19+ <include name="readme.txt"/>
20+ <include name="license.txt"/>
21+ </fileset>
22+ </zip>
23+ <echo message="SLWebTunnel.zip is created."/>
24+ </target>
25+</project>
Added: svn:keywords
## -0,0 +1 ##
+Id Date Author Rev URL
\ No newline at end of property
Afficher sur ancien navigateur de dépôt.