Subversion Repositories php-qbpwcf

Rev

Rev 3 | Rev 68 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3 Rev 66
Line 10033... Line 10033...
10033
			#$result["output"],爲執行完二元碼後的輸出陣列.
10033
			#$result["output"],爲執行完二元碼後的輸出陣列.
10034
			#必填的參數
10034
			#必填的參數
10035
			#$conf["command"],字串,要執行的指令與.
10035
			#$conf["command"],字串,要執行的指令與.
10036
			$conf["external::callShell"]["command"]="systemctl";
10036
			$conf["external::callShell"]["command"]="systemctl";
10037
			#$conf["fileArgu"],字串,變數__FILE__的內容.
10037
			#$conf["fileArgu"],字串,變數__FILE__的內容.
10038
			$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];		
10038
			$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];
10039
			#可省略參數:
10039
			#可省略參數:
10040
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
10040
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
10041
			$conf["external::callShell"]["argu"]=array("restart","httpd");
10041
			$conf["external::callShell"]["argu"]=array("restart","httpd");
10042
			#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
10042
			#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
10043
			#$conf["arguIsAddr"]=array();
10043
			#$conf["arguIsAddr"]=array();
Line 10106... Line 10106...
10106
	#$conf["listenIp"]="";
10106
	#$conf["listenIp"]="";
10107
	#$conf["listenPort"],字串,要接聽的port,預設為已使用port+1.
10107
	#$conf["listenPort"],字串,要接聽的port,預設為已使用port+1.
10108
	#$conf["listenPort"]="";
10108
	#$conf["listenPort"]="";
10109
	#$conf["wsMode"],字串,是否要用webSocket模式,預設為"false",不使用,若為"true"則要使用.
10109
	#$conf["wsMode"],字串,是否要用webSocket模式,預設為"false",不使用,若為"true"則要使用.
10110
	#$conf["wsMode"]="false";
10110
	#$conf["wsMode"]="false";
10111
	#$conf["processFuncs"],陣列,針對收到的訊息要呼叫的函式,會帶入一個參數陣列,array("data"=>收到的資料,"serverSock"=>serverSock,"clientSock"=>clientSock,"clientInfo"=>用戶端的資訊,"clientIndex"=>用戶端的索引,"allConn"=>所有連線的用戶端的連線資訊),回傳的結果若為陣列$result,其$result["status"]為"true"時,會結束執行(等待下個訊息);為"false"時,會var_dump結果,然後交給下一個函式執行;為"continue"時,代表交給下一個函式執行.
10111
	#$conf["processFuncs"],陣列,針對收到的訊息要呼叫的函式,會帶入一個參數陣列,array("data"=>收到的資料,"serverSock"=>serverSock,"clientSock"=>clientSock,"clientInfo"=>用戶端的資訊,"clientIndex"=>用戶端的索引,"allConn"=>所有連線的用戶端的連線資訊),回傳的結果若為陣列$result,其$result["status"]為"true"時,會結束執行(等待下個訊息);為"false"時,會var_dump結果,然後交給下一個函式執行;為"continue"時,代表交給下一個函式執行;預設的數值為array("noAuth");
10112
	#$conf["processFuncs"]=array();
10112
	#$conf["processFuncs"]=array();
-
 
10113
	#$conf["idleFunc"],陣列,當沒有收到訊息時,要執行的函式順序,預設不指定.
-
 
10114
	#$conf["idleFunc"]=array();
10113
	#參考資料:
10115
	#參考資料:
10114
	#http://php.net/manual/en/sockets.examples.php
10116
	#http://php.net/manual/en/sockets.examples.php
10115
	#http://us3.php.net/manual/en/function.socket-select.php
10117
	#http://us3.php.net/manual/en/function.socket-select.php
10116
	#response should at least end with "\r"=>http://stackoverflow.com/questions/25739768/websocket-communication-between-chromeclient-and-hotspotserver-status-line
10118
	#response should at least end with "\r"=>http://stackoverflow.com/questions/25739768/websocket-communication-between-chromeclient-and-hotspotserver-status-line
10117
	#response status code should be 101=>http://stackoverflow.com/questions/29829597/i-get-a-status-200-when-connecting-to-the-websocket-but-it-is-an-error
10119
	#response status code should be 101=>http://stackoverflow.com/questions/29829597/i-get-a-status-200-when-connecting-to-the-websocket-but-it-is-an-error
10118
	#webSocket實做=>http://srchea.com/build-a-real-time-application-using-html5-websockets
10120
	#webSocket實做=>http://srchea.com/build-a-real-time-application-using-html5-websockets
10119
	#webSocketServer實做=>http://www.cuelogic.com/blog/php-and-html5-websocket-server-and-client-communication/
10121
	#webSocketServer實做=>http://www.cuelogic.com/blog/php-and-html5-websocket-server-and-client-communication/
10120
	#備註:
10122
	#備註:
10121
	#僅能在命令列執行.
10123
	#僅能在命令列執行.
10122
	#收到用戶的"id?"訊息,會回傳用戶的id.
-
 
10123
	#收到用戶的"ids?"訊息,會回傳非自己的所有用戶id
-
 
10124
	#收到用戶的"talkTo?"訊息,會回傳目前在跟誰談話.
-
 
10125
	#收到用戶的"talkTo:client-id"訊息,會建立與id對應的用戶對話,此後傳遞的訊息均會給對方.
-
 
10126
	#收到用戶的"quit"訊息,會結束與用戶的連線.
-
 
10127
	#收到用戶的"shutdown"訊息,會重新啟動webSocket server.
-
 
10128
	*/
10124
	*/
10129
	public static function nativeSocketTcpIpServer(&$conf){
10125
	public static function nativeSocketTcpIpServer(&$conf){
10130
		
10126
		
10131
		#初始化要回傳的結果
10127
		#初始化要回傳的結果
10132
		$result=array();
10128
		$result=array();
Line 10207... Line 10203...
10207
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
10203
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
10208
		#$conf["canBeEmpty"]=array();
10204
		#$conf["canBeEmpty"]=array();
10209
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
10205
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
10210
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
10206
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
10211
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
10207
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
10212
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("listenIp","listenPort","wsMode","processFuncs");
10208
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("listenIp","listenPort","wsMode","processFuncs","idleFunc");
10213
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
10209
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
10214
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array");
10210
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array","array");
10215
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
10211
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
10216
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",null,"false",null);
10212
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",null,"false",array("noAuth"),null);
10217
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
10213
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
10218
		#$conf["arrayCountEqualCheck"][]=array();
10214
		#$conf["arrayCountEqualCheck"][]=array();
10219
		#參考資料來源:
10215
		#參考資料來源:
10220
		#array_keys=>http://php.net/manual/en/function.array-keys.php
10216
		#array_keys=>http://php.net/manual/en/function.array-keys.php
10221
		#建議:
10217
		#建議:
Line 10247... Line 10243...
10247
			$result["error"]=$checkArguments;
10243
			$result["error"]=$checkArguments;
10248
			
10244
			
10249
			#回傳結果
10245
			#回傳結果
10250
			return $result;
10246
			return $result;
10251
			
10247
			
10252
			}#if end		
10248
			}#if end
10253
		
10249
		
10254
		#如果 $conf["listenPort"] 不存在
10250
		#如果 $conf["listenPort"] 不存在
10255
		if(!isset($conf["listenPort"])){
10251
		if(!isset($conf["listenPort"])){
10256
			
10252
			
10257
			#用nmap掃port
10253
			#用nmap掃port
Line 10327... Line 10323...
10327
					#設為4000
10323
					#設為4000
10328
					$conf["listenPort"]="4000";
10324
					$conf["listenPort"]="4000";
10329
					
10325
					
10330
					}#if end
10326
					}#if end
10331
				
10327
				
10332
				}#if end	
10328
				}#if end
10333
				
10329
				
10334
			}#if end
10330
			}#if end
10335
			
10331
			
10336
		#反之
10332
		#反之
10337
		else{
10333
		else{
Line 10452... Line 10448...
10452
			socket_set_nonblock($sock);
10448
			socket_set_nonblock($sock);
10453
			
10449
			
10454
			#SOL_SOCKET => socket level
10450
			#SOL_SOCKET => socket level
10455
			#SO_REUSEADDR => Reports whether local addresses can be reused. 
10451
			#SO_REUSEADDR => Reports whether local addresses can be reused. 
10456
			socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
10452
			socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
10457
							
10453
			
10458
			#如果 Binds a name to a socket 失敗
10454
			#如果 Binds a name to a socket 失敗
10459
			if (@socket_bind($sock, $address, $port) === false){
10455
			if (@socket_bind($sock, $address, $port) === false){
10460
				
10456
				
10461
				#儲存錯誤訊息
10457
				#儲存錯誤訊息
10462
				$error=socket_strerror(socket_last_error($sock));
10458
				$error=socket_strerror(socket_last_error($sock));
Line 10525... Line 10521...
10525
				}#if end
10521
				}#if end
10526
 
10522
 
10527
			#初始化儲存已經連線到 socket service 的服務
10523
			#初始化儲存已經連線到 socket service 的服務
10528
			$connections=array();
10524
			$connections=array();
10529
 
10525
 
-
 
10526
			#初始化 idle 時要呼叫的函式名稱陣列
-
 
10527
			$idleFunc=array();
-
 
10528
 
10530
			#提示 listen 的 ip 與 port
10529
			#提示 listen 的 ip 與 port
10531
			echo "Listen to:".$address.":".$port.PHP_EOL;
10530
			echo "Listen to:".$address.":".$port.PHP_EOL;
10532
 
10531
 
10533
			#重複做,等待別人連線.
10532
			#重複做,等待別人連線.
10534
			do{
10533
			do{
Line 10591... Line 10590...
10591
						#設置執行失敗
10590
						#設置執行失敗
10592
						$result["status"]="false";
10591
						$result["status"]="false";
10593
						
10592
						
10594
						#設置執行錯誤訊息
10593
						#設置執行錯誤訊息
10595
						$result["error"]=$encode;
10594
						$result["error"]=$encode;
10596
							
10595
						
10597
						#回傳結果
10596
						#回傳結果
10598
						return $result;
10597
						return $result;
10599
					
10598
					
10600
						}#if end
10599
						}#if end
10601
					
10600
					
Line 10606... Line 10605...
10606
						if(isset($client["lastPongTime"])){
10605
						if(isset($client["lastPongTime"])){
10607
						
10606
						
10608
							#如果小於5秒沒有收到pong
10607
							#如果小於5秒沒有收到pong
10609
							if(time()-$client["lastPongTime"]<5){
10608
							if(time()-$client["lastPongTime"]<5){
10610
							
10609
							
10611
								#看下一個連線
10610
								#看下一個連線,亦即視為用戶已經斷線.
10612
								continue;
10611
								continue;
10613
							
10612
							
10614
								}#if end
10613
								}#if end
10615
						
10614
						
10616
							}#if end
10615
							}#if end
Line 10624... Line 10623...
10624
						#debug
10623
						#debug
10625
						#var_dump(__LINE__,"send ping",$socket_write,socket_strerror(socket_last_error($clientSock)));
10624
						#var_dump(__LINE__,"send ping",$socket_write,socket_strerror(socket_last_error($clientSock)));
10626
					
10625
					
10627
						}#foreach end
10626
						}#foreach end
10628
					
10627
					
-
 
10628
					#如果有idle時要做的事情
-
 
10629
					if(count($conf["idleFunc"])>0){
-
 
10630
					
-
 
10631
						#取得idleFunc設定
-
 
10632
						$idleFunc=$conf["idleFunc"];
-
 
10633
						
-
 
10634
						#移除初始的idelFunc設定
-
 
10635
						unset($conf["idleFunc"]);
-
 
10636
					
-
 
10637
						}#if end
-
 
10638
					
-
 
10639
					#如果有idle時要做的事情
-
 
10640
					if(count($idleFunc)>0){
-
 
10641
					
-
 
10642
						#針對每個要執行的函式
-
 
10643
						foreach($idleFunc as $if){
-
 
10644
						
-
 
10645
							#設置要給予函式的參數陣列
-
 
10646
							$param=array("idleFunc"=>&$idleFunc,"serverSock"=>&$sock,"allConn"=>&$connections);
-
 
10647
							
-
 
10648
							#初始化給予 call_user_func_array 的第2個參數
-
 
10649
							$params=array();
-
 
10650
							
-
 
10651
							#設置呼叫函式 $if 時要傳遞的參數為一個 $param
-
 
10652
							$params[]=&$param;
-
 
10653
							
-
 
10654
							#呼叫函式 $if 與要傳遞的參數.
-
 
10655
							$result=call_user_func_array($if,$params);
-
 
10656
					
-
 
10657
							}#foreach end
-
 
10658
					
-
 
10659
						}#if end
-
 
10660
						
-
 
10661
					#如果有php程式要於idle時執行
-
 
10662
					while(count($php2runWhenIdle)>0){
-
 
10663
					
-
 
10664
						#取得要執行的 php code
-
 
10665
						$phpCode=array_shift($php2runWhenIdle);
-
 
10666
					
-
 
10667
						#...
-
 
10668
					
-
 
10669
						}#while end
-
 
10670
					
10629
					#下一輪
10671
					#下一輪
10630
					continue;
10672
					continue;
10631
					
10673
					
10632
					}#if end
10674
					}#if end
10633
				
10675
				
10634
				#有事情發生
10676
				#有事情發生
10635
				echo "something happen".PHP_EOL;
10677
				echo "something happen".PHP_EOL;
10636
								
10678
				
10637
				#如果有socket要處理
10679
				#如果有socket要處理
10638
				if(in_array($sock,$read)){
10680
				if(in_array($sock,$read)){
10639
					
10681
					
10640
					#如果有接收到 socket 連線
10682
					#如果有接收到 socket 連線
10641
					if (($msgsock = socket_accept($sock)) !== false) {
10683
					if (($msgsock = socket_accept($sock)) !== false) {
10642
							
10684
						
10643
						#初始化不是既有的 sock
10685
						#初始化不是既有的 sock
10644
						$existSock=false;
10686
						$existSock=false;
10645
							
10687
						
10646
						#尋找是哪個 socket
10688
						#尋找是哪個 socket
10647
						for($i=0;$i<count($connections);$i++){
10689
						for($i=0;$i<count($connections);$i++){
10648
							
10690
							
10649
							#如果是既有的 sock
10691
							#如果是既有的 sock
10650
							if($connections[$i]["connect"]===$msgsock){
10692
							if($connections[$i]["connect"]===$msgsock){
Line 10659... Line 10701...
10659
						#如果該 socket 是新的
10701
						#如果該 socket 是新的
10660
						if(!$existSock){
10702
						if(!$existSock){
10661
							
10703
							
10662
							#重複做
10704
							#重複做
10663
							do{
10705
							do{
10664
									
10706
								
10665
								#亂數產生連線id
10707
								#亂數產生連線id
10666
								#涵式說明:
10708
								#涵式說明:
10667
								#建立以圖片(PNG格式)呈現的驗證碼.
10709
								#建立以圖片(PNG格式)呈現的驗證碼.
10668
								#回傳的解果:
10710
								#回傳的解果:
10669
								#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
10711
								#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
Line 10721... Line 10763...
10721
									
10763
									
10722
								}#do end
10764
								}#do end
10723
									
10765
									
10724
							#檢查id有無重複
10766
							#檢查id有無重複
10725
							while(in_array($validationCode["randNumberWord"],$idArray));
10767
							while(in_array($validationCode["randNumberWord"],$idArray));
10726
											
10768
							
10727
							#如果不是 ws 模式			
10769
							#如果不是 ws 模式
10728
							if($conf["wsMode"]==="false"){
10770
							if($conf["wsMode"]==="false"){
10729
									
10771
								
10730
								#儲存連線到陣列裡面
10772
								#儲存連線到陣列裡面
10731
								$connections[]=array("connect"=>$msgsock,"buf"=>"","id"=>$validationCode["randNumberWord"],"talkTo"=>array());
10773
								$connections[]=array("connect"=>$msgsock,"buf"=>"","id"=>$validationCode["randNumberWord"],"talkTo"=>array());
10732
									
10774
								
10733
								}#if end
10775
								}#if end
10734
											
10776
							
10735
							#如果是 ws 模式
10777
							#如果是 ws 模式
10736
							if($conf["wsMode"]==="true"){
10778
							if($conf["wsMode"]==="true"){
10737
									
10779
							
10738
								#儲存連線到陣列裡面
10780
								#儲存連線到陣列裡面
10739
								$connections[]=array("connect"=>$msgsock,"buf"=>"","id"=>$validationCode["randNumberWord"],"talkTo"=>array(),"handshaked"=>"false","unmask"=>"false","userAgent"=>"false","3rn"=>0,"receivedMsgFromServer"=>array());
10781
								$connections[]=array("connect"=>$msgsock,"buf"=>"","id"=>$validationCode["randNumberWord"],"talkTo"=>array(),"handshaked"=>"false","unmask"=>"false","userAgent"=>"false","3rn"=>0,"receivedMsgFromServer"=>array());
10740
									
10782
								
10741
								}#if end
10783
								}#if end
10742
									
10784
							
10743
							#debug,提示 Server 給予的新 Id
10785
							#debug,提示 Server 給予的新 Id
10744
							echo "new connection:".PHP_EOL;
10786
							echo "new connection:".PHP_EOL;
10745
						
10787
						
10746
							#初始化連線後要回傳的訊息
10788
							#初始化連線後要回傳的訊息
10747
							$msg="";
10789
							$msg="";
10748
								
10790
							
10749
							#如果不是 ws 模式
10791
							#如果不是 ws 模式
10750
							if($conf["wsMode"]!=="true"){
10792
							if($conf["wsMode"]!=="true"){
10751
									
10793
									
10752
								#提示client連上線後得到的訊息
10794
								#提示client連上線後得到的訊息
10753
								$msg = $msg.PHP_EOL."Welcome to the PHP Test Server.".PHP_EOL;
10795
								$msg = $msg.PHP_EOL."Welcome to the PHP Test Server.".PHP_EOL;
Line 10810... Line 10852...
10810
						
10852
						
10811
							}#if end
10853
							}#if end
10812
						
10854
						
10813
						#如果有 handshaked
10855
						#如果有 handshaked
10814
						if($con["handshaked"]==="true"){
10856
						if($con["handshaked"]==="true"){
10815
												
10857
						
10816
							#讀取內容					
10858
							#讀取內容
10817
							$buf = @socket_read($con["connect"], 2048, PHP_BINARY_READ);
10859
							$buf = @socket_read($con["connect"], 2048, PHP_BINARY_READ);
10818
						
10860
						
10819
							#設置要 unmask
10861
							#設置要 unmask
10820
							$connections[$conIndex]["unmask"]="true";
10862
							$connections[$conIndex]["unmask"]="true";
-
 
10863
							
-
 
10864
							#設置尚未 auth
-
 
10865
							$connections[$conIndex]["auth"]="false";
10821
						
10866
						
10822
							}#if end
10867
							}#if end
10823
							
10868
						
10824
						#反之
10869
						#反之
10825
						else{
10870
						else{
10826
						
10871
						
10827
							#讀取內容
10872
							#讀取內容
10828
							$buf = @socket_read($con["connect"], 2048, PHP_NORMAL_READ);
10873
							$buf = @socket_read($con["connect"], 2048, PHP_NORMAL_READ);
Line 10860... Line 10905...
10860
						#印出接受的非換行符號內容
10905
						#印出接受的非換行符號內容
10861
						if($buf!==PHP_EOL){
10906
						if($buf!==PHP_EOL){
10862
						
10907
						
10863
							#debug
10908
							#debug
10864
							echo "received:".$buf.PHP_EOL;
10909
							echo "received:".$buf.PHP_EOL;
10865
												
10910
							
10866
							}#if end
10911
							}#if end
10867
						
10912
						
10868
						#如果無 handshaked
10913
						#如果無 handshaked
10869
						if($con["handshaked"]!=="true"){
10914
						if($con["handshaked"]!=="true"){
10870
						
10915
						
Line 10876... Line 10921...
10876
						#web socket mode
10921
						#web socket mode
10877
						if($conf["wsMode"]==="true"){
10922
						if($conf["wsMode"]==="true"){
10878
						
10923
						
10879
							#如果不需要 unmask
10924
							#如果不需要 unmask
10880
							if($connections[$conIndex]["unmask"]==="false"){
10925
							if($connections[$conIndex]["unmask"]==="false"){
10881
								
10926
							
10882
								#提示還不用 unmask
10927
								#提示還不用 unmask
10883
								echo "don't need unmask now".PHP_EOL;
10928
								echo "don't need unmask now".PHP_EOL;
10884
								
10929
							
10885
								#重新計數 \r\n
10930
								#重新計數 \r\n
10886
								$connections[$conIndex]["3rn"]=0;
10931
								$connections[$conIndex]["3rn"]=0;
10887
								
10932
							
10888
								}#if end
10933
								}#if end
10889
						
10934
						
10890
							}#if end
10935
							}#if end
10891
							
10936
						
10892
						#如果有內容(不是換行符號)
10937
						#如果有內容(不是換行符號)
10893
						$st=trim($buf);
10938
						$st=trim($buf);
10894
						
10939
						
10895
						#如果是 ws 模式
10940
						#如果是 ws 模式
10896
						if($conf["wsMode"]==="true"){
10941
						if($conf["wsMode"]==="true"){
10897
							
10942
							
10898
							#如果尚未 handshake
10943
							#如果尚未 handshake
10899
							if($connections[$conIndex]["handshaked"]==="false"){
10944
							if($connections[$conIndex]["handshaked"]==="false"){
10900
																								
10945
							
10901
								#提示 server 在檢查 handshake 用的 key 是否存在.
10946
								#提示 server 在檢查 handshake 用的 key 是否存在.
10902
								echo "check Sec-WebSocket-Key ..".PHP_EOL;
10947
								echo "check Sec-WebSocket-Key ..".PHP_EOL;
10903
								
10948
							
10904
								#handshake
10949
								#handshake
10905
								#如果收到的內容$buf含有 Sec-WebSocket-Key: 字串開頭,擷取後面的內容存到$matchs裡面.
10950
								#如果收到的內容$buf含有 Sec-WebSocket-Key: 字串開頭,擷取後面的內容存到$matchs裡面.
10906
								if(preg_match("/Sec-WebSocket-Key: (.*)/",$buf,$matchs)){
10951
								if(preg_match("/Sec-WebSocket-Key: (.*)/",$buf,$matchs)){
10907
									
10952
								
10908
									#提示serve在handshake
10953
									#提示serve在handshake
10909
									echo "do handshake...".PHP_EOL.PHP_EOL;
10954
									echo "do handshake...".PHP_EOL.PHP_EOL;
10910
									
10955
								
10911
									#handshake
10956
									#handshake
10912
									$key = $matchs[1].'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
10957
									$key = $matchs[1].'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
10913
									$key =  base64_encode(sha1($key, true)); 
10958
									$key =  base64_encode(sha1($key, true)); 
10914
									
10959
								
10915
									#設置 handshake 的 header
10960
									#設置 handshake 的 header
10916
									$headers = 
10961
									$headers = 
10917
									"HTTP/1.1 101 Switching Protocols".PHP_EOL.
10962
									"HTTP/1.1 101 Switching Protocols".PHP_EOL.
10918
									"Upgrade: websocket".PHP_EOL.
10963
									"Upgrade: websocket".PHP_EOL.
10919
									"Connection: Upgrade".PHP_EOL.
10964
									"Connection: Upgrade".PHP_EOL.
10920
									"Sec-WebSocket-Accept: ".$key.PHP_EOL.
10965
									"Sec-WebSocket-Accept: ".$key.PHP_EOL.
10921
									"X-Powered-By: qbpwcf".PHP_EOL.
10966
									"X-Powered-By: qbpwcf".PHP_EOL.
10922
									PHP_EOL;
10967
									PHP_EOL;
10923
									
10968
								
10924
									#傳送header給client
10969
									#傳送header給client
10925
									socket_write($con["connect"], $headers);
10970
									socket_write($con["connect"], $headers);
10926
									
10971
								
10927
									#儲存server傳送給client的訊息
10972
									#儲存server傳送給client的訊息
10928
									#$connections[$conIndex]["receivedMsgFromServer"][]=$headers;
10973
									#$connections[$conIndex]["receivedMsgFromServer"][]=$headers;
10929
									
10974
								
10930
									#提示serve handshake 完畢
10975
									#提示serve handshake 完畢
10931
									echo "handshak done...".PHP_EOL;
10976
									echo "handshak done...".PHP_EOL;
10932
									
10977
								
10933
									#設置已經 handshake
10978
									#設置已經 handshake
10934
									$connections[$conIndex]["handshaked"]="true";
10979
									$connections[$conIndex]["handshaked"]="true";
10935
									
10980
								
10936
									}#if end
10981
									}#if end
10937
								
10982
								
10938
								}#if end
10983
								}#if end
10939
							
10984
							
10940
							}#if end
10985
							}#if end
10941
						
10986
						
10942
						#如果是 ws 模式
10987
						#如果是 ws 模式
10943
						if($conf["wsMode"]==="true"){
10988
						if($conf["wsMode"]==="true"){
10944
							
10989
						
10945
							#如果尚未 handshake 過
10990
							#如果尚未 handshake 過
10946
							if($connections[$conIndex]["handshaked"]==="false"){
10991
							if($connections[$conIndex]["handshaked"]==="false"){
10947
							
10992
							
10948
								#跳過
10993
								#跳過
10949
								continue;
10994
								continue;
10950
							
10995
							
10951
								}#if end
10996
								}#if end
10952
								
10997
							
10953
							#如果還不用要 unmask	
10998
							#如果還不用要 unmask
10954
							if($connections[$conIndex]["unmask"]==="false"){
10999
							if($connections[$conIndex]["unmask"]==="false"){
10955
							
11000
							
10956
								#跳過
11001
								#跳過
10957
								continue;
11002
								continue;
10958
							
11003
							
Line 10960... Line 11005...
10960
							
11005
							
10961
							}#if end
11006
							}#if end
10962
						
11007
						
10963
						#如果是 ws 模式
11008
						#如果是 ws 模式
10964
						if($conf["wsMode"]==="true"){
11009
						if($conf["wsMode"]==="true"){
10965
								
11010
							
10966
							#debug
11011
							#debug
10967
							#var_dump(__LINE__,$connections[$conIndex]);
11012
							#var_dump(__LINE__,$connections[$conIndex]);
10968
								
11013
							
10969
							#如果已經 handshake 過
11014
							#如果已經 handshake 過
10970
							if($connections[$conIndex]["handshaked"]==="true"){
11015
							if($connections[$conIndex]["handshaked"]==="true"){
10971
							
11016
							
10972
								#如果要 unmask	
11017
								#如果要 unmask	
10973
								if($connections[$conIndex]["unmask"]==="true"){
11018
								if($connections[$conIndex]["unmask"]==="true"){
10974
								
11019
								
10975
									#如果收到的訊息不為空
11020
									#如果收到的訊息不為空
10976
									if(!empty($buf)){
11021
									if(!empty($buf)){
10977
																		
11022
									
10978
										echo "start unmask...".PHP_EOL;
11023
										echo "start unmask...".PHP_EOL;
10979
								
11024
								
10980
										#debug
11025
										#debug
10981
										#var_dump(__LINE__,$buf);
11026
										#var_dump(__LINE__,$buf);
10982
								
11027
								
Line 10992... Line 11037...
10992
										$buf=webSock::unmask($conf["self::unmask"]);
11037
										$buf=webSock::unmask($conf["self::unmask"]);
10993
										unset($conf["self::unmask"]);
11038
										unset($conf["self::unmask"]);
10994
										
11039
										
10995
										#如果執行失敗
11040
										#如果執行失敗
10996
										if($buf["status"]==="false"){
11041
										if($buf["status"]==="false"){
10997
											
11042
										
10998
											#印出結果
11043
											#印出結果
10999
											var_dump($buf);
11044
											var_dump($buf);
11000
										
11045
										
11001
											#結束執行
11046
											#結束執行
11002
											exit;
11047
											exit;
11003
											
11048
										
11004
											}#if end
11049
											}#if end
11005
										
11050
										
11006
										#如果是 ping 的回應 pong
11051
										#如果是 ping 的回應 pong
11007
										if($buf["type"]==="pong"){
11052
										if($buf["type"]==="pong"){
11008
											
11053
										
11009
											#提示收到 pong
11054
											#提示收到 pong
11010
											echo "got pong".PHP_EOL;
11055
											echo "got pong".PHP_EOL;
11011
										
11056
										
11012
											#更新的連線的 last pong time
11057
											#更新的連線的 last pong time
11013
											$connections[$conIndex]["lastPongTime"]=time();
11058
											$connections[$conIndex]["lastPongTime"]=time();
11014
										
11059
										
11015
											#換處理下一則訊息
11060
											#換處理下一則訊息
11016
											continue;
11061
											continue;
11017
											
11062
										
11018
											}#if end
11063
											}#if end
11019
											
11064
											
11020
										#如果不是 web socket frame
11065
										#如果不是 web socket frame
11021
										if($buf["type"]==="invalid"){
11066
										if($buf["type"]==="invalid"){
11022
										
11067
										
Line 11048... Line 11093...
11048
									}#if end
11093
									}#if end
11049
							
11094
							
11050
								}#if end
11095
								}#if end
11051
								
11096
								
11052
							}#if end
11097
							}#if end
11053
							
11098
						
-
 
11099
						/*
-
 
11100
						
11054
						#如果收到的是 id?
11101
						#如果收到的是 id?
11055
						if($buf === 'id?'){
11102
						if($buf === 'id?'){
11056
							
11103
							
-
 
11104
							#如果尚未認證
-
 
11105
							if($connections[$conIndex]["auth"]==="false"){
-
 
11106
							
11057
							#設置要回傳的訊息
11107
								#設置要回傳的訊息
-
 
11108
								$talkback="permission denied";
-
 
11109
							
-
 
11110
								}#if end
-
 
11111
							
-
 
11112
							else{
-
 
11113
							
-
 
11114
								#設置要回傳的訊息
11058
							$talkback=$connections[$conIndex]["id"];
11115
								$talkback=$connections[$conIndex]["id"];
-
 
11116
							
-
 
11117
								}#else end
11059
 
11118
 
11060
							#debug
11119
							#debug
11061
							#var_dump(__LINE__,$talkback);
11120
							#var_dump(__LINE__,$talkback);
11062
 
11121
 
11063
							#json encode 要回傳的訊息
11122
							#json encode 要回傳的訊息
Line 11150... Line 11209...
11150
							#跳到下一輪
11209
							#跳到下一輪
11151
							continue;
11210
							continue;
11152
							
11211
							
11153
							}#if end
11212
							}#if end
11154
							
11213
							
-
 
11214
						*/	
-
 
11215
						
-
 
11216
						/*
-
 
11217
						
11155
						#如果收到的是 ids?
11218
						#如果收到的是 ids?
11156
						if($buf === 'ids?'){
11219
						if($buf === 'ids?'){
11157
							
11220
							
11158
							#設置要回傳的訊息
11221
							#如果尚未認證
11159
							$talkback=array();
11222
							if($connections[$conIndex]["auth"]==="false"){
11160
							
11223
							
11161
							#針對每個連線
11224
								#設置要回傳的訊息
11162
							foreach($connections as $conIndex_ids => $con_ids){
11225
								$talkback=json_encode("permission denied");
11163
 
-
 
11164
								#如果不是自己							
-
 
11165
								if($con_ids["connect"]!==$connections[$conIndex]["connect"]){
-
 
11166
								
11226
							
11167
									#記錄其他人的id
11227
								}#if end
11168
									$talkback[]=$con_ids["id"];
-
 
11169
								
11228
								
11170
									}#if end
11229
							#反之
-
 
11230
							else{
11171
							
11231
							
-
 
11232
								#設置要回傳的訊息
11172
								}#foreach end
11233
								$talkback=array();
11173
								
11234
								
-
 
11235
								#針對每個連線
-
 
11236
								foreach($connections as $conIndex_ids => $con_ids){
-
 
11237
 
-
 
11238
									#如果不是自己
-
 
11239
									if($con_ids["connect"]!==$connections[$conIndex]["connect"]){
-
 
11240
									
-
 
11241
										#記錄其他人的id
-
 
11242
										$talkback[]=$con_ids["id"];
-
 
11243
									
-
 
11244
										}#if end
-
 
11245
								
-
 
11246
									}#foreach end
-
 
11247
									
11174
							#json encode要回傳的id陣列	
11248
								#json encode要回傳的id陣列
11175
							$talkback=json_encode($talkback);	
11249
								$talkback=json_encode($talkback);
-
 
11250
							
-
 
11251
								}#else end
11176
							
11252
							
11177
							#如果是 ws 模式
11253
							#如果是 ws 模式
11178
							if($conf["wsMode"]==="true"){
11254
							if($conf["wsMode"]==="true"){
11179
							
11255
							
11180
								#如果已經 handshake 過
11256
								#如果已經 handshake 過
11181
								if($connections[$conIndex]["handshaked"]==="true"){
11257
								if($connections[$conIndex]["handshaked"]==="true"){
11182
								
11258
								
11183
									#如果要 unmask	
11259
									#如果要 unmask
11184
									if($connections[$conIndex]["unmask"]==="true"){
11260
									if($connections[$conIndex]["unmask"]==="true"){
11185
								
11261
								
11186
										#函式說明:
11262
										#函式說明:
11187
										#加密 handshake 後要傳送的訊息 
11263
										#加密 handshake 後要傳送的訊息 
11188
										#回傳結果:
11264
										#回傳結果:
Line 11258... Line 11334...
11258
							}#if end
11334
							}#if end
11259
						
11335
						
11260
						#如果收到 "talkTo?"
11336
						#如果收到 "talkTo?"
11261
						if($buf==="talkTo?"){
11337
						if($buf==="talkTo?"){
11262
							
11338
							
11263
							#初始化要講話的id陣列
11339
							#如果尚未認證
11264
							$talkback=array();
11340
							if($connections[$conIndex]["auth"]==="false"){
11265
							
11341
							
11266
							#有幾個要講話的人就執行幾次
11342
								#設置要回傳的訊息
11267
							foreach($connections[$conIndex]["talkTo"] as $to){
11343
								$talkback=json_encode("permission denied");
-
 
11344
							
-
 
11345
								}#if end
-
 
11346
							
-
 
11347
							#反之
-
 
11348
							else{
-
 
11349
							
-
 
11350
								#初始化要講話的id陣列
-
 
11351
								$talkback=array();
11268
								
11352
								
-
 
11353
								#有幾個要講話的人就執行幾次
-
 
11354
								foreach($connections[$conIndex]["talkTo"] as $to){
-
 
11355
									
11269
								#串街要講話的人
11356
									#串街要講話的人
11270
								$talkback[]=$to;
11357
									$talkback[]=$to;
-
 
11358
									
-
 
11359
									}#foreach end
11271
								
11360
								
11272
								}#foreach end
11361
								#設置要回傳的訊息
-
 
11362
								$talkback=json_encode($talkback).PHP_EOL;
11273
							
11363
							
11274
							#設置要回傳的訊息
11364
								}#else end
11275
							$talkback=json_encode($talkback).PHP_EOL;
-
 
11276
							
11365
							
11277
							#如果是 ws 模式
11366
							#如果是 ws 模式
11278
							if($conf["wsMode"]==="true"){
11367
							if($conf["wsMode"]==="true"){
11279
							
11368
							
11280
								#如果已經 handshake 過
11369
								#如果已經 handshake 過
Line 11397... Line 11486...
11397
								}#if end
11486
								}#if end
11398
								
11487
								
11399
							#如果存在 "talkTo:" 前置字串
11488
							#如果存在 "talkTo:" 前置字串
11400
							if($getMeetConditionsString["founded"]==="true"){
11489
							if($getMeetConditionsString["founded"]==="true"){
11401
								
11490
								
-
 
11491
								#如果尚未認證
-
 
11492
								if($connections[$conIndex]["auth"]==="false"){
-
 
11493
								
-
 
11494
									#設置要回傳的訊息
-
 
11495
									$talkback=json_encode("permission denied");
-
 
11496
									
-
 
11497
									#如果是 ws 模式
-
 
11498
									if($conf["wsMode"]==="true"){
-
 
11499
									
-
 
11500
										#如果已經 handshake 過
-
 
11501
										if($connections[$conIndex]["handshaked"]==="true"){
-
 
11502
										
-
 
11503
											#如果要 unmask	
-
 
11504
											if($connections[$conIndex]["unmask"]==="true"){
-
 
11505
										
-
 
11506
												#函式說明:
-
 
11507
												#加密 handshake 後要傳送的訊息 
-
 
11508
												#回傳結果:
-
 
11509
												#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
11510
												#$result["error"],執行不正常結束的錯訊息陣列.
-
 
11511
												#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
11512
												#$result["argu"],陣列,使用的參數.
-
 
11513
												#必填參數:
-
 
11514
												#$conf["text"],字串,要加密的訊息.
-
 
11515
												$conf["webSock::encode"]["text"]=$talkback; 
-
 
11516
												#可省略參數:
-
 
11517
												#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
11518
												#$conf["payloadIsBin"]="false";
-
 
11519
												#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
11520
												#$conf["ping"]="false";
-
 
11521
												#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
11522
												#$conf["pong"]="false";
-
 
11523
												#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
11524
												#$conf["frames"]=array();
-
 
11525
												#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
11526
												#$conf["mask"]="false";
-
 
11527
												#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
11528
												#$conf["debug"]="false";
-
 
11529
												#參考資料:
-
 
11530
												#無.
-
 
11531
												#備註:
-
 
11532
												#目前$conf["text"]長度超過125會出錯.
-
 
11533
												$talkback=webSock::encode($conf["webSock::encode"]);
-
 
11534
												unset($conf["webSock::encode"]);
-
 
11535
												
-
 
11536
												#如果執行失敗
-
 
11537
												if($talkback["status"]==="false"){
-
 
11538
												
-
 
11539
													#印出結果
-
 
11540
													var_dump($talkback);
-
 
11541
												
-
 
11542
													#結束執行
-
 
11543
													exit;
-
 
11544
												
-
 
11545
													}#if end
-
 
11546
												
-
 
11547
												#debug
-
 
11548
												#var_dump(__LINE__,$talkback);
-
 
11549
												
-
 
11550
												}#if end
-
 
11551
												
-
 
11552
											}#if end
-
 
11553
									
-
 
11554
										}#if end
-
 
11555
									
-
 
11556
									#反之不為 web socket 訊息
-
 
11557
									else{
-
 
11558
									
-
 
11559
										#儲存成只有一個訊息
-
 
11560
										$talkback["content"][]=$talkback;
-
 
11561
									
-
 
11562
										}#else
-
 
11563
									
-
 
11564
									#針對每個訊息的分段
-
 
11565
									foreach($talkback["content"] as $msg){
-
 
11566
										
-
 
11567
										#回傳訊息
-
 
11568
										$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
11569
								
-
 
11570
										#debug
-
 
11571
										#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
11572
										
-
 
11573
										}#foreach end
-
 
11574
									
-
 
11575
									#跳到下一輪
-
 
11576
									continue;
-
 
11577
								
-
 
11578
									}#if end
-
 
11579
								
11402
								#用 "talkTo:" 分割 $buf
11580
								#用 "talkTo:" 分割 $buf
11403
								#涵式說明:
11581
								#涵式說明:
11404
								#將固定格式的字串分開,並回傳分開的結果。
11582
								#將固定格式的字串分開,並回傳分開的結果。
11405
								#回傳結果:
11583
								#回傳結果:
11406
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11584
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 11533... Line 11711...
11533
													
11711
													
11534
													#debug
11712
													#debug
11535
													#var_dump(__LINE__,$talkback);
11713
													#var_dump(__LINE__,$talkback);
11536
													
11714
													
11537
													}#if end
11715
													}#if end
11538
																			
11716
												
11539
												}#if end
11717
												}#if end
11540
										
11718
										
11541
											}#if end
11719
											}#if end
11542
											
11720
											
11543
										#反之不為 web socket 訊息
11721
										#反之不為 web socket 訊息
Line 11554... Line 11732...
11554
											#回傳訊息
11732
											#回傳訊息
11555
											$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
11733
											$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
11556
									
11734
									
11557
											#debug
11735
											#debug
11558
											#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
11736
											#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
11559
																			
11737
											
11560
											}#foreach end
11738
											}#foreach end
11561
										
11739
										
11562
										#讓對方可以跟自己對話
11740
										#讓對方可以跟自己對話
11563
										$connections[$targetKey]["talkTo"][]=$myId;
11741
										$connections[$targetKey]["talkTo"][]=$myId;
11564
										
11742
										
Line 11620... Line 11798...
11620
													
11798
													
11621
													#debug
11799
													#debug
11622
													#var_dump(__LINE__,$talkback);
11800
													#var_dump(__LINE__,$talkback);
11623
													
11801
													
11624
													}#if end
11802
													}#if end
11625
																			
11803
													
11626
												}#if end
11804
												}#if end
11627
										
11805
										
11628
											}#if end
11806
											}#if end
11629
											
11807
											
11630
										#反之不為 web socket 訊息
11808
										#反之不為 web socket 訊息
Line 11654... Line 11832...
11654
									}#if end
11832
									}#if end
11655
								
11833
								
11656
								}#if end
11834
								}#if end
11657
							
11835
							
11658
							}#if end
11836
							}#if end
-
 
11837
						
-
 
11838
						*/
-
 
11839
						
-
 
11840
						#如果收到的訊息是 runPhpWhenIdle: 開頭
-
 
11841
						if(strpos($buf,"runPhpWhenIdle:")===0){
-
 
11842
						
-
 
11843
							#如果尚未認證
-
 
11844
							if($connections[$conIndex]["auth"]==="false"){
-
 
11845
							
-
 
11846
								#設置要回傳的訊息
-
 
11847
								$talkback=json_encode("permission denied");
-
 
11848
								
-
 
11849
								#如果是 ws 模式
-
 
11850
								if($conf["wsMode"]==="true"){
-
 
11851
								
-
 
11852
									#如果已經 handshake 過
-
 
11853
									if($connections[$conIndex]["handshaked"]==="true"){
-
 
11854
									
-
 
11855
										#如果要 unmask	
-
 
11856
										if($connections[$conIndex]["unmask"]==="true"){
-
 
11857
									
-
 
11858
											#函式說明:
-
 
11859
											#加密 handshake 後要傳送的訊息 
-
 
11860
											#回傳結果:
-
 
11861
											#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
11862
											#$result["error"],執行不正常結束的錯訊息陣列.
-
 
11863
											#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
11864
											#$result["argu"],陣列,使用的參數.
-
 
11865
											#必填參數:
-
 
11866
											#$conf["text"],字串,要加密的訊息.
-
 
11867
											$conf["webSock::encode"]["text"]=$talkback; 
-
 
11868
											#可省略參數:
-
 
11869
											#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
11870
											#$conf["payloadIsBin"]="false";
-
 
11871
											#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
11872
											#$conf["ping"]="false";
-
 
11873
											#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
11874
											#$conf["pong"]="false";
-
 
11875
											#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
11876
											#$conf["frames"]=array();
-
 
11877
											#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
11878
											#$conf["mask"]="false";
-
 
11879
											#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
11880
											#$conf["debug"]="false";
-
 
11881
											#參考資料:
-
 
11882
											#無.
-
 
11883
											#備註:
-
 
11884
											#目前$conf["text"]長度超過125會出錯.
-
 
11885
											$talkback=webSock::encode($conf["webSock::encode"]);
-
 
11886
											unset($conf["webSock::encode"]);
-
 
11887
											
-
 
11888
											#如果執行失敗
-
 
11889
											if($talkback["status"]==="false"){
-
 
11890
											
-
 
11891
												#印出結果
-
 
11892
												var_dump($talkback);
-
 
11893
											
-
 
11894
												#結束執行
-
 
11895
												exit;
-
 
11896
											
-
 
11897
												}#if end
-
 
11898
											
-
 
11899
											#debug
-
 
11900
											#var_dump(__LINE__,$talkback);
-
 
11901
											
-
 
11902
											}#if end
-
 
11903
											
-
 
11904
										}#if end
-
 
11905
								
-
 
11906
									}#if end
-
 
11907
								
-
 
11908
								#反之不為 web socket 訊息
-
 
11909
								else{
-
 
11910
								
-
 
11911
									#儲存成只有一個訊息
-
 
11912
									$talkback["content"][]=$talkback;
-
 
11913
								
-
 
11914
									}#else
-
 
11915
								
-
 
11916
								#針對每個訊息的分段
-
 
11917
								foreach($talkback["content"] as $msg){
-
 
11918
									
-
 
11919
									#回傳訊息
-
 
11920
									$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
11921
							
-
 
11922
									#debug
-
 
11923
									#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
11924
									
-
 
11925
									}#foreach end
-
 
11926
								
-
 
11927
								#跳到下一輪
-
 
11928
								continue;
-
 
11929
							
-
 
11930
								}#if end
-
 
11931
						
-
 
11932
							#剔除開頭的 "runPhpWhenIdle:"
-
 
11933
							#函式說明:
-
 
11934
							#將字串特定關鍵字與其前面的內容剔除
-
 
11935
							#回傳結果:
-
 
11936
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
11937
							#$result["error"],錯誤訊息陣列.
-
 
11938
							#$result["warning"],警告訊息鎮列.
-
 
11939
							#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
-
 
11940
							#$result["function"],當前執行的函數名稱.
-
 
11941
							#$result["argu"],使用的參數.
-
 
11942
							#$result["oriStr"],要處理的原始字串內容.
-
 
11943
							#$result["content"],處理好的的字串內容.
-
 
11944
							#$result["deleted"],被移除的內容.
-
 
11945
							#必填參數:
-
 
11946
							#$conf["stringIn"],字串,要處理的字串.
-
 
11947
							$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$buf;
-
 
11948
							#$conf["keyWord"],字串,特定字串.
-
 
11949
							$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="runPhpWhenIdle:";
-
 
11950
							#可省略參數:
-
 
11951
							#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.
-
 
11952
							#$conf["recursive"]="true";
-
 
11953
							#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.
-
 
11954
							#$conf["lastResult"]=$delStrBeforeKeyWord;
-
 
11955
							#參考資料:
-
 
11956
							#無.
-
 
11957
							#備註:
-
 
11958
							#無.
-
 
11959
							$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);
-
 
11960
							unset($conf["stringProcess::delStrBeforeKeyWord"]);
-
 
11961
						
-
 
11962
							#如果執行失敗
-
 
11963
							if($delStrBeforeKeyWord["status"]==="false"){
-
 
11964
							
-
 
11965
								#印出結果
-
 
11966
								var_dump($delStrBeforeKeyWord);
11659
							
11967
							
-
 
11968
								#結束執行
-
 
11969
								exit;
-
 
11970
							
-
 
11971
								}#if end
-
 
11972
							
-
 
11973
							#設置要執行的php程式
-
 
11974
							$php2runWhenIdle[]=$delStrBeforeKeyWord["content"];
-
 
11975
							
-
 
11976
							#跳到下一輪
-
 
11977
							continue;
-
 
11978
							
-
 
11979
							}#if end
-
 
11980
						
-
 
11981
						/* 舊的寫法
-
 
11982
						
11660
						#如果收到的是 quit
11983
						#如果收到的是 quit
11661
						if ($buf === 'quit' ) {
11984
						if ($buf === 'quit' ) {
11662
							
11985
							
11663
							#設置要回傳的訊息
11986
							#設置要回傳的訊息
11664
							$talkback="結束與 server 的連線";
11987
							$talkback="結束與 server 的連線";
Line 11753... Line 12076...
11753
							#跳到下一輪
12076
							#跳到下一輪
11754
							continue;
12077
							continue;
11755
							
12078
							
11756
							}#if end
12079
							}#if end
11757
							
12080
							
-
 
12081
						*/
-
 
12082
						
-
 
12083
						/* 舊的寫法
-
 
12084
						
11758
						#如果收到的是 shutdown	
12085
						#如果收到的是 shutdown	
11759
						if ($buf === 'shutdown') {
12086
						if ($buf === 'shutdown') {
11760
							
12087
							
-
 
12088
							#如果尚未認證
-
 
12089
							if($connections[$conIndex]["auth"]==="false"){
-
 
12090
							
-
 
12091
								#設置要回傳的訊息
-
 
12092
								$talkback=json_encode("permission denied");
-
 
12093
								
-
 
12094
								#如果是 ws 模式
-
 
12095
								if($conf["wsMode"]==="true"){
-
 
12096
								
-
 
12097
									#如果已經 handshake 過
-
 
12098
									if($connections[$conIndex]["handshaked"]==="true"){
-
 
12099
									
-
 
12100
										#如果要 unmask	
-
 
12101
										if($connections[$conIndex]["unmask"]==="true"){
-
 
12102
									
-
 
12103
											#函式說明:
-
 
12104
											#加密 handshake 後要傳送的訊息 
-
 
12105
											#回傳結果:
-
 
12106
											#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
12107
											#$result["error"],執行不正常結束的錯訊息陣列.
-
 
12108
											#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
12109
											#$result["argu"],陣列,使用的參數.
-
 
12110
											#必填參數:
-
 
12111
											#$conf["text"],字串,要加密的訊息.
-
 
12112
											$conf["webSock::encode"]["text"]=$talkback; 
-
 
12113
											#可省略參數:
-
 
12114
											#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
12115
											#$conf["payloadIsBin"]="false";
-
 
12116
											#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
12117
											#$conf["ping"]="false";
-
 
12118
											#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
12119
											#$conf["pong"]="false";
-
 
12120
											#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
12121
											#$conf["frames"]=array();
-
 
12122
											#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
12123
											#$conf["mask"]="false";
-
 
12124
											#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
12125
											#$conf["debug"]="false";
-
 
12126
											#參考資料:
-
 
12127
											#無.
-
 
12128
											#備註:
-
 
12129
											#目前$conf["text"]長度超過125會出錯.
-
 
12130
											$talkback=webSock::encode($conf["webSock::encode"]);
-
 
12131
											unset($conf["webSock::encode"]);
-
 
12132
											
-
 
12133
											#如果執行失敗
-
 
12134
											if($talkback["status"]==="false"){
-
 
12135
											
-
 
12136
												#印出結果
-
 
12137
												var_dump($talkback);
-
 
12138
											
-
 
12139
												#結束執行
-
 
12140
												exit;
-
 
12141
											
-
 
12142
												}#if end
-
 
12143
											
-
 
12144
											#debug
-
 
12145
											#var_dump(__LINE__,$talkback);
-
 
12146
											
-
 
12147
											}#if end
-
 
12148
											
-
 
12149
										}#if end
-
 
12150
								
-
 
12151
									}#if end
-
 
12152
								
-
 
12153
								#反之不為 web socket 訊息
-
 
12154
								else{
-
 
12155
								
-
 
12156
									#儲存成只有一個訊息
-
 
12157
									$talkback["content"][]=$talkback;
-
 
12158
								
-
 
12159
									}#else
-
 
12160
								
-
 
12161
								#針對每個訊息的分段
-
 
12162
								foreach($talkback["content"] as $msg){
-
 
12163
									
-
 
12164
									#回傳訊息
-
 
12165
									$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
12166
							
-
 
12167
									#debug
-
 
12168
									#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
12169
									
-
 
12170
									}#foreach end
-
 
12171
								
-
 
12172
								#跳到下一輪
-
 
12173
								continue;
-
 
12174
							
-
 
12175
								}#if end
-
 
12176
							
11761
							#設置要回傳的訊息
12177
							#設置要回傳的訊息
11762
							$talkback="Server 即將關閉";
12178
							$talkback="Server 即將關閉";
11763
							
12179
							
11764
							#json encode 要回傳的訊息
12180
							#json encode 要回傳的訊息
11765
							$talkback=json_encode($talkback);
12181
							$talkback=json_encode($talkback);
Line 11848... Line 12264...
11848
							#跳到最外層,結束webSocket server
12264
							#跳到最外層,結束webSocket server
11849
							break 2;
12265
							break 2;
11850
							
12266
							
11851
							}#if end
12267
							}#if end
11852
						
12268
						
-
 
12269
						*/
-
 
12270
						
-
 
12271
						/* 舊的寫法
-
 
12272
						
-
 
12273
						#如果收到的訊息為"auth:"開頭
-
 
12274
						if(strpos($buf,"auth:")){
-
 
12275
						
-
 
12276
							#剔除 "auth:" 前面的內容
-
 
12277
							#函式說明:
-
 
12278
							#將字串特定關鍵字與其前面的內容剔除
-
 
12279
							#回傳結果:
-
 
12280
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
12281
							#$result["error"],錯誤訊息陣列.
-
 
12282
							#$result["warning"],警告訊息鎮列.
-
 
12283
							#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
-
 
12284
							#$result["function"],當前執行的函數名稱.
-
 
12285
							#$result["argu"],使用的參數.
-
 
12286
							#$result["oriStr"],要處理的原始字串內容.
-
 
12287
							#$result["content"],處理好的的字串內容.
-
 
12288
							#$result["deleted"],被移除的內容.
-
 
12289
							#必填參數:
-
 
12290
							#$conf["stringIn"],字串,要處理的字串.
-
 
12291
							$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$buf;
-
 
12292
							#$conf["keyWord"],字串,特定字串.
-
 
12293
							$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="auth:";
-
 
12294
							#可省略參數:
-
 
12295
							#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.
-
 
12296
							#$conf["recursive"]="true";
-
 
12297
							#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.
-
 
12298
							#$conf["lastResult"]=$delStrBeforeKeyWord;
-
 
12299
							#參考資料:
-
 
12300
							#無.
-
 
12301
							#備註:
-
 
12302
							#無.
-
 
12303
							$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);
-
 
12304
							unset($conf["stringProcess::delStrBeforeKeyWord"]);
-
 
12305
						
-
 
12306
							#如果執行失敗
-
 
12307
							if($delStrBeforeKeyWord["status"]==="false"){
-
 
12308
							
-
 
12309
								#印出結果
-
 
12310
								var_dump($delStrBeforeKeyWord);
-
 
12311
							
-
 
12312
								#結束執行
-
 
12313
								exit;
-
 
12314
							
-
 
12315
								}#if end
-
 
12316
							
-
 
12317
							#還原編碼
-
 
12318
							#$delStrBeforeKeyWord["content"];
-
 
12319
						
-
 
12320
							#gpg解密
-
 
12321
							#...
-
 
12322
							
-
 
12323
							#檢查賬號密碼
-
 
12324
							#...
-
 
12325
						
-
 
12326
							}#if end
-
 
12327
							
-
 
12328
						*/
-
 
12329
						
-
 
12330
						#以下為其他收到的訊息內容
-
 
12331
						
-
 
12332
						/* 舊的寫法
-
 
12333
						
-
 
12334
						#如果尚未認證
-
 
12335
						if($connections[$conIndex]["auth"]==="false"){
-
 
12336
						
-
 
12337
							#設置要回傳的訊息
-
 
12338
							$talkback=json_encode("permission denied");
-
 
12339
							
-
 
12340
							#如果是 ws 模式
-
 
12341
							if($conf["wsMode"]==="true"){
-
 
12342
							
-
 
12343
								#如果已經 handshake 過
-
 
12344
								if($connections[$conIndex]["handshaked"]==="true"){
-
 
12345
								
-
 
12346
									#如果要 unmask	
-
 
12347
									if($connections[$conIndex]["unmask"]==="true"){
-
 
12348
								
-
 
12349
										#函式說明:
-
 
12350
										#加密 handshake 後要傳送的訊息 
-
 
12351
										#回傳結果:
-
 
12352
										#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
12353
										#$result["error"],執行不正常結束的錯訊息陣列.
-
 
12354
										#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
12355
										#$result["argu"],陣列,使用的參數.
-
 
12356
										#必填參數:
-
 
12357
										#$conf["text"],字串,要加密的訊息.
-
 
12358
										$conf["webSock::encode"]["text"]=$talkback; 
-
 
12359
										#可省略參數:
-
 
12360
										#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
12361
										#$conf["payloadIsBin"]="false";
-
 
12362
										#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
12363
										#$conf["ping"]="false";
-
 
12364
										#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
12365
										#$conf["pong"]="false";
-
 
12366
										#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
12367
										#$conf["frames"]=array();
-
 
12368
										#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
12369
										#$conf["mask"]="false";
-
 
12370
										#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
12371
										#$conf["debug"]="false";
-
 
12372
										#參考資料:
-
 
12373
										#無.
-
 
12374
										#備註:
-
 
12375
										#目前$conf["text"]長度超過125會出錯.
-
 
12376
										$talkback=webSock::encode($conf["webSock::encode"]);
-
 
12377
										unset($conf["webSock::encode"]);
-
 
12378
										
-
 
12379
										#如果執行失敗
-
 
12380
										if($talkback["status"]==="false"){
-
 
12381
										
-
 
12382
											#印出結果
-
 
12383
											var_dump($talkback);
-
 
12384
										
-
 
12385
											#結束執行
-
 
12386
											exit;
-
 
12387
										
-
 
12388
											}#if end
-
 
12389
										
-
 
12390
										#debug
-
 
12391
										#var_dump(__LINE__,$talkback);
-
 
12392
										
-
 
12393
										}#if end
-
 
12394
										
-
 
12395
									}#if end
-
 
12396
							
-
 
12397
								}#if end
-
 
12398
							
-
 
12399
							#反之不為 web socket 訊息
-
 
12400
							else{
-
 
12401
							
-
 
12402
								#儲存成只有一個訊息
-
 
12403
								$talkback["content"][]=$talkback;
-
 
12404
							
-
 
12405
								}#else
-
 
12406
							
-
 
12407
							#針對每個訊息的分段
-
 
12408
							foreach($talkback["content"] as $msg){
-
 
12409
								
-
 
12410
								#回傳訊息
-
 
12411
								$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
12412
						
-
 
12413
								#debug
-
 
12414
								#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
12415
								
-
 
12416
								}#foreach end
-
 
12417
							
-
 
12418
							#跳到下一輪
-
 
12419
							continue;
-
 
12420
						
-
 
12421
							}#if end
-
 
12422
						
-
 
12423
						*/
-
 
12424
						
11853
						#如果有指定的外掛函式
12425
						#如果有指定的外掛函式
11854
						if(isset($conf["processFuncs"])){
12426
						if(isset($conf["processFuncs"])){
11855
						
12427
						
11856
							#針對每個用來處理輸入字串的函式
12428
							#針對每個用來處理輸入字串的函式
11857
							foreach($conf["processFuncs"] as $proFunc){
12429
							foreach($conf["processFuncs"] as $proFunc){
11858
 
12430
							
11859
								#debug
12431
								#debug
11860
								#var_dump(__LINE__,$proFunc);
12432
								#var_dump(__LINE__,$proFunc);
-
 
12433
								
-
 
12434
								#函式說明:
-
 
12435
								#提供webSock::nativeSocketTcpIpServer用於接受檢查權限的功能.
-
 
12436
								#回傳結果:
-
 
12437
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
12438
								#$result["error"],執行不正常結束的錯訊息陣列.
-
 
12439
								#$result["argu"],陣列,使用的參數.
-
 
12440
								#必填參數:
-
 
12441
								#$conf["data"],字串,收到的bin2hex編碼後果gpg加密過後的json格式資料,必填的key有"randomStr","username","password".
-
 
12442
								$conf["webSocket::checkAuth"]["data"]=&$buf;
-
 
12443
								#$conf["serverSock"],resource,web socket server socket
-
 
12444
								$conf["webSocket::checkAuth"]["serverSock"]=&$sock;
-
 
12445
								#$conf["clientSock"],$resource,web socket client socket
-
 
12446
								$conf["webSocket::checkAuth"]["clientSock"]=&$con["connect"];
-
 
12447
								#$conf["clientInfo"],陣列,web socket client info.
-
 
12448
								$conf["webSocket::checkAuth"]["clientInfo"]=&$connections[$conIndex];
-
 
12449
								#$conf["clientIndex"],整數.web socket client index.
-
 
12450
								$conf["webSocket::checkAuth"]["clientIndex"]=&$conIndex;
-
 
12451
								#$conf["allConn"],陣列,all web socket client info.
-
 
12452
								$conf["webSocket::checkAuth"]["allConn"]=&$connections;
-
 
12453
								#$conf["func"],字串,要檢查的是否具備權限的函式.
-
 
12454
								$conf["webSocket::checkAuth"]["func"]=$proFunc;
-
 
12455
								#可省略參數:
-
 
12456
								#$conf["wsMode"],字串,是否要按照rfc6555,預設為"true"為是;"false"為否.
-
 
12457
								#$conf["wsMode"]="true";
-
 
12458
								#$conf["gpgId"],字串,用於加解密的gpg id,預設為gnupgId.
-
 
12459
								#$conf["gpgId"]=gnupgId;
-
 
12460
								#$conf["falseAllowFuncPlus"],陣列,額外的未認證時可以執行的函式清單.
-
 
12461
								#$conf["falseAllowFuncPlus"]=array();
-
 
12462
								#$conf["publicAllowFuncPlus"],陣列,額外的認證為public時可以執行的函式清單.
-
 
12463
								#$conf["publicAllowFuncPlus"]=array();
-
 
12464
								#參考資料:
-
 
12465
								#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
-
 
12466
								#備註:
-
 
12467
								#無.
-
 
12468
								$checkAuth=webSocket::checkAuth($conf["webSocket::checkAuth"]);
-
 
12469
								unset($conf["webSocket::checkAuth"]);
-
 
12470
 
-
 
12471
								#如果沒有權限
-
 
12472
								if($checkAuth["status"]==="false"){
-
 
12473
								
-
 
12474
									#換看下個 $proFunc
-
 
12475
									continue;
-
 
12476
								
-
 
12477
									}#if end
11861
 
12478
 
11862
								#呼叫函式,參數為輸入的字串data跟client socket, server socket, 每個 socket
12479
								#呼叫函式,參數為輸入的字串data跟client socket, server socket, 每個 socket
11863
								#https://www.php.net/manual/en/function.call-user-func.php
12480
								#https://www.php.net/manual/en/function.call-user-func.php
11864
								$param=array("data"=>&$buf,"serverSock"=>&$sock,"clientSock"=>&$con["connect"],"clientInfo"=>&$connections[$conIndex],"clientIndex"=>&$conIndex,"allConn"=>&$connections);
12481
								$param=array("data"=>&$buf,"serverSock"=>&$sock,"clientSock"=>&$con["connect"],"clientInfo"=>&$connections[$conIndex],"clientIndex"=>&$conIndex,"allConn"=>&$connections);
11865
								$params=array();
12482
								$params=array();
11866
								$params[]=&$param;										
12483
								$params[]=&$param;
11867
								$result=call_user_func_array($proFunc,$params);						
12484
								$result=call_user_func_array($proFunc,$params);
11868
 
12485
 
11869
								#debug
12486
								#debug
11870
								#var_dump(__LINE__,$result);
12487
								#var_dump(__LINE__,$result);
11871
 
12488
 
11872
								#如果有回傳結果
12489
								#如果有回傳結果
Line 16066... Line 16683...
16066
			
16683
			
16067
			#設置執行錯誤
16684
			#設置執行錯誤
16068
			$result["error"]="no matched ServerName";
16685
			$result["error"]="no matched ServerName";
16069
			
16686
			
16070
			#debug
16687
			#debug
16071
			var_dump(__FUNCTION__,__LINE__,$result);	
16688
			var_dump(__FUNCTION__,__LINE__,$result);
16072
			
16689
			
16073
			#回傳結果
16690
			#回傳結果
16074
			return $result;
16691
			return $result;
16075
		
16692
		
16076
			}#if end
16693
			}#if end
Line 16084... Line 16701...
16084
		#回傳結果
16701
		#回傳結果
16085
		return $result;
16702
		return $result;
16086
	
16703
	
16087
		}#function getFileContent end
16704
		}#function getFileContent end
16088
	
16705
	
-
 
16706
	/*
-
 
16707
	#函式說明:
-
 
16708
	#提供webSock::nativeSocketTcpIpServer用於接受檢查權限的功能.
-
 
16709
	#回傳結果:
-
 
16710
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
16711
	#$result["error"],執行不正常結束的錯訊息陣列.
-
 
16712
	#$result["argu"],陣列,使用的參數.
-
 
16713
	#必填參數:
-
 
16714
	#$conf["data"],字串,收到的bin2hex編碼後果gpg加密過後的json格式資料,必填的key有"randomStr","username","password".
-
 
16715
	$conf["data"]="";
-
 
16716
	#$conf["serverSock"],resource,web socket server socket
-
 
16717
	$conf["serverSock"]=$resource;
-
 
16718
	#$conf["clientSock"],$resource,web socket client socket
-
 
16719
	$conf["clientSock"]=$resource;
-
 
16720
	#$conf["clientInfo"],陣列,web socket client info.
-
 
16721
	$conf["clientInfo"]=array();
-
 
16722
	#$conf["clientIndex"],整數.web socket client index.
-
 
16723
	$conf["clientIndex"];
-
 
16724
	#$conf["allConn"],陣列,all web socket client info.
-
 
16725
	$conf["allConn"]=array();
-
 
16726
	#$conf["func"],字串,要檢查的是否具備權限的函式.
-
 
16727
	$conf["func"]="";
-
 
16728
	#可省略參數:
-
 
16729
	#$conf["wsMode"],字串,是否要按照rfc6555,預設為"true"為是;"false"為否.
-
 
16730
	#$conf["wsMode"]="true";
-
 
16731
	#$conf["gpgId"],字串,用於加解密的gpg id,預設為gnupgId.
-
 
16732
	#$conf["gpgId"]=gnupgId;
-
 
16733
	#$conf["falseAllowFuncPlus"],陣列,額外的未認證時可以執行的函式清單.
-
 
16734
	#$conf["falseAllowFuncPlus"]=array();
-
 
16735
	#$conf["publicAllowFuncPlus"],陣列,額外的認證為public時可以執行的函式清單.
-
 
16736
	#$conf["publicAllowFuncPlus"]=array();
-
 
16737
	#參考資料:
-
 
16738
	#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
-
 
16739
	#備註:
-
 
16740
	#無.
-
 
16741
	*/
-
 
16742
	public static function checkAuth(&$conf){
-
 
16743
	
-
 
16744
		#初始化要回傳的結果
-
 
16745
		$result=array();
-
 
16746
 
-
 
16747
		#取得當前執行的函數名稱
-
 
16748
		$result["function"]=__FUNCTION__;
-
 
16749
 
-
 
16750
		#涵式說明:
-
 
16751
		#判斷當前環境為web還是cmd
-
 
16752
		#回傳結果:
-
 
16753
		#$result,"web"或"cmd"
-
 
16754
		if(csInformation::getEnv()==="web"){
-
 
16755
			
-
 
16756
			#設置執行失敗
-
 
16757
			$result["status"]="false";
-
 
16758
			
-
 
16759
			#設置執行錯誤訊息
-
 
16760
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
-
 
16761
			
-
 
16762
			#回傳結果
-
 
16763
			return $result;
-
 
16764
			
-
 
16765
			}#if end
-
 
16766
 
-
 
16767
		#取得參數
-
 
16768
		$result["argu"]=$conf;
-
 
16769
 
-
 
16770
		#如果 $conf 不為陣列
-
 
16771
		if(gettype($conf)!="array"){
-
 
16772
		
-
 
16773
			#設置執行失敗
-
 
16774
			$result["status"]="false";
-
 
16775
		
-
 
16776
			#設置執行錯誤訊息
-
 
16777
			$result["error"][]="\$conf變數須為陣列形態";
-
 
16778
		
-
 
16779
			#如果傳入的參數為 null
-
 
16780
			if($conf==null){
-
 
16781
			
-
 
16782
				#設置執行錯誤訊息
-
 
16783
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
-
 
16784
			
-
 
16785
				}#if end
-
 
16786
 
-
 
16787
			#回傳結果
-
 
16788
			return $result;
-
 
16789
		
-
 
16790
			}#if end
-
 
16791
		
-
 
16792
		#檢查參數
-
 
16793
		#函式說明:
-
 
16794
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
-
 
16795
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
16796
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
16797
		#$result["function"],當前執行的函式名稱.
-
 
16798
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
16799
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
16800
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
16801
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
16802
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
16803
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
16804
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
16805
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
16806
		#必填寫的參數:
-
 
16807
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
16808
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
16809
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
16810
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","serverSock","clientInfo","clientIndex","allConn","func");
-
 
16811
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
-
 
16812
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","resource","array","string","array","string");
-
 
16813
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
16814
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
16815
		#可以省略的參數:
-
 
16816
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
16817
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
-
 
16818
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
16819
		#$conf["canNotBeEmpty"]=array();
-
 
16820
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
16821
		#$conf["canBeEmpty"]=array();
-
 
16822
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
16823
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("wsMode");
-
 
16824
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
16825
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("wsMode","gpgId","falseAllowFuncPlus","publicAllowFuncPlus");
-
 
16826
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
-
 
16827
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array","array");
-
 
16828
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
16829
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",gnupgId,array(),array());
-
 
16830
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
16831
		#$conf["arrayCountEqualCheck"][]=array();
-
 
16832
		#參考資料來源:
-
 
16833
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
16834
		#建議:
-
 
16835
		#增加可省略參數全部不能為空字串或空陣列的參數功能.
-
 
16836
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
16837
		unset($conf["variableCheck::checkArguments"]);
-
 
16838
		
-
 
16839
		#如果檢查參數失敗
-
 
16840
		if($checkArguments["status"]==="false"){
-
 
16841
			
-
 
16842
			#設置執行失敗
-
 
16843
			$result["status"]="false";
-
 
16844
		
-
 
16845
			#設置執行錯誤訊息
-
 
16846
			$result["error"]=$checkArguments;
-
 
16847
			
-
 
16848
			#回傳結果
-
 
16849
			return $result;
-
 
16850
			
-
 
16851
			}#if end
-
 
16852
			
-
 
16853
		#如果檢查參數不通過
-
 
16854
		if($checkArguments["passed"]==="false"){
-
 
16855
			
-
 
16856
			#設置執行失敗
-
 
16857
			$result["status"]="false";
-
 
16858
		
-
 
16859
			#設置執行錯誤訊息
-
 
16860
			$result["error"]=$checkArguments;
-
 
16861
			
-
 
16862
			#回傳結果
-
 
16863
			return $result;
-
 
16864
			
-
 
16865
			}#if end
-
 
16866
 
-
 
16867
		#取得收到的訊息
-
 
16868
		$receivedData=$conf["data"];
-
 
16869
		
-
 
16870
		#取得 server 的 socket
-
 
16871
		$serverSocket=$conf["serverSock"];
-
 
16872
		
-
 
16873
		#取得 client 的 socket
-
 
16874
		$clientSocket=$conf["clientSock"];
-
 
16875
		
-
 
16876
		#取得 client 的資訊
-
 
16877
		$clientInfo=$conf["clientInfo"];
-
 
16878
		
-
 
16879
		#取得 client 的索引
-
 
16880
		$clientIndex=$conf["clientIndex"];
-
 
16881
		
-
 
16882
		#取得 all clients 的資訊
-
 
16883
		$allConn=&$conf["allConn"];
-
 
16884
	
-
 
16885
		/* 檢查權限不用看收到的訊息
-
 
16886
	
-
 
16887
		#hex2bin
-
 
16888
		#函式說明:
-
 
16889
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
16890
		#回傳結果:
-
 
16891
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
16892
		#$result["function"],當前執行的函數名稱.
-
 
16893
		#$result["content"],加密後的結果.
-
 
16894
		#$result["error"],錯誤訊息陣列.
-
 
16895
		#$result["argu"],使用的參數.
-
 
16896
		#必填參數:
-
 
16897
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
16898
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
16899
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
16900
		$conf["authenticate::enCodeStr"]["enCodeType"]="hex2bin";
-
 
16901
		#可省略參數:
-
 
16902
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
16903
		#$conf["sha1Raw"]="false";
-
 
16904
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
16905
		#$conf["p_hash"]="";
-
 
16906
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
16907
		#$conf["keyForAes256"]="";
-
 
16908
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
16909
		#$conf["aes256Encode"]="";
-
 
16910
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
16911
		#$conf["qbpwcfDecode"]="false";
-
 
16912
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
16913
		#$conf["gpgDecrypt"]="false";
-
 
16914
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
16915
		#$conf["gpgId"]="";
-
 
16916
		#參考資料:
-
 
16917
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
16918
		#md5=>http://php.net/manual/en/function.md5.php
-
 
16919
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
16920
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
16921
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
16922
		#備註:
-
 
16923
		#無.
-
 
16924
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
16925
		unset($conf["authenticate::enCodeStr"]);
-
 
16926
 
-
 
16927
		#如果執行失敗
-
 
16928
		if($enCodeStr["status"]==="false"){
-
 
16929
 
-
 
16930
			#設置執行異常
-
 
16931
			$result["status"]="false";
-
 
16932
 
-
 
16933
			#設置執行錯誤
-
 
16934
			$result["error"]=$enCodeStr;
-
 
16935
 
-
 
16936
			#回傳結果
-
 
16937
			return $result;
-
 
16938
 
-
 
16939
			}#if end
-
 
16940
 
-
 
16941
		#取得hex2bin後的字串
-
 
16942
		$receivedData=$enCodeStr["content"];
-
 
16943
		
-
 
16944
		#gpg decrypt
-
 
16945
		#函式說明:
-
 
16946
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
16947
		#回傳結果:
-
 
16948
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
16949
		#$result["function"],當前執行的函數名稱.
-
 
16950
		#$result["content"],加密後的結果.
-
 
16951
		#$result["error"],錯誤訊息陣列.
-
 
16952
		#$result["argu"],使用的參數.
-
 
16953
		#必填參數:
-
 
16954
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
16955
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
16956
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
16957
		$conf["authenticate::enCodeStr"]["enCodeType"]="gpg";
-
 
16958
		#可省略參數:
-
 
16959
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
16960
		#$conf["sha1Raw"]="false";
-
 
16961
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
16962
		#$conf["p_hash"]="";
-
 
16963
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
16964
		#$conf["keyForAes256"]="";
-
 
16965
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
16966
		#$conf["aes256Encode"]="";
-
 
16967
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
16968
		#$conf["qbpwcfDecode"]="false";
-
 
16969
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
16970
		$conf["authenticate::enCodeStr"]["gpgDecrypt"]="true";
-
 
16971
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
16972
		$conf["authenticate::enCodeStr"]["gpgId"]=$conf["gpgId"];
-
 
16973
		#參考資料:
-
 
16974
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
16975
		#md5=>http://php.net/manual/en/function.md5.php
-
 
16976
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
16977
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
16978
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
16979
		#備註:
-
 
16980
		#無.
-
 
16981
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
16982
		unset($conf["authenticate::enCodeStr"]);
-
 
16983
 
-
 
16984
		#如果執行失敗
-
 
16985
		if($enCodeStr["status"]==="false"){
-
 
16986
 
-
 
16987
			#設置執行異常
-
 
16988
			$result["status"]="false";
-
 
16989
 
-
 
16990
			#設置執行錯誤
-
 
16991
			$result["error"]=$enCodeStr;
-
 
16992
 
-
 
16993
			#回傳結果
-
 
16994
			return $result;
-
 
16995
 
-
 
16996
			}#if end
-
 
16997
 
-
 
16998
		#取得解密後的字串
-
 
16999
		$receivedData=$enCodeStr["content"];
-
 
17000
		
-
 
17001
		#json_decode
-
 
17002
		$receivedData=json_decode($receivedData);
-
 
17003
	
-
 
17004
		*/
-
 
17005
	
-
 
17006
		#取得認證狀態
-
 
17007
		$authStatus=$conf["clientInfo"][$conf["clientIndex"]]["auth"];
-
 
17008
	
-
 
17009
		#判斷 authStatus
-
 
17010
		switch($authStatus){
-
 
17011
		
-
 
17012
			#如果未經過認證
-
 
17013
			case "false":
-
 
17014
				
-
 
17015
				#預設可以使用的功能只有"auth"跟"checkAuth"
-
 
17016
				$authFunc=array("auth","checkAuth");
-
 
17017
			
-
 
17018
				#如果有 $conf["falseAllowFuncPlus"]
-
 
17019
				if(count($conf["falseAllowFuncPlus"])>0){
-
 
17020
				
-
 
17021
					#合併 array
-
 
17022
					#函式說明:
-
 
17023
					#將多個一維陣列串聯起來,key從0開始排序.
-
 
17024
					#回傳的結果:
-
 
17025
					#$result["status"],"true"表執行正常,"false"代表執行不正常.
-
 
17026
					#$result["error"],錯誤訊息陣列.
-
 
17027
					#$result["function"],當前執行的函數.
-
 
17028
					#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
17029
					#$result["content"],合併好的一維陣列.
-
 
17030
					#必填參數
-
 
17031
					#$conf["inputArray"],陣列,要合併的一維陣列變數,例如:=array($array1,$array2);
-
 
17032
					$conf["arrays::mergeArray"]["inputArray"]=array($authFunc,$conf["falseAllowFuncPlus"]);
-
 
17033
					#可省略參數:
-
 
17034
					#$conf["allowRepeat"],字串,預設為"true",允許重複的結果;若為"false"則不會出現重複的元素內容.
-
 
17035
					$conf["arrays::mergeArray"]["allowRepeat"]="false";
-
 
17036
					#$conf["looseDiff"],字串,預設為"false",代表要嚴謹判斷為有相異,例如陣列中元素的key順序不同(整數)就代表有相異;反之為"true",例如陣列中元素的key順序不同(非整數),但value有相同,則視為無相異.
-
 
17037
					$conf["arrays::mergeArray"]["looseDiff"]="true";
-
 
17038
					#參考資料:
-
 
17039
					#無.
-
 
17040
					#備註:
-
 
17041
					#無.
-
 
17042
					$mergeArray=arrays::mergeArray($conf["arrays::mergeArray"]);
-
 
17043
					unset($conf["arrays::mergeArray"]);
-
 
17044
				
-
 
17045
					#如果執行失敗
-
 
17046
					if($mergeArray["status"]==="false"){
-
 
17047
 
-
 
17048
						#設置執行異常
-
 
17049
						$result["status"]="false";
-
 
17050
 
-
 
17051
						#設置執行錯誤
-
 
17052
						$result["error"]=$mergeArray;
-
 
17053
 
-
 
17054
						#回傳結果
-
 
17055
						return $result;
-
 
17056
 
-
 
17057
						}#if end
-
 
17058
				
-
 
17059
					#取得合併好允許使用的清單
-
 
17060
					$authFunc=$mergeArray["content"];
-
 
17061
				
-
 
17062
					}#if end
-
 
17063
			
-
 
17064
				#如果沒有權限使用 
-
 
17065
				if(!in_array($conf["func"],$authFunc)){
-
 
17066
				
-
 
17067
					#設置執行異常
-
 
17068
					$result["status"]="false";
-
 
17069
 
-
 
17070
					#設置執行錯誤
-
 
17071
					$result["error"][]="no ".$conf["func"]." permission";
-
 
17072
					
-
 
17073
					#回傳結果
-
 
17074
					return $result;
-
 
17075
				
-
 
17076
					}#if end
-
 
17077
			
-
 
17078
				#結束 switch
-
 
17079
				break;
-
 
17080
			
-
 
17081
			#如果是"root"賬戶,代表系統管理者,擁有所有權限.
-
 
17082
			case "root":
-
 
17083
			
-
 
17084
				#預設可以使用的功能只有"*",代表所有功能都能用.
-
 
17085
				$authFunc=array("*");
-
 
17086
			
-
 
17087
				/*	允許使用所有函式
-
 
17088
			
-
 
17089
				#如果沒有權限使用 
-
 
17090
				if(!in_array($conf["func"],$authFunc)){
-
 
17091
				
-
 
17092
					#設置執行異常
-
 
17093
					$result["status"]="false";
-
 
17094
 
-
 
17095
					#設置執行錯誤
-
 
17096
					$result["error"][]="no ".$conf["func"]." permission";
-
 
17097
					
-
 
17098
					#回傳結果
-
 
17099
					return $result;
-
 
17100
				
-
 
17101
					}#if end
-
 
17102
			
-
 
17103
				*/
-
 
17104
			
-
 
17105
				#結束 switch
-
 
17106
				break;
-
 
17107
			
-
 
17108
			#如果是"public"賬戶,代表具備一般使用權限的公用使用者.
-
 
17109
			case "public":
-
 
17110
			
-
 
17111
				#預設可以使用的功能只有"*",代表所有功能都能用.
-
 
17112
				$authFunc=array("auth","checkAuth","basic");
-
 
17113
				
-
 
17114
				#如果有 publicAllowFuncPlus
-
 
17115
				if(count($conf["publicAllowFuncPlus"])>0){
-
 
17116
			
-
 
17117
					#合併 array
-
 
17118
					#函式說明:
-
 
17119
					#將多個一維陣列串聯起來,key從0開始排序.
-
 
17120
					#回傳的結果:
-
 
17121
					#$result["status"],"true"表執行正常,"false"代表執行不正常.
-
 
17122
					#$result["error"],錯誤訊息陣列.
-
 
17123
					#$result["function"],當前執行的函數.
-
 
17124
					#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
17125
					#$result["content"],合併好的一維陣列.
-
 
17126
					#必填參數
-
 
17127
					#$conf["inputArray"],陣列,要合併的一維陣列變數,例如:=array($array1,$array2);
-
 
17128
					$conf["arrays::mergeArray"]["inputArray"]=array($authFunc,$conf["publicAllowFuncPlus"]);
-
 
17129
					#可省略參數:
-
 
17130
					#$conf["allowRepeat"],字串,預設為"true",允許重複的結果;若為"false"則不會出現重複的元素內容.
-
 
17131
					$conf["arrays::mergeArray"]["allowRepeat"]="false";
-
 
17132
					#$conf["looseDiff"],字串,預設為"false",代表要嚴謹判斷為有相異,例如陣列中元素的key順序不同(整數)就代表有相異;反之為"true",例如陣列中元素的key順序不同(非整數),但value有相同,則視為無相異.
-
 
17133
					$conf["arrays::mergeArray"]["looseDiff"]="true";
-
 
17134
					#參考資料:
-
 
17135
					#無.
-
 
17136
					#備註:
-
 
17137
					#無.
-
 
17138
					$mergeArray=arrays::mergeArray($conf["arrays::mergeArray"]);
-
 
17139
					unset($conf["arrays::mergeArray"]);
-
 
17140
				
-
 
17141
					#如果執行失敗
-
 
17142
					if($mergeArray["status"]==="false"){
-
 
17143
 
-
 
17144
						#設置執行異常
-
 
17145
						$result["status"]="false";
-
 
17146
 
-
 
17147
						#設置執行錯誤
-
 
17148
						$result["error"]=$mergeArray;
-
 
17149
 
-
 
17150
						#回傳結果
-
 
17151
						return $result;
-
 
17152
 
-
 
17153
						}#if end
-
 
17154
				
-
 
17155
					#取得合併好允許使用的清單
-
 
17156
					$authFunc=$mergeArray["content"];
-
 
17157
					
-
 
17158
					}#if end
-
 
17159
			
-
 
17160
				#如果沒有權限使用 
-
 
17161
				if(!in_array($conf["func"],$authFunc)){
-
 
17162
				
-
 
17163
					#設置執行異常
-
 
17164
					$result["status"]="false";
-
 
17165
 
-
 
17166
					#設置執行錯誤
-
 
17167
					$result["error"][]="no ".$conf["func"]." permission";
-
 
17168
					
-
 
17169
					#回傳結果
-
 
17170
					return $result;
-
 
17171
				
-
 
17172
					}#if end
-
 
17173
			
-
 
17174
				break;
-
 
17175
			
-
 
17176
			#其他結果
-
 
17177
			default:
-
 
17178
			
-
 
17179
				#依照指定的資料來源進行權限與可用功能的檢查
-
 
17180
				#...
-
 
17181
				
-
 
17182
				#設置執行異常
-
 
17183
				$result["status"]="false";
-
 
17184
 
-
 
17185
				#設置執行錯誤
-
 
17186
				$result["error"][]="not supported authStatus(".$authStatus.")";
-
 
17187
				
-
 
17188
				#回傳結果
-
 
17189
				return $result;
-
 
17190
				
-
 
17191
			}#switch end
-
 
17192
	
-
 
17193
			#設置執行正常
-
 
17194
			$result["status"]="true";
-
 
17195
 
-
 
17196
			#回傳結果
-
 
17197
			return $result;
-
 
17198
	
-
 
17199
		}#function checkAuth end
-
 
17200
	
-
 
17201
	/*
-
 
17202
	#函式說明:
-
 
17203
	#提供webSock::nativeSocketTcpIpServer用於接受"auth:"開頭的訊息進行認證使用者的功能.
-
 
17204
	#回傳結果:
-
 
17205
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常,"continue"代表不適用.
-
 
17206
	#$result["error"],執行不正常結束的錯訊息陣列.
-
 
17207
	#$result["argu"],陣列,使用的參數.
-
 
17208
	#必填參數:
-
 
17209
	#$conf["data"],字串,收到的bin2hex編碼後果gpg加密過後的json格式資料,必填的key有"randomStr","username","password".
-
 
17210
	$conf["data"]="";
-
 
17211
	#$conf["serverSock"],resource,web socket server socket
-
 
17212
	$conf["serverSock"]=$resource;
-
 
17213
	#$conf["clientSock"],$resource,web socket client socket
-
 
17214
	$conf["clientSock"]=$resource;
-
 
17215
	#$conf["clientInfo"],陣列,web socket client info.
-
 
17216
	$conf["clientInfo"]=array();
-
 
17217
	#$conf["clientIndex"],整數.web socket client index.
-
 
17218
	$conf["clientIndex"];
-
 
17219
	#$conf["allConn"],陣列,all web socket client info.
-
 
17220
	$conf["allConn"]=array();
-
 
17221
	#可省略參數:
-
 
17222
	#$conf["wsMode"],字串,是否要按照rfc6555,預設為"true"為是;"false"為否.
-
 
17223
	#$conf["wsMode"]="true";
-
 
17224
	#$conf["gpgId"],字串,用於加解密的gpg id,預設為gnupgId.
-
 
17225
	#$conf["gpgId"]=gnupgId;
-
 
17226
	#參考資料:
-
 
17227
	#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
-
 
17228
	#備註:
-
 
17229
	#無.
-
 
17230
	*/
-
 
17231
	public static function auth(&$conf){
-
 
17232
	
-
 
17233
		#初始化要回傳的結果
-
 
17234
		$result=array();
-
 
17235
 
-
 
17236
		#取得當前執行的函數名稱
-
 
17237
		$result["function"]=__FUNCTION__;
-
 
17238
 
-
 
17239
		#涵式說明:
-
 
17240
		#判斷當前環境為web還是cmd
-
 
17241
		#回傳結果:
-
 
17242
		#$result,"web"或"cmd"
-
 
17243
		if(csInformation::getEnv()==="web"){
-
 
17244
			
-
 
17245
			#設置執行失敗
-
 
17246
			$result["status"]="false";
-
 
17247
			
-
 
17248
			#設置執行錯誤訊息
-
 
17249
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
-
 
17250
			
-
 
17251
			#回傳結果
-
 
17252
			return $result;
-
 
17253
			
-
 
17254
			}#if end
-
 
17255
 
-
 
17256
		#取得參數
-
 
17257
		$result["argu"]=$conf;
-
 
17258
 
-
 
17259
		#如果 $conf 不為陣列
-
 
17260
		if(gettype($conf)!="array"){
-
 
17261
		
-
 
17262
			#設置執行失敗
-
 
17263
			$result["status"]="false";
-
 
17264
		
-
 
17265
			#設置執行錯誤訊息
-
 
17266
			$result["error"][]="\$conf變數須為陣列形態";
-
 
17267
		
-
 
17268
			#如果傳入的參數為 null
-
 
17269
			if($conf==null){
-
 
17270
			
-
 
17271
				#設置執行錯誤訊息
-
 
17272
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
-
 
17273
			
-
 
17274
				}#if end
-
 
17275
 
-
 
17276
			#回傳結果
-
 
17277
			return $result;
-
 
17278
		
-
 
17279
			}#if end
-
 
17280
		
-
 
17281
		#檢查參數
-
 
17282
		#函式說明:
-
 
17283
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
-
 
17284
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
17285
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
17286
		#$result["function"],當前執行的函式名稱.
-
 
17287
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
17288
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
17289
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
17290
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
17291
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
17292
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
17293
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
17294
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
17295
		#必填寫的參數:
-
 
17296
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
17297
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
17298
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
17299
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","serverSock","clientInfo","clientIndex","allConn");
-
 
17300
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
-
 
17301
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","resource","array","string","array");
-
 
17302
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
17303
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
17304
		#可以省略的參數:
-
 
17305
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
17306
		#$conf["canBeEmptyString"]="false";
-
 
17307
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
17308
		#$conf["canNotBeEmpty"]=array();
-
 
17309
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
17310
		#$conf["canBeEmpty"]=array();
-
 
17311
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
17312
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("wsMode");
-
 
17313
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
17314
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("wsMode","gpgId");
-
 
17315
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
-
 
17316
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
-
 
17317
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
17318
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",gnupgId);
-
 
17319
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
17320
		#$conf["arrayCountEqualCheck"][]=array();
-
 
17321
		#參考資料來源:
-
 
17322
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
17323
		#建議:
-
 
17324
		#增加可省略參數全部不能為空字串或空陣列的參數功能.
-
 
17325
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
17326
		unset($conf["variableCheck::checkArguments"]);
-
 
17327
		
-
 
17328
		#如果檢查參數失敗
-
 
17329
		if($checkArguments["status"]==="false"){
-
 
17330
			
-
 
17331
			#設置執行失敗
-
 
17332
			$result["status"]="false";
-
 
17333
		
-
 
17334
			#設置執行錯誤訊息
-
 
17335
			$result["error"]=$checkArguments;
-
 
17336
			
-
 
17337
			#回傳結果
-
 
17338
			return $result;
-
 
17339
			
-
 
17340
			}#if end
-
 
17341
			
-
 
17342
		#如果檢查參數不通過
-
 
17343
		if($checkArguments["passed"]==="false"){
-
 
17344
			
-
 
17345
			#設置執行失敗
-
 
17346
			$result["status"]="false";
-
 
17347
		
-
 
17348
			#設置執行錯誤訊息
-
 
17349
			$result["error"]=$checkArguments;
-
 
17350
			
-
 
17351
			#回傳結果
-
 
17352
			return $result;
-
 
17353
			
-
 
17354
			}#if end
-
 
17355
 
-
 
17356
		#取得收到的訊息
-
 
17357
		$receivedData=$conf["data"];
-
 
17358
		
-
 
17359
		#取得 server 的 socket
-
 
17360
		$serverSocket=$conf["serverSock"];
-
 
17361
		
-
 
17362
		#取得 client 的 socket
-
 
17363
		$clientSocket=$conf["clientSock"];
-
 
17364
		
-
 
17365
		#取得 client 的資訊
-
 
17366
		$clientInfo=$conf["clientInfo"];
-
 
17367
		
-
 
17368
		#取得 client 的索引
-
 
17369
		$clientIndex=$conf["clientIndex"];
-
 
17370
		
-
 
17371
		#取得認證狀態
-
 
17372
		$authStatus=&$conf["clientInfo"][$conf["clientIndex"]]["auth"];
-
 
17373
		
-
 
17374
		#取得 all clients 的資訊
-
 
17375
		$allConn=&$conf["allConn"];
-
 
17376
		
-
 
17377
		#hex2bin
-
 
17378
		#函式說明:
-
 
17379
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
17380
		#回傳結果:
-
 
17381
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
17382
		#$result["function"],當前執行的函數名稱.
-
 
17383
		#$result["content"],加密後的結果.
-
 
17384
		#$result["error"],錯誤訊息陣列.
-
 
17385
		#$result["argu"],使用的參數.
-
 
17386
		#必填參數:
-
 
17387
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
17388
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
17389
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
17390
		$conf["authenticate::enCodeStr"]["enCodeType"]="hex2bin";
-
 
17391
		#可省略參數:
-
 
17392
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
17393
		#$conf["sha1Raw"]="false";
-
 
17394
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
17395
		#$conf["p_hash"]="";
-
 
17396
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
17397
		#$conf["keyForAes256"]="";
-
 
17398
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
17399
		#$conf["aes256Encode"]="";
-
 
17400
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
17401
		#$conf["qbpwcfDecode"]="false";
-
 
17402
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
17403
		#$conf["gpgDecrypt"]="false";
-
 
17404
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
17405
		#$conf["gpgId"]="";
-
 
17406
		#參考資料:
-
 
17407
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
17408
		#md5=>http://php.net/manual/en/function.md5.php
-
 
17409
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
17410
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
17411
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
17412
		#備註:
-
 
17413
		#無.
-
 
17414
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
17415
		unset($conf["authenticate::enCodeStr"]);
-
 
17416
 
-
 
17417
		#如果執行失敗
-
 
17418
		if($enCodeStr["status"]==="false"){
-
 
17419
 
-
 
17420
			#設置執行異常
-
 
17421
			$result["status"]="false";
-
 
17422
 
-
 
17423
			#設置執行錯誤
-
 
17424
			$result["error"]=$enCodeStr;
-
 
17425
 
-
 
17426
			#回傳結果
-
 
17427
			return $result;
-
 
17428
 
-
 
17429
			}#if end
-
 
17430
 
-
 
17431
		#取得hex2bin後的字串
-
 
17432
		$receivedData=$enCodeStr["content"];
-
 
17433
		
-
 
17434
		#gpg decrypt
-
 
17435
		#函式說明:
-
 
17436
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
17437
		#回傳結果:
-
 
17438
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
17439
		#$result["function"],當前執行的函數名稱.
-
 
17440
		#$result["content"],加密後的結果.
-
 
17441
		#$result["error"],錯誤訊息陣列.
-
 
17442
		#$result["argu"],使用的參數.
-
 
17443
		#必填參數:
-
 
17444
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
17445
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
17446
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
17447
		$conf["authenticate::enCodeStr"]["enCodeType"]="gpg";
-
 
17448
		#可省略參數:
-
 
17449
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
17450
		#$conf["sha1Raw"]="false";
-
 
17451
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
17452
		#$conf["p_hash"]="";
-
 
17453
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
17454
		#$conf["keyForAes256"]="";
-
 
17455
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
17456
		#$conf["aes256Encode"]="";
-
 
17457
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
17458
		#$conf["qbpwcfDecode"]="false";
-
 
17459
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
17460
		$conf["authenticate::enCodeStr"]["gpgDecrypt"]="true";
-
 
17461
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
17462
		$conf["authenticate::enCodeStr"]["gpgId"]=$conf["gpgId"];
-
 
17463
		#參考資料:
-
 
17464
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
17465
		#md5=>http://php.net/manual/en/function.md5.php
-
 
17466
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
17467
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
17468
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
17469
		#備註:
-
 
17470
		#無.
-
 
17471
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
17472
		unset($conf["authenticate::enCodeStr"]);
-
 
17473
 
-
 
17474
		#如果執行失敗
-
 
17475
		if($enCodeStr["status"]==="false"){
-
 
17476
 
-
 
17477
			#設置執行異常
-
 
17478
			$result["status"]="false";
-
 
17479
 
-
 
17480
			#設置執行錯誤
-
 
17481
			$result["error"]=$enCodeStr;
-
 
17482
 
-
 
17483
			#回傳結果
-
 
17484
			return $result;
-
 
17485
 
-
 
17486
			}#if end
-
 
17487
 
-
 
17488
		#取得解密後的字串
-
 
17489
		$receivedData=$enCodeStr["content"];
-
 
17490
		
-
 
17491
		#json_decode
-
 
17492
		$receivedData=json_decode($receivedData);
-
 
17493
		
-
 
17494
		#如果decode後的內容不為物件
-
 
17495
		if(gettype($receivedData)!=="Object"){
-
 
17496
		
-
 
17497
			#設置不適用
-
 
17498
			$result["status"]="continue";
-
 
17499
		
-
 
17500
			#回傳結果
-
 
17501
			return $result;
-
 
17502
		
-
 
17503
			}#if end
-
 
17504
		
-
 
17505
		#檢查物件是否符合格式
-
 
17506
		#函式說明:
-
 
17507
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
-
 
17508
		#回傳結果:
-
 
17509
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
17510
		#$result["error"],執行不正常結束的錯訊息陣列.
-
 
17511
		#$result["simpleError"],簡單表示的錯誤訊息.
-
 
17512
		#$result["function"],當前執行的函式名稱.
-
 
17513
		#$result["argu"],設置給予的參數.
-
 
17514
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
17515
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
17516
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
17517
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
17518
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
17519
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
17520
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
17521
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
17522
		#必填參數:
-
 
17523
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
17524
		$conf["variableCheck::checkArguments"]["varInput"]=&$receivedData;
-
 
17525
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
17526
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
17527
		#可省略參數:
-
 
17528
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
17529
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("user","type","secrect");
-
 
17530
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
-
 
17531
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string");
-
 
17532
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
17533
		#$conf["canBeEmptyString"]="false";
-
 
17534
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
17535
		#$conf["canNotBeEmpty"]=array();
-
 
17536
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
17537
		#$conf["canBeEmpty"]=array();
-
 
17538
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
17539
		#$conf["skipableVariableCanNotBeEmpty"]=array();
-
 
17540
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
17541
		#$conf["skipableVariableName"]=array();
-
 
17542
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
-
 
17543
		#$conf["skipableVariableType"]=array();
-
 
17544
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
17545
		#$conf["skipableVarDefaultValue"]=array("");
-
 
17546
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
-
 
17547
		#$conf["disallowAllSkipableVarIsEmpty"]="";
-
 
17548
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
-
 
17549
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
-
 
17550
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
-
 
17551
		#$conf["disallowAllSkipableVarNotExist"]="";
-
 
17552
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
17553
		#$conf["arrayCountEqualCheck"][]=array();
-
 
17554
		#參考資料:
-
 
17555
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
17556
		#備註:
-
 
17557
		#無.
-
 
17558
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
17559
		unset($conf["variableCheck::checkArguments"]);
-
 
17560
		
-
 
17561
		#如果執行異常
-
 
17562
		if($checkArguments["status"]==="false"){
-
 
17563
		
-
 
17564
			#設置異常
-
 
17565
			$result["status"]="false";
-
 
17566
		
-
 
17567
			#設置錯誤訊息
-
 
17568
			$result["error"]=$checkArguments;
-
 
17569
		
-
 
17570
			#回傳結果
-
 
17571
			return $result;
-
 
17572
		
-
 
17573
			}#if end
-
 
17574
			
-
 
17575
		#如果參數不合法
-
 
17576
		if($checkArguments["passed"]==="false"){
-
 
17577
		
-
 
17578
			#設置不適用
-
 
17579
			$result["status"]="continue";
-
 
17580
		
-
 
17581
			#回傳結果
-
 
17582
			return $result;
-
 
17583
		
-
 
17584
			}#if end
-
 
17585
		
-
 
17586
		#取得使用者名稱
-
 
17587
		$user=$receivedData->user;
-
 
17588
		
-
 
17589
		#取得密碼或金鑰內容
-
 
17590
		$secrect=$receivedData->secrect;
-
 
17591
		
-
 
17592
		#依照驗證方式
-
 
17593
		switch($receivedData->type){
-
 
17594
		
-
 
17595
			#若是密碼認證
-
 
17596
			case "password":
-
 
17597
			
-
 
17598
				#測試 $user 與 password 的組合是否能夠認證.
-
 
17599
				#函式說明:
-
 
17600
				#驗證Linux使用者的密碼是否正確.
-
 
17601
				#回傳結果:
-
 
17602
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
17603
				#$result["function"],當前執行的函數名稱.
-
 
17604
				#$result["error"],錯誤訊息陣列.
-
 
17605
				#$result["warninig"],警告訊息陣列.
-
 
17606
				#$result["valid"],是否為存在的使用者且密碼正確.
-
 
17607
				#必填參數:
-
 
17608
				#$conf["username"],字串,要驗證的使用者名稱.
-
 
17609
				$conf["authenticate::validUser"]["username"]=$user;
-
 
17610
				#$conf["password"],字串,用於驗證使用者的密碼.
-
 
17611
				$conf["authenticate::validUser"]["password"]=$secrect;
-
 
17612
				#$conf["fileArgu"],字串,變數__FILE__的內容.
-
 
17613
				$conf["authenticate::validUser"]["fileArgu"]=__FILE__;
-
 
17614
				#可省略參數:
-
 
17615
				#無.
-
 
17616
				#參考資料:
-
 
17617
				#無.
-
 
17618
				#備註:
-
 
17619
				#僅能在命令列環境下運行.
-
 
17620
				$validUser=authenticate::validUser($conf["authenticate::validUser"]);
-
 
17621
				unset($conf["authenticate::validUser"]);
-
 
17622
			
-
 
17623
				#如果執行異常
-
 
17624
				if($validUser["status"]==="false"){
-
 
17625
				
-
 
17626
					#設置異常
-
 
17627
					$result["status"]="false";
-
 
17628
				
-
 
17629
					#設置錯誤訊息
-
 
17630
					$result["error"]=$validUser;
-
 
17631
				
-
 
17632
					#回傳結果
-
 
17633
					return $result;
-
 
17634
				
-
 
17635
					}#if end
-
 
17636
					
-
 
17637
				#如果認證失敗
-
 
17638
				if($validUser["valid"]==="false"){
-
 
17639
				
-
 
17640
					#記錄該 client 認證失敗的事件
-
 
17641
					$allConn[$clientIndex]["authFailed"][]=array("time"=>time(),"user"=>$user);
-
 
17642
					
-
 
17643
					#針對每次認證失敗的記錄
-
 
17644
					for($i=0;$i<count($allConn[$clientIndex]["authFailed"]);$i++){
-
 
17645
					
-
 
17646
						#如果有下一個事件
-
 
17647
						if(isset($allConn[$clientIndex]["authFailed"][$i+1])){
-
 
17648
						
-
 
17649
							#如果本次跟下次事件的時間間隔小於60秒
-
 
17650
							if($allConn[$clientIndex]["authFailed"][$i+1]["time"] - $allConn[$clientIndex]["authFailed"][$i]["time"] > 60){
-
 
17651
							
-
 
17652
								#移除本次記錄
-
 
17653
								array_shift($allConn[$clientIndex]["authFailed"]);
-
 
17654
								
-
 
17655
								#新記錄的索引減少了1,因此更新$i
-
 
17656
								$i--;
-
 
17657
							
-
 
17658
								}#if end
-
 
17659
						
-
 
17660
							}#if end
-
 
17661
					
-
 
17662
						}#foreach end
-
 
17663
						
-
 
17664
					#如果總事件次數大於3
-
 
17665
					if(count($allConn[$clientIndex]["authFailed"])>3){
-
 
17666
					
-
 
17667
						#設置異常
-
 
17668
						$result["status"]="false";
-
 
17669
						
-
 
17670
						#設置錯誤訊息
-
 
17671
						$result["error"]=$allConn[$clientIndex]["authFailed"];
-
 
17672
						
-
 
17673
						#回傳結果
-
 
17674
						return $result;
-
 
17675
					
-
 
17676
						}#if end
-
 
17677
				
-
 
17678
					#設置正常
-
 
17679
					$result["status"]="true";
-
 
17680
				
-
 
17681
					#回傳結果
-
 
17682
					return $result;
-
 
17683
				
-
 
17684
					}#if end
-
 
17685
					
-
 
17686
				#執行到這邊代表使用者認證通過
-
 
17687
				
-
 
17688
				#依照 user 取得其所屬 group
-
 
17689
				#函式說明:
-
 
17690
				#id指令來取得目標賬號的群組資訊
-
 
17691
				#回傳結果:
-
 
17692
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
17693
				#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
17694
				#$result["function"],當前執行的函式名稱.
-
 
17695
				#$result["content"],呼叫完WebService所得回傳結果.
-
 
17696
				#$result["content"]["groupId"],群組的id.
-
 
17697
				#$result["content"]["belongGroupName"],陣列,隸屬的群組名稱陣列.
-
 
17698
				#$result["content"]["belongGroupId"],陣列,隸屬的群組id.
-
 
17699
				#必填參數:
-
 
17700
				#$conf["user"],字串,要取得群組資訊的目標使用者名稱.
-
 
17701
				$conf["authenticate::getUserGroup"]["user"]=$user;
-
 
17702
				#可省略參數:
-
 
17703
				#無.
-
 
17704
				#參考資料:
-
 
17705
				#無.
-
 
17706
				#備註:
-
 
17707
				#無.
-
 
17708
				$getUserGroup=authenticate::getUserGroup($conf["authenticate::getUserGroup"]);
-
 
17709
				unset($conf["authenticate::getUserGroup"]);
-
 
17710
				
-
 
17711
				#如果執行異常
-
 
17712
				if($getUserGroup["status"]==="false"){
-
 
17713
				
-
 
17714
					#設置異常
-
 
17715
					$result["status"]="false";
-
 
17716
				
-
 
17717
					#設置錯誤訊息
-
 
17718
					$result["error"]=$getUserGroup;
-
 
17719
				
-
 
17720
					#回傳結果
-
 
17721
					return $result;
-
 
17722
				
-
 
17723
					}#if end
-
 
17724
				
-
 
17725
				#設置預設的權限為 "false"
-
 
17726
				$authStatus="false";
-
 
17727
				
-
 
17728
				#針對每個取得的群組名稱
-
 
17729
				foreach($getUserGroup["content"]["belongGroupName"] as $groupName){
-
 
17730
				
-
 
17731
					#如果是 root
-
 
17732
					if($groupName==="root"){
-
 
17733
					
-
 
17734
						#設置得到的權限
-
 
17735
						$authStatus=$groupName;
-
 
17736
					
-
 
17737
						#結束 foreach
-
 
17738
						break;
-
 
17739
					
-
 
17740
						}#if end
-
 
17741
						
-
 
17742
					#反之如果是公開的使用者
-
 
17743
					else if($groupName==="public"){
-
 
17744
					
-
 
17745
						#設置得到的權限
-
 
17746
						$authStatus=$groupName;
-
 
17747
						
-
 
17748
						}#if end
-
 
17749
					
-
 
17750
					#其他群組名稱
-
 
17751
					else{
-
 
17752
					
-
 
17753
						#跳過
-
 
17754
						continue;
-
 
17755
					
-
 
17756
						}#else end
-
 
17757
				
-
 
17758
					}#foreach end
-
 
17759
				
-
 
17760
				#設置正常
-
 
17761
				$result["status"]="true";
-
 
17762
			
-
 
17763
				#回傳結果
-
 
17764
				return $result;
-
 
17765
			
-
 
17766
				#跳出 switch
-
 
17767
				break;
-
 
17768
		
-
 
17769
			#若是金鑰認證
-
 
17770
			case "key":
-
 
17771
			
-
 
17772
				#測試 $user 與 key 的組合是否能夠認證.
-
 
17773
				#函式說明:
-
 
17774
				#驗證Linux使用者的密碼或ssh private key是否正確.
-
 
17775
				#回傳結果:
-
 
17776
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
17777
				#$result["function"],當前執行的函數名稱.
-
 
17778
				#$result["error"],錯誤訊息陣列.
-
 
17779
				#$result["warninig"],警告訊息陣列.
-
 
17780
				#$result["valid"],是否為存在的使用者且密碼正確.
-
 
17781
				#必填參數:
-
 
17782
				#$conf["username"],字串,要驗證的使用者名稱.
-
 
17783
				$conf["authenticate::validUser"]["username"]=$user;
-
 
17784
				#$conf["password"],字串,用於驗證使用者的密碼.
-
 
17785
				$conf["authenticate::validUser"]["password"]=$secrect;
-
 
17786
				#$conf["fileArgu"],字串,變數__FILE__的內容.
-
 
17787
				$conf["authenticate::validUser"]["fileArgu"]=__FILE__;
-
 
17788
				#可省略參數:
-
 
17789
				#$conf["sshPrivateKey"],字串,"true"代表password為ssh private key的內容;反之預設為密碼,設置為"false".
-
 
17790
				$conf["authenticate::validUser"]["sshPrivateKey"]="true";
-
 
17791
				#參考資料:
-
 
17792
				#無.
-
 
17793
				#備註:
-
 
17794
				#僅能在命令列環境下運.
-
 
17795
				#目前僅支援驗證執行php端的使用者.
-
 
17796
				$validUser=authenticate::validUser($conf["authenticate::validUser"]);
-
 
17797
				unset($conf["authenticate::validUser"]);
-
 
17798
			
-
 
17799
				#如果執行異常
-
 
17800
				if($validUser["status"]==="false"){
-
 
17801
				
-
 
17802
					#設置異常
-
 
17803
					$result["status"]="false";
-
 
17804
				
-
 
17805
					#設置錯誤訊息
-
 
17806
					$result["error"]=$validUser;
-
 
17807
				
-
 
17808
					#回傳結果
-
 
17809
					return $result;
-
 
17810
				
-
 
17811
					}#if end
-
 
17812
					
-
 
17813
				#如果認證失敗
-
 
17814
				if($validUser["valid"]==="false"){
-
 
17815
				
-
 
17816
					#記錄該 client 認證失敗的事件
-
 
17817
					$allConn[$clientIndex]["authFailed"][]=array("time"=>time(),"user"=>$user);
-
 
17818
					
-
 
17819
					#針對每次認證失敗的記錄
-
 
17820
					for($i=0;$i<count($allConn[$clientIndex]["authFailed"]);$i++){
-
 
17821
					
-
 
17822
						#如果有下一個事件
-
 
17823
						if(isset($allConn[$clientIndex]["authFailed"][$i+1])){
-
 
17824
						
-
 
17825
							#如果本次跟下次事件的時間間隔小於60秒
-
 
17826
							if($allConn[$clientIndex]["authFailed"][$i+1]["time"] - $allConn[$clientIndex]["authFailed"][$i]["time"] > 60){
-
 
17827
							
-
 
17828
								#移除本次記錄
-
 
17829
								array_shift($allConn[$clientIndex]["authFailed"]);
-
 
17830
								
-
 
17831
								#新記錄的索引減少了1,因此更新$i
-
 
17832
								$i--;
-
 
17833
							
-
 
17834
								}#if end
-
 
17835
						
-
 
17836
							}#if end
-
 
17837
					
-
 
17838
						}#foreach end
-
 
17839
						
-
 
17840
					#如果總事件次數大於3
-
 
17841
					if(count($allConn[$clientIndex]["authFailed"])>3){
-
 
17842
					
-
 
17843
						#設置異常
-
 
17844
						$result["status"]="false";
-
 
17845
						
-
 
17846
						#設置錯誤訊息
-
 
17847
						$result["error"]=$allConn[$clientIndex]["authFailed"];
-
 
17848
						
-
 
17849
						#回傳結果
-
 
17850
						return $result;
-
 
17851
					
-
 
17852
						}#if end
-
 
17853
				
-
 
17854
					#設置正常
-
 
17855
					$result["status"]="true";
-
 
17856
				
-
 
17857
					#回傳結果
-
 
17858
					return $result;
-
 
17859
				
-
 
17860
					}#if end
-
 
17861
					
-
 
17862
				#執行到這邊代表使用者認證通過
-
 
17863
				
-
 
17864
				#依照 user 取得其所屬 group
-
 
17865
				#函式說明:
-
 
17866
				#id指令來取得目標賬號的群組資訊
-
 
17867
				#回傳結果:
-
 
17868
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
17869
				#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
17870
				#$result["function"],當前執行的函式名稱.
-
 
17871
				#$result["content"],呼叫完WebService所得回傳結果.
-
 
17872
				#$result["content"]["groupId"],群組的id.
-
 
17873
				#$result["content"]["belongGroupName"],陣列,隸屬的群組名稱陣列.
-
 
17874
				#$result["content"]["belongGroupId"],陣列,隸屬的群組id.
-
 
17875
				#必填參數:
-
 
17876
				#$conf["user"],字串,要取得群組資訊的目標使用者名稱.
-
 
17877
				$conf["authenticate::getUserGroup"]["user"]=$user;
-
 
17878
				#可省略參數:
-
 
17879
				#無.
-
 
17880
				#參考資料:
-
 
17881
				#無.
-
 
17882
				#備註:
-
 
17883
				#無.
-
 
17884
				$getUserGroup=authenticate::getUserGroup($conf["authenticate::getUserGroup"]);
-
 
17885
				unset($conf["authenticate::getUserGroup"]);
-
 
17886
				
-
 
17887
				#如果執行異常
-
 
17888
				if($getUserGroup["status"]==="false"){
-
 
17889
				
-
 
17890
					#設置異常
-
 
17891
					$result["status"]="false";
-
 
17892
				
-
 
17893
					#設置錯誤訊息
-
 
17894
					$result["error"]=$getUserGroup;
-
 
17895
				
-
 
17896
					#回傳結果
-
 
17897
					return $result;
-
 
17898
				
-
 
17899
					}#if end
-
 
17900
				
-
 
17901
				#設置預設的權限為 "false"
-
 
17902
				$authStatus="false";
-
 
17903
				
-
 
17904
				#針對每個取得的群組名稱
-
 
17905
				foreach($getUserGroup["content"]["belongGroupName"] as $groupName){
-
 
17906
				
-
 
17907
					#如果是 root
-
 
17908
					if($groupName==="root"){
-
 
17909
					
-
 
17910
						#設置得到的權限
-
 
17911
						$authStatus=$groupName;
-
 
17912
					
-
 
17913
						#結束 foreach
-
 
17914
						break;
-
 
17915
					
-
 
17916
						}#if end
-
 
17917
						
-
 
17918
					#反之如果是公開的使用者
-
 
17919
					else if($groupName==="public"){
-
 
17920
					
-
 
17921
						#設置得到的權限
-
 
17922
						$authStatus=$groupName;
-
 
17923
						
-
 
17924
						}#if end
-
 
17925
					
-
 
17926
					#其他群組名稱
-
 
17927
					else{
-
 
17928
					
-
 
17929
						#跳過
-
 
17930
						continue;
-
 
17931
					
-
 
17932
						}#else end
-
 
17933
				
-
 
17934
					}#foreach end
-
 
17935
					
-
 
17936
				#設置正常
-
 
17937
				$result["status"]="true";
-
 
17938
			
-
 
17939
				#回傳結果
-
 
17940
				return $result;
-
 
17941
			
-
 
17942
				#跳出 switch
-
 
17943
				break;
-
 
17944
				
-
 
17945
			#其他類型
-
 
17946
			default:
-
 
17947
			
-
 
17948
				#設置不適用
-
 
17949
				$result["status"]="continue";
-
 
17950
			
-
 
17951
				#回傳結果
-
 
17952
				return $result;
-
 
17953
		
-
 
17954
			}#switch end
-
 
17955
		
-
 
17956
		#執行到這邊代表異常
-
 
17957
 
-
 
17958
		#設置異常
-
 
17959
		$result["status"]="false";
-
 
17960
 
-
 
17961
		#回傳結果
-
 
17962
		return $result;
-
 
17963
	
-
 
17964
		}#function auth end
-
 
17965
	
-
 
17966
	/*
-
 
17967
	#函式說明:
-
 
17968
	#提供webSock::nativeSocketTcpIpServer使用基本功能(basic).
-
 
17969
	#回傳結果:
-
 
17970
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常,"continue"代表不適用.
-
 
17971
	#$result["error"],執行不正常結束的錯訊息陣列.
-
 
17972
	#$result["argu"],陣列,使用的參數.
-
 
17973
	#必填參數:
-
 
17974
	#$conf["data"],字串,收到的bin2hex編碼後再gpg加密過後的json格式資料.
-
 
17975
	$conf["data"]="";
-
 
17976
	#$conf["serverSock"],resource,web socket server socket
-
 
17977
	$conf["serverSock"]=$resource;
-
 
17978
	#$conf["clientSock"],$resource,web socket client socket
-
 
17979
	$conf["clientSock"]=$resource;
-
 
17980
	#$conf["clientInfo"],陣列,web socket client info.
-
 
17981
	$conf["clientInfo"]=array();
-
 
17982
	#$conf["clientIndex"],整數.web socket client index.
-
 
17983
	$conf["clientIndex"];
-
 
17984
	#$conf["allConn"],陣列,all web socket client info.
-
 
17985
	$conf["allConn"]=array();
-
 
17986
	#可省略參數:
-
 
17987
	#$conf["wsMode"],字串,是否要按照rfc6555,預設為"true"為是;"false"為否.
-
 
17988
	#$conf["wsMode"]="true";
-
 
17989
	#$conf["gpgId"],字串,用於加解密的gpg id,預設為gnupgId.
-
 
17990
	#$conf["gpgId"]=gnupgId;
-
 
17991
	#參考資料:
-
 
17992
	#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
-
 
17993
	#備註:
-
 
17994
	#收到用戶的"id?"訊息,會回傳用戶的id.
-
 
17995
	#收到用戶的"ids?"訊息,會回傳非自己的所有用戶id.
-
 
17996
	#收到用戶的"talkTo?"訊息,會回傳目前在跟誰談話.
-
 
17997
	#收到用戶的"talkTo:client-id"訊息,會建立與id對應的用戶對話,此後傳遞的訊息均會給對方.
-
 
17998
	#結束連線的訊息"quit".
-
 
17999
	*/
-
 
18000
	public static function basic(&$conf){
-
 
18001
		
-
 
18002
		#初始化要回傳的結果
-
 
18003
		$result=array();
-
 
18004
 
-
 
18005
		#取得當前執行的函數名稱
-
 
18006
		$result["function"]=__FUNCTION__;
-
 
18007
 
-
 
18008
		#涵式說明:
-
 
18009
		#判斷當前環境為web還是cmd
-
 
18010
		#回傳結果:
-
 
18011
		#$result,"web"或"cmd"
-
 
18012
		if(csInformation::getEnv()==="web"){
-
 
18013
			
-
 
18014
			#設置執行失敗
-
 
18015
			$result["status"]="false";
-
 
18016
			
-
 
18017
			#設置執行錯誤訊息
-
 
18018
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
-
 
18019
			
-
 
18020
			#回傳結果
-
 
18021
			return $result;
-
 
18022
			
-
 
18023
			}#if end
-
 
18024
 
-
 
18025
		#取得參數
-
 
18026
		$result["argu"]=$conf;
-
 
18027
 
-
 
18028
		#如果 $conf 不為陣列
-
 
18029
		if(gettype($conf)!="array"){
-
 
18030
		
-
 
18031
			#設置執行失敗
-
 
18032
			$result["status"]="false";
-
 
18033
		
-
 
18034
			#設置執行錯誤訊息
-
 
18035
			$result["error"][]="\$conf變數須為陣列形態";
-
 
18036
		
-
 
18037
			#如果傳入的參數為 null
-
 
18038
			if($conf==null){
-
 
18039
			
-
 
18040
				#設置執行錯誤訊息
-
 
18041
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
-
 
18042
			
-
 
18043
				}#if end
-
 
18044
 
-
 
18045
			#回傳結果
-
 
18046
			return $result;
-
 
18047
		
-
 
18048
			}#if end
-
 
18049
		
-
 
18050
		#檢查參數
-
 
18051
		#函式說明:
-
 
18052
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
-
 
18053
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
18054
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
18055
		#$result["function"],當前執行的函式名稱.
-
 
18056
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
18057
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
18058
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
18059
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
18060
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
18061
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
18062
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
18063
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
18064
		#必填寫的參數:
-
 
18065
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
18066
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
18067
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
18068
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","serverSock","clientInfo","clientIndex","allConn");
-
 
18069
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
-
 
18070
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","resource","array","string","array");
-
 
18071
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
18072
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
18073
		#可以省略的參數:
-
 
18074
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
18075
		#$conf["canBeEmptyString"]="false";
-
 
18076
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
18077
		#$conf["canNotBeEmpty"]=array();
-
 
18078
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
18079
		#$conf["canBeEmpty"]=array();
-
 
18080
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
18081
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("wsMode");
-
 
18082
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
18083
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("wsMode","gpgId");
-
 
18084
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
-
 
18085
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
-
 
18086
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
18087
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",gnupgId);
-
 
18088
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
18089
		#$conf["arrayCountEqualCheck"][]=array();
-
 
18090
		#參考資料來源:
-
 
18091
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
18092
		#建議:
-
 
18093
		#增加可省略參數全部不能為空字串或空陣列的參數功能.
-
 
18094
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
18095
		unset($conf["variableCheck::checkArguments"]);
-
 
18096
		
-
 
18097
		#如果檢查參數失敗
-
 
18098
		if($checkArguments["status"]==="false"){
-
 
18099
			
-
 
18100
			#設置執行失敗
-
 
18101
			$result["status"]="false";
-
 
18102
		
-
 
18103
			#設置執行錯誤訊息
-
 
18104
			$result["error"]=$checkArguments;
-
 
18105
			
-
 
18106
			#回傳結果
-
 
18107
			return $result;
-
 
18108
			
-
 
18109
			}#if end
-
 
18110
			
-
 
18111
		#如果檢查參數不通過
-
 
18112
		if($checkArguments["passed"]==="false"){
-
 
18113
			
-
 
18114
			#設置執行失敗
-
 
18115
			$result["status"]="false";
-
 
18116
		
-
 
18117
			#設置執行錯誤訊息
-
 
18118
			$result["error"]=$checkArguments;
-
 
18119
			
-
 
18120
			#回傳結果
-
 
18121
			return $result;
-
 
18122
			
-
 
18123
			}#if end
-
 
18124
 
-
 
18125
		#取得收到的訊息
-
 
18126
		$receivedData=$conf["data"];
-
 
18127
		
-
 
18128
		#取得 server 的 socket
-
 
18129
		$serverSocket=$conf["serverSock"];
-
 
18130
		
-
 
18131
		#取得 client 的 socket
-
 
18132
		$clientSocket=$conf["clientSock"];
-
 
18133
		
-
 
18134
		#取得 client 的資訊
-
 
18135
		$clientInfo=$conf["clientInfo"];
-
 
18136
		
-
 
18137
		#取得 client 的索引
-
 
18138
		$clientIndex=$conf["clientIndex"];
-
 
18139
		
-
 
18140
		#取得 all clients 的資訊
-
 
18141
		$allConn=&$conf["allConn"];
-
 
18142
	
-
 
18143
		#hex2bin
-
 
18144
		#函式說明:
-
 
18145
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
18146
		#回傳結果:
-
 
18147
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
18148
		#$result["function"],當前執行的函數名稱.
-
 
18149
		#$result["content"],加密後的結果.
-
 
18150
		#$result["error"],錯誤訊息陣列.
-
 
18151
		#$result["argu"],使用的參數.
-
 
18152
		#必填參數:
-
 
18153
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
18154
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
18155
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
18156
		$conf["authenticate::enCodeStr"]["enCodeType"]="hex2bin";
-
 
18157
		#可省略參數:
-
 
18158
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
18159
		#$conf["sha1Raw"]="false";
-
 
18160
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
18161
		#$conf["p_hash"]="";
-
 
18162
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
18163
		#$conf["keyForAes256"]="";
-
 
18164
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
18165
		#$conf["aes256Encode"]="";
-
 
18166
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
18167
		#$conf["qbpwcfDecode"]="false";
-
 
18168
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
18169
		#$conf["gpgDecrypt"]="false";
-
 
18170
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
18171
		#$conf["gpgId"]="";
-
 
18172
		#參考資料:
-
 
18173
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
18174
		#md5=>http://php.net/manual/en/function.md5.php
-
 
18175
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
18176
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
18177
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
18178
		#備註:
-
 
18179
		#無.
-
 
18180
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
18181
		unset($conf["authenticate::enCodeStr"]);
-
 
18182
 
-
 
18183
		#如果執行失敗
-
 
18184
		if($enCodeStr["status"]==="false"){
-
 
18185
 
-
 
18186
			#設置執行異常
-
 
18187
			$result["status"]="false";
-
 
18188
 
-
 
18189
			#設置執行錯誤
-
 
18190
			$result["error"]=$enCodeStr;
-
 
18191
 
-
 
18192
			#回傳結果
-
 
18193
			return $result;
-
 
18194
 
-
 
18195
			}#if end
-
 
18196
 
-
 
18197
		#取得hex2bin後的字串
-
 
18198
		$receivedData=$enCodeStr["content"];
-
 
18199
		
-
 
18200
		#gpg decrypt
-
 
18201
		#函式說明:
-
 
18202
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
18203
		#回傳結果:
-
 
18204
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
18205
		#$result["function"],當前執行的函數名稱.
-
 
18206
		#$result["content"],加密後的結果.
-
 
18207
		#$result["error"],錯誤訊息陣列.
-
 
18208
		#$result["argu"],使用的參數.
-
 
18209
		#必填參數:
-
 
18210
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
18211
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
18212
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
18213
		$conf["authenticate::enCodeStr"]["enCodeType"]="gpg";
-
 
18214
		#可省略參數:
-
 
18215
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
18216
		#$conf["sha1Raw"]="false";
-
 
18217
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
18218
		#$conf["p_hash"]="";
-
 
18219
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
18220
		#$conf["keyForAes256"]="";
-
 
18221
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
18222
		#$conf["aes256Encode"]="";
-
 
18223
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
18224
		#$conf["qbpwcfDecode"]="false";
-
 
18225
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
18226
		$conf["authenticate::enCodeStr"]["gpgDecrypt"]="true";
-
 
18227
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
18228
		$conf["authenticate::enCodeStr"]["gpgId"]=$conf["gpgId"];
-
 
18229
		#參考資料:
-
 
18230
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
18231
		#md5=>http://php.net/manual/en/function.md5.php
-
 
18232
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
18233
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
18234
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
18235
		#備註:
-
 
18236
		#無.
-
 
18237
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
18238
		unset($conf["authenticate::enCodeStr"]);
-
 
18239
 
-
 
18240
		#如果執行失敗
-
 
18241
		if($enCodeStr["status"]==="false"){
-
 
18242
 
-
 
18243
			#設置執行異常
-
 
18244
			$result["status"]="false";
-
 
18245
 
-
 
18246
			#設置執行錯誤
-
 
18247
			$result["error"]=$enCodeStr;
-
 
18248
 
-
 
18249
			#回傳結果
-
 
18250
			return $result;
-
 
18251
 
-
 
18252
			}#if end
-
 
18253
 
-
 
18254
		#取得解密後的字串
-
 
18255
		$receivedData=$enCodeStr["content"];
-
 
18256
		
-
 
18257
		#json_decode
-
 
18258
		$receivedData=json_decode($receivedData);
-
 
18259
	
-
 
18260
		#如果收到的是 id?
-
 
18261
		if($receivedData==="id?"){
-
 
18262
			
-
 
18263
			#如果尚未認證
-
 
18264
			if($connections[$conIndex]["auth"]==="false"){
-
 
18265
			
-
 
18266
				#設置要回傳的訊息
-
 
18267
				$talkback="permission denied";
-
 
18268
			
-
 
18269
				}#if end
-
 
18270
			
-
 
18271
			else{
-
 
18272
			
-
 
18273
				#設置要回傳的訊息
-
 
18274
				$talkback=$connections[$conIndex]["id"];
-
 
18275
			
-
 
18276
				}#else end
-
 
18277
 
-
 
18278
			#debug
-
 
18279
			#var_dump(__LINE__,$talkback);
-
 
18280
 
-
 
18281
			#json encode 要回傳的訊息
-
 
18282
			$talkback=json_encode($talkback);
-
 
18283
				
-
 
18284
			#debug
-
 
18285
			#var_dump(__LINE__,$talkback);
-
 
18286
			
-
 
18287
			#如果是 ws 模式
-
 
18288
			if($conf["wsMode"]==="true"){
-
 
18289
			
-
 
18290
				#如果已經 handshake 過
-
 
18291
				if($connections[$conIndex]["handshaked"]==="true"){
-
 
18292
				
-
 
18293
					#如果要 unmask	
-
 
18294
					if($connections[$conIndex]["unmask"]==="true"){
-
 
18295
				
-
 
18296
						#函式說明:
-
 
18297
						#加密 handshake 後要傳送的訊息 
-
 
18298
						#回傳結果:
-
 
18299
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
18300
						#$result["error"],執行不正常結束的錯訊息陣列.
-
 
18301
						#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
18302
						#$result["argu"],陣列,使用的參數.
-
 
18303
						#必填參數:
-
 
18304
						#$conf["text"],字串,要加密的訊息.
-
 
18305
						$conf["webSock::encode"]["text"]=$talkback; 
-
 
18306
						#可省略參數:
-
 
18307
						#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
18308
						#$conf["payloadIsBin"]="false";
-
 
18309
						#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
18310
						#$conf["ping"]="false";
-
 
18311
						#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
18312
						#$conf["pong"]="false";
-
 
18313
						#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
18314
						#$conf["frames"]=array();
-
 
18315
						#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
18316
						#$conf["mask"]="false";
-
 
18317
						#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
18318
						#$conf["debug"]="false";
-
 
18319
						#參考資料:
-
 
18320
						#無.
-
 
18321
						#備註:
-
 
18322
						#目前$conf["text"]長度超過125會出錯.
-
 
18323
						$talkback=webSock::encode($conf["webSock::encode"]);
-
 
18324
						unset($conf["webSock::encode"]);
-
 
18325
						
-
 
18326
						#如果執行失敗
-
 
18327
						if($talkback["status"]==="false"){
-
 
18328
						
-
 
18329
							#印出結果
-
 
18330
							var_dump($talkback);
-
 
18331
						
-
 
18332
							#結束執行
-
 
18333
							exit;
-
 
18334
						
-
 
18335
							}#if end
-
 
18336
						
-
 
18337
						#debug
-
 
18338
						#var_dump(__LINE__,$talkback);
-
 
18339
						
-
 
18340
						}#if end
-
 
18341
					
-
 
18342
					}#if end
-
 
18343
			
-
 
18344
				}#if end
-
 
18345
				
-
 
18346
			#反之不為 web socket 訊息
-
 
18347
			else{
-
 
18348
			
-
 
18349
				#儲存成只有一個訊息
-
 
18350
				$talkback["content"][]=$talkback;
-
 
18351
			
-
 
18352
				}#else
-
 
18353
			
-
 
18354
			#針對每個訊息的分段
-
 
18355
			foreach($talkback["content"] as $msg){
-
 
18356
				
-
 
18357
				#debug
-
 
18358
				var_dump(__LINE__,$msg);
-
 
18359
				
-
 
18360
				#回傳訊息
-
 
18361
				$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
18362
		
-
 
18363
				#debug
-
 
18364
				var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
18365
				
-
 
18366
				}#foreach end
-
 
18367
				
-
 
18368
			#設置執行正常
-
 
18369
			$result["status"]="true";
-
 
18370
			
-
 
18371
			#回傳結果
-
 
18372
			return $result;
-
 
18373
			
-
 
18374
			}#if end
-
 
18375
		
-
 
18376
		#反之如果收到的是 "quit"
-
 
18377
		else if($receivedData==="quit"){
-
 
18378
			
-
 
18379
			#設置要回傳的訊息
-
 
18380
			$talkback="結束與 server 的連線";
-
 
18381
			
-
 
18382
			#json encode 要回傳的訊息
-
 
18383
			$talkback=json_encode($talkback).PHP_EOL;
-
 
18384
			
-
 
18385
			#如果是 ws 模式
-
 
18386
			if($conf["wsMode"]==="true"){
-
 
18387
			
-
 
18388
				#如果已經 handshake 過
-
 
18389
				if($connections[$conIndex]["handshaked"]==="true"){
-
 
18390
				
-
 
18391
					#如果要 unmask	
-
 
18392
					if($connections[$conIndex]["unmask"]==="true"){
-
 
18393
				
-
 
18394
						#函式說明:
-
 
18395
						#加密 handshake 後要傳送的訊息 
-
 
18396
						#回傳結果:
-
 
18397
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
18398
						#$result["error"],執行不正常結束的錯訊息陣列.
-
 
18399
						#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
18400
						#$result["argu"],陣列,使用的參數.
-
 
18401
						#必填參數:
-
 
18402
						#$conf["text"],字串,要加密的訊息.
-
 
18403
						$conf["webSock::encode"]["text"]=$talkback; 
-
 
18404
						#可省略參數:
-
 
18405
						#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
18406
						#$conf["payloadIsBin"]="false";
-
 
18407
						#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
18408
						#$conf["ping"]="false";
-
 
18409
						#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
18410
						#$conf["pong"]="false";
-
 
18411
						#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
18412
						#$conf["frames"]=array();
-
 
18413
						#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
18414
						#$conf["mask"]="false";
-
 
18415
						#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
18416
						#$conf["debug"]="false";
-
 
18417
						#參考資料:
-
 
18418
						#無.
-
 
18419
						#備註:
-
 
18420
						#目前$conf["text"]長度超過125會出錯.
-
 
18421
						$talkback=webSock::encode($conf["webSock::encode"]);
-
 
18422
						unset($conf["webSock::encode"]);
-
 
18423
						
-
 
18424
						#如果執行失敗
-
 
18425
						if($talkback["status"]==="false"){
-
 
18426
						
-
 
18427
							#印出結果
-
 
18428
							var_dump($talkback);
-
 
18429
						
-
 
18430
							#結束執行
-
 
18431
							exit;
-
 
18432
						
-
 
18433
							}#if end
-
 
18434
						
-
 
18435
						#debug
-
 
18436
						#var_dump(__LINE__,$talkback);
-
 
18437
						
-
 
18438
						}#if end
-
 
18439
						
-
 
18440
					}#if end
-
 
18441
			
-
 
18442
				}#if end
-
 
18443
				
-
 
18444
			#反之不為 web socket 訊息
-
 
18445
			else{
-
 
18446
			
-
 
18447
				#儲存成只有一個訊息
-
 
18448
				$talkback["content"][]=$talkback;
-
 
18449
			
-
 
18450
				}#else
-
 
18451
			
-
 
18452
			#針對每個訊息的分段
-
 
18453
			foreach($talkback["content"] as $msg){
-
 
18454
				
-
 
18455
				#回傳訊息
-
 
18456
				$socket_write=socket_write($con["connect"], $msg, strlen($msg));
-
 
18457
		
-
 
18458
				#debug
-
 
18459
				#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
18460
				
-
 
18461
				}#foreach end
-
 
18462
				
-
 
18463
			#關閉被 client 的連線	
-
 
18464
			socket_close($con["connect"]);
-
 
18465
			
-
 
18466
			#清理連線的陣列
-
 
18467
			unset($connections[$conIndex]);
-
 
18468
			
-
 
18469
			#設置執行正常
-
 
18470
			$result["status"]="true";
-
 
18471
			
-
 
18472
			#回傳結果
-
 
18473
			return $result;
-
 
18474
		
-
 
18475
			}#if end
-
 
18476
		
-
 
18477
		#反之是如果收到的是 ids?
-
 
18478
		else if($receivedData === 'ids?'){
-
 
18479
			
-
 
18480
			#如果尚未認證
-
 
18481
			if($connections[$conIndex]["auth"]==="false"){
-
 
18482
			
-
 
18483
				#設置要回傳的訊息
-
 
18484
				$talkback=json_encode("permission denied");
-
 
18485
			
-
 
18486
				}#if end
-
 
18487
				
-
 
18488
			#反之
-
 
18489
			else{
-
 
18490
			
-
 
18491
				#設置要回傳的訊息
-
 
18492
				$talkback=array();
-
 
18493
				
-
 
18494
				#針對每個連線
-
 
18495
				foreach($connections as $conIndex_ids => $con_ids){
-
 
18496
 
-
 
18497
					#如果不是自己
-
 
18498
					if($con_ids["connect"]!==$connections[$conIndex]["connect"]){
-
 
18499
					
-
 
18500
						#記錄其他人的id
-
 
18501
						$talkback[]=$con_ids["id"];
-
 
18502
					
-
 
18503
						}#if end
-
 
18504
				
-
 
18505
					}#foreach end
-
 
18506
					
-
 
18507
				#json encode要回傳的id陣列
-
 
18508
				$talkback=json_encode($talkback);
-
 
18509
			
-
 
18510
				}#else end
-
 
18511
			
-
 
18512
			#如果是 ws 模式
-
 
18513
			if($conf["wsMode"]==="true"){
-
 
18514
			
-
 
18515
				#如果已經 handshake 過
-
 
18516
				if($connections[$conIndex]["handshaked"]==="true"){
-
 
18517
				
-
 
18518
					#如果要 unmask
-
 
18519
					if($connections[$conIndex]["unmask"]==="true"){
-
 
18520
				
-
 
18521
						#函式說明:
-
 
18522
						#加密 handshake 後要傳送的訊息 
-
 
18523
						#回傳結果:
-
 
18524
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
18525
						#$result["error"],執行不正常結束的錯訊息陣列.
-
 
18526
						#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
18527
						#$result["argu"],陣列,使用的參數.
-
 
18528
						#必填參數:
-
 
18529
						#$conf["text"],字串,要加密的訊息.
-
 
18530
						$conf["webSock::encode"]["text"]=$talkback; 
-
 
18531
						#可省略參數:
-
 
18532
						#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
18533
						#$conf["payloadIsBin"]="false";
-
 
18534
						#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
18535
						#$conf["ping"]="false";
-
 
18536
						#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
18537
						#$conf["pong"]="false";
-
 
18538
						#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
18539
						#$conf["frames"]=array();
-
 
18540
						#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
18541
						#$conf["mask"]="false";
-
 
18542
						#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
18543
						#$conf["debug"]="false";
-
 
18544
						#參考資料:
-
 
18545
						#無.
-
 
18546
						#備註:
-
 
18547
						#目前$conf["text"]長度超過125會出錯.
-
 
18548
						$talkback=webSock::encode($conf["webSock::encode"]);
-
 
18549
						unset($conf["webSock::encode"]);
-
 
18550
						
-
 
18551
						#如果執行失敗
-
 
18552
						if($talkback["status"]==="false"){
-
 
18553
						
-
 
18554
							#印出結果
-
 
18555
							var_dump($talkback);
-
 
18556
						
-
 
18557
							#結束執行
-
 
18558
							exit;
-
 
18559
						
-
 
18560
							}#if end
-
 
18561
						
-
 
18562
						#debug
-
 
18563
						#var_dump(__LINE__,$talkback);
-
 
18564
						
-
 
18565
						}#if end
-
 
18566
					
-
 
18567
					}#if end
-
 
18568
			
-
 
18569
				}#if end
-
 
18570
			
-
 
18571
			#反之不為 web socket 訊息
-
 
18572
			else{
-
 
18573
			
-
 
18574
				#儲存成只有一個訊息
-
 
18575
				$talkback["content"][]=$talkback;
-
 
18576
			
-
 
18577
				}#else
-
 
18578
			
-
 
18579
			#針對每個訊息的分段
-
 
18580
			foreach($talkback["content"] as $msg){
-
 
18581
				
-
 
18582
				#回傳訊息
-
 
18583
				$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
18584
		
-
 
18585
				#debug
-
 
18586
				var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
18587
				
-
 
18588
				}#foreach end
-
 
18589
		
-
 
18590
			#設置執行正常
-
 
18591
			$result["status"]="true";
-
 
18592
			
-
 
18593
			#回傳結果
-
 
18594
			return $result;
-
 
18595
			
-
 
18596
			}#if end
-
 
18597
		
-
 
18598
		#反之如果收到 "talkTo?"
-
 
18599
		else if($receivedData==="talkTo?"){
-
 
18600
			
-
 
18601
			#如果尚未認證
-
 
18602
			if($connections[$conIndex]["auth"]==="false"){
-
 
18603
			
-
 
18604
				#設置要回傳的訊息
-
 
18605
				$talkback=json_encode("permission denied");
-
 
18606
			
-
 
18607
				}#if end
-
 
18608
			
-
 
18609
			#反之
-
 
18610
			else{
-
 
18611
			
-
 
18612
				#初始化要講話的id陣列
-
 
18613
				$talkback=array();
-
 
18614
				
-
 
18615
				#有幾個要講話的人就執行幾次
-
 
18616
				foreach($connections[$conIndex]["talkTo"] as $to){
-
 
18617
					
-
 
18618
					#串街要講話的人
-
 
18619
					$talkback[]=$to;
-
 
18620
					
-
 
18621
					}#foreach end
-
 
18622
				
-
 
18623
				#設置要回傳的訊息
-
 
18624
				$talkback=json_encode($talkback).PHP_EOL;
-
 
18625
			
-
 
18626
				}#else end
-
 
18627
			
-
 
18628
			#如果是 ws 模式
-
 
18629
			if($conf["wsMode"]==="true"){
-
 
18630
			
-
 
18631
				#如果已經 handshake 過
-
 
18632
				if($connections[$conIndex]["handshaked"]==="true"){
-
 
18633
				
-
 
18634
					#如果要 unmask	
-
 
18635
					if($connections[$conIndex]["unmask"]==="true"){
-
 
18636
				
-
 
18637
						#函式說明:
-
 
18638
						#加密 handshake 後要傳送的訊息 
-
 
18639
						#回傳結果:
-
 
18640
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
18641
						#$result["error"],執行不正常結束的錯訊息陣列.
-
 
18642
						#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
18643
						#$result["argu"],陣列,使用的參數.
-
 
18644
						#必填參數:
-
 
18645
						#$conf["text"],字串,要加密的訊息.
-
 
18646
						$conf["webSock::encode"]["text"]=$talkback; 
-
 
18647
						#可省略參數:
-
 
18648
						#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
18649
						#$conf["payloadIsBin"]="false";
-
 
18650
						#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
18651
						#$conf["ping"]="false";
-
 
18652
						#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
18653
						#$conf["pong"]="false";
-
 
18654
						#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
18655
						#$conf["frames"]=array();
-
 
18656
						#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
18657
						#$conf["mask"]="false";
-
 
18658
						#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
18659
						#$conf["debug"]="false";
-
 
18660
						#參考資料:
-
 
18661
						#無.
-
 
18662
						#備註:
-
 
18663
						#目前$conf["text"]長度超過125會出錯.
-
 
18664
						$talkback=webSock::encode($conf["webSock::encode"]);
-
 
18665
						unset($conf["webSock::encode"]);
-
 
18666
						
-
 
18667
						#如果執行失敗
-
 
18668
						if($talkback["status"]==="false"){
-
 
18669
						
-
 
18670
							#印出結果
-
 
18671
							var_dump($talkback);
-
 
18672
						
-
 
18673
							#結束執行
-
 
18674
							exit;
-
 
18675
						
-
 
18676
							}#if end
-
 
18677
						
-
 
18678
						#debug
-
 
18679
						#var_dump(__LINE__,$talkback);
-
 
18680
						
-
 
18681
						}#if end
-
 
18682
						
-
 
18683
					}#if end
-
 
18684
			
-
 
18685
				}#if end
-
 
18686
			
-
 
18687
			#反之不為 web socket 訊息
-
 
18688
			else{
-
 
18689
			
-
 
18690
				#儲存成只有一個訊息
-
 
18691
				$talkback["content"][]=$talkback;
-
 
18692
			
-
 
18693
				}#else
-
 
18694
			
-
 
18695
			#針對每個訊息的分段
-
 
18696
			foreach($talkback["content"] as $msg){
-
 
18697
				
-
 
18698
				#回傳訊息
-
 
18699
				$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
18700
		
-
 
18701
				#debug
-
 
18702
				#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
18703
				
-
 
18704
				}#foreach end
-
 
18705
			
-
 
18706
			#設置執行正常
-
 
18707
			$result["status"]="true";
-
 
18708
			
-
 
18709
			#回傳結果
-
 
18710
			return $result;
-
 
18711
			
-
 
18712
			}#if end
-
 
18713
			
-
 
18714
		#如果收到的訊息長度大於 "talkTo:"
-
 
18715
		if(strlen($receivedData)>strlen("talkTo:")){
-
 
18716
			
-
 
18717
			#如果收到開頭為 "talkTo:"
-
 
18718
			#涵式說明:
-
 
18719
			#取得符合特定字首與字尾的字串
-
 
18720
			#回傳的結果:
-
 
18721
			#$result["status"],若爲"true"則代表執行正常;若爲"false"則代表執行失敗。
-
 
18722
			#$result["function"],當前執行的函數名稱.
-
 
18723
			#$result["error"],錯誤訊息陣列.
-
 
18724
			#$result["founded"],若為"true"則代表有找到符合字首條件的結果;若爲"false"則代表沒有找到。
-
 
18725
			#$result["returnString"],爲符合字首條件的字串內容。
-
 
18726
			#必填參數:
-
 
18727
			#$conf["checkString"],字串,要檢查的字串.
-
 
18728
			$conf["search::getMeetConditionsString"]["checkString"]=$receivedData;
-
 
18729
			#可省略參數:
-
 
18730
			#$conf["frontWord"],字串,用來檢查字首應該要有什麼字串,預設不指定.
-
 
18731
			$conf["search::getMeetConditionsString"]["frontWord"]="talkTo:";
-
 
18732
			#$conf["tailWord"],字串,用來檢查字尾應該要有什麼字串,預設不指定.
-
 
18733
			#$conf["tailWord"]="";
-
 
18734
			#參考資料:
-
 
18735
			#str_spilt(),可以將字串依照字母分割成一個個陣列字串。
-
 
18736
			$getMeetConditionsString=search::getMeetConditionsString($conf["search::getMeetConditionsString"]);
-
 
18737
			unset($conf["search::getMeetConditionsString"]);
-
 
18738
				
-
 
18739
			#如果選找前置字串 "talkTo:" 失敗
-
 
18740
			if($getMeetConditionsString["status"]==="false"){
-
 
18741
				
-
 
18742
				#設置執行失敗
-
 
18743
				$result["status"]="false";
-
 
18744
			
-
 
18745
				#設置執行錯誤訊息
-
 
18746
				$result["error"]=$getMeetConditionsString;
-
 
18747
				
-
 
18748
				#回傳結果
-
 
18749
				return $result;
-
 
18750
				
-
 
18751
				}#if end
-
 
18752
				
-
 
18753
			#如果存在 "talkTo:" 前置字串
-
 
18754
			if($getMeetConditionsString["founded"]==="true"){
-
 
18755
				
-
 
18756
				#如果尚未認證
-
 
18757
				if($connections[$conIndex]["auth"]==="false"){
-
 
18758
				
-
 
18759
					#設置要回傳的訊息
-
 
18760
					$talkback=json_encode("permission denied");
-
 
18761
					
-
 
18762
					#如果是 ws 模式
-
 
18763
					if($conf["wsMode"]==="true"){
-
 
18764
					
-
 
18765
						#如果已經 handshake 過
-
 
18766
						if($connections[$conIndex]["handshaked"]==="true"){
-
 
18767
						
-
 
18768
							#如果要 unmask	
-
 
18769
							if($connections[$conIndex]["unmask"]==="true"){
-
 
18770
						
-
 
18771
								#函式說明:
-
 
18772
								#加密 handshake 後要傳送的訊息 
-
 
18773
								#回傳結果:
-
 
18774
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
18775
								#$result["error"],執行不正常結束的錯訊息陣列.
-
 
18776
								#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
18777
								#$result["argu"],陣列,使用的參數.
-
 
18778
								#必填參數:
-
 
18779
								#$conf["text"],字串,要加密的訊息.
-
 
18780
								$conf["webSock::encode"]["text"]=$talkback; 
-
 
18781
								#可省略參數:
-
 
18782
								#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
18783
								#$conf["payloadIsBin"]="false";
-
 
18784
								#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
18785
								#$conf["ping"]="false";
-
 
18786
								#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
18787
								#$conf["pong"]="false";
-
 
18788
								#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
18789
								#$conf["frames"]=array();
-
 
18790
								#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
18791
								#$conf["mask"]="false";
-
 
18792
								#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
18793
								#$conf["debug"]="false";
-
 
18794
								#參考資料:
-
 
18795
								#無.
-
 
18796
								#備註:
-
 
18797
								#目前$conf["text"]長度超過125會出錯.
-
 
18798
								$talkback=webSock::encode($conf["webSock::encode"]);
-
 
18799
								unset($conf["webSock::encode"]);
-
 
18800
								
-
 
18801
								#如果執行失敗
-
 
18802
								if($talkback["status"]==="false"){
-
 
18803
								
-
 
18804
									#印出結果
-
 
18805
									var_dump($talkback);
-
 
18806
								
-
 
18807
									#結束執行
-
 
18808
									exit;
-
 
18809
								
-
 
18810
									}#if end
-
 
18811
								
-
 
18812
								#debug
-
 
18813
								#var_dump(__LINE__,$talkback);
-
 
18814
								
-
 
18815
								}#if end
-
 
18816
								
-
 
18817
							}#if end
-
 
18818
					
-
 
18819
						}#if end
-
 
18820
					
-
 
18821
					#反之不為 web socket 訊息
-
 
18822
					else{
-
 
18823
					
-
 
18824
						#儲存成只有一個訊息
-
 
18825
						$talkback["content"][]=$talkback;
-
 
18826
					
-
 
18827
						}#else
-
 
18828
					
-
 
18829
					#針對每個訊息的分段
-
 
18830
					foreach($talkback["content"] as $msg){
-
 
18831
						
-
 
18832
						#回傳訊息
-
 
18833
						$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
18834
				
-
 
18835
						#debug
-
 
18836
						#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
18837
						
-
 
18838
						}#foreach end
-
 
18839
					
-
 
18840
					#設置執行正常
-
 
18841
					$result["status"]="true";
-
 
18842
					
-
 
18843
					#回傳結果
-
 
18844
					return $result;
-
 
18845
				
-
 
18846
					}#if end
-
 
18847
				
-
 
18848
				#用 "talkTo:" 分割收到的訊息
-
 
18849
				#涵式說明:
-
 
18850
				#將固定格式的字串分開,並回傳分開的結果。
-
 
18851
				#回傳結果:
-
 
18852
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
18853
				#$result["error"],錯誤訊息陣列
-
 
18854
				#$result["function"],當前執行的函數名稱.
-
 
18855
				#$result["oriStr"],要分割的原始字串內容
-
 
18856
				#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
-
 
18857
				#$result["dataCounts"],爲總共分成幾段
-
 
18858
				#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
-
 
18859
				#必填的參數:
-
 
18860
				$conf["stringProcess::spiltString"]["stringIn"]=$receivedData;#要處理的字串。
-
 
18861
				$conf["stringProcess::spiltString"]["spiltSymbol"]="talkTo:";#爲以哪個符號作爲分割
-
 
18862
				#可省略參數:
-
 
18863
				#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
-
 
18864
				$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";
-
 
18865
				$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
-
 
18866
				unset($conf["stringProcess::spiltString"]);
-
 
18867
				
-
 
18868
				#如果分割字串失敗
-
 
18869
				if($spiltString["status"]==="false"){
-
 
18870
					
-
 
18871
					#設置執行失敗
-
 
18872
					$result["status"]="false";
-
 
18873
				
-
 
18874
					#設置執行錯誤訊息
-
 
18875
					$result["error"]=$spiltString;
-
 
18876
					
-
 
18877
					#回傳結果
-
 
18878
					return $result;
-
 
18879
					
-
 
18880
					}#if end
-
 
18881
				
-
 
18882
				#如果剛好分割出一筆資料
-
 
18883
				if($spiltString["dataCounts"]===1){
-
 
18884
					
-
 
18885
					#取得自己的id
-
 
18886
					$myId=$connections[$conIndex]["id"];
-
 
18887
					
-
 
18888
					#取得講話對象的id
-
 
18889
					$toId=$spiltString["dataArray"][0];
-
 
18890
					
-
 
18891
					#設置對象不存在的識別
-
 
18892
					$targetExist=false;
-
 
18893
					
-
 
18894
					#設置通話對象的key
-
 
18895
					$targetKey="";
-
 
18896
					
-
 
18897
					#取得除了自己的id以外的所有連線
-
 
18898
					foreach($connections as $index=>$talkInfo){
-
 
18899
						
-
 
18900
						#除了自己的id
-
 
18901
						if($talkInfo["id"]!==$myId){
-
 
18902
							
-
 
18903
							#如果存在要對話的對象
-
 
18904
							if($talkInfo["id"]===$toId){
-
 
18905
								
-
 
18906
								#設置對象存在的識別
-
 
18907
								$targetExist=true;
-
 
18908
								
-
 
18909
								#通話對象的key
-
 
18910
								$targetKey=$index;
-
 
18911
								
-
 
18912
								}#if end
-
 
18913
							
-
 
18914
							}#if end
-
 
18915
						
-
 
18916
						}#for each end
-
 
18917
 
-
 
18918
					#如果通話對象存在
-
 
18919
					if($targetExist){
-
 
18920
						
-
 
18921
						#保存自己的通話對象
-
 
18922
						$connections[$conIndex]["talkTo"][]=$toId;
-
 
18923
						
-
 
18924
						#設置要給自己看的訊息
-
 
18925
						$talkback="您與 ".$toId." 展開對話";
-
 
18926
						
-
 
18927
						#json encode 要給自己看的訊息
-
 
18928
						$talkback=json_encode($talkback).PHP_EOL;
-
 
18929
						
-
 
18930
						#如果是 ws 模式
-
 
18931
						if($conf["wsMode"]==="true"){
-
 
18932
						
-
 
18933
							#如果已經 handshake 過
-
 
18934
							if($connections[$conIndex]["handshaked"]==="true"){
-
 
18935
							
-
 
18936
								#如果要 unmask	
-
 
18937
								if($connections[$conIndex]["unmask"]==="true"){
-
 
18938
							
-
 
18939
									#函式說明:
-
 
18940
									#加密 handshake 後要傳送的訊息 
-
 
18941
									#回傳結果:
-
 
18942
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
18943
									#$result["error"],執行不正常結束的錯訊息陣列.
-
 
18944
									#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
18945
									#$result["argu"],陣列,使用的參數.
-
 
18946
									#必填參數:
-
 
18947
									#$conf["text"],字串,要加密的訊息.
-
 
18948
									$conf["webSock::encode"]["text"]=$talkback; 
-
 
18949
									#可省略參數:
-
 
18950
									#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
18951
									#$conf["payloadIsBin"]="false";
-
 
18952
									#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
18953
									#$conf["ping"]="false";
-
 
18954
									#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
18955
									#$conf["pong"]="false";
-
 
18956
									#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
18957
									#$conf["frames"]=array();
-
 
18958
									#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
18959
									#$conf["mask"]="false";
-
 
18960
									#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
18961
									#$conf["debug"]="false";
-
 
18962
									#參考資料:
-
 
18963
									#無.
-
 
18964
									#備註:
-
 
18965
									#目前$conf["text"]長度超過125會出錯.
-
 
18966
									$talkback=webSock::encode($conf["webSock::encode"]);
-
 
18967
									unset($conf["webSock::encode"]);
-
 
18968
									
-
 
18969
									#如果執行失敗
-
 
18970
									if($talkback["status"]==="false"){
-
 
18971
									
-
 
18972
										#印出結果
-
 
18973
										var_dump($talkback);
-
 
18974
									
-
 
18975
										#結束執行
-
 
18976
										exit;
-
 
18977
									
-
 
18978
										}#if end
-
 
18979
									
-
 
18980
									#debug
-
 
18981
									#var_dump(__LINE__,$talkback);
-
 
18982
									
-
 
18983
									}#if end
-
 
18984
								
-
 
18985
								}#if end
-
 
18986
						
-
 
18987
							}#if end
-
 
18988
							
-
 
18989
						#反之不為 web socket 訊息
-
 
18990
						else{
-
 
18991
						
-
 
18992
							#儲存成只有一個訊息
-
 
18993
							$talkback["content"][]=$talkback;
-
 
18994
						
-
 
18995
							}#else
-
 
18996
						
-
 
18997
						#針對每個訊息的分段
-
 
18998
						foreach($talkback["content"] as $msg){
-
 
18999
							
-
 
19000
							#回傳訊息
-
 
19001
							$socket_write=socket_write($connections[$conIndex]["connect"], $msg, strlen($msg));
-
 
19002
					
-
 
19003
							#debug
-
 
19004
							#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
19005
							
-
 
19006
							}#foreach end
-
 
19007
						
-
 
19008
						#讓對方可以跟自己對話
-
 
19009
						$connections[$targetKey]["talkTo"][]=$myId;
-
 
19010
						
-
 
19011
						#設置要給對方看的訊息
-
 
19012
						$talkback=$connections[$conIndex]["id"]." 與您展開對話";
-
 
19013
						
-
 
19014
						#json encode 設置要給對方看的訊息
-
 
19015
						$talkback=json_encode($talkback);
-
 
19016
						
-
 
19017
						#如果是 ws 模式
-
 
19018
						if($conf["wsMode"]==="true"){
-
 
19019
						
-
 
19020
							#如果已經 handshake 過
-
 
19021
							if($connections[$conIndex]["handshaked"]==="true"){
-
 
19022
							
-
 
19023
								#如果要 unmask	
-
 
19024
								if($connections[$conIndex]["unmask"]==="true"){
-
 
19025
							
-
 
19026
									#函式說明:
-
 
19027
									#加密 handshake 後要傳送的訊息 
-
 
19028
									#回傳結果:
-
 
19029
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
19030
									#$result["error"],執行不正常結束的錯訊息陣列.
-
 
19031
									#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
19032
									#$result["argu"],陣列,使用的參數.
-
 
19033
									#必填參數:
-
 
19034
									#$conf["text"],字串,要加密的訊息.
-
 
19035
									$conf["webSock::encode"]["text"]=$talkback; 
-
 
19036
									#可省略參數:
-
 
19037
									#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
19038
									#$conf["payloadIsBin"]="false";
-
 
19039
									#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
19040
									#$conf["ping"]="false";
-
 
19041
									#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
19042
									#$conf["pong"]="false";
-
 
19043
									#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
19044
									#$conf["frames"]=array();
-
 
19045
									#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
19046
									#$conf["mask"]="false";
-
 
19047
									#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
19048
									#$conf["debug"]="false";
-
 
19049
									#參考資料:
-
 
19050
									#無.
-
 
19051
									#備註:
-
 
19052
									#目前$conf["text"]長度超過125會出錯.
-
 
19053
									$talkback=webSock::encode($conf["webSock::encode"]);
-
 
19054
									unset($conf["webSock::encode"]);
-
 
19055
									
-
 
19056
									#如果執行失敗
-
 
19057
									if($talkback["status"]==="false"){
-
 
19058
									
-
 
19059
										#印出結果
-
 
19060
										var_dump($talkback);
-
 
19061
									
-
 
19062
										#結束執行
-
 
19063
										exit;
-
 
19064
									
-
 
19065
										}#if end
-
 
19066
									
-
 
19067
									#debug
-
 
19068
									#var_dump(__LINE__,$talkback);
-
 
19069
									
-
 
19070
									}#if end
-
 
19071
									
-
 
19072
								}#if end
-
 
19073
						
-
 
19074
							}#if end
-
 
19075
							
-
 
19076
						#反之不為 web socket 訊息
-
 
19077
						else{
-
 
19078
						
-
 
19079
							#儲存成只有一個訊息
-
 
19080
							$talkback["content"][]=$talkback;
-
 
19081
						
-
 
19082
							}#else
-
 
19083
						
-
 
19084
						#針對每個訊息的分段
-
 
19085
						foreach($talkback["content"] as $msg){
-
 
19086
							
-
 
19087
							#給對方看的訊息
-
 
19088
							$socket_write=socket_write($connections[$targetKey]["connect"], $msg, strlen($msg));
-
 
19089
					
-
 
19090
							#debug
-
 
19091
							#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
19092
							
-
 
19093
							}#foreach end
-
 
19094
							
-
 
19095
						#設置執行正常
-
 
19096
						$result["status"]="true";
-
 
19097
						
-
 
19098
						#回傳結果
-
 
19099
						return $result;
-
 
19100
						
-
 
19101
						}#if end
-
 
19102
					
-
 
19103
					}#if end
-
 
19104
				
-
 
19105
				}#if end
-
 
19106
			
-
 
19107
			}#if end
-
 
19108
		
-
 
19109
		#不是支援的訊息
-
 
19110
		$result["status"]="continue";
-
 
19111
	
-
 
19112
		#回傳結果
-
 
19113
		return $result;
-
 
19114
	
-
 
19115
		}#function basic end
-
 
19116
	
-
 
19117
	/*
-
 
19118
	#函式說明:
-
 
19119
	#提供webSock::nativeSocketTcpIpServer使用系統功能(system).
-
 
19120
	#回傳結果:
-
 
19121
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常,"continue"代表不適用.
-
 
19122
	#$result["error"],執行不正常結束的錯訊息陣列.
-
 
19123
	#$result["argu"],陣列,使用的參數.
-
 
19124
	#必填參數:
-
 
19125
	#$conf["data"],字串,收到的bin2hex編碼後再gpg加密過後的json格式資料,必填的key有"randomStr","username","password".
-
 
19126
	$conf["data"]="";
-
 
19127
	#$conf["serverSock"],resource,web socket server socket
-
 
19128
	$conf["serverSock"]=$resource;
-
 
19129
	#$conf["clientSock"],$resource,web socket client socket
-
 
19130
	$conf["clientSock"]=$resource;
-
 
19131
	#$conf["clientInfo"],陣列,web socket client info.
-
 
19132
	$conf["clientInfo"]=array();
-
 
19133
	#$conf["clientIndex"],整數.web socket client index.
-
 
19134
	$conf["clientIndex"];
-
 
19135
	#$conf["allConn"],陣列,all web socket client info.
-
 
19136
	$conf["allConn"]=array();
-
 
19137
	#可省略參數:
-
 
19138
	#$conf["wsMode"],字串,是否要按照rfc6555,預設為"true"為是;"false"為否.
-
 
19139
	#$conf["wsMode"]="true";
-
 
19140
	#$conf["gpgId"],字串,用於加解密的gpg id,預設為gnupgId.
-
 
19141
	#$conf["gpgId"]=gnupgId;
-
 
19142
	#參考資料:
-
 
19143
	#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
-
 
19144
	#備註:
-
 
19145
	#收到用戶的"shutdown"訊息,會重新啟動webSocket server.
-
 
19146
	#無.
-
 
19147
	*/
-
 
19148
	public static function system(&$conf){
-
 
19149
	
-
 
19150
		#初始化要回傳的結果
-
 
19151
		$result=array();
-
 
19152
 
-
 
19153
		#取得當前執行的函數名稱
-
 
19154
		$result["function"]=__FUNCTION__;
-
 
19155
 
-
 
19156
		#涵式說明:
-
 
19157
		#判斷當前環境為web還是cmd
-
 
19158
		#回傳結果:
-
 
19159
		#$result,"web"或"cmd"
-
 
19160
		if(csInformation::getEnv()==="web"){
-
 
19161
			
-
 
19162
			#設置執行失敗
-
 
19163
			$result["status"]="false";
-
 
19164
			
-
 
19165
			#設置執行錯誤訊息
-
 
19166
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
-
 
19167
			
-
 
19168
			#回傳結果
-
 
19169
			return $result;
-
 
19170
			
-
 
19171
			}#if end
-
 
19172
 
-
 
19173
		#取得參數
-
 
19174
		$result["argu"]=$conf;
-
 
19175
 
-
 
19176
		#如果 $conf 不為陣列
-
 
19177
		if(gettype($conf)!="array"){
-
 
19178
		
-
 
19179
			#設置執行失敗
-
 
19180
			$result["status"]="false";
-
 
19181
		
-
 
19182
			#設置執行錯誤訊息
-
 
19183
			$result["error"][]="\$conf變數須為陣列形態";
-
 
19184
		
-
 
19185
			#如果傳入的參數為 null
-
 
19186
			if($conf==null){
-
 
19187
			
-
 
19188
				#設置執行錯誤訊息
-
 
19189
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
-
 
19190
			
-
 
19191
				}#if end
-
 
19192
 
-
 
19193
			#回傳結果
-
 
19194
			return $result;
-
 
19195
		
-
 
19196
			}#if end
-
 
19197
		
-
 
19198
		#檢查參數
-
 
19199
		#函式說明:
-
 
19200
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
-
 
19201
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
19202
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
19203
		#$result["function"],當前執行的函式名稱.
-
 
19204
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
19205
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
19206
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
19207
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
19208
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
19209
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
19210
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
19211
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
19212
		#必填寫的參數:
-
 
19213
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
19214
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
19215
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
19216
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","serverSock","clientInfo","clientIndex","allConn");
-
 
19217
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
-
 
19218
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","resource","array","string","array");
-
 
19219
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
19220
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
19221
		#可以省略的參數:
-
 
19222
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
19223
		#$conf["canBeEmptyString"]="false";
-
 
19224
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
19225
		#$conf["canNotBeEmpty"]=array();
-
 
19226
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
19227
		#$conf["canBeEmpty"]=array();
-
 
19228
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
19229
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("wsMode");
-
 
19230
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
19231
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("wsMode","gpgId");
-
 
19232
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
-
 
19233
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
-
 
19234
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
19235
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",gnupgId);
-
 
19236
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
19237
		#$conf["arrayCountEqualCheck"][]=array();
-
 
19238
		#參考資料來源:
-
 
19239
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
19240
		#建議:
-
 
19241
		#增加可省略參數全部不能為空字串或空陣列的參數功能.
-
 
19242
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
19243
		unset($conf["variableCheck::checkArguments"]);
-
 
19244
		
-
 
19245
		#如果檢查參數失敗
-
 
19246
		if($checkArguments["status"]==="false"){
-
 
19247
			
-
 
19248
			#設置執行失敗
-
 
19249
			$result["status"]="false";
-
 
19250
		
-
 
19251
			#設置執行錯誤訊息
-
 
19252
			$result["error"]=$checkArguments;
-
 
19253
			
-
 
19254
			#回傳結果
-
 
19255
			return $result;
-
 
19256
			
-
 
19257
			}#if end
-
 
19258
			
-
 
19259
		#如果檢查參數不通過
-
 
19260
		if($checkArguments["passed"]==="false"){
-
 
19261
			
-
 
19262
			#設置執行失敗
-
 
19263
			$result["status"]="false";
-
 
19264
		
-
 
19265
			#設置執行錯誤訊息
-
 
19266
			$result["error"]=$checkArguments;
-
 
19267
			
-
 
19268
			#回傳結果
-
 
19269
			return $result;
-
 
19270
			
-
 
19271
			}#if end
-
 
19272
 
-
 
19273
		#取得收到的訊息
-
 
19274
		$receivedData=$conf["data"];
-
 
19275
		
-
 
19276
		#取得 server 的 socket
-
 
19277
		$serverSocket=$conf["serverSock"];
-
 
19278
		
-
 
19279
		#取得 client 的 socket
-
 
19280
		$clientSocket=$conf["clientSock"];
-
 
19281
		
-
 
19282
		#取得 client 的資訊
-
 
19283
		$clientInfo=$conf["clientInfo"];
-
 
19284
		
-
 
19285
		#取得 client 的索引
-
 
19286
		$clientIndex=$conf["clientIndex"];
-
 
19287
		
-
 
19288
		#取得 all clients 的資訊
-
 
19289
		$allConn=&$conf["allConn"];
-
 
19290
	
-
 
19291
		#hex2bin
-
 
19292
		#函式說明:
-
 
19293
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
19294
		#回傳結果:
-
 
19295
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
19296
		#$result["function"],當前執行的函數名稱.
-
 
19297
		#$result["content"],加密後的結果.
-
 
19298
		#$result["error"],錯誤訊息陣列.
-
 
19299
		#$result["argu"],使用的參數.
-
 
19300
		#必填參數:
-
 
19301
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
19302
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
19303
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
19304
		$conf["authenticate::enCodeStr"]["enCodeType"]="hex2bin";
-
 
19305
		#可省略參數:
-
 
19306
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
19307
		#$conf["sha1Raw"]="false";
-
 
19308
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
19309
		#$conf["p_hash"]="";
-
 
19310
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
19311
		#$conf["keyForAes256"]="";
-
 
19312
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
19313
		#$conf["aes256Encode"]="";
-
 
19314
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
19315
		#$conf["qbpwcfDecode"]="false";
-
 
19316
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
19317
		#$conf["gpgDecrypt"]="false";
-
 
19318
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
19319
		#$conf["gpgId"]="";
-
 
19320
		#參考資料:
-
 
19321
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
19322
		#md5=>http://php.net/manual/en/function.md5.php
-
 
19323
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
19324
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
19325
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
19326
		#備註:
-
 
19327
		#無.
-
 
19328
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
19329
		unset($conf["authenticate::enCodeStr"]);
-
 
19330
 
-
 
19331
		#如果執行失敗
-
 
19332
		if($enCodeStr["status"]==="false"){
-
 
19333
 
-
 
19334
			#設置執行異常
-
 
19335
			$result["status"]="false";
-
 
19336
 
-
 
19337
			#設置執行錯誤
-
 
19338
			$result["error"]=$enCodeStr;
-
 
19339
 
-
 
19340
			#回傳結果
-
 
19341
			return $result;
-
 
19342
 
-
 
19343
			}#if end
-
 
19344
 
-
 
19345
		#取得hex2bin後的字串
-
 
19346
		$receivedData=$enCodeStr["content"];
-
 
19347
		
-
 
19348
		#gpg decrypt
-
 
19349
		#函式說明:
-
 
19350
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
19351
		#回傳結果:
-
 
19352
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
19353
		#$result["function"],當前執行的函數名稱.
-
 
19354
		#$result["content"],加密後的結果.
-
 
19355
		#$result["error"],錯誤訊息陣列.
-
 
19356
		#$result["argu"],使用的參數.
-
 
19357
		#必填參數:
-
 
19358
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
19359
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
19360
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
19361
		$conf["authenticate::enCodeStr"]["enCodeType"]="gpg";
-
 
19362
		#可省略參數:
-
 
19363
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
19364
		#$conf["sha1Raw"]="false";
-
 
19365
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
19366
		#$conf["p_hash"]="";
-
 
19367
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
19368
		#$conf["keyForAes256"]="";
-
 
19369
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
19370
		#$conf["aes256Encode"]="";
-
 
19371
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
19372
		#$conf["qbpwcfDecode"]="false";
-
 
19373
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
19374
		$conf["authenticate::enCodeStr"]["gpgDecrypt"]="true";
-
 
19375
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
19376
		$conf["authenticate::enCodeStr"]["gpgId"]=$conf["gpgId"];
-
 
19377
		#參考資料:
-
 
19378
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
19379
		#md5=>http://php.net/manual/en/function.md5.php
-
 
19380
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
19381
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
19382
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
19383
		#備註:
-
 
19384
		#無.
-
 
19385
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
19386
		unset($conf["authenticate::enCodeStr"]);
-
 
19387
 
-
 
19388
		#如果執行失敗
-
 
19389
		if($enCodeStr["status"]==="false"){
-
 
19390
 
-
 
19391
			#設置執行異常
-
 
19392
			$result["status"]="false";
-
 
19393
 
-
 
19394
			#設置執行錯誤
-
 
19395
			$result["error"]=$enCodeStr;
-
 
19396
 
-
 
19397
			#回傳結果
-
 
19398
			return $result;
-
 
19399
 
-
 
19400
			}#if end
-
 
19401
 
-
 
19402
		#取得解密後的字串
-
 
19403
		$receivedData=$enCodeStr["content"];
-
 
19404
		
-
 
19405
		#json_decode
-
 
19406
		$receivedData=json_decode($receivedData);
-
 
19407
		
-
 
19408
		#如果收到 "shutdown"
-
 
19409
		if($receivedData==="shutdown"){
-
 
19410
			
-
 
19411
			#設置要回傳的訊息
-
 
19412
			$talkback="Server 即將關閉";
-
 
19413
			
-
 
19414
			#json encode 要回傳的訊息
-
 
19415
			$talkback=json_encode($talkback);
-
 
19416
			
-
 
19417
			#如果是 ws 模式
-
 
19418
			if($conf["wsMode"]==="true"){
-
 
19419
			
-
 
19420
				#如果已經 handshake 過
-
 
19421
				if($connections[$conIndex]["handshaked"]==="true"){
-
 
19422
				
-
 
19423
					#如果要 unmask	
-
 
19424
					if($connections[$conIndex]["unmask"]==="true"){
-
 
19425
				
-
 
19426
						#函式說明:
-
 
19427
						#加密 handshake 後要傳送的訊息 
-
 
19428
						#回傳結果:
-
 
19429
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
19430
						#$result["error"],執行不正常結束的錯訊息陣列.
-
 
19431
						#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
19432
						#$result["argu"],陣列,使用的參數.
-
 
19433
						#必填參數:
-
 
19434
						#$conf["text"],字串,要加密的訊息.
-
 
19435
						$conf["webSock::encode"]["text"]=$talkback; 
-
 
19436
						#可省略參數:
-
 
19437
						#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
19438
						#$conf["payloadIsBin"]="false";
-
 
19439
						#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
19440
						#$conf["ping"]="false";
-
 
19441
						#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
19442
						#$conf["pong"]="false";
-
 
19443
						#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
19444
						#$conf["frames"]=array();
-
 
19445
						#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
19446
						#$conf["mask"]="false";
-
 
19447
						#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
19448
						#$conf["debug"]="false";
-
 
19449
						#參考資料:
-
 
19450
						#無.
-
 
19451
						#備註:
-
 
19452
						#無.
-
 
19453
						$talkback=webSock::encode($conf["webSock::encode"]);
-
 
19454
						unset($conf["webSock::encode"]);
-
 
19455
						
-
 
19456
						#如果執行失敗
-
 
19457
						if($talkback["status"]==="false"){
-
 
19458
						
-
 
19459
							#印出結果
-
 
19460
							var_dump($talkback);
-
 
19461
						
-
 
19462
							#結束執行
-
 
19463
							exit;
-
 
19464
						
-
 
19465
							}#if end
-
 
19466
						
-
 
19467
						#debug
-
 
19468
						#var_dump(__LINE__,$talkback);
-
 
19469
						
-
 
19470
						}#if end
-
 
19471
					
-
 
19472
					}#if end
-
 
19473
			
-
 
19474
				}#if end
-
 
19475
			
-
 
19476
			#反之不為 web socket 訊息
-
 
19477
			else{
-
 
19478
			
-
 
19479
				#儲存成只有一個訊息
-
 
19480
				$talkback["content"][]=$talkback;
-
 
19481
			
-
 
19482
				}#else
-
 
19483
			
-
 
19484
			#針對每個訊息的分段
-
 
19485
			foreach($talkback["content"] as $msg){
-
 
19486
				
-
 
19487
				#回傳訊息
-
 
19488
				$socket_write=socket_write($con["connect"], $msg, strlen($msg));
-
 
19489
		
-
 
19490
				#debug
-
 
19491
				#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
19492
				
-
 
19493
				}#foreach end
-
 
19494
			
-
 
19495
			#關閉用戶的連線
-
 
19496
			socket_close($con["connect"]);
-
 
19497
		
-
 
19498
			}#if end
-
 
19499
			
-
 
19500
		#關閉 server socket
-
 
19501
		socket_close($serverSocket);
-
 
19502
		
-
 
19503
		#設置執行正常
-
 
19504
		$result["status"]="true";
-
 
19505
		
-
 
19506
		#回傳結果
-
 
19507
		return $result;
-
 
19508
	
-
 
19509
		}#function system end
-
 
19510
	
-
 
19511
	/*
-
 
19512
	#函式說明:
-
 
19513
	#提供webSock::nativeSocketTcpIpServer使用系統功能(system).
-
 
19514
	#回傳結果:
-
 
19515
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常,"continue"代表不適用.
-
 
19516
	#$result["error"],執行不正常結束的錯訊息陣列.
-
 
19517
	#$result["argu"],陣列,使用的參數.
-
 
19518
	#必填參數:
-
 
19519
	#$conf["data"],字串,收到的bin2hex編碼後再gpg加密過後的json格式資料.
-
 
19520
	$conf["data"]="";
-
 
19521
	#$conf["serverSock"],resource,web socket server socket
-
 
19522
	$conf["serverSock"]=$resource;
-
 
19523
	#$conf["clientSock"],$resource,web socket client socket
-
 
19524
	$conf["clientSock"]=$resource;
-
 
19525
	#$conf["clientInfo"],陣列,web socket client info.
-
 
19526
	$conf["clientInfo"]=array();
-
 
19527
	#$conf["clientIndex"],整數.web socket client index.
-
 
19528
	$conf["clientIndex"];
-
 
19529
	#$conf["allConn"],陣列,all web socket client info.
-
 
19530
	$conf["allConn"]=array();
-
 
19531
	#可省略參數:
-
 
19532
	#$conf["wsMode"],字串,是否要按照rfc6555,預設為"true"為是;"false"為否.
-
 
19533
	#$conf["wsMode"]="true";
-
 
19534
	#$conf["gpgId"],字串,用於加解密的gpg id,預設為gnupgId.
-
 
19535
	#$conf["gpgId"]=gnupgId;
-
 
19536
	#參考資料:
-
 
19537
	#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
-
 
19538
	#備註:
-
 
19539
	#收到用戶的"quit"訊息,會結束與用戶的連線.
-
 
19540
	*/
-
 
19541
	public static function noAuth(&$conf){
-
 
19542
	
-
 
19543
		#初始化要回傳的結果
-
 
19544
		$result=array();
-
 
19545
 
-
 
19546
		#取得當前執行的函數名稱
-
 
19547
		$result["function"]=__FUNCTION__;
-
 
19548
 
-
 
19549
		#涵式說明:
-
 
19550
		#判斷當前環境為web還是cmd
-
 
19551
		#回傳結果:
-
 
19552
		#$result,"web"或"cmd"
-
 
19553
		if(csInformation::getEnv()==="web"){
-
 
19554
			
-
 
19555
			#設置執行失敗
-
 
19556
			$result["status"]="false";
-
 
19557
			
-
 
19558
			#設置執行錯誤訊息
-
 
19559
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
-
 
19560
			
-
 
19561
			#回傳結果
-
 
19562
			return $result;
-
 
19563
			
-
 
19564
			}#if end
-
 
19565
 
-
 
19566
		#取得參數
-
 
19567
		$result["argu"]=$conf;
-
 
19568
 
-
 
19569
		#如果 $conf 不為陣列
-
 
19570
		if(gettype($conf)!="array"){
-
 
19571
		
-
 
19572
			#設置執行失敗
-
 
19573
			$result["status"]="false";
-
 
19574
		
-
 
19575
			#設置執行錯誤訊息
-
 
19576
			$result["error"][]="\$conf變數須為陣列形態";
-
 
19577
		
-
 
19578
			#如果傳入的參數為 null
-
 
19579
			if($conf==null){
-
 
19580
			
-
 
19581
				#設置執行錯誤訊息
-
 
19582
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
-
 
19583
			
-
 
19584
				}#if end
-
 
19585
 
-
 
19586
			#回傳結果
-
 
19587
			return $result;
-
 
19588
		
-
 
19589
			}#if end
-
 
19590
		
-
 
19591
		#檢查參數
-
 
19592
		#函式說明:
-
 
19593
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
-
 
19594
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
19595
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
19596
		#$result["function"],當前執行的函式名稱.
-
 
19597
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
19598
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
19599
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
19600
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
19601
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
19602
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
19603
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
19604
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
19605
		#必填寫的參數:
-
 
19606
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
19607
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
19608
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
19609
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","serverSock","clientInfo","clientIndex","allConn");
-
 
19610
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
-
 
19611
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","resource","array","string","array");
-
 
19612
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
19613
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
19614
		#可以省略的參數:
-
 
19615
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
19616
		#$conf["canBeEmptyString"]="false";
-
 
19617
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
19618
		#$conf["canNotBeEmpty"]=array();
-
 
19619
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
19620
		#$conf["canBeEmpty"]=array();
-
 
19621
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
19622
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("wsMode");
-
 
19623
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
19624
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("wsMode","gpgId");
-
 
19625
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
-
 
19626
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
-
 
19627
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
19628
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",gnupgId);
-
 
19629
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
19630
		#$conf["arrayCountEqualCheck"][]=array();
-
 
19631
		#參考資料來源:
-
 
19632
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
19633
		#建議:
-
 
19634
		#增加可省略參數全部不能為空字串或空陣列的參數功能.
-
 
19635
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
19636
		unset($conf["variableCheck::checkArguments"]);
-
 
19637
		
-
 
19638
		#如果檢查參數失敗
-
 
19639
		if($checkArguments["status"]==="false"){
-
 
19640
			
-
 
19641
			#設置執行失敗
-
 
19642
			$result["status"]="false";
-
 
19643
		
-
 
19644
			#設置執行錯誤訊息
-
 
19645
			$result["error"]=$checkArguments;
-
 
19646
			
-
 
19647
			#回傳結果
-
 
19648
			return $result;
-
 
19649
			
-
 
19650
			}#if end
-
 
19651
			
-
 
19652
		#如果檢查參數不通過
-
 
19653
		if($checkArguments["passed"]==="false"){
-
 
19654
			
-
 
19655
			#設置執行失敗
-
 
19656
			$result["status"]="false";
-
 
19657
		
-
 
19658
			#設置執行錯誤訊息
-
 
19659
			$result["error"]=$checkArguments;
-
 
19660
			
-
 
19661
			#回傳結果
-
 
19662
			return $result;
-
 
19663
			
-
 
19664
			}#if end
-
 
19665
 
-
 
19666
		#取得收到的訊息
-
 
19667
		$receivedData=$conf["data"];
-
 
19668
		
-
 
19669
		#取得 server 的 socket
-
 
19670
		$serverSocket=$conf["serverSock"];
-
 
19671
		
-
 
19672
		#取得 client 的 socket
-
 
19673
		$clientSocket=$conf["clientSock"];
-
 
19674
		
-
 
19675
		#取得 client 的資訊
-
 
19676
		$clientInfo=$conf["clientInfo"];
-
 
19677
		
-
 
19678
		#取得 client 的索引
-
 
19679
		$clientIndex=$conf["clientIndex"];
-
 
19680
		
-
 
19681
		#取得 all clients 的資訊
-
 
19682
		$allConn=&$conf["allConn"];
-
 
19683
	
-
 
19684
		#hex2bin
-
 
19685
		#函式說明:
-
 
19686
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
19687
		#回傳結果:
-
 
19688
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
19689
		#$result["function"],當前執行的函數名稱.
-
 
19690
		#$result["content"],加密後的結果.
-
 
19691
		#$result["error"],錯誤訊息陣列.
-
 
19692
		#$result["argu"],使用的參數.
-
 
19693
		#必填參數:
-
 
19694
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
19695
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
19696
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
19697
		$conf["authenticate::enCodeStr"]["enCodeType"]="hex2bin";
-
 
19698
		#可省略參數:
-
 
19699
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
19700
		#$conf["sha1Raw"]="false";
-
 
19701
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
19702
		#$conf["p_hash"]="";
-
 
19703
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
19704
		#$conf["keyForAes256"]="";
-
 
19705
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
19706
		#$conf["aes256Encode"]="";
-
 
19707
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
19708
		#$conf["qbpwcfDecode"]="false";
-
 
19709
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
19710
		#$conf["gpgDecrypt"]="false";
-
 
19711
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
19712
		#$conf["gpgId"]="";
-
 
19713
		#參考資料:
-
 
19714
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
19715
		#md5=>http://php.net/manual/en/function.md5.php
-
 
19716
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
19717
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
19718
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
19719
		#備註:
-
 
19720
		#無.
-
 
19721
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
19722
		unset($conf["authenticate::enCodeStr"]);
-
 
19723
 
-
 
19724
		#如果執行失敗
-
 
19725
		if($enCodeStr["status"]==="false"){
-
 
19726
 
-
 
19727
			#設置執行異常
-
 
19728
			$result["status"]="false";
-
 
19729
 
-
 
19730
			#設置執行錯誤
-
 
19731
			$result["error"]=$enCodeStr;
-
 
19732
 
-
 
19733
			#回傳結果
-
 
19734
			return $result;
-
 
19735
 
-
 
19736
			}#if end
-
 
19737
 
-
 
19738
		#取得hex2bin後的字串
-
 
19739
		$receivedData=$enCodeStr["content"];
-
 
19740
		
-
 
19741
		#gpg decrypt
-
 
19742
		#函式說明:
-
 
19743
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
19744
		#回傳結果:
-
 
19745
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
19746
		#$result["function"],當前執行的函數名稱.
-
 
19747
		#$result["content"],加密後的結果.
-
 
19748
		#$result["error"],錯誤訊息陣列.
-
 
19749
		#$result["argu"],使用的參數.
-
 
19750
		#必填參數:
-
 
19751
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
19752
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
19753
		#$conf["enCodeType"],"字串",加密的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin",7種,"sha1"較耗時,"md5"較快,"p_hash"適用於密碼加密,"aes256"是對稱式加解密,"qbpwcf"是透過urlencode、json_encode、base64_encode的結果,"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin".
-
 
19754
		$conf["authenticate::enCodeStr"]["enCodeType"]="gpg";
-
 
19755
		#可省略參數:
-
 
19756
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
19757
		#$conf["sha1Raw"]="false";
-
 
19758
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
19759
		#$conf["p_hash"]="";
-
 
19760
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
19761
		#$conf["keyForAes256"]="";
-
 
19762
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
19763
		#$conf["aes256Encode"]="";
-
 
19764
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
19765
		#$conf["qbpwcfDecode"]="false";
-
 
19766
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
19767
		$conf["authenticate::enCodeStr"]["gpgDecrypt"]="true";
-
 
19768
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
19769
		$conf["authenticate::enCodeStr"]["gpgId"]=$conf["gpgId"];
-
 
19770
		#參考資料:
-
 
19771
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
19772
		#md5=>http://php.net/manual/en/function.md5.php
-
 
19773
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
19774
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
19775
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
19776
		#備註:
-
 
19777
		#無.
-
 
19778
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
19779
		unset($conf["authenticate::enCodeStr"]);
-
 
19780
 
-
 
19781
		#如果執行失敗
-
 
19782
		if($enCodeStr["status"]==="false"){
-
 
19783
 
-
 
19784
			#設置執行異常
-
 
19785
			$result["status"]="false";
-
 
19786
 
-
 
19787
			#設置執行錯誤
-
 
19788
			$result["error"]=$enCodeStr;
-
 
19789
 
-
 
19790
			#回傳結果
-
 
19791
			return $result;
-
 
19792
 
-
 
19793
			}#if end
-
 
19794
 
-
 
19795
		#取得解密後的字串
-
 
19796
		$receivedData=$enCodeStr["content"];
-
 
19797
		
-
 
19798
		#json_decode
-
 
19799
		$receivedData=json_decode($receivedData);
-
 
19800
	
-
 
19801
		#如果訊息內容為 "quit"
-
 
19802
		if($receivedData==="quit"){
-
 
19803
		
-
 
19804
			#設置要回傳的訊息
-
 
19805
			$talkback="結束與 server 的連線";
-
 
19806
			
-
 
19807
			#json encode 要回傳的訊息
-
 
19808
			$talkback=json_encode($talkback).PHP_EOL;
-
 
19809
			
-
 
19810
			#如果是 ws 模式
-
 
19811
			if($conf["wsMode"]==="true"){
-
 
19812
			
-
 
19813
				#如果已經 handshake 過
-
 
19814
				if($connections[$conIndex]["handshaked"]==="true"){
-
 
19815
				
-
 
19816
					#如果要 unmask	
-
 
19817
					if($connections[$conIndex]["unmask"]==="true"){
-
 
19818
				
-
 
19819
						#函式說明:
-
 
19820
						#加密 handshake 後要傳送的訊息 
-
 
19821
						#回傳結果:
-
 
19822
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
19823
						#$result["error"],執行不正常結束的錯訊息陣列.
-
 
19824
						#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
-
 
19825
						#$result["argu"],陣列,使用的參數.
-
 
19826
						#必填參數:
-
 
19827
						#$conf["text"],字串,要加密的訊息.
-
 
19828
						$conf["webSock::encode"]["text"]=$talkback; 
-
 
19829
						#可省略參數:
-
 
19830
						#$conf["payloadIsBin"],字串,"true"定義Payload data是為2元碼;預設為"false"代表為文字.
-
 
19831
						#$conf["payloadIsBin"]="false";
-
 
19832
						#$conf["ping"],字串,"true"代表為ping訊息;反之為"false",預設為"false".
-
 
19833
						#$conf["ping"]="false";
-
 
19834
						#$conf["pong"],字串,"true"代表為pong訊息;反之為"false",預設為"false".
-
 
19835
						#$conf["pong"]="false";
-
 
19836
						#$conf["frames"],陣列,目前既有的訊息frame,預設為空陣列,代表沒有.
-
 
19837
						#$conf["frames"]=array();
-
 
19838
						#$conf["mask"],字串,代表是否要將內容進行mask,預設為"false",代表不要,適用於server to client;反之為"true"代表要,適用於client to server.
-
 
19839
						#$conf["mask"]="false";
-
 
19840
						#$conf["debug"],字串,"true"代表要show debug訊息;反之為預設"false".
-
 
19841
						#$conf["debug"]="false";
-
 
19842
						#參考資料:
-
 
19843
						#無.
-
 
19844
						#備註:
-
 
19845
						#目前$conf["text"]長度超過125會出錯.
-
 
19846
						$talkback=webSock::encode($conf["webSock::encode"]);
-
 
19847
						unset($conf["webSock::encode"]);
-
 
19848
						
-
 
19849
						#如果執行失敗
-
 
19850
						if($talkback["status"]==="false"){
-
 
19851
						
-
 
19852
							#印出結果
-
 
19853
							var_dump($talkback);
-
 
19854
						
-
 
19855
							#結束執行
-
 
19856
							exit;
-
 
19857
						
-
 
19858
							}#if end
-
 
19859
						
-
 
19860
						#debug
-
 
19861
						#var_dump(__LINE__,$talkback);
-
 
19862
						
-
 
19863
						}#if end
-
 
19864
						
-
 
19865
					}#if end
-
 
19866
			
-
 
19867
				}#if end
-
 
19868
				
-
 
19869
			#反之不為 web socket 訊息
-
 
19870
			else{
-
 
19871
			
-
 
19872
				#儲存成只有一個訊息
-
 
19873
				$talkback["content"][]=$talkback;
-
 
19874
			
-
 
19875
				}#else
-
 
19876
			
-
 
19877
			#針對每個訊息的分段
-
 
19878
			foreach($talkback["content"] as $msg){
-
 
19879
				
-
 
19880
				#回傳訊息
-
 
19881
				$socket_write=socket_write($con["connect"], $msg, strlen($msg));
-
 
19882
		
-
 
19883
				#debug
-
 
19884
				#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($con["connect"])));
-
 
19885
				
-
 
19886
				}#foreach end
-
 
19887
				
-
 
19888
			#關閉被 client 的連線
-
 
19889
			socket_close($con["connect"]);
-
 
19890
			
-
 
19891
			#清理連線的陣列
-
 
19892
			unset($connections[$conIndex]);
-
 
19893
			
-
 
19894
			#設置執行正常
-
 
19895
			$result["status"]="true";
-
 
19896
			
-
 
19897
			#回傳結果
-
 
19898
			return $result;
-
 
19899
			
-
 
19900
			}#if end
-
 
19901
	
-
 
19902
		}#function noAuth end
-
 
19903
	
-
 
19904
	/*
-
 
19905
	#函式說明:
-
 
19906
	#依照參數來執行對應的函式.
-
 
19907
	#回傳結果:
-
 
19908
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
19909
	#$result["function"],當前執行的函數名稱.
-
 
19910
	#$result["content"],加密後的結果.
-
 
19911
	#$result["error"],錯誤訊息陣列.
-
 
19912
	#$result["argu"],使用的參數.
-
 
19913
	#必填參數:
-
 
19914
	#$conf["data"],字串,收到bin2hex編碼後再gpg加密後的資料.
-
 
19915
	$conf["data"]="";
-
 
19916
	#$conf["serverSock"],socket,代表web socket server的socket.
-
 
19917
	$conf["serverSock"]=;
-
 
19918
	#$conf["clientSock"],socket,代表web socket client的socket.
-
 
19919
	#$conf["clientInfo"],陣列,用戶端的資訊.
-
 
19920
	$conf["clientInfo"]=array();
-
 
19921
	#$conf["clientIndex"],字串,代表client於allConn中的索引.
-
 
19922
	$conf["clientIndex"]="";
-
 
19923
	#$conf["allConn"],陣列,所有連線的用戶端的連線資訊.
-
 
19924
	$conf["allConn"]=array();
-
 
19925
	#可省略參數:
-
 
19926
	#無.
-
 
19927
	#參考資料:
-
 
19928
	#無.
-
 
19929
	#備註:
-
 
19930
	#無.
-
 
19931
	*/
-
 
19932
	public static function callFunc(&$conf){
-
 
19933
 
-
 
19934
		#初始化要回傳的結果
-
 
19935
		$result=array();
-
 
19936
 
-
 
19937
		#取得當前執行的函數名稱
-
 
19938
		$result["function"]=__FUNCTION__;
-
 
19939
 
-
 
19940
		#涵式說明:
-
 
19941
		#判斷當前環境為web還是cmd
-
 
19942
		#回傳結果:
-
 
19943
		#$result,"web"或"cmd"
-
 
19944
		if(csInformation::getEnv()==="web"){
-
 
19945
			
-
 
19946
			#設置執行失敗
-
 
19947
			$result["status"]="false";
-
 
19948
			
-
 
19949
			#設置執行錯誤訊息
-
 
19950
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
-
 
19951
			
-
 
19952
			#回傳結果
-
 
19953
			return $result;
-
 
19954
			
-
 
19955
			}#if end
-
 
19956
 
-
 
19957
		#取得參數
-
 
19958
		$result["argu"]=$conf;
-
 
19959
 
-
 
19960
		#如果 $conf 不為陣列
-
 
19961
		if(gettype($conf)!="array"){
-
 
19962
		
-
 
19963
			#設置執行失敗
-
 
19964
			$result["status"]="false";
-
 
19965
		
-
 
19966
			#設置執行錯誤訊息
-
 
19967
			$result["error"][]="\$conf變數須為陣列形態";
-
 
19968
		
-
 
19969
			#如果傳入的參數為 null
-
 
19970
			if($conf==null){
-
 
19971
			
-
 
19972
				#設置執行錯誤訊息
-
 
19973
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
-
 
19974
			
-
 
19975
				}#if end
-
 
19976
 
-
 
19977
			#回傳結果
-
 
19978
			return $result;
-
 
19979
		
-
 
19980
			}#if end
-
 
19981
			
-
 
19982
		#檢查參數
-
 
19983
		#函式說明:
-
 
19984
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
-
 
19985
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
19986
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
19987
		#$result["function"],當前執行的函式名稱.
-
 
19988
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
19989
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
19990
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
19991
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
19992
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
19993
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
19994
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
19995
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
19996
		#必填寫的參數:
-
 
19997
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
19998
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
19999
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
20000
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","serverSock","clientInfo","clientIndex","allConn");
-
 
20001
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
-
 
20002
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","resource","array","string","array");
-
 
20003
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
20004
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
20005
		#可以省略的參數:
-
 
20006
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
20007
		#$conf["canBeEmptyString"]="false";
-
 
20008
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
20009
		#$conf["canNotBeEmpty"]=array();
-
 
20010
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
20011
		#$conf["canBeEmpty"]=array();
-
 
20012
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
20013
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
-
 
20014
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
20015
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("listenIp","listenPort","wsMode","processFuncs");
-
 
20016
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
-
 
20017
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array");
-
 
20018
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
20019
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",null,"false",null);
-
 
20020
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
20021
		#$conf["arrayCountEqualCheck"][]=array();
-
 
20022
		#參考資料來源:
-
 
20023
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
20024
		#建議:
-
 
20025
		#增加可省略參數全部不能為空字串或空陣列的參數功能.
-
 
20026
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
20027
		unset($conf["variableCheck::checkArguments"]);
-
 
20028
				
-
 
20029
		#如果檢查參數失敗
-
 
20030
		if($checkArguments["status"]==="false"){
-
 
20031
			
-
 
20032
			#設置執行失敗
-
 
20033
			$result["status"]="false";
-
 
20034
		
-
 
20035
			#設置執行錯誤訊息
-
 
20036
			$result["error"]=$checkArguments;
-
 
20037
			
-
 
20038
			#回傳結果
-
 
20039
			return $result;
-
 
20040
			
-
 
20041
			}#if end
-
 
20042
			
-
 
20043
		#如果檢查參數不通過
-
 
20044
		if($checkArguments["passed"]==="false"){
-
 
20045
			
-
 
20046
			#設置執行失敗
-
 
20047
			$result["status"]="false";
-
 
20048
		
-
 
20049
			#設置執行錯誤訊息
-
 
20050
			$result["error"]=$checkArguments;
-
 
20051
			
-
 
20052
			#回傳結果
-
 
20053
			return $result;
-
 
20054
			
-
 
20055
			}#if end
-
 
20056
 
-
 
20057
		#取得收到的訊息
-
 
20058
		$receivedData=$conf["data"];
-
 
20059
		
-
 
20060
		#取得 server 的 socket
-
 
20061
		$serverSocket=$conf["serverSock"];
-
 
20062
		
-
 
20063
		#取得 client 的 socket
-
 
20064
		$clientSocket=$conf["clientSock"];
-
 
20065
		
-
 
20066
		#取得 client 的資訊
-
 
20067
		$clientInfo=$conf["clientInfo"];
-
 
20068
		
-
 
20069
		#取得 client 的索引
-
 
20070
		$clientIndex=$conf["clientIndex"];
-
 
20071
		
-
 
20072
		#取得 all clients 的資訊
-
 
20073
		$allConn=$conf["allConn"];
-
 
20074
		
-
 
20075
		#hex2bin
-
 
20076
		#函式說明:
-
 
20077
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,gpg,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
20078
		#回傳結果:
-
 
20079
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
20080
		#$result["function"],當前執行的函數名稱.
-
 
20081
		#$result["content"],加密後的結果.
-
 
20082
		#$result["error"],錯誤訊息陣列.
-
 
20083
		#$result["argu"],使用的參數.
-
 
20084
		#必填參數:
-
 
20085
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
20086
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$receivedData;
-
 
20087
		#$conf["enCodeType"],"字串",加密或編碼的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin"與"gpg"與"hex2bin&gpg",9種,"sha1"較耗時;"md5"較快;"p_hash"適用於密碼加密;"aes256"是對稱式加解密;"qbpwcf"是透過urlencode、json_encode、base64_encode的結果;"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin";"gpg"是應用gpg進行加解密,需要先有ID對應的key;"hex2bin&gpg"為先hex2bin在進行gpg加解密.
-
 
20088
		$conf["authenticate::enCodeStr"]["enCodeType"]="hex2bin";
-
 
20089
		#可省略參數:
-
 
20090
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
20091
		#$conf["sha1Raw"]="false";
-
 
20092
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
20093
		#$conf["p_hash"]="";
-
 
20094
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
20095
		#$conf["keyForAes256"]="";
-
 
20096
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
20097
		#$conf["aes256Encode"]="";
-
 
20098
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
20099
		#$conf["qbpwcfDecode"]="false";
-
 
20100
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
20101
		#$conf["gpgDecrypt"]="false";
-
 
20102
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
20103
		$conf["authenticate::enCodeStr"]["gpgId"]=gnupgId;
-
 
20104
		#參考資料:
-
 
20105
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
20106
		#md5=>http://php.net/manual/en/function.md5.php
-
 
20107
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
20108
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
20109
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
20110
		#備註:
-
 
20111
		#無.
-
 
20112
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
20113
		unset($conf["authenticate::enCodeStr"]);
-
 
20114
		
-
 
20115
		#如果執行失敗
-
 
20116
		if($enCodeStr["status"]==="false"){
-
 
20117
		
-
 
20118
			#印出結果
-
 
20119
			return $enCodeStr;
-
 
20120
			
-
 
20121
			}#if end
-
 
20122
		
-
 
20123
		#用GnuPG解密
-
 
20124
		#函式說明:
-
 
20125
		#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,gpg,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
-
 
20126
		#回傳結果:
-
 
20127
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
-
 
20128
		#$result["function"],當前執行的函數名稱.
-
 
20129
		#$result["content"],加密後的結果.
-
 
20130
		#$result["error"],錯誤訊息陣列.
-
 
20131
		#$result["argu"],使用的參數.
-
 
20132
		#必填參數:
-
 
20133
		#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
-
 
20134
		$conf["authenticate::enCodeStr"]["enCodeStr"]=$$enCodeStr["content"];
-
 
20135
		#$conf["enCodeType"],"字串",加密或編碼的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin"與"gpg"與"hex2bin&gpg",9種,"sha1"較耗時;"md5"較快;"p_hash"適用於密碼加密;"aes256"是對稱式加解密;"qbpwcf"是透過urlencode、json_encode、base64_encode的結果;"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin";"gpg"是應用gpg進行加解密,需要先有ID對應的key;"hex2bin&gpg"為先hex2bin在進行gpg加解密.
-
 
20136
		$conf["authenticate::enCodeStr"]["enCodeType"]="gpg";
-
 
20137
		#可省略參數:
-
 
20138
		#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
-
 
20139
		#$conf["sha1Raw"]="false";
-
 
20140
		#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
-
 
20141
		#$conf["p_hash"]="";
-
 
20142
		#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
-
 
20143
		#$conf["keyForAes256"]="";
-
 
20144
		#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
-
 
20145
		#$conf["aes256Encode"]="";
-
 
20146
		#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
-
 
20147
		#$conf["qbpwcfDecode"]="false";
-
 
20148
		#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
-
 
20149
		#$conf["gpgDecrypt"]="false";
-
 
20150
		#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,該參數必填.
-
 
20151
		$conf["authenticate::enCodeStr"]["gpgId"]=gnupgId;
-
 
20152
		#參考資料:
-
 
20153
		#sha1=>http://php.net/manual/en/function.sha1.php
-
 
20154
		#md5=>http://php.net/manual/en/function.md5.php
-
 
20155
		#password_hash=>http://php.net/manual/en/function.password-hash.php
-
 
20156
		#password_verify=>http://php.net/manual/en/function.password-verify.php
-
 
20157
		#json_decode=>https://www.php.net/manual/en/function.json-decode.php
-
 
20158
		#備註:
-
 
20159
		#無.
-
 
20160
		$enCodeStr=authenticate::enCodeStr($conf["authenticate::enCodeStr"]);
-
 
20161
		unset($conf["authenticate::enCodeStr"]);
-
 
20162
		
-
 
20163
		#如果執行失敗
-
 
20164
		if($enCodeStr["status"]==="false"){
-
 
20165
		
-
 
20166
			#印出結果
-
 
20167
			return $enCodeStr;
-
 
20168
			
-
 
20169
			}#if end
-
 
20170
		
-
 
20171
		#解碼取得的內容
-
 
20172
		$receivedData=json_decode($enCodeStr["content"]);
-
 
20173
		
-
 
20174
		#如果有設置 callFunc
-
 
20175
		if(isset($receivedData->callFunc)){
-
 
20176
		
-
 
20177
			#取得要呼叫的函式
-
 
20178
			$func=$receivedData->callFunc;
-
 
20179
			
-
 
20180
			#檢查是否有權限執行該函式
-
 
20181
			#函式說明:
-
 
20182
			#提供webSock::nativeSocketTcpIpServer用於接受檢查權限的功能.
-
 
20183
			#回傳結果:
-
 
20184
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
20185
			#$result["error"],執行不正常結束的錯訊息陣列.
-
 
20186
			#$result["argu"],陣列,使用的參數.
-
 
20187
			#必填參數:
-
 
20188
			#$conf["data"],字串,收到的bin2hex編碼後果gpg加密過後的json格式資料,必填的key有"randomStr","username","password".
-
 
20189
			$conf["self::checkAuth"]["data"]=$conf["data"];
-
 
20190
			#$conf["serverSock"],resource,web socket server socket
-
 
20191
			$conf["self::checkAuth"]["serverSock"]=$conf["serverSock"];
-
 
20192
			#$conf["clientSock"],$resource,web socket client socket
-
 
20193
			$conf["self::checkAuth"]["clientSock"]=$conf["clientSock"];
-
 
20194
			#$conf["clientInfo"],陣列,web socket client info.
-
 
20195
			$conf["self::checkAuth"]["clientInfo"]=$conf["clientInfo"];
-
 
20196
			#$conf["clientIndex"],整數.web socket client index.
-
 
20197
			$conf["self::checkAuth"]["clientIndex"]=$conf["clientIndex"];
-
 
20198
			#$conf["allConn"],陣列,all web socket client info.
-
 
20199
			$conf["self::checkAuth"]["allConn"]=$conf["allConn"];
-
 
20200
			#$conf["func"],字串,要檢查的是否具備權限的函式.
-
 
20201
			$conf["self::checkAuth"]["func"]=$func;
-
 
20202
			#可省略參數:
-
 
20203
			#$conf["wsMode"],字串,是否要按照rfc6555,預設為"true"為是;"false"為否.
-
 
20204
			#$conf["wsMode"]="true";
-
 
20205
			#$conf["gpgId"],字串,用於加解密的gpg id,預設為gnupgId.
-
 
20206
			#$conf["gpgId"]=gnupgId;
-
 
20207
			#$conf["falseAllowFuncPlus"],陣列,額外的未認證時可以執行的函式清單.
-
 
20208
			#$conf["falseAllowFuncPlus"]=array();
-
 
20209
			#$conf["publicAllowFuncPlus"],陣列,額外的認證為public時可以執行的函式清單.
-
 
20210
			#$conf["publicAllowFuncPlus"]=array();
-
 
20211
			#參考資料:
-
 
20212
			#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
-
 
20213
			#備註:
-
 
20214
			#無.
-
 
20215
			$checkAuth=self::checkAuth($conf["self::checkAuth"]);
-
 
20216
			unset($conf["self::checkAuth"]);
-
 
20217
			
-
 
20218
			#如果異常
-
 
20219
			if($checkAuth["status"]==="false"){
-
 
20220
			
-
 
20221
				#回傳結果
-
 
20222
				return $checkAuth;
-
 
20223
				
-
 
20224
				}#if end
-
 
20225
			
-
 
20226
			#移除使用好的元素
-
 
20227
			unset($receivedData["callFunc"]);
-
 
20228
			
-
 
20229
			#置換data為未加密的內容
-
 
20230
			$conf["data"]=json_encode($receivedData);
-
 
20231
			
-
 
20232
			#呼叫對應的函式
-
 
20233
			return eval($func."(&\$conf);");
-
 
20234
			
-
 
20235
			}#if end
-
 
20236
		
-
 
20237
		#設置執行失敗
-
 
20238
		$result["ststus"]="false";
-
 
20239
		
-
 
20240
		#回傳結果
-
 
20241
		return $result;
-
 
20242
 
-
 
20243
		}#function callFunc end
-
 
20244
	
16089
	}#class webSock end
20245
	}#class webSock end
16090
 
20246
 
16091
?>
20247
?>
16092
20248