Subversion Repositories php-qbpwcf

Rev

Rev 66 | Rev 179 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
 
3
/*
4
 
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
6
    Copyright (C) 2015~2025 Min-Jhin,Chen
7
 
8
    This file is part of QBPWCF.
9
 
10
    QBPWCF is free software: you can redistribute it and/or modify
11
    it under the terms of the GNU General Public License as published by
12
    the Free Software Foundation, either version 3 of the License, or
13
    (at your option) any later version.
14
 
15
    QBPWCF is distributed in the hope that it will be useful,
16
    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
    GNU General Public License for more details.
19
 
20
    You should have received a copy of the GNU General Public License
21
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
22
 
23
*/
24
namespace qbpwcf;
25
 
26
/*
27
類別說明:
28
用於驗證處理的類別.
29
備註:
30
無.
31
*/
32
class authenticate{
33
 
34
	/*
35
	#函式說明:
36
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
37
	#回傳結果:
38
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
39
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
40
	#$result["function"],當前執行的函式名稱.
41
	#必填參數:
42
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
43
	#$arguments,陣列,為呼叫方法時所用的參數.
44
	#參考資料:
45
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
46
	*/
47
	public function __call($method,$arguments){
48
 
49
		#取得當前執行的函式
50
		$result["function"]=__FUNCTION__;
51
 
52
		#設置執行不正常
53
		$result["status"]="false";
54
 
55
		#設置執行錯誤
56
		$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";
57
 
58
		#設置所丟入的參數
59
		$result["error"][]=$arguments;
60
 
61
		#回傳結果
62
		return $result;
63
 
64
		}#function __call end
65
 
66
	/*
67
	#函式說明:
68
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
69
	#回傳結果:
70
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
71
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
72
	#$result["function"],當前執行的函式名稱.
73
	#必填參數:
74
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
75
	#$arguments,陣列,為呼叫方法時所用的參數.
76
	#參考資料:
77
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
78
	*/
79
	public static function __callStatic($method,$arguments){
80
 
81
		#取得當前執行的函式
82
		$result["function"]=__FUNCTION__;
83
 
84
		#設置執行不正常
85
		$result["status"]="false";
86
 
87
		#設置執行錯誤
88
		$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";
89
 
90
		#設置所丟入的參數
91
		$result["error"][]=$arguments;
92
 
93
		#回傳結果
94
		return $result;
95
 
96
		}#function __callStatic end
97
 
98
	/*
99
	#函式說明:
100
	#用來檢查 $_SESSION['password'] 是否存在以及其值是否正確
101
	#回傳結果:
102
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
103
	#$result["passed"],是否驗證通過,"true"為驗證通過,"false"為驗證不通過.
104
	#$result["function"],當前執行的函數名稱.
105
	#$result["error"],錯誤訊息陣列.
106
	#必填參數:
107
	$conf["password"]="";#是驗證碼的內容應該要等於什麼才是對的。
108
	#可省略參數:
109
	#無.
110
	#參考資料:
111
	#無.
112
	#備註:
113
	#無.
114
	*/	
115
	public static function simpleAuthenticate(&$conf){
116
 
117
		#初始化要回傳的變數
118
		$result=array();
119
 
120
		#記錄當前執行的函數名稱
121
		$result["function"]=__FUNCTION__;
122
 
123
		#如果 $conf 不為陣列
124
		if(gettype($conf)!="array"){
125
 
126
			#設置執行失敗
127
			$result["status"]="false";
128
 
129
			#設置執行錯誤訊息
130
			$result["error"][]="\$conf變數須為陣列形態";
131
 
132
			#如果傳入的參數為 null
133
			if($conf==null){
134
 
135
				#設置執行錯誤訊息
136
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
137
 
138
				}#if end
139
 
140
			#回傳結果
141
			return $result;
142
 
143
			}#if end
144
 
145
		#檢查參數
146
		#函式說明:
147
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
148
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
149
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
150
		#$result["function"],當前執行的函式名稱.
151
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
152
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
153
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
154
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
155
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
156
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
157
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
158
		#必填參數:
159
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
160
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
161
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
162
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("password");
163
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double"); 
164
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
165
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
166
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
167
		#可以省略的參數:
168
		#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
169
		#$conf["canBeEmptyString"]="false";
170
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
171
		#$conf["skipableVariableName"]=array();
172
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
173
		#$conf["skipableVariableType"]=array();
174
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
175
		#$conf["skipableVarDefaultValue"]=array("");
176
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
177
		#$conf["arrayCountEqualCheck"][]=array();
178
		#參考資料來源:
179
		#array_keys=>http://php.net/manual/en/function.array-keys.php
180
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
181
		unset($conf["variableCheck::checkArguments"]);
182
 
183
		#debug
184
		#var_dump($checkResult);
185
		#exit;
186
 
187
		#debug
188
		#var_dump($result);
189
		#exit;
190
 
191
		#如果檢查失敗
192
		if($checkResult["status"]=="false"){
193
 
194
			#debug
195
			#var_dump($result);
196
			#exit;
197
 
198
			#debug
199
			#var_dump($checkResult);
200
			#exit;
201
 
202
			#設置執行失敗
203
			$result["status"]="false";
204
 
205
			#設置執行錯誤訊息
206
			$result["error"]=$checkResult;
207
 
208
			#回傳結果
209
			return $result;
210
 
211
			}#if end
212
 
213
		#如果檢查不通過
214
		if($checkResult["passed"]=="false"){
215
 
216
			#設置執行失敗
217
			$result["status"]="false";
218
 
219
			#設置執行錯誤訊息
220
			$result["error"]=$checkResult;
221
 
222
			#回傳結果
223
			return $result;
224
 
225
			}#if end
226
 
227
		#debug
228
		#var_dump($result);
229
		#exit;
230
 
231
		#echo "entered";
232
 
233
		#若沒有供驗證的變數,或其驗證內容爲""
234
		if(!isset($_SESSION['password']) || $_SESSION['password']===""){
235
 
236
			#設置執行成功
237
			$result["status"]="true";
238
 
239
			#設置驗證不通過
240
			$result["passed"]="false";
241
 
242
			#回傳結果
243
			return $result;
244
 
245
			}#if end
246
 
247
		#如果驗證碼不正確
248
		if($_SESSION['password']!==$conf["password"]){
249
 
250
			#設置執行成功
251
			$result["status"]="true";
252
 
253
			#設置驗證不通過
254
			$result["passed"]="false";
255
 
256
			#回傳結果
257
			return $result;
258
 
259
			}#if end
260
 
261
		#反之驗證成功
262
		else{
263
 
264
			#設置執行成功
265
			$result["status"]="true";
266
 
267
			#設置驗證通過
268
			$result["passed"]="true";
269
 
270
			#回傳結果
271
			return $result;
272
 
273
			}#else end
274
 
275
		#不應該執行到這邊
276
		#設置執行失敗
277
		$result["status"]="false";
278
 
279
		#設置驗證不通過
280
		$result["passed"]="false";
281
 
282
		#回傳結果
283
		return $result;
284
 
285
		}#函式結束
286
 
287
	/*
288
	#函式說明:
289
	#用來檢查 $_SESSION['password'] 是否存在以及其值是否正確,如果檢查不通過,則會轉址.
290
	#回傳結果:
291
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
292
	#$result["passed"],是否驗證通過,"true"為驗證通過,"false"為驗證不通過.
293
	#$result["function"],當前執行的函數名稱.
294
	#必填參數:
295
	$conf["failLocation"]="";#是當驗證失敗時要轉址到的位置
296
	$conf["password"]="";#是驗證碼的內容應該要等於什麼才是對的。
297
	#可省略參數:
298
	#無.
299
	#參考資料:
300
	#無.
301
	#備註:
302
	#無.
303
	*/	
304
	public static function sessionAuthenticate(&$conf){
305
 
306
		#初始化要回傳的變數
307
		$result=array();
308
 
309
		#記錄當前執行的函數名稱
310
		$result["function"]=__FUNCTION__;
311
 
312
		#如果 $conf 不為陣列
313
		if(gettype($conf)!="array"){
314
 
315
			#設置執行失敗
316
			$result["status"]="false";
317
 
318
			#設置執行錯誤訊息
319
			$result["error"][]="\$conf變數須為陣列形態";
320
 
321
			#如果傳入的參數為 null
322
			if($conf==null){
323
 
324
				#設置執行錯誤訊息
325
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
326
 
327
				}#if end
328
 
329
			#回傳結果
330
			return $result;
331
 
332
			}#if end
333
 
334
		#檢查參數
335
		#函式說明:
336
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
337
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
338
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
339
		#$result["function"],當前執行的函式名稱.
340
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
341
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
342
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
343
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
344
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
345
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
346
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
347
		#必填參數:
348
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
349
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
350
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
351
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("failLocation","password");
352
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double"); 
353
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
354
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
355
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
356
		#可以省略的參數:
357
		#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
358
		#$conf["canBeEmptyString"]="false";
359
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
360
		#$conf["skipableVariableName"]=array();
361
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
362
		#$conf["skipableVariableType"]=array();
363
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
364
		#$conf["skipableVarDefaultValue"]=array("");
365
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
366
		#$conf["arrayCountEqualCheck"][]=array();
367
		#參考資料來源:
368
		#array_keys=>http://php.net/manual/en/function.array-keys.php
369
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
370
		unset($conf["variableCheck::checkArguments"]);
371
 
372
		#如果檢查失敗
373
		if($checkResult["status"]=="false"){
374
 
375
			#設置執行失敗
376
			$result["status"]="false";
377
 
378
			#設置執行錯誤訊息
379
			$result["error"]=$checkResult;
380
 
381
			#回傳結果
382
			return $result;
383
 
384
			}#if end
385
 
386
		#如果檢查不通過
387
		if($checkResult["status"]=="false"){
388
 
389
			#設置執行失敗
390
			$result["status"]="false";
391
 
392
			#設置執行錯誤訊息
393
			$result["error"]=$checkResult;
394
 
395
			#回傳結果
396
			return $result;
397
 
398
			}#if end
399
 
400
		#取得驗證碼驗證的回傳值
401
		#函式說明:
402
		#用來檢查 $_SESSION['password'] 是否存在以及其值是否正確
403
		#回傳結果:
404
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
405
		#$result["passed"],是否驗證通過,"true"為驗證通過,"false"為驗證不通過.
406
		#$result["function"],當前執行的函數名稱.
407
		#$result["error"],錯誤訊息陣列.
408
		#必填參數:
409
		$conf["authenticate::simpleAuthenticate"]["password"]=$conf["password"];#是驗證碼的內容應該要等於什麼才是對的。
410
		$simpleAuthenticate=authenticate::simpleAuthenticate($conf["authenticate::simpleAuthenticate"]);
411
		unset($conf["authenticate::simpleAuthenticate"]);
412
 
413
		#如果執行驗證失敗
414
		if($simpleAuthenticate["status"]=="false"){
415
 
416
			#設置執行失敗
417
			$result["status"]="false";
418
 
419
			#設置錯誤訊息
420
			$result["error"]=$simpleAuthenticate;
421
 
422
			#回傳結果
423
			return $result;
424
 
425
			}#if end
426
 
427
		#如果驗證失敗
428
		if($simpleAuthenticate["passed"]=="false"){
429
 
430
			#進行轉址
431
			#函式說明:
432
			#設定session變數後,立即轉址.
433
			#回傳的結果:
434
			#$result["status"],執行是否成功,"true"代表成功,"false"代表不成功.
435
			#$result["error"],錯誤訊息陣列.
436
			#必填的參數:
437
			#$conf["headerLocation"],為要轉址到的地方,若爲 $_SERVER["PHP_SELF"],則爲回到目前頁面,全民資安素養網爲 https://isafe.moe.edu.tw/.
438
			$conf["header::redirectionNow"]["headerLocation"]=$conf["failLocation"];
439
			#可省略的參數:
440
			#$conf["sessionName"],字串陣列,可以指派session變數的名稱.
441
			#$conf["sessionName"]=array("");
442
			#$conf["sessionValue"]字串陣列,可以指派session變數的內容.
443
			#$conf["sessionValue"]=array("");
444
			#參靠資料來源:
445
			#http://php.net/manual/en/reserved.variables.server.php
446
			$redirectionNow=header::redirectionNow($conf["header::redirectionNow"]);
447
			unset($conf["header::redirectionNow"]);
448
 
449
			#如果轉址失敗
450
			if($redirectionNow["status"]=="false"){
451
 
452
				#設置執行失敗
453
				$result["status"]="false";
454
 
455
				#設置錯誤訊息
456
				$result["error"]=$redirectionNow;
457
 
458
				#回傳結果
459
				return $result;
460
 
461
				}#if end
462
 
463
			}#if end	
464
 
465
		#執行到這邊代表正常
466
		#設置執行正常
467
		$result["status"]="true";
468
 
469
		#回傳結果
470
		return $result;
471
 
472
		}#函式結束
473
 
474
	/*
475
	#函式說明:
476
	#檢查session裏面的使用者$_SESSION["account"]是否在會員清單裏面,與該會員所屬的羣組是否具有權限瀏覽該子功能頁面.
477
	#回傳的參數:
478
	#$result["status"],執行是否正常的識別,"true"代表一切正常,"false"代表不正常
479
	#$result["error"],錯誤訊息
480
	#$result["function"],當前執行的函數名稱
481
	#$result["passed"],是否通過檢查,"true"代表通過檢查,"false"代表沒有通過檢查.
482
	#$result["warning"],記錄不會影響程式執行,但是需要注意的事情。
483
	#$result["sql"],查詢用的sql.
484
	#必填參數:
485
	$conf["thisSubSystemName"]="";#爲該子系統的名稱,若該羣組所能瀏覽的子系統裏面有該名稱,則通過驗證。
486
	$conf["dbName"]="";#爲指定的資料庫名稱,欲選擇的資料庫名稱
487
	$conf["dbPassword"]="";#爲連線到資料庫時要使用的密碼,可省略,若省略則代表不使用密碼
488
	#可省略參數:
489
	#$conf["dbAddress"]="localhost";#爲資料庫的位置,預設爲 "localhost"
490
	#$conf["dbAccount"]="root";#爲用於連入資料庫時要使用的帳號,預設爲 "root"
491
	#$conf["dtName.member"]="member";#儲存會員資料的資料表,預設爲 "member"
492
	#$conf["dtName.userGroup"]="userGroupAuthorties";#儲存羣組資料的資,預設爲 "userGroupAuthorities"
493
	#參考資料:
494
	#無.
495
	#備註:
496
	#無.
497
	*/
498
	public static function checkUserGroupAuthorities($conf){
499
 
500
		#初始化要回傳的結果
501
		$result=array();
502
 
503
		#初始化儲存要回傳的警告訊息
504
		$result["warning"]=array();
505
 
506
		#記錄當前執行的涵式名稱
507
		$result["function"]=__FUNCTION__;
508
 
509
		#如果 $conf 不為陣列
510
		if(gettype($conf)!="array"){
511
 
512
			#設置執行失敗
513
			$result["status"]="false";
514
 
515
			#設置執行錯誤訊息
516
			$result["error"][]="\$conf變數須為陣列形態";
517
 
518
			#如果傳入的參數為 null
519
			if($conf==null){
520
 
521
				#設置執行錯誤訊息
522
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
523
 
524
				}#if end
525
 
526
			#回傳結果
527
			return $result;
528
 
529
			}#if end
530
 
531
		#檢查參數
532
		#函式說明:
533
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
534
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
535
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
536
		#$result["function"],當前執行的函式名稱.
537
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
538
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
539
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
540
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
541
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
542
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
543
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
544
		#必填參數:
545
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
546
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
547
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
548
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("thisSubSystemName","dbName","dbPassword");
549
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double"); 
550
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string");
551
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
552
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
553
		#可以省略的參數:
554
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
555
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
556
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
557
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("dbAddress","dbAccount","dtName.member","dtName.userGroup");
558
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
559
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string");
560
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
561
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("localhost","root","member","userGroupAuthorities");
562
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
563
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
564
		#參考資料來源:
565
		#array_keys=>http://php.net/manual/en/function.array-keys.php
566
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
567
		unset($conf["variableCheck::checkArguments"]);
568
 
569
		#如果 $checkResult["status"]=="false"
570
		if($checkResult["status"]=="false"){
571
 
572
			#設置執行不正常的適別
573
			$result["status"]="false";
574
 
575
			#設置執行錯誤的訊息
576
			$result["error"]=$checkResult;
577
 
578
			#回傳結果
579
			return $result;
580
 
581
			}#if end
582
 
583
		#如果 $checkResult["passed"] 等於 "false"
584
		if($checkResult["passed"]=="false"){
585
 
586
			#設置執行不正常的適別
587
			$result["status"]="false";
588
 
589
			#設置執行錯誤的訊息
590
			$result["error"]=$checkResult;
591
 
592
			#回傳結果
593
			return $result;
594
 
595
			}#if end
596
 
597
		#檢查是否有session["username"],如果不存在
598
		if(!isset($_SESSION["username"])){
599
 
600
			#設置執行正常的適別
601
			$result["status"]="true";
602
 
603
			#設置檢查不通過
604
			$result["passed"]="false";
605
 
606
			#設置警告訊息
607
			$result["warning"][]="使用者名稱變數不存在";
608
 
609
			#回傳結果
610
			return $result;
611
 
612
			}#if end
613
 
614
		#檢查$_SESSION["username"]所屬的羣組爲何
615
 
616
		#函式說明:
617
		#一次取得資料庫、表的資料
618
		#回傳的結果
619
		#$result["status"],執行結果"true"為成功;"false"為執行失敗。
620
		#$result["error"],錯誤訊息陣列。
621
		#$result["dataContent"],爲資料的內容。
622
		#$result["dataContent"][$conf["WhereColumnName"][$i]][$dataSetNum]
623
			#$dataSetNum 爲第$dataSetNum+1筆資料
624
			#$conf["WhereColumnName"][$i] 爲第 $i+1 個欄位的名稱
625
		#$result["dataCount"],爲取得的資料筆數。
626
		#$result["sql"],執行的sql字串.
627
		#必填參數:
628
		$conf["db"]["fastGetDbData"]["dbAddress"]=$conf["dbAddress"];#爲dbServer的位置。
629
		$conf["db"]["fastGetDbData"]["dbAccount"]=$conf["dbAccount"];#爲登入dbServer的帳號。
630
		$conf["db"]["fastGetDbData"]["dbName"]=$conf["dbName"];#爲要存取的資料庫名稱
631
		$conf["db"]["fastGetDbData"]["tableName"]=$conf["dtName.member"];#爲要存取的資料表名稱
632
		$conf["db"]["fastGetDbData"]["columnYouWant"]=array("account","groupName");#你想要的欄位!
633
		#可省略參數:
634
		$conf["db"]["fastGetDbData"]["dbPassword"]=$conf["dbPassword"];#爲要存取dbServer的密碼
635
		$conf["db"]["fastGetDbData"]["WhereColumnName"]=array("account");#用於判斷語句的欄位項目陣列。
636
		$conf["db"]["fastGetDbData"]["WhereColumnValue"]=array($_SESSION["account"]);#用於判斷語句的欄位數值陣列,若與LIKE搭配,則可以在關鍵自字串的左右名加上「%」符號,這樣就可以搜尋具有該字串的內容。
637
		#$conf["db"]["fastGetDbData"]["WhereColumnCombine"]=array("");#用於判斷語句當中需要()起來的判斷式,須爲陣列值,"s"代表「(」,"e"代表「)」 ,若無則須設爲""。
638
		#$conf["db"]["fastGetDbData"]["WhereColumnOperator"]=array("");#用於判斷語句的比較符號陣列,可以用的符號有「"="、">"、"<"、"LIKE"、"NOT LIKE"」,預設都爲「=」。
639
		#$conf["db"]["fastGetDbData"]["WhereColumnAndOr"]=array("");#用於判斷語句條件之間成立的條件是AND還是OR,須爲陣列值。其數量應爲要判斷的欄位數量減一。
640
		#$conf["db"]["fastGetDbData"]["orderItem"]="";#爲排序的項目依據,若要用隨機抽樣,可以用"rand()",可省略。
641
		#$conf["db"]["fastGetDbData"]["ascORdesc"]="";#爲要低增還是遞減排序,asc爲遞增;desc爲遞減。
642
		#$conf["db"]["fastGetDbData"]["numberStart"]="0";#為從第幾筆開始讀取,預設為0,代筆第一筆。
643
		#$conf["db"]["fastGetDbData"]["numLimit"]="30";#為要取幾筆資料,可以省略,省略則表示不限制數目。
644
		#$conf["db"]["fastGetDbData"]["groupBy"]=array("");#爲要以哪幾個欄爲作爲分羣的依據(欄位相同的數值僅會取出一筆)。
645
		$memberData=db::fastGetDbData($conf["db"]["fastGetDbData"]);
646
		unset($conf["db"]["fastGetDbData"]);
647
 
648
		#如果 $memberData["status"] 等於 "false"
649
		if($memberData["status"]=="false"){
650
 
651
			#設置執行不正常的適別
652
			$result["status"]="false";
653
 
654
			#設置執行錯誤的訊息
655
			$result["error"]=$memberData;
656
 
657
			#回傳結果
658
			return $result;
659
 
660
			}#if end
661
 
662
		#如果 $memberData["dataCount"] 等於 0
663
		if($memberData["dataCount"]==0){
664
 
665
			#代表沒有符合的帳戶
666
			$result["status"]="true";
667
 
668
			#設置警告訊息
669
			$result["warning"][]="使用者沒有歸屬於任何群組";
670
 
671
			#紀錄查詢用的sql
672
			$result["sql"]=$memberData["sql"];
673
 
674
			#設置檢查不通過
675
			$result["passed"]="false";
676
 
677
			#回傳結果
678
			return $result;
679
 
680
			}#if end
681
 
682
		#取得目前該使用者所屬的羣組
683
		$userGroup=$memberData["dataContent"]["groupName"][0];#符合資料的會員群組名稱。
684
 
685
		#檢查該群組能否瀏覽目標子系統
686
		#函式說明:
687
		#檢查資料庫裏的資料表有無指定條件的資料
688
		#回傳的結果:
689
		#$result["status"],執行是否成功,成功為"true",失敗為"false"。
690
		#$result["error"],錯誤訊息	
691
		#$result["founded"],是否找到資料,"true"代表有符合的資料;"false"代表沒有符合的資料.		
692
		#必填參數:
693
		$conf["db"]["checkDataExists"]["dbAddress"]=$conf["dbAddress"];#爲mysql-Server的位置
694
		$conf["db"]["checkDataExists"]["dbAccount"]=$conf["dbAccount"];#爲用於連入mysql-Server時要使用的帳號
695
		$conf["db"]["checkDataExists"]["selectedDataBaseName"]=$conf["dbName"];#爲指定的資料庫名稱,欲選擇的資料庫名稱
696
		$conf["db"]["checkDataExists"]["selectedDataTableName"]=$conf["dtName.userGroup"];#欲選擇的資料表名稱
697
		#可省略的參數:
698
		$conf["db"]["checkDataExists"]["dbPassword"]=$conf["dbPassword"];#爲連線到mysql-Server時要使用的密碼,可省略,若省略則代表不使用密碼
699
		$conf["db"]["checkDataExists"]["conditionTargetName"]=array("groupName","visitableSubSystem");#用來判斷的資料表數值名稱,需爲陣列,可省略
700
		$conf["db"]["checkDataExists"]["conditionTargetValue"]=array($userGroup,$conf["thisSubSystemName"]);#用來判斷的資料表數值名稱若等於該數值,表示條件成立,需爲陣列,可省略
701
		$checkDataExistResult=db::checkDataExists($conf["db"]["checkDataExists"]);
702
		unset($conf["db"]["checkDataExists"]);
703
 
704
		#var_dump($checkDataExistResult);
705
 
706
		#如果 $checkDataExistResult["status"] 等於 "false"
707
		if($checkDataExistResult["status"]=="false"){
708
 
709
			#代表操作失敗
710
			$result["status"]="false";
711
 
712
			#設置警告訊息
713
			$result["error"]=$checkDataExistResult;
714
 
715
			#回傳結果
716
			return $result;
717
 
718
			}#if end
719
 
720
		#反之代表執行成功
721
		else{
722
 
723
			#如果 $checkDataExistResult["founded"] 等於 "true"
724
			if($checkDataExistResult["founded"]=="true"){
725
 
726
				#代表有相符合的資料
727
 
728
				#設置符合權限
729
				$result["passed"]="true";
730
 
731
				#設置執行正常
732
				$result["status"]="true";
733
 
734
				#回傳結果
735
				return $result;
736
 
737
				}#if end
738
 
739
			#反之代表沒有找到相符的資料,不符合權限.	
740
			else{
741
 
742
				#設置符合權限
743
				$result["passed"]="false";
744
 
745
				#設置執行正常
746
				$result["status"]="true";	
747
 
748
				#設置警告訊息
749
				$result["warning"][]="使用者所屬的群組沒有權限使用該子系統";	
750
 
751
				#回傳結果
752
				return $result;					
753
 
754
				}#else end
755
 
756
			}#else end
757
 
758
		#執行到這邊代表執行不正常
759
		$result["status"]="false";
760
 
761
		#設置錯誤訊息
762
		$result["error"][]="不應該執行到的位置";	
763
 
764
		#回傳結果
765
		return $result;
766
 
767
		}#函式結束
768
 
769
	/*
770
	#函式說明:
771
	#建立以圖片(PNG格式)呈現的驗證碼.
772
	#回傳的解果:
773
	#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
774
	#$result["error"],錯誤訊息.
775
	#$result["function"],檔前執行的函數名稱.
776
	#$result["randNumberWord"],傳驗證碼的內容.
777
	#$result["imgAddress"],包含src圖片的位置與名稱.
778
	#$result["imgSrcVal"],放在src裏面的圖片位置與名稱.
779
	#必填參數:
780
	#$conf["imgAddressAndName"],字串,爲驗證碼圖片儲存的位置與名稱,副檔名程式會自動產生
781
	$conf["imgAddressAndName"]="";
782
	#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
783
	$conf["fileArgu"]=__FILE__;
784
	#可省略參數:
785
	#$conf["num"],字串,爲驗證碼的位數,請輸入阿拉伯數字,預設為"8"位數.
786
	#$conf["num"]="8";
787
	#$conf["disableImg"],字串,是否要取消驗證碼圖片的輸出,"true"為要取消,預設為"false"為不取消
788
	#$conf["disableImg"]="false";
789
	#$conf["imgToData"],字串,預設為"true"代表將圖片轉存成base64圖片,並將原始圖片移除;反之為"false"
790
	#$conf["imgToData"]="true";
791
	#$conf["class"],字串,圖片要套用的css樣式類別.
792
	#$conf["class"]="";
793
	#$conf["content"],字串陣列,允許的亂數陣列內容,預設爲(1~9 and A~Z).
794
	#$conf["content"]=array();
795
	#參考資料:
796
	#無.
797
	#備註:
798
	#無.
799
	*/	
800
	public static function validationCode(&$conf){
801
 
802
		#初始化要回傳的結果
803
		$result=array();
804
 
805
		#取得當前執行的函數
806
		$result["function"]=__FUNCTION__;
807
 
808
		#如果 $conf 不為陣列
809
		if(gettype($conf)!="array"){
810
 
811
			#設置執行失敗
812
			$result["status"]="false";
813
 
814
			#設置執行錯誤訊息
815
			$result["error"][]="\$conf變數須為陣列形態";
816
 
817
			#如果傳入的參數為 null
818
			if($conf==null){
819
 
820
				#設置執行錯誤訊息
821
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
822
 
823
				}#if end
824
 
825
			#回傳結果
826
			return $result;
827
 
828
			}#if end
829
 
830
		#檢查參數
831
		#函式說明:
832
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
833
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
834
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
835
		#$result["function"],當前執行的函式名稱.
836
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
837
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
838
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
839
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
840
		#必填參數:
841
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
842
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
843
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
844
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("imgAddressAndName","fileArgu");
845
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double"); 
846
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
847
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
848
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
849
		#可以省略的參數:
850
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
851
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
852
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
853
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("fileArgu","num","disableImg","imgToData","class","content");
854
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
855
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string","string","array");
856
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
857
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,"8","false","true",null,array("1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","V","U","W","X","Y","Z"));
858
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
859
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
860
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
861
		unset($conf["variableCheck::checkArguments"]);
862
 
863
		#如果檢查失敗
864
		if($checkResult["status"]=="false"){
865
 
866
			#設置錯誤狀態
867
			$result["status"]="false";
868
 
869
			#設置錯誤提示
870
			$result["error"]=$checkResult;
871
 
872
			return $result;
873
 
874
			}#if end
875
 
876
		#如果檢查不通過
877
		if($checkResult["passed"]=="false"){
878
 
879
			#設置錯誤狀態
880
			$result["status"]="false";
881
 
882
			#設置錯誤提示
883
			$result["error"]=$checkResult;
884
 
885
			return $result;
886
 
887
			}#if end
888
 
889
		#可以出現的亂數字碼
890
		$target=$conf["content"];
891
 
892
		#建立$randNumberWordUn的初始值
893
		$randNumberWordUn="";
894
 
895
		#跑$num次
896
		for($i=0;$i<=($conf["num"]-1);$i++){
897
 
898
			#則將該代數值轉換成對應的target陣列值。
899
			$number[$i]=$target[rand(0,count($target)-1)];
900
 
901
			#將轉換完的驗證碼合併
902
			$randNumberWordUn=$randNumberWordUn.$number[$i];
903
 
904
			}#for end
905
 
906
		#將合併好的驗證碼到randNumberWord 
907
		$randNumberWord = $randNumberWordUn;
908
 
909
		#如果有設定產出圖片
910
		if($conf["disableImg"]=="false"){
911
 
912
			#如果驗證碼數量爲$num則放置驗證碼的圖片寬度就等於
913
			$backgroundImgWidth=$conf["num"]*10;
914
 
915
			#函式說明:
916
			#建立含有文字的png圖檔
917
			#回傳的結果:
918
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
919
			#$result["error"],錯誤訊息陣列
920
			#$result["function"],當前執行的函數名稱
921
			#$result["content"],圖片的位置與檔案名稱
922
			#必填參數:
923
			$conf["img::create"]["imgWidth"]=$backgroundImgWidth;#圖片的寬度(int)
924
			$conf["img::create"]["imgHeight"]=20;#圖片的高度(int)
925
			$conf["img::create"]["imgStoreAddAndName"]=$conf["imgAddressAndName"];#圖片要儲存到的地方以及其名稱
926
			#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
927
			$conf["img::create"]["fileArgu"]=$conf["fileArgu"];
928
			#可省略參數:
929
			#$conf["bgRedNum"]=0;#圖片的紅色底色數值0~255,預設爲0
930
			#$conf["bgGreenNum"]=0;#圖片的綠色底色數值0~255,預設爲0
931
			#$conf["bgBlueNum"]=0;#圖片的藍色底色數值0~255,預設爲0
932
			$conf["img::create"]["strOnImg"]=$randNumberWord;#要出現在圖片上的文字,預設為""
933
			#$conf["textRedNum"]=255;#文字顏色的紅色數值0~255,預設爲255
934
			#$conf["textGreenNum"]=255;#文字顏色的綠色數值0~255,預設爲255
935
			#$conf["textBlueNum"]=255;#文字顏色的藍色數值0~255,預設爲255
936
			#$conf["drawLine"]=array("");#可以畫多條線,參數格式爲「0,0,200,100,50,100,150 」,每個參數依序代表x0、y0爲線條的起始點;x1、y1爲線條的終點;red、green、blue爲線條的顏色數值(0~255)
937
			#在圖片上畫左下到右上的線
938
			$conf["img::create"]["drawLine"][]="0,0,".$backgroundImgWidth.",".$conf["img::create"]["imgHeight"].",255,0,0";#可以畫多條線,參數格式爲「0,0,200,100,50,100,150 」,每個參數依序代表x0、y0爲線條的起始點;x1、y1爲線條的終點;red、green、blue爲線條的顏色數值(0~255)
939
			#在圖片上畫左上到右下的線
940
			$conf["img::create"]["drawLine"][]="0,".$conf["img::create"]["imgHeight"].",".$backgroundImgWidth.",0,0,255,0";#可以畫多條線,參數格式爲「0,0,200,100,50,100,150 」,每個參數依序代表x0、y0爲線條的起始點;x1、y1爲線條的終點;red、green、blue爲線條的顏色數值(0~255)
941
			#在圖片上畫左中到右中的線
942
			$conf["img::create"]["drawLine"][]="0,".($conf["img::create"]["imgHeight"]/2).",".$backgroundImgWidth.",".($conf["img::create"]["imgHeight"]/2).",0,0,255";#可以畫多條線,參數格式爲「0,0,200,100,50,100,150 」,每個參數依序代表x0、y0爲線條的起始點;x1、y1爲線條的終點;red、green、blue爲線條的顏色數值(0~255)
943
			#在圖片上畫中上到中下的線
944
			$conf["img::create"]["drawLine"][]=($backgroundImgWidth/2).",".$conf["img::create"]["imgHeight"].",".($backgroundImgWidth/2).",0,50,50,50";#可以畫多條線,參數格式爲「0,0,200,100,50,100,150 」,每個參數依序代表x0、y0爲線條的起始點;x1、y1爲線條的終點;red、green、blue爲線條的顏色數值(0~255)
945
			$conf["img::create"]["replaceOriImg"]="true";#如果遇到相同名字會將之刪除,flase爲不要刪除,預設為"false".
946
			#參考資料來源:
947
			#imagecreate=>http://php.net/manual/en/function.imagecreate.php
948
			#imagecolorallocate=>http://php.net/manual/en/function.imagecolorallocate.php
949
			#imagestring=>http://php.net/manual/en/function.imagestring.php
950
			#imageline=>http://php.net/manual/en/function.imageline.php
951
			#imagepng=>http://php.net/manual/en/function.imagepng.php
952
			#imagedestroy=>http://php.net/manual/en/function.imagedestroy.php
953
			$imgAddress=img::create($conf["img::create"]);
954
			unset($conf["img::create"]);
955
 
956
			#如果建立圖片失敗
957
			if($imgAddress["status"]=="false"){
958
 
959
				#設置錯誤狀態
960
				$result["status"]="false";
961
 
962
				#設置錯誤提示
963
				$result["error"]=$imgAddress;
964
 
965
				return $result;
966
 
967
				}#if end
968
 
969
			#設置圖片的位置與名稱
970
			$result["imgAddress"]=$imgAddress["content"];
971
 
972
			#如果要把圖片轉存成base64
973
			if($conf["imgToData"]=="true"){
974
 
975
				#函數說明:
976
				#用data:mimeType;base64,imgVar的形式來提供圖片的連結,亦即圖片儲存在變數裡面,本函式包含顯示圖片的語法.
977
				#回傳結果:
978
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
979
				#$result["error"],錯誤訊息
980
				#$result["content"]["imgWithoutImgTag"],img的src數值內容.
981
				#$result["content"]["img"],圖片的連結資訊
982
				#$result["function"],當前執行的函數名稱 
983
				#必填參數:
984
				#$conf["imgPosition"],要轉存成2元碼的圖片檔案位置與名稱
985
				$conf["img::data"]["imgPosition"]=$result["imgAddress"];
986
				#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.
987
				$conf["img::data"]["fileArgu"]=$conf["fileArgu"];
988
				#可省略參數:
989
				#$conf["alt"],若沒有圖片要用什麼文字顯示。
990
				#$conf["alt"]="";
991
				#$conf["class"],圖片要套用的css樣式名稱.
992
 
993
				#如果有設定 class
994
				if(isset($conf["class"])){
995
 
996
					#設置圖片的 class
997
					$conf["img::data"]["class"]=$conf["class"];
998
 
999
					}#if end
1000
 
1001
				#$conf["mimeType"],2元碼的內容是什麼,預設為"image/*".
1002
				#$conf["mimeType"]="image/*";
1003
				#$conf["compressType"],2元碼壓縮的方式,預設為"base64".
1004
				#$conf["compressType"]="base64";
1005
				#$conf["delImg"],讀取完圖片檔案後,要移除圖片嗎?"true"代表要移除,"false"代表不要移除,預設為"false".
1006
				$conf["img::data"]["delImg"]="true";
1007
				#參考資料:
1008
				#將檔案用字串變數儲存起來=>http://php.net/manual/en/function.file-get-contents.php
1009
				#壓縮2元碼=>http://php.net/manual/en/function.base64-encode.php
1010
				$data=img::data($conf["img::data"]);
1011
				unset($conf["img::data"]);
1012
 
1013
				#如果轉存成base64失敗
1014
				if($data["status"]=="false"){
1015
 
1016
					#設置錯誤狀態
1017
					$result["status"]="false";
1018
 
1019
					#設置錯誤提示
1020
					$result["error"]=$data;
1021
 
1022
					return $result;
1023
 
1024
					}#if end
1025
 
1026
				#設置圖片src的數值	
1027
				$result["imgSrcVal"]=$data["content"]["imgWithoutImgTag"];
1028
 
1029
				#更新圖片位置為base64
1030
				$result["imgAddress"]=$data["content"]["img"];
1031
 
1032
				}#if end
1033
 
1034
			}#if end
1035
 
1036
		#設置執行成功狀態
1037
		$result["status"]="true";
1038
 
1039
		#設置亂數文字結果
1040
		$result["randNumberWord"]=$randNumberWord;
1041
 
1042
		#回傳內容
1043
		return $result;
1044
 
1045
		}#函式結束
1046
 
1047
	/*
1048
	#函式說明:
1049
	#產生亂數驗證碼或驗證亂數驗證碼與表單資料
1050
	#回傳結果:
1051
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1052
	#$result["error"],錯誤訊息.
1053
	#$result["argu"],使用的參數.
1054
	#$result["function"],當前執行的函數名稱.
1055
	#$result["content"],語法.
1056
	#必填參數:
1057
	#$conf["fileArgu"]
1058
	$conf["fileArgu"]=__FILE__;
1059
	#可省略參數:
1060
	#$conf["sendedName"],字串,傳送的post變數名稱,預設爲"formData".
1061
	#$conf["sendedName"]="";	
1062
	#$conf["codeFormName"],字串,驗證碼表單的名稱,預設為"randomCode",對應的 session 變數名稱為 authenticate.verifyCodeAndFormData.$conf["codeFormName"]
1063
	#$conf["codeFormName"]="randomCode";
1064
	#$conf["names"],字串陣列,需要處理的表單必填變數.
1065
	#$conf["names"]=array();
1066
	#$conf["skipNames"],字串陣列,需要處理的表單可爲空變數.
1067
	#$conf["skipNames"]=array(); 
1068
	#參考資料:
1069
	#無.
1070
	#備註:
1071
	#請跟javaScript類別的randomCode函式搭配.應用情境在會員登入、驗證與寄送Email表單.
1072
	*/
1073
	function verifyCodeAndFormData($conf){
1074
 
1075
		#初始化要回傳的結果
1076
		$result=array();
1077
 
1078
		#取得當前執行的函數名稱
1079
		$result["function"]=__FUNCTION__;
1080
 
1081
		#如果沒有參數
1082
		if(func_num_args()==0){
1083
 
1084
			#設置執行失敗
1085
			$result["status"]="false";
1086
 
1087
			#設置執行錯誤訊息
1088
			$result["error"]="函數".$result["function"]."需要參數";
1089
 
1090
			#回傳結果
1091
			return $result;
1092
 
1093
			}#if en
1094
 
1095
		#取得參數
1096
		$result["argu"]=$conf;
1097
 
1098
		#如果 $conf 不為陣列
1099
		if(gettype($conf)!=="array"){
1100
 
1101
			#設置執行失敗
1102
			$result["status"]="false";
1103
 
1104
			#設置執行錯誤訊息
1105
			$result["error"][]="\$conf變數須為陣列形態";
1106
 
1107
			#如果傳入的參數為 null
1108
			if(is_null($conf)){
1109
 
1110
				#設置執行錯誤訊息
1111
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1112
 
1113
				}#if end
1114
 
1115
			#回傳結果
1116
			return $result;
1117
 
1118
			}#if end
1119
 
1120
		#函式說明:
1121
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1122
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1123
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1124
		#$result["function"],當前執行的函式名稱.
1125
		#$result["argu"],設置給予的參數.
1126
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1127
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1128
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1129
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1130
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1131
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1132
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1133
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1134
		#必填寫的參數:
1135
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1136
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1137
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1138
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1139
		#可以省略的參數:
1140
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1141
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu");
1142
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
1143
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
1144
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1145
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1146
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1147
		#$conf["canNotBeEmpty"]=array();
1148
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1149
		#$conf["canBeEmpty"]=array();
1150
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1151
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sendedName","codeFormName","names","skipNames");
1152
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1153
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sendedName","codeFormName","names","skipNames");
1154
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1155
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array","array");
1156
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1157
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("formData","randomCode",null,null);
1158
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1159
		#$conf["disallowAllSkipableVarIsEmpty"]="";
1160
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1161
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1162
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1163
		#$conf["arrayCountEqualCheck"][]=array();
1164
		#參考資料來源:
1165
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1166
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1167
		unset($conf["variableCheck::checkArguments"]);
1168
 
1169
		#如果出錯
1170
		if($checkArguments["status"]==="false"){
1171
 
1172
			#設置執行失敗
1173
			$result["status"]="false";
1174
 
1175
			#設置執行失敗
1176
			$result["error"]=$checkArguments;
1177
 
1178
			#回傳結果
1179
			return $result;
1180
 
1181
			}#if end
1182
 
1183
		#如果出錯
1184
		if($checkArguments["passed"]==="false"){
1185
 
1186
			#設置執行失敗
1187
			$result["status"]="false";
1188
 
1189
			#設置執行失敗
1190
			$result["error"]=$checkArguments;
1191
 
1192
			#回傳結果
1193
			return $result;
1194
 
1195
			}#if end			
1196
 
1197
		#如果沒有設置 $conf["names"]		
1198
		if(!isset($conf["names"])){
1199
 
1200
			#初始化
1201
			$conf["names"]=array($conf["codeFormName"]);
1202
 
1203
			}#if end
1204
 
1205
		#反之
1206
		else{
1207
 
1208
			#加上驗證碼表單
1209
			$conf["names"][]=$conf["codeFormName"];
1210
 
1211
			}#else end
1212
 
1213
		#如果沒有設置 $conf["skipNames"]		
1214
		if(!isset($conf["skipNames"])){
1215
 
1216
			#初始化
1217
			$conf["skipNames"]=array();
1218
 
1219
			}#if end
1220
 
1221
		#函式說明:
1222
		#建立一個陣列,可以指派陣列的內容,然後回傳
1223
		#回傳的結果:
1224
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1225
		#$result["function"],當前執行的函數名稱.
1226
		#$result["error"],錯誤訊息陣列.
1227
		#$result["argu"],使用的參數.
1228
		#$result["content"],爲陣列變數內容
1229
		#必填參數:
1230
		$conf["arrays::create"]["arrayContent"]=array("string");#陣列元素的內容,須爲陣列值。
1231
		#可省略參數:
1232
		$conf["arrays::create"]["arrayCounts"]=count($conf["names"])+count($conf["skipNames"]);#爲陣列的元素有幾個,若沒設定,則數量爲$conf["arrayContent"]裏的元素數量
1233
		$conf["arrays::create"]["theSameAs"]="true";#若設爲"true",則所有元素內容都跟第一個元素內容相同
1234
		$create=arrays::create($conf["arrays::create"]);
1235
		unset($conf["arrays::create"]);
1236
 
1237
		#如果失敗
1238
		if($create["status"]==="false"){
1239
 
1240
			#設置執行失敗
1241
			$result["status"]="false";
1242
 
1243
			#設置執行失敗
1244
			$result["error"]=$create;
1245
 
1246
			#回傳結果
1247
			return $result;
1248
 
1249
			}#if end
1250
 
1251
		#函式說明:
1252
		#將多個一維陣列串聯起來,key從0開始排序.
1253
		#回傳的結果:
1254
		#$result["status"],"true"表執行正常,"false"代表執行不正常.
1255
		#$result["error"],錯誤訊息陣列.
1256
		#$result["function"],當前執行的函數.
1257
		#$result["content"],合併好的一維陣列.
1258
		#必填的參數
1259
		#$conf["inputArray"],陣列,要合併的一維陣列變數,例如:=array($array1,$array2);
1260
		$conf["arrays::mergeArray"]["inputArray"]=array($conf["names"],$conf["skipNames"]);
1261
		#可省略的參數:
1262
		#$conf["allowRepeat"],字串,預設為"true",允許重複的結果;若為"false"則不會出現重複的元素內容.
1263
		#$conf["allowRepeat"]="true";
1264
		$mergeArray=arrays::mergeArray($conf["arrays::mergeArray"]);
1265
		unset($conf["arrays::mergeArray"]);
1266
 
1267
		#如果失敗
1268
		if($mergeArray["status"]==="false"){
1269
 
1270
			#設置執行失敗
1271
			$result["status"]="false";
1272
 
1273
			#設置執行失敗
1274
			$result["error"]=$mergeArray;
1275
 
1276
			#回傳結果
1277
			return $result;
1278
 
1279
			}#if end
1280
 
1281
		#如表單變數存在
1282
		if(isset($_POST[$conf["sendedName"]])){
1283
 
1284
			#解碼
1285
			$urlEncodeStr=base64_decode($_POST[$conf["sendedName"]]);
1286
 
1287
			#解碼
1288
			$jsonEncodeStr=urldecode($urlEncodeStr);				
1289
 
1290
			#解碼
1291
			$obj=json_decode($jsonEncodeStr);
1292
 
1293
			#debug
1294
			#echo $urlEncodeStr."<p>";
1295
			#echo $jsonEncodeStr."<p>";
1296
			#var_dump($obj);
1297
 
1298
			#如果爲空物件
1299
			if($jsonEncodeStr==="{}"){
1300
 
1301
				#建立亂數驗證碼
1302
				#函式說明:
1303
				#建立以圖片(PNG格式)呈現的驗證碼.
1304
				#回傳的解果:
1305
				#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
1306
				#$result["error"],錯誤訊息.
1307
				#$result["function"],檔前執行的函數名稱.
1308
				#$result["randNumberWord"],傳驗證碼的內容.
1309
				#$result["imgSrcVal"],放在src裏面的圖片位置與名稱.
1310
				#$result["imgAddress"],圖片的位置與名稱.
1311
				#必填的參數:
1312
				#$conf["imgAddressAndName"],字串,爲驗證碼圖片儲存的位置與名稱,副檔名程式會自動產生
1313
				$conf["authenticate::validationCode"]["imgAddressAndName"]="/tmp/authenticate.verifyCodeAndFormData.".$conf["codeFormName"];
1314
				#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1315
				$conf["authenticate::validationCode"]["fileArgu"]=$conf["fileArgu"];
1316
				#可省略參數:
1317
				#$conf["num"],字串,爲驗證碼的位數,請輸入阿拉伯數字,預設為"8"位數.
1318
				#$conf["num"]="8";
1319
				#$conf["disableImg"],字串,是否要取消驗證碼圖片的輸出,"true"為要取消,預設為"false"為不取消
1320
				#$conf["disableImg"]="false";
1321
				#$conf["imgToData"],字串,預設為"true"代表將圖片轉存成base64圖片,並將原始圖片移除;反之為"false"
1322
				#$conf["imgToData"]="true";
1323
				#$conf["class"],字串,圖片要套用的css樣式類別.
1324
				#$conf["class"]="";
1325
				$validationCode=authenticate::validationCode($conf["authenticate::validationCode"]);
1326
				unset($conf["authenticate::validationCode"]);
1327
 
1328
				#如果建立亂碼圖片失敗
1329
				if($validationCode["status"]==="false"){			
1330
 
1331
					#設置執行失敗
1332
					$result["status"]="false";
1333
 
1334
					#設置執行失敗
1335
					$result["error"]=$validationCode;
1336
 
1337
					#回傳結果
1338
					return $result;
1339
 
1340
					}#if end
1341
 
1342
				#設置驗證碼到session變數
1343
				$_SESSION["authenticate.verifyCodeAndFormData.".$conf["codeFormName"]]=$validationCode["randNumberWord"];
1344
 
1345
				#取得驗證碼長度
1346
				$json["content"]["randomCodeLength"]=strlen($_SESSION["authenticate.verifyCodeAndFormData.".$conf["codeFormName"]]);
1347
 
1348
				#設置圖片data
1349
				$json["content"]["randomCodeSrc"]=$validationCode["imgSrcVal"];
1350
 
1351
				#設置執行失敗
1352
				$json["status"]="false";
1353
 
1354
				#設置執行錯誤
1355
				$json["error"]="no data";
1356
 
1357
				#設置 json
1358
				$result["content"]=json_encode($json);
1359
 
1360
				#運行正常
1361
				$result["status"]="true";
1362
 
1363
				#回傳結果
1364
				return $result;
1365
 
1366
				}#if end 
1367
 
1368
			#反之有內容
1369
			else{
1370
 
1371
				#清空post變數
1372
				$_POST=array();			
1373
 
1374
				#debug
1375
				#echo $urlEncodeStr."<p>";
1376
				#echo $jsonEncodeStr."<p>";
1377
				#var_dump($obj);
1378
 
1379
				#依據每個物件
1380
				foreach($obj as $key=>$val){
1381
 
1382
					#設置對應的 post 數值
1383
					$_POST[$key]=$val;				
1384
 
1385
					}#foreach end
1386
 
1387
				#debug
1388
				#echo json_encode($_POST);
1389
 
1390
				#如果驗證碼正確
1391
				if($_POST["randomCode"]===$_SESSION["authenticate.verifyCodeAndFormData.".$conf["codeFormName"]]){
1392
 
1393
					#設置執行正常
1394
					$json["status"]="true";
1395
 
1396
					#設置通過驗證
1397
					$json["passed"]="true";
1398
 
1399
					#設置訊息 
1400
					$json["msg"]="通過驗證";
1401
 
1402
					#取得要檢查的變數名稱
1403
					$mustBeFilledVariableName=$mergeArray["content"];
1404
 
1405
					#取得要檢查的變數形態
1406
					$mustBeFilledVariableType=$create["content"];							
1407
 
1408
					#檢查POST參數
1409
					#函式說明:
1410
					#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1411
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1412
					#$reuslt["error"],執行不正常結束的錯訊息陣列.
1413
					#$result["function"],當前執行的函式名稱.
1414
					#$result["argu"],設置給予的參數.
1415
					#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1416
					#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1417
					#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1418
					#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1419
					#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1420
					#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1421
					#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1422
					#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1423
					#必填寫的參數:
1424
					#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1425
					$conf["variableCheck::checkArguments"]["varInput"]=&$_POST;
1426
					#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1427
					$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1428
					#可以省略的參數:
1429
					#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1430
					$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=$mustBeFilledVariableName;
1431
					#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
1432
					$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=$mustBeFilledVariableType;
1433
					#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1434
					$conf["variableCheck::checkArguments"]["canBeEmptyString"]="true";
1435
					#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1436
					$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=$conf["names"];
1437
					#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1438
					#$conf["canBeEmpty"]=array();
1439
					#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1440
					#$conf["skipableVariableCanNotBeEmpty"]=array();
1441
					#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1442
					#$conf["skipableVariableName"]=array();
1443
					#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1444
					#$conf["skipableVariableType"]=array();
1445
					#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1446
					#$conf["skipableVarDefaultValue"]=array("");
1447
					#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1448
					#$conf["disallowAllSkipableVarIsEmpty"]="";
1449
					#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1450
					#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1451
					#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1452
					#$conf["arrayCountEqualCheck"][]=array();
1453
					#參考資料來源:
1454
					#array_keys=>http://php.net/manual/en/function.array-keys.php
1455
					$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1456
					unset($conf["variableCheck::checkArguments"]);
1457
 
1458
					#如果檢查失敗
1459
					if($checkArguments["status"]==="false"){
1460
 
1461
						#設置執行不正常
1462
						$jsons["status"]="false";
1463
 
1464
						#設置檢查不通過
1465
						$json["passed"]="false";
1466
 
1467
						#設置執行失敗
1468
						$json["error"]=$checkArguments;
1469
 
1470
						#設置 json
1471
						$result["content"]=json_encode($json);
1472
 
1473
						#運行正常
1474
						$result["status"]="true";
1475
 
1476
						#回傳結果
1477
						return $result;
1478
 
1479
						}#if end
1480
 
1481
					#如果檢查不通過
1482
					if($checkArguments["passed"]==="false"){
1483
 
1484
						#設置執行正常
1485
						$json["status"]="true";
1486
 
1487
						#設置檢查不通過
1488
						$json["passed"]="false";
1489
 
1490
						#設置執行失敗
1491
						$json["error"]=$checkArguments;
1492
 
1493
						#設置 json
1494
						$result["content"]=json_encode($json);
1495
 
1496
						#運行正常 
1497
						$result["status"]="true";
1498
 
1499
						#回傳結果
1500
						return $result;
1501
 
1502
						}#if end
1503
 
1504
					#設置執行正常
1505
					$json["status"]="true";
1506
 
1507
					#設置通過驗證
1508
					$json["passed"]="true";	
1509
 
1510
					#設置抓到的 post 內容
1511
					$json["post"]=$_POST;
1512
 
1513
					#設置 json
1514
					$result["content"]=json_encode($json);
1515
 
1516
					#運行正常 
1517
					$result["status"]="true";
1518
 
1519
					#回傳結果
1520
					return $result;
1521
 
1522
					}#if end
1523
 
1524
				#反之
1525
				else{
1526
 
1527
					#設置執行正常
1528
					$json["status"]="true";
1529
 
1530
					#設置未通過驗證
1531
					$json["passed"]="false";
1532
 
1533
					#設置錯誤訊息 
1534
					$json["error"]="驗證碼錯誤";
1535
 
1536
					#設置 json
1537
					$result["content"]=json_encode($json);
1538
 
1539
					#運行正常 
1540
					$result["status"]="true";
1541
 
1542
					#回傳結果 
1543
					return $result; 
1544
 
1545
					}#else end
1546
 
1547
				}#else end
1548
 
1549
			#設置執行正常
1550
			$json["status"]="false";
1551
 
1552
			#設置通過驗證
1553
			$json["passed"]="false";
1554
 
1555
			#設置錯誤訊息 
1556
			$json["error"]="缺少POST變數";	
1557
 
1558
			#設置抓到的 post 內容
1559
			$json["post"]=$_POST;
1560
 
1561
			#設置 json
1562
			$result["content"]=json_encode($json);
1563
 
1564
			#運行不正常 
1565
			$result["status"]="false";
1566
 
1567
			#設置錯誤訊息 
61 liveuser 1568
			$result["error"][]="缺少POST變數";
3 liveuser 1569
 
1570
			#回傳結果
1571
			return $result;
61 liveuser 1572
 
3 liveuser 1573
			}#if end
1574
 
1575
		}#function verifyCodeAndFormData end
1576
 
1577
	/*
1578
	#函式說明:
61 liveuser 1579
	#加密或編碼字串,可以用的方法有sha1,md5,password_sha,qbpwcf,bin2hex,hex2bin,gpg,sha1可以回傳20或40的數值字串,md5可以回傳32個數值字串,password_hash可以回傳60~255個字元.
3 liveuser 1580
	#回傳結果:
1581
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
1582
	#$result["function"],當前執行的函數名稱.
1583
	#$result["content"],加密後的結果.
1584
	#$result["error"],錯誤訊息陣列.
1585
	#$result["argu"],使用的參數.
1586
	#必填參數:
1587
	#$conf["enCodeStr"],any,要加密的字串,陣列,物件.
1588
	$conf["enCodeStr"]="";
170 liveuser 1589
	#$conf["enCodeType"],"字串",加密或編碼的類型,有"sha1"與"md5"與"p_hash"與"aes256"與"qbpwcf"與"bin2hex"與"hex2bin"與"gpg"與"hex2bin&gpg",9種,"sha1"較耗時;"md5"較快;"p_hash"適用於密碼加密;"aes256"是對稱式加解密;"qbpwcf"是透過json_encode、urlencode、base64_encode的結果;"bin2hex"是依照每個byte的整數數值轉成"00"~"FF"後的結果,反之為"hex2bin";"gpg"是應用gpg進行加解密,需要先有ID對應的key;"hex2bin&gpg"為先hex2bin在進行gpg加解密.
3 liveuser 1590
	$conf["enCodeType"]="sha1";
1591
	#可省略參數:
1592
	#$conf["sha1Raw"],字串,sha1加密的結果要用20個0與1組合還是要用40位數的16進位數值,"true"代表前者,"false"代表後者,預設為"false".
1593
	#$conf["sha1Raw"]="false";
1594
	#$conf["p_hash"],字串,p_hash加密過後的字串,該參數若存在且$conf["enCodeType"]為"p_hash",則代表是要檢查$conf["enCodeStr"]是否為符合$conf["p_hash"]的密碼.
1595
	#$conf["p_hash"]="";
1596
	#$conf["keyForAes256"],字串,用來 AES256 加解密的金鑰.
1597
	#$conf["keyForAes256"]="";
1598
	#$conf["aes256Encode"],字串,"true"代表是要加密,"false"代表是要解密.
1599
	#$conf["aes256Encode"]="";
1600
	#$conf["qbpwcfDecode"],字串,若"enCodeType"為"qbpwcf",則預設為"false",代表加密;反之為"true",代表解密.
1601
	#$conf["qbpwcfDecode"]="false";
61 liveuser 1602
	#$conf["gpgDecrypt"],字串,若"enCodeType"為"gpg",則預設為"false",代表加密;反之為"true",代表解密.
1603
	#$conf["gpgDecrypt"]="false";
170 liveuser 1604
	#$conf["gpgId"],字串,若"enCodeType"為"gpg"時,要使用的gpg id,預設為gnupgId.
61 liveuser 1605
	#$conf["gpgId"]="";
3 liveuser 1606
	#參考資料:
1607
	#sha1=>http://php.net/manual/en/function.sha1.php
1608
	#md5=>http://php.net/manual/en/function.md5.php
1609
	#password_hash=>http://php.net/manual/en/function.password-hash.php
1610
	#password_verify=>http://php.net/manual/en/function.password-verify.php
1611
	#json_decode=>https://www.php.net/manual/en/function.json-decode.php
1612
	#備註:
1613
	#無.
1614
	*/
1615
	public static function enCodeStr(&$conf){
1616
 
1617
		#初始化要回傳的結果
1618
		$result=array();
1619
 
1620
		#記錄當前執行的函數
1621
		$result["function"]=__FUNCTION__;
1622
 
1623
		#如果 $conf 不為陣列
1624
		if(gettype($conf)!="array"){
1625
 
1626
			#設置執行失敗
1627
			$result["status"]="false";
1628
 
1629
			#設置執行錯誤訊息
1630
			$result["error"][]="\$conf變數須為陣列形態";
1631
 
1632
			#如果傳入的參數為 null
1633
			if($conf==null){
1634
 
1635
				#設置執行錯誤訊息
1636
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1637
 
1638
				}#if end
1639
 
1640
			#回傳結果
1641
			return $result;
1642
 
1643
			}#if end
1644
 
1645
		#計數使用的參數
1646
		$result["argu"]=$conf;
1647
 
1648
		#檢查參數
1649
		#函式說明:
1650
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1651
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1652
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1653
		#$result["function"],當前執行的函式名稱.
1654
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1655
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1656
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1657
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
1658
		#必填參數:
1659
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1660
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1661
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1662
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("enCodeStr","enCodeType");
1663
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double"); 
1664
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array(null,"string");
1665
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1666
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1667
		#可以省略的參數:
1668
		#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
1669
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1670
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
61 liveuser 1671
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sha1Raw","p_hash","keyForAes256","aes256Encode","qbpwcfDecode","gpgDecrypt","gpgId");
3 liveuser 1672
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
61 liveuser 1673
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string","string","string","string");
3 liveuser 1674
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
170 liveuser 1675
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false",null,null,null,"false","false",gnupgId);
3 liveuser 1676
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1677
		#$conf["arrayCountEqualCheck"][]=array();
1678
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1679
		unset($conf["variableCheck::checkArguments"]);
1680
 
1681
		#如果檢查參數失敗
61 liveuser 1682
		if($checkResult["status"]==="false"){
3 liveuser 1683
 
1684
			#設置執行失敗
1685
			$result["status"]="false";
1686
 
1687
			#設置執行錯誤
1688
			$result["error"]=$checkResult;
1689
 
1690
			#回傳結果
1691
			return $result;
1692
 
1693
			}#if end
1694
 
1695
		#如果檢查參數不通過
61 liveuser 1696
		if($checkResult["passed"]==="false"){
3 liveuser 1697
 
1698
			#設置執行失敗
1699
			$result["status"]="false";
1700
 
1701
			#設置執行錯誤
1702
			$result["error"]=$checkResult;
1703
 
1704
			#回傳結果
1705
			return $result;
1706
 
1707
			}#if end	
1708
 
1709
		#判斷是哪一種加密方法
1710
		switch($conf["enCodeType"]){
1711
 
1712
			#如果是 "sha1"
1713
			case "sha1":
1714
 
1715
				#如果輸入不是字串
1716
				if(gettype($conf["enCodeStr"])!=="string"){
1717
 
1718
					#設置執行失敗
1719
					$result["status"]="false";
1720
 
1721
					#設置執行錯誤
1722
					$result["error"][]="enCodeStr shoud be string when enCodeType is ".$conf["enCodeType"];
1723
 
1724
					#回傳結果
1725
					return $result;
1726
 
1727
					}#if end
1728
 
1729
				#如果要用2元碼輸出
1730
				if($conf["sha1Raw"]=="true"){
1731
 
1732
					#sha1加密
1733
					$encodeStr=sha1($conf["enCodeStr"],TRUE);
1734
 
1735
					#如果加密失敗
1736
					if($encodeStr==false){
1737
 
1738
						#設置執行失敗
1739
						$result["status"]="false";
1740
 
1741
						#設置執行錯誤
1742
						$result["error"][]="加密失敗";
1743
 
1744
						#回傳結果
1745
						return $result;
1746
 
1747
						}#if end
1748
 
1749
					#反之加密成功
1750
					else{
1751
 
1752
						#取得加密後的字串
1753
						$result["content"]=$encodeStr;
1754
 
1755
						}#else end
1756
 
1757
					}#if end
1758
 
1759
				#反之用16進位數值輸出
1760
				else{
1761
 
1762
					#sha1加密
1763
					$encodeStr=sha1($conf["enCodeStr"],FALSE);
1764
 
1765
					#如果加密失敗
1766
					if($encodeStr==false){
1767
 
1768
						#設置執行失敗
1769
						$result["status"]="false";
1770
 
1771
						#設置執行錯誤
1772
						$result["error"][]="加密失敗";
1773
 
1774
						#回傳結果
1775
						return $result;
1776
 
1777
						}#if end
1778
 
1779
					#反之加密成功
1780
					else{
1781
 
1782
						#取得加密後的字串
1783
						$result["content"]=$encodeStr;
1784
 
1785
						}#else end
1786
 
1787
					}#else end
1788
 
1789
				#跳出
1790
				break;
1791
 
1792
			#如果是 "md5"
1793
			case "md5";
1794
 
1795
				#如果輸入不是字串
1796
				if(gettype($conf["enCodeStr"])!=="string"){
1797
 
1798
					#設置執行失敗
1799
					$result["status"]="false";
1800
 
1801
					#設置執行錯誤
1802
					$result["error"][]="enCodeStr shoud be string when enCodeType is ".$conf["enCodeType"];
1803
 
1804
					#回傳結果
1805
					return $result;
1806
 
1807
					}#if end
1808
 
1809
				#md5加密
1810
				$encodeStr=md5($conf["enCodeStr"]);
1811
 
1812
				#如果加密失敗
1813
				if($encodeStr==false){
1814
 
1815
					#設置執行失敗
1816
					$result["status"]="false";
1817
 
1818
					#設置執行錯誤
1819
					$result["error"][]="加密失敗";
1820
 
1821
					#回傳結果
1822
					return $result;
1823
 
1824
					}#if end
1825
 
1826
				#反之加密成功
1827
				else{
1828
 
1829
					#取得加密後的字串
1830
					$result["content"]=$encodeStr;
1831
 
1832
					}#else end
1833
 
1834
				#跳出
1835
				break;
1836
 
1837
			#如果是"p_hash"
1838
			case "p_hash":
1839
 
1840
				#如果輸入不是字串
1841
				if(gettype($conf["enCodeStr"])!=="string"){
1842
 
1843
					#設置執行失敗
1844
					$result["status"]="false";
1845
 
1846
					#設置執行錯誤
1847
					$result["error"][]="enCodeStr shoud be string when enCodeType is ".$conf["enCodeType"];
1848
 
1849
					#回傳結果
1850
					return $result;
1851
 
1852
					}#if end
1853
 
1854
				#如果 $conf["p_hash"] 存在
1855
				if(isset($conf["p_hash"])){
1856
 
1857
					#檢驗 $conf["enCodeStr"] 是否與 $conf["p_hash"] 相符
1858
					if(password_verify($conf["enCodeStr"],$conf["p_hash"])){
1859
 
1860
						#設置執行正常
1861
						$result["status"]="true";
1862
 
1863
						#回傳結果
1864
						return $result;
1865
 
1866
						}#if end
1867
 
1868
					#反之
1869
					else{
1870
 
1871
						#設置執行失敗
1872
						$result["status"]="false";
1873
 
1874
						#設置執行錯誤
1875
						$result["error"][]="密碼不正確";
1876
 
1877
						#回傳結果
1878
						return $result;
1879
 
1880
						}#else end
1881
 
1882
					}#if end
1883
 
1884
				#加密密碼
1885
				$encodeStr=password_hash($conf["enCodeStr"],PASSWORD_DEFAULT);
1886
 
1887
				#如果加密失敗
1888
				if($encodeStr==false){
1889
 
1890
					#設置執行失敗
1891
					$result["status"]="false";
1892
 
1893
					#設置執行錯誤
1894
					$result["error"][]="加密失敗";
1895
 
1896
					#回傳結果
1897
					return $result;
1898
 
1899
					}#if end
1900
 
1901
				#反之加密成功
1902
				else{
1903
 
1904
					#取得加密後的字串
1905
					$result["content"]=$encodeStr;
1906
 
1907
					}#else end
1908
 
1909
				break;
1910
 
1911
			#如果是 AES 256 bit 加密
1912
			#參考資料:
1913
			#https://www.ucamc.com/e-learning/php/388-php%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8aes-openssl%E5%8A%A0%E5%AF%86%E4%BB%A3%E7%A2%BC%E3%80%81encrypt%E3%80%81decrypt
1914
			case "aes256":
1915
 
1916
				#如果輸入不是字串
1917
				if(gettype($conf["enCodeStr"])!=="string"){
1918
 
1919
					#設置執行失敗
1920
					$result["status"]="false";
1921
 
1922
					#設置執行錯誤
1923
					$result["error"][]="enCodeStr shoud be string when enCodeType is ".$conf["enCodeType"];
1924
 
1925
					#回傳結果
1926
					return $result;
1927
 
1928
					}#if end
1929
 
1930
				#如果參數有缺
1931
				if( !isset($conf["keyForAes256"]) || !isset($conf["aes256Encode"]) ){
1932
 
1933
					#設置執行失敗
1934
					$result["status"]="false";
1935
 
1936
					#設置執行錯誤
1937
					$result["error"][]="aes256 演算法需要 keyForAes256 與 aes256Encode 參數";
1938
 
1939
					#回傳結果
1940
					return $result;
1941
 
1942
					}#if end
1943
 
1944
				#如果是要加密
1945
				if($conf["aes256Encode"]==="true"){
1946
 
1947
					#取得iv
1948
					$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
1949
 
1950
					#加密內容
1951
					$encrypted = openssl_encrypt($conf["enCodeStr"], 'aes-256-cbc', $conf["keyForAes256"], 0, $iv);
1952
 
1953
					#使用base64加密的內容
1954
					$result["content"]=base64_encode($encrypted . '::' . $iv);
1955
 
1956
					#數值執行正常
1957
					$result["status"]="true";
1958
 
1959
					#回傳結果
1960
					return $result;
1961
 
1962
					}#if end
1963
 
1964
				#反之是要解密
1965
				else{
1966
 
1967
					#取得 base64_decoed 的本文與 iv
1968
					list($conf["enCodeStr"], $iv) = explode('::', base64_decode($conf["enCodeStr"]), 2);
1969
 
1970
					#取得 解密好的內容
61 liveuser 1971
					$result["content"]=openssl_decrypt($conf["enCodeStr"], 'aes-256-cbc', $conf["keyForAes256"], 0, $iv);
1972
 
1973
					#數值執行正常
3 liveuser 1974
					$result["status"]="true";
1975
 
1976
					#回傳結果
1977
					return $result;
1978
 
1979
					}#else end
1980
 
1981
				#跳出迴圈
1982
				break;	
1983
 
1984
			#如果是 "qbpwcf"
1985
			case "qbpwcf":
1986
 
1987
				#如果是要加密
1988
				if($conf["qbpwcfDecode"]==="false"){
1989
 
1990
					#to json string
1991
					$jsonData=json_encode($conf["enCodeStr"]);
1992
 
1993
					#如果出錯
1994
					if($jsonData===false){
1995
 
1996
						#設置執行失敗
1997
						$result["status"]="false";
1998
 
1999
						#設置執行錯誤
2000
						$result["error"][]="encode 「".$conf["enCodeStr"]."」 失敗";
2001
 
2002
						#回傳結果
2003
						return $result;
2004
 
2005
						}#if end
2006
 
2007
					#設置加密好的內容	
2008
					$result["content"]=base64_encode(urlencode($jsonData));
2009
 
2010
					}#if end
2011
 
2012
				#反之是要解密
2013
				else{
2014
 
2015
					#base64_decode then urldecode data
2016
					$urlDecodeData=urldecode(base64_decode($conf["enCodeStr"]));
2017
 
2018
					#json_decode data
2019
					$json_decode_data=json_decode($urlDecodeData);
2020
 
2021
					#如果異常
2022
					if($urlDecodeData!==null && $json_decode_data===null){
2023
 
2024
						#設置執行失敗
2025
						$result["status"]="false";
2026
 
2027
						#設置執行錯誤
2028
						$result["error"][]="decode 「".$conf["enCodeStr"]."」 失敗";
2029
 
2030
						#回傳結果
2031
						return $result;
2032
 
2033
						}#if end
2034
 
2035
					#設置解密好的內容
2036
					$result["content"]=$json_decode_data;
2037
 
2038
					}#else end
2039
 
61 liveuser 2040
				#跳出 switch
3 liveuser 2041
				break;	
2042
 
61 liveuser 2043
			#若是bin2hex
2044
			case "bin2hex":
2045
 
2046
				#用16進位的兩個字母來表示每個byte
66 liveuser 2047
				$unpack=unpack("H*",$conf["enCodeStr"]);
61 liveuser 2048
 
66 liveuser 2049
				#如果沒有結果
2050
				if(!isset($unpack[1])){
2051
 
2052
					#設置執行失敗
2053
					$result["status"]="false";
2054
 
2055
					#設置執行錯誤
2056
					$result["error"][]="bin2hex failed";
2057
 
2058
					#設置執行錯誤
2059
					$result["error"][]=$unpack;
2060
 
2061
					#回傳結果
2062
					return $result;
2063
 
2064
					}#if end
2065
 
2066
				#取得結果
2067
				$result["content"]=$unpack[1];
2068
 
61 liveuser 2069
				#相當於
2070
				#$result["content"]=bin2hex($conf["enCodeStr"]);
2071
 
2072
				#跳出 switch
2073
				break;
2074
 
2075
			#若是hex2bin
2076
			case "hex2bin":
2077
 
2078
				#將每個byte用兩個16進位字母來表示的字串變成 binary string
66 liveuser 2079
 				$pack=pack("H*",$conf["enCodeStr"]);
2080
 
2081
				$result["content"]=$pack;
61 liveuser 2082
 
2083
				#跳出 switch
2084
				break;
2085
 
2086
			#如果是"gpg加解密"
2087
			case "gpg":
2088
 
2089
				#如果沒有 gpgId
2090
				if(!isset($conf["gpgId"])){
2091
 
2092
					#設置執行失敗
2093
					$result["status"]="false";
2094
 
2095
					#設置執行錯誤
2096
					$result["error"]="param gpgId if required when enCodeType is ".$conf["enCodeType"];
2097
 
2098
					#回傳結果
2099
					return $result;
2100
 
2101
					}#if end
2102
 
2103
				#如果是用加密
2104
				if($conf["gpgDecrypt"]==="false"){
2105
 
2106
					#用GnuPG加密
2107
					#函式說明:
2108
					#呼叫shell執行系統命令,並取得回傳的內容.
2109
					#回傳結果:
2110
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2111
					#$result["error"],錯誤訊息陣列.
2112
					#$result["function"],當前執行的函數名稱.
2113
					#$result["argu"],使用的參數.
2114
					#$result["cmd"],執行的指令內容.
2115
					#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.
2116
					#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.
2117
					#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.
2118
					#$result["content"],為執行完後的輸出字串.
2119
					#$result["running"],是否還在執行.
2120
					#$result["pid"],pid.
2121
					#$result["statusCode"],執行結束後的代碼.
2122
					#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
2123
					#必填參數:
2124
					#$conf["command"],字串,要執行的指令.
2125
					$conf["external::callShell"]["command"]="base64decode.php";
2126
					#$conf["fileArgu"],字串,變數__FILE__的內容.
2127
					$conf["external::callShell"]["fileArgu"]=__FILE__;
2128
					#可省略參數:
2129
					#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2130
					$conf["external::callShell"]["argu"]=array(base64_encode($conf["enCodeStr"]),"|","gpg","-r",$conf["gpgId"],"--trust-model","always","-v","-e");
2131
					#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
2132
					#$conf["arguIsAddr"]=array();
2133
					#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
2134
					#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
2135
					#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
2136
					#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
2137
					#$conf["enablePrintDescription"]="true";
2138
					#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.
2139
					#$conf["printDescription"]="";
2140
					#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.
2141
					$conf["external::callShell"]["escapeshellarg"]="true";
2142
					#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.
2143
					#$conf["thereIsShellVar"]=array();
2144
					#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.
2145
					#$conf["username"]="";
2146
					#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
2147
					#$conf["password"]="";
2148
					#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".
2149
					#$conf["useScript"]="";
2150
					#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".
2151
					#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
2152
					#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
2153
					#$conf["inBackGround"]="";
2154
					#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
2155
					#$conf["getErr"]="false";
2156
					#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
2157
					#$conf["doNotRun"]="false";
2158
					#參考資料:
2159
					#exec=>http://php.net/manual/en/function.exec.php
2160
					#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
2161
					#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
2162
					#備註:
2163
					#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
2164
					#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
2165
					$callShell=external::callShell($conf["external::callShell"]);
2166
					unset($conf["external::callShell"]);
2167
 
2168
					#如果執行失敗
2169
					if($callShell["status"]==="false"){
2170
 
2171
						#設置執行失敗
2172
						$result["status"]="false";
2173
 
2174
						#設置執行錯誤
2175
						$result["error"]=$callShell;
2176
 
2177
						#回傳結果
2178
						return $result;
2179
 
2180
						}#if end
2181
 
2182
					#取得加密後的內容
2183
					$result["content"]=$callShell["content"];
2184
 
2185
					}#if end
2186
 
2187
				#反之如果是解密
2188
				else if($conf["gpgDecrypt"]==="true"){
2189
 
2190
					#用GnuPG解密
2191
					#函式說明:
2192
					#呼叫shell執行系統命令,並取得回傳的內容.
2193
					#回傳結果:
2194
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2195
					#$result["error"],錯誤訊息陣列.
2196
					#$result["function"],當前執行的函數名稱.
2197
					#$result["argu"],使用的參數.
2198
					#$result["cmd"],執行的指令內容.
2199
					#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.
2200
					#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.
2201
					#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.
2202
					#$result["content"],為執行完後的輸出字串.
2203
					#$result["running"],是否還在執行.
2204
					#$result["pid"],pid.
2205
					#$result["statusCode"],執行結束後的代碼.
2206
					#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
2207
					#必填參數:
2208
					#$conf["command"],字串,要執行的指令.
2209
					$conf["external::callShell"]["command"]="base64decode.php";
2210
					#$conf["fileArgu"],字串,變數__FILE__的內容.
2211
					$conf["external::callShell"]["fileArgu"]=__FILE__;
2212
					#可省略參數:
2213
					#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2214
					$conf["external::callShell"]["argu"]=array(base64_encode($conf["enCodeStr"]),"|","gpg","-r",$conf["gpgId"],"--trust-model","always","-v","-d");
2215
					#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
2216
					#$conf["arguIsAddr"]=array();
2217
					#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
2218
					#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
2219
					#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
2220
					#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
2221
					#$conf["enablePrintDescription"]="true";
2222
					#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.
2223
					#$conf["printDescription"]="";
2224
					#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.
2225
					$conf["external::callShell"]["escapeshellarg"]="true";
2226
					#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.
2227
					#$conf["thereIsShellVar"]=array();
2228
					#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.
2229
					#$conf["username"]="";
2230
					#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
2231
					#$conf["password"]="";
2232
					#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".
2233
					#$conf["useScript"]="";
2234
					#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".
2235
					#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
2236
					#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
2237
					#$conf["inBackGround"]="";
2238
					#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
2239
					#$conf["getErr"]="false";
2240
					#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
2241
					#$conf["doNotRun"]="false";
2242
					#參考資料:
2243
					#exec=>http://php.net/manual/en/function.exec.php
2244
					#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
2245
					#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
2246
					#備註:
2247
					#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
2248
					#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
2249
					$callShell=external::callShell($conf["external::callShell"]);
2250
					unset($conf["external::callShell"]);
2251
 
2252
					#如果執行失敗
2253
					if($callShell["status"]==="false"){
2254
 
2255
						#設置執行失敗
2256
						$result["status"]="false";
2257
 
2258
						#設置執行錯誤
2259
						$result["error"]=$callShell;
2260
 
2261
						#回傳結果
2262
						return $result;
2263
 
2264
						}#if end
2265
 
2266
					#取得加密後的內容
2267
					$result["content"]=$callShell["content"];
2268
 
2269
					}#else end
2270
 
2271
				#跳出 switch
2272
				break;
2273
 
3 liveuser 2274
			#如果是其他內容
2275
			default:
2276
 
2277
				#設置執行失敗
2278
				$result["status"]="false";
2279
 
2280
				#設置執行錯誤
2281
				$result["error"][]="不支援的加密方法「".$conf["enCodeType"]."」";
2282
 
2283
				#回傳結果
2284
				return $result;
2285
 
2286
			}#switch end
2287
 
2288
		#執行到這邊代表執行正常
2289
		$result["status"]="true";
2290
 
2291
		#回傳結果
2292
		return $result;
2293
 
61 liveuser 2294
		}#function enCodeStr end
3 liveuser 2295
 
2296
	/*
2297
	#函式說明:
2298
	#將字串變成2元碼或2元碼變成字串.
2299
	#回傳結果:
2300
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
2301
	#$result["function"],當前執行的函數名稱.
2302
	#$result["content"],加密後的結果.
2303
	#$result["error"],錯誤訊息陣列.
2304
	#必填參數:
2305
	#$conf["input"],"字串",要hex或unhex的字串
2306
	$conf["input"]="";
2307
	#$conf["action"],"字串",要toBin或toStr.
2308
	$conf["action"]="";	
2309
	#可省略參數:
2310
	#無.
2311
	#參考資料:
2312
	#hex2bin=>http://php.net/manual/en/function.hex2bin.php #bin2hex=>http://php.net/manual/en/function.binhex.php #pack=>http://php.net/manual/en/function.pack.php 轉換的方法似乎有問題. bin2hex可以將10進位數字字串轉換成2進位字串.
2313
	#備註:
2314
	#無.
2315
	*/
2316
	public static function str2bin(&$conf){
2317
 
2318
		#初始化要回傳的結果
2319
		$result=array();
2320
 
2321
		#記錄當前執行的函數
2322
		$result["function"]=__FUNCTION__;
2323
 
2324
		#如果沒有參數
2325
		if(func_num_args()==0){
2326
 
2327
			#設置執行失敗
2328
			$result["status"]="false";
2329
 
2330
			#設置執行錯誤訊息
2331
			$result["error"]="函數".$result["function"]."需要參數";
2332
 
2333
			#回傳結果
2334
			return $result;
2335
 
2336
			}#if end
2337
 
2338
		#如果 $conf 不為陣列
2339
		if(gettype($conf)!="array"){
2340
 
2341
			#設置執行失敗
2342
			$result["status"]="false";
2343
 
2344
			#設置執行錯誤訊息
2345
			$result["error"][]="\$conf變數須為陣列形態";
2346
 
2347
			#如果傳入的參數為 null
2348
			if($conf==null){
2349
 
2350
				#設置執行錯誤訊息
2351
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2352
 
2353
				}#if end
2354
 
2355
			#回傳結果
2356
			return $result;
2357
 
2358
			}#if end
2359
 
2360
		#檢查參數
2361
		#函式說明:
2362
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2363
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2364
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2365
		#$result["function"],當前執行的函式名稱.
2366
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2367
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2368
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2369
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
2370
		#必填參數:
2371
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2372
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2373
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2374
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("input","action");
2375
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double"); 
2376
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
2377
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2378
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2379
		#可以省略的參數:
2380
		#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
2381
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2382
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2383
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sha1Raw","p_hash");
2384
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
2385
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
2386
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2387
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false",null);
2388
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2389
		#$conf["arrayCountEqualCheck"][]=array();
2390
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2391
		unset($conf["variableCheck::checkArguments"]);
2392
 
2393
		#如果檢查參數失敗
2394
		if($checkResult["status"]=="false"){
2395
 
2396
			#設置執行失敗
2397
			$result["status"]="false";
2398
 
2399
			#設置執行錯誤
2400
			$result["error"]=$checkResult;
2401
 
2402
			#回傳結果
2403
			return $result;
2404
 
2405
			}#if end
2406
 
2407
		#如果要hex
2408
		if($conf["action"]=="toBin"){
2409
 
2410
			#將字串轉換成2進位
2411
			$result["content"]=pack('H*', base_convert($conf["input"], 2, 16));
2412
 
2413
			}#if end	
2414
 
2415
		#反之如果要unhex
2416
		else if($conf["action"]=="toStr"){
2417
 
2418
			#將2進位轉為字串
2419
			$result["content"]=unpack('H*',$conf["input"]);
2420
 
2421
			#針對每個字
2422
			foreach($result["content"] as $key=>$bin){
2423
 
2424
				#轉換成字串
2425
				$result["content"][$key]=base_convert($result["content"][1], 16, 2);
2426
 
61 liveuser 2427
				}#foreach end
3 liveuser 2428
 
2429
			}#if end
2430
 
2431
		#設置執行正常
2432
		$result["status"]="true";
2433
 
2434
		#回傳結果
2435
		return $result;
2436
 
61 liveuser 2437
		}#function str2bin end	
3 liveuser 2438
 
2439
	/*
2440
	#函式說明:
66 liveuser 2441
	#驗證Linux使用者的密碼或ssh private key是否正確.
3 liveuser 2442
	#回傳結果:
2443
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
2444
	#$result["function"],當前執行的函數名稱.
2445
	#$result["error"],錯誤訊息陣列.
2446
	#$result["warninig"],警告訊息陣列.
2447
	#$result["valid"],是否為存在的使用者且密碼正確.
2448
	#必填參數:
2449
	#$conf["username"],字串,要驗證的使用者名稱.
2450
	$conf["username"]="";
2451
	#$conf["password"],字串,用於驗證使用者的密碼.
2452
	$conf["password"]="";
2453
	#$conf["fileArgu"],字串,變數__FILE__的內容.
2454
	$conf["fileArgu"]=__FILE__;
2455
	#可省略參數:
66 liveuser 2456
	#$conf["sshPrivateKey"],字串,"true"代表password為ssh private key的內容;反之預設為密碼,設置為"false".
2457
	#$conf["sshPrivateKey"]="false";
3 liveuser 2458
	#參考資料:
2459
	#無.
2460
	#備註:
66 liveuser 2461
	#僅能在命令列環境下運.
2462
	#目前僅支援驗證執行php端的使用者.
3 liveuser 2463
	*/
2464
	public static function validUser(&$conf){
2465
 
2466
		#初始化要回傳的結果
2467
		$result=array();
2468
 
2469
		#取得當前執行的函數名稱
2470
		$result["function"]=__FUNCTION__;
2471
 
2472
		#初始化警告訊息
2473
		$result["warning"]=array();
2474
 
2475
		#函式說明:
2476
		#判斷當前環境為web還是cmd
2477
		#回傳結果:
2478
		#$result,"web"或"cmd"
2479
		if(csInformation::getEnv()=="web"){
2480
 
2481
			#設置執行失敗
2482
			$result["status"]="false";
2483
 
2484
			#設置執行錯誤訊息
2485
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
2486
 
2487
			#回傳結果
2488
			return $result;
2489
 
2490
			}#if end
2491
 
2492
		#如果沒有參數
2493
		if(func_num_args()==0){
2494
 
2495
			#設置執行失敗
2496
			$result["status"]="false";
2497
 
2498
			#設置執行錯誤訊息
2499
			$result["error"]="函數".$result["function"]."需要參數";
2500
 
2501
			#回傳結果
2502
			return $result;
2503
 
2504
			}#if end
2505
 
2506
		#取得參數
2507
		$result["argu"]=$conf;
2508
 
2509
		#如果 $conf 不為陣列
2510
		if(gettype($conf)!="array"){
2511
 
2512
			#設置執行失敗
2513
			$result["status"]="false";
2514
 
2515
			#設置執行錯誤訊息
2516
			$result["error"][]="\$conf變數須為陣列形態";
2517
 
2518
			#如果傳入的參數為 null
2519
			if($conf==null){
2520
 
2521
				#設置執行錯誤訊息
2522
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2523
 
2524
				}#if end
2525
 
2526
			#回傳結果
2527
			return $result;
2528
 
2529
			}#if end
2530
 
2531
		#檢查參數
2532
		#函式說明:
2533
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2534
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2535
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2536
		#$result["function"],當前執行的函式名稱.
2537
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2538
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2539
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2540
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
2541
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
2542
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2543
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2544
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2545
		#必填參數:
2546
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2547
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2548
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2549
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("username","password","fileArgu");
2550
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
2551
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string");
2552
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2553
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2554
		#可以省略的參數:
2555
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
2556
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2557
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列
2558
		#$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("password");
2559
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列
2560
		$conf["variableCheck::checkArguments"]["canBeEmpty"]=array("password");
2561
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.
2562
		#$conf["skipableVariableCanNotBeEmpty"]=array();
2563
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
66 liveuser 2564
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sshPrivateKey");
3 liveuser 2565
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
66 liveuser 2566
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
3 liveuser 2567
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
66 liveuser 2568
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
3 liveuser 2569
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2570
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("conName","conVal");
2571
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("target","styleAttr","styleVal");
2572
		#參考資料來源:
2573
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2574
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2575
		unset($conf["variableCheck::checkArguments"]);	
2576
 
2577
		#如果檢查參數失敗
2578
		if($checkArguments["status"]=="false"){
2579
 
2580
			#設置執行不正常
2581
			$result["status"]="false";
2582
 
2583
			#設置執行錯誤
2584
			$result["error"]=$checkArguments;
2585
 
2586
			#回傳結果
2587
			return $result;
2588
 
2589
			}#if end
2590
 
2591
		#如果檢查參數不通過
2592
		if($checkArguments["passed"]=="false"){
2593
 
2594
			#設置執行不正常
2595
			$result["status"]="false";
2596
 
2597
			#設置執行錯誤
2598
			$result["error"]=$checkArguments;
2599
 
2600
			#回傳結果
2601
			return $result;
2602
 
2603
			}#if end
2604
 
2605
		#檢查使用者是否存在
2606
		#函式說明:
2607
		#呼叫shell執行系統命令,並取得回傳的內容.
2608
		#回傳的結果:
2609
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2610
		#$result["error"],錯誤訊息陣列.
2611
		#$result["function"],當前執行的函數名稱.
2612
		#$result["cmd"],執行的指令內容.
2613
		#$result["output"],爲執行完二元碼後的輸出陣列.
2614
		#必填的參數
2615
		#$conf["command"],字串,要執行的指令與.
2616
		$conf["external::callShell"]["command"]="id";
2617
		#可省略參數:
2618
		#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2619
		$conf["external::callShell"]["argu"]=array($conf["username"]);
2620
		#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
2621
		#$conf["enablePrintDescription"]="true";
2622
		#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容.
2623
		#$conf["printDescription"]="";
2624
		#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".
2625
		#$conf["escapeshellarg"]="false";
2626
		#$conf["username"],字串,要用什麼使用者來執行,預設為執行apache的使用者.
2627
		#$conf["external::callShell"]["username"]="";
2628
		#$conf["password"],字串,與$conf["username"]搭配的使用者密碼,預設不使用密碼.
2629
		#$conf["external::callShell"]["password"]="";
2630
		#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要;"false"代表不要,預設為"false".
2631
		$conf["external::callShell"]["useScript"]="true";
2632
		#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 ".qbpwcf_tmp/external/callShell/".
2633
		#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
2634
		#$conf["fileArgu"],字串,變數__FILE__的內容,預設為當前檔案的路徑與名稱.
2635
		#$conf["fileArgu"],字串,變數__FILE__的內容.
2636
		$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];
2637
		#備註:
2638
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行.使用root身份可能會被selinux阻擋.
2639
		#參考資料:
2640
		#exec=>http://php.net/manual/en/function.exec.php
2641
		#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
2642
		#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
2643
		$callShell=external::callShell($conf["external::callShell"]);
2644
		unset($conf["external::callShell"]);
2645
 
2646
		#如果執行shell失敗
66 liveuser 2647
		if($callShell["status"]==="false"){
3 liveuser 2648
 
2649
			#設置執行不正常
2650
			$result["status"]="false";
2651
 
2652
			#設置執行錯誤
2653
			$result["error"]=$callShell;
2654
 
2655
			#回傳結果
2656
			return $result;
2657
 
2658
			}#if end
2659
 
2660
		#如果使用者 $conf["username"] 不存在
66 liveuser 2661
		if($callShell["output"][0]==="id: ".$conf["username"].": no such user"){
3 liveuser 2662
 
2663
			#設置執行不正常
2664
			$result["status"]="true";
2665
 
2666
			#設置使用者驗證失敗
2667
			$result["valid"]="false";
2668
 
2669
			#設置使用者不存在的警告
2670
			$result["warninig"][]="使用者 \"".$conf["username"]."\" 不存在!";
2671
 
2672
			#回傳結果
2673
			return $result;
2674
 
2675
			}#if end
66 liveuser 2676
 
2677
		#如果要用ssh private key進行認證
2678
		if($conf["sshPrivateKey"]==="true"){
2679
 
2680
			#可以用 echo "env | grep SSH_CONNECTION=" | ssh username@127.0.0.1 來驗證使用者的ssh連線是否成功
2681
 
2682
			#預設用來測試ssh private key 與 username 是否可成功登入的賬戶
2683
			$sshAgentAcct="qbpwcf";
2684
 
2685
			#確認用來測試登入ssh的使用者qbpwcf存在
2686
			#檢查使用者是否存在
2687
			#函式說明:
2688
			#呼叫shell執行系統命令,並取得回傳的內容.
2689
			#回傳的結果:
2690
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2691
			#$result["error"],錯誤訊息陣列.
2692
			#$result["function"],當前執行的函數名稱.
2693
			#$result["cmd"],執行的指令內容.
2694
			#$result["output"],爲執行完二元碼後的輸出陣列.
2695
			#必填的參數
2696
			#$conf["command"],字串,要執行的指令與.
2697
			$conf["external::callShell"]["command"]="id";
2698
			#可省略參數:
2699
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2700
			$conf["external::callShell"]["argu"]=array($sshAgentAcct);
2701
			#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
2702
			#$conf["enablePrintDescription"]="true";
2703
			#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容.
2704
			#$conf["printDescription"]="";
2705
			#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".
2706
			#$conf["escapeshellarg"]="false";
2707
			#$conf["username"],字串,要用什麼使用者來執行,預設為執行apache的使用者.
2708
			#$conf["external::callShell"]["username"]="";
2709
			#$conf["password"],字串,與$conf["username"]搭配的使用者密碼,預設不使用密碼.
2710
			#$conf["external::callShell"]["password"]="";
2711
			#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要;"false"代表不要,預設為"false".
2712
			$conf["external::callShell"]["useScript"]="true";
2713
			#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 ".qbpwcf_tmp/external/callShell/".
2714
			#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
2715
			#$conf["fileArgu"],字串,變數__FILE__的內容,預設為當前檔案的路徑與名稱.
2716
			#$conf["fileArgu"],字串,變數__FILE__的內容.
2717
			$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];
2718
			#備註:
2719
			#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行.使用root身份可能會被selinux阻擋.
2720
			#參考資料:
2721
			#exec=>http://php.net/manual/en/function.exec.php
2722
			#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
2723
			#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
2724
			$callShell=external::callShell($conf["external::callShell"]);
2725
			unset($conf["external::callShell"]);
2726
 
2727
			#如果執行shell失敗
2728
			if($callShell["status"]==="false"){
2729
 
2730
				#設置執行不正常
2731
				$result["status"]="false";
2732
 
2733
				#設置執行錯誤
2734
				$result["error"]=$callShell;
2735
 
2736
				#回傳結果
2737
				return $result;
2738
 
2739
				}#if end
2740
 
2741
			#另外儲存存放ssh使用者設定的目錄
2742
			$dotsshFolderOfsshAgent="/home/".$sshAgentAcct."/.ssh";
2743
 
2744
			#如果使用者 $sshAgentAcct 不存在
2745
			if($callShell["output"][0]==="id: ".$sshAgentAcct.": no such user"){
2746
 
2747
				#透過 qbpwcf-usock.service 服務建立對應的使用者
2748
				#函式說明:
2749
				#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2750
				#回傳結果:
2751
				#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2752
				#$result["error"],錯誤訊息陣列.
2753
				#$result["function"],當前執行的函式名稱.
2754
				#$result["argu"],使用的參數.
2755
				#$result["content"],執行完指令的結果.
2756
				#必填參數:
2757
				#$conf["fileArgu"],字串,變數__FILE__的內容.
2758
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
2759
				#$conf["command"],字串,要執行的指令名稱.
2760
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="useradd";
2761
				#可省略參數:
2762
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2763
				#$conf["sock"]=qbpwcf_usock_path;
2764
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2765
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array($sshAgentAcct);
2766
				#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
2767
				#$conf["commandIncludeArgu"]="false";
2768
				#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
2769
				#$conf["commandInBg"]="false";
2770
				#參考資料:
2771
				#無.
2772
				#備註:
2773
				#無.
2774
				$execAnyCmdByQBPWCFunixSocket=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2775
				unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2776
 
2777
				#如果執行shell失敗
2778
				if($execAnyCmdByQBPWCFunixSocket["status"]==="false"){
3 liveuser 2779
 
66 liveuser 2780
					#設置執行不正常
2781
					$result["status"]="false";
3 liveuser 2782
 
66 liveuser 2783
					#設置執行錯誤
2784
					$result["error"]=$execAnyCmdByQBPWCFunixSocket;
2785
 
2786
					#回傳結果
2787
					return $result;
2788
 
2789
					}#if end
2790
 
2791
				#透過 qbpwcf-usock.service 服務建立設置對應使用者的 .ssh 目錄 
2792
				#函式說明:
2793
				#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2794
				#回傳結果:
2795
				#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2796
				#$result["error"],錯誤訊息陣列.
2797
				#$result["function"],當前執行的函式名稱.
2798
				#$result["argu"],使用的參數.
2799
				#$result["content"],執行完指令的結果.
2800
				#必填參數:
2801
				#$conf["fileArgu"],字串,變數__FILE__的內容.
2802
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
2803
				#$conf["command"],字串,要執行的指令名稱.
2804
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="mkdir";
2805
				#可省略參數:
2806
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2807
				#$conf["sock"]=qbpwcf_usock_path;
2808
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2809
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array($dotsshFolderOfsshAgent);
2810
				#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
2811
				#$conf["commandIncludeArgu"]="false";
2812
				#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
2813
				#$conf["commandInBg"]="false";
2814
				#參考資料:
2815
				#無.
2816
				#備註:
2817
				#無.
2818
				$execAnyCmdByQBPWCFunixSocket=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2819
				unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2820
 
2821
				#如果執行shell失敗
2822
				if($execAnyCmdByQBPWCFunixSocket["status"]==="false"){
2823
 
2824
					#設置執行不正常
2825
					$result["status"]="false";
2826
 
2827
					#設置執行錯誤
2828
					$result["error"]=$execAnyCmdByQBPWCFunixSocket;
2829
 
2830
					#回傳結果
2831
					return $result;
2832
 
2833
					}#if end
2834
 
2835
				}#if end
3 liveuser 2836
 
66 liveuser 2837
			#確認 ssh 使用者設定的目錄 $dotsshFolderOfsshAgent 是否存在
2838
			#函式說明:
2839
			#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2840
			#回傳結果:
2841
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2842
			#$result["error"],錯誤訊息陣列.
2843
			#$result["function"],當前執行的函式名稱.
2844
			#$result["argu"],使用的參數.
2845
			#$result["content"],執行完指令的結果.
2846
			#必填參數:
2847
			#$conf["fileArgu"],字串,變數__FILE__的內容.
2848
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
2849
			#$conf["command"],字串,要執行的指令名稱.
2850
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="checkNodeExist.php";
2851
			#可省略參數:
2852
			#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2853
			#$conf["sock"]=qbpwcf_usock_path;
2854
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2855
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array($dotsshFolderOfsshAgent);
2856
			#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
2857
			#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
2858
			#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
2859
			#$conf["commandInBg"]="false";
2860
			#參考資料:
2861
			#無.
2862
			#備註:
2863
			#無.
2864
			$execAnyCmdByQBPWCFunixSocket=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2865
			unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3 liveuser 2866
 
66 liveuser 2867
			#如果執行shell失敗
2868
			if($execAnyCmdByQBPWCFunixSocket["status"]==="false"){
2869
 
2870
				#設置執行不正常
2871
				$result["status"]="false";
2872
 
2873
				#設置執行錯誤
2874
				$result["error"]=$execAnyCmdByQBPWCFunixSocket;
2875
 
2876
				#回傳結果
2877
				return $result;
2878
 
2879
				}#if end
3 liveuser 2880
 
66 liveuser 2881
			#如果得到的結果不為 json
2882
			if(!json_validate($execAnyCmdByQBPWCFunixSocket["content"])){
3 liveuser 2883
 
66 liveuser 2884
				#設置執行不正常
2885
				$result["status"]="false";
2886
 
2887
				#設置執行錯誤
2888
				$result["error"]=$execAnyCmdByQBPWCFunixSocket;
2889
 
2890
				#回傳結果
2891
				return $result;
3 liveuser 2892
 
66 liveuser 2893
				}#if end
3 liveuser 2894
 
66 liveuser 2895
			#解析 json 並轉換成 array
2896
			$execAnyCmdByQBPWCFunixSocket["content"]=(array)(json_decode($execAnyCmdByQBPWCFunixSocket["content"]));
3 liveuser 2897
 
66 liveuser 2898
			#如果沒有找到要存在的 $dotsshFolderOfsshAgent 目錄
2899
			if(count($execAnyCmdByQBPWCFunixSocket["content"])===0){
3 liveuser 2900
 
66 liveuser 2901
				#建立之
2902
				#函式說明:
2903
				#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2904
				#回傳結果:
2905
				#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2906
				#$result["error"],錯誤訊息陣列.
2907
				#$result["function"],當前執行的函式名稱.
2908
				#$result["argu"],使用的參數.
2909
				#$result["content"],執行完指令的結果.
2910
				#必填參數:
2911
				#$conf["fileArgu"],字串,變數__FILE__的內容.
2912
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
2913
				#$conf["command"],字串,要執行的指令名稱.
2914
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="mkdir";
2915
				#可省略參數:
2916
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2917
				#$conf["sock"]=qbpwcf_usock_path;
2918
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2919
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array("-p",$dotsshFolderOfsshAgent);
2920
				#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
2921
				#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
2922
				#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
2923
				#$conf["commandInBg"]="false";
2924
				#參考資料:
2925
				#無.
2926
				#備註:
2927
				#無.
2928
				$createDotsshFolderOfsshAgent=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2929
				unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2930
 
2931
				#如果執行shell失敗
2932
				if($createDotsshFolderOfsshAgent["status"]==="false"){
2933
 
2934
					#設置執行不正常
2935
					$result["status"]="false";
2936
 
2937
					#設置執行錯誤
2938
					$result["error"]=$createDotsshFolderOfsshAgent;
2939
 
2940
					#回傳結果
2941
					return $result;
2942
 
2943
					}#if end
3 liveuser 2944
 
66 liveuser 2945
				}#if end
3 liveuser 2946
 
66 liveuser 2947
			#如果沒有找到要存在的 $dotsshFolderOfsshAgent 目錄
2948
			else if($execAnyCmdByQBPWCFunixSocket[0]!==$dotsshFolderOfsshAgent){
2949
 
2950
				#建立之
2951
				#函式說明:
2952
				#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2953
				#回傳結果:
2954
				#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2955
				#$result["error"],錯誤訊息陣列.
2956
				#$result["function"],當前執行的函式名稱.
2957
				#$result["argu"],使用的參數.
2958
				#$result["content"],執行完指令的結果.
2959
				#必填參數:
2960
				#$conf["fileArgu"],字串,變數__FILE__的內容.
2961
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
2962
				#$conf["command"],字串,要執行的指令名稱.
2963
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="mkdir";
2964
				#可省略參數:
2965
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2966
				#$conf["sock"]=qbpwcf_usock_path;
2967
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2968
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array("-p",$dotsshFolderOfsshAgent);
2969
				#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
2970
				#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
2971
				#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
2972
				#$conf["commandInBg"]="false";
2973
				#參考資料:
2974
				#無.
2975
				#備註:
2976
				#無.
2977
				$createDotsshFolderOfsshAgent=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2978
				unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2979
 
2980
				#如果執行shell失敗
2981
				if($createDotsshFolderOfsshAgent["status"]==="false"){
2982
 
2983
					#設置執行不正常
2984
					$result["status"]="false";
2985
 
2986
					#設置執行錯誤
2987
					$result["error"]=$createDotsshFolderOfsshAgent;
2988
 
2989
					#回傳結果
2990
					return $result;
2991
 
2992
					}#if end
2993
 
2994
				}#if end
2995
 
2996
			#取得 $dotsshFolderOfsshAgent 的權限與擁有着
2997
			#函式說明:
2998
			#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2999
			#回傳結果:
3000
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3001
			#$result["error"],錯誤訊息陣列.
3002
			#$result["function"],當前執行的函式名稱.
3003
			#$result["argu"],使用的參數.
3004
			#$result["content"],執行完指令的結果.
3005
			#必填參數:
3006
			#$conf["fileArgu"],字串,變數__FILE__的內容.
3007
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
3008
			#$conf["command"],字串,要執行的指令名稱.
3009
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="getNodeInfo.php";
3010
			#可省略參數:
3011
			#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
3012
			#$conf["sock"]=qbpwcf_usock_path;
3013
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3014
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array("--node",$dotsshFolderOfsshAgent);
3015
			#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
3016
			#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
3017
			#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
3018
			#$conf["commandInBg"]="false";
3019
			#參考資料:
3020
			#無.
3021
			#備註:
3022
			#無.
3023
			$createDotsshFolderOfsshAgent=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3024
			unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3025
 
3026
			#如果執行shell失敗
3027
			if($createDotsshFolderOfsshAgent["status"]==="false"){
3028
 
3029
				#設置執行不正常
3030
				$result["status"]="false";
3031
 
3032
				#設置執行錯誤
3033
				$result["error"]=$createDotsshFolderOfsshAgent;
3034
 
3035
				#回傳結果
3036
				return $result;
3037
 
3038
				}#if end
3039
 
3040
			#如果執行異常
3041
			if($createDotsshFolderOfsshAgent["status"]==="false"){
3042
 
3043
				#設置執行不正常
3044
				$result["status"]="false";
3045
 
3046
				#設置執行錯誤
3047
				$result["error"]=$createDotsshFolderOfsshAgent;
3048
 
3049
				#回傳結果
3050
				return $result;
3051
 
3052
				}#if end
3053
 
3054
			#如果沒有得到輸出
3055
			if(!isset($createDotsshFolderOfsshAgent["content"][0])){
3056
 
3057
				#設置執行不正常
3058
				$result["status"]="false";
3059
 
3060
				#設置執行錯誤
3061
				$result["error"]=$createDotsshFolderOfsshAgent;
3062
 
3063
				#回傳結果
3064
				return $result;
3065
 
3066
				}#if end
3067
 
3068
			#如果輸出結果不是json
3069
			if(!json_validate($createDotsshFolderOfsshAgent["content"][0])){
3070
 
3071
				#設置執行不正常
3072
				$result["status"]="false";
3073
 
3074
				#設置執行錯誤
3075
				$result["error"]=$createDotsshFolderOfsshAgent;
3076
 
3077
				#回傳結果
3078
				return $result;
3079
 
3080
				}#if end
3081
 
3082
			#解析json
3083
			$node_info=json_decode($createDotsshFolderOfsshAgent["content"][0]);
3084
 
3085
			#若 $dotsshFolderOfsshAgent 的權限,不為 "rwx------"
3086
			if($node_info->ownerPerm!=="rwx" || $node_info->groupPerm!=="---" || $node_info->otherPerm!=="---"){
3087
 
3088
				#更新其權限設置
3089
				#函式說明:
3090
				#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
3091
				#回傳結果:
3092
				#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3093
				#$result["error"],錯誤訊息陣列.
3094
				#$result["function"],當前執行的函式名稱.
3095
				#$result["argu"],使用的參數.
3096
				#$result["content"],執行完指令的結果.
3097
				#必填參數:
3098
				#$conf["fileArgu"],字串,變數__FILE__的內容.
3099
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
3100
				#$conf["command"],字串,要執行的指令名稱.
3101
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="chmod";
3102
				#可省略參數:
3103
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
3104
				#$conf["sock"]=qbpwcf_usock_path;
3105
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3106
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array("700",$dotsshFolderOfsshAgent);
3107
				#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
3108
				#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
3109
				#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
3110
				#$conf["commandInBg"]="false";
3111
				#參考資料:
3112
				#無.
3113
				#備註:
3114
				#無.
3115
				$createDotsshFolderOfsshAgent=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3116
				unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3117
 
3118
				#如果執行shell失敗
3119
				if($createDotsshFolderOfsshAgent["status"]==="false"){
3120
 
3121
					#設置執行不正常
3122
					$result["status"]="false";
3123
 
3124
					#設置執行錯誤
3125
					$result["error"]=$createDotsshFolderOfsshAgent;
3126
 
3127
					#回傳結果
3128
					return $result;
3129
 
3130
					}#if end
3131
 
3132
				}#if end
3133
 
3134
			#若 $dotsshFolderOfsshAgent 的擁有着不為 $sshAgentAcct:$sshAgentAcct
3135
			if($node_info->ownerName!==$sshAgentAcct || $node_info->groupName!==$sshAgentAcct){
3136
 
3137
				#更新其擁有着設置
3138
				#函式說明:
3139
				#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
3140
				#回傳結果:
3141
				#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3142
				#$result["error"],錯誤訊息陣列.
3143
				#$result["function"],當前執行的函式名稱.
3144
				#$result["argu"],使用的參數.
3145
				#$result["content"],執行完指令的結果.
3146
				#必填參數:
3147
				#$conf["fileArgu"],字串,變數__FILE__的內容.
3148
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
3149
				#$conf["command"],字串,要執行的指令名稱.
3150
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="chown";
3151
				#可省略參數:
3152
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
3153
				#$conf["sock"]=qbpwcf_usock_path;
3154
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3155
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array($sshAgentAcct.":".$sshAgentAcct,$dotsshFolderOfsshAgent);
3156
				#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
3157
				#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
3158
				#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
3159
				#$conf["commandInBg"]="false";
3160
				#參考資料:
3161
				#無.
3162
				#備註:
3163
				#無.
3164
				$createDotsshFolderOfsshAgent=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3165
				unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3166
 
3167
				#如果執行shell失敗
3168
				if($createDotsshFolderOfsshAgent["status"]==="false"){
3169
 
3170
					#設置執行不正常
3171
					$result["status"]="false";
3172
 
3173
					#設置執行錯誤
3174
					$result["error"]=$createDotsshFolderOfsshAgent;
3175
 
3176
					#回傳結果
3177
					return $result;
3178
 
3179
					}#if end
3180
 
3181
				}#if end
3182
 
3183
			#設置要使用的ssh private key
3184
			#函式說明:
3185
			#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
3186
			#回傳結果:
3187
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3188
			#$result["error"],錯誤訊息陣列.
3189
			#$result["function"],當前執行的函式名稱.
3190
			#$result["argu"],使用的參數.
3191
			#$result["content"],執行完指令的結果.
3192
			#必填參數:
3193
			#$conf["fileArgu"],字串,變數__FILE__的內容.
3194
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
3195
			#$conf["command"],字串,要執行的指令名稱.
3196
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="echo";
3197
			#可省略參數:
3198
			#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
3199
			#$conf["sock"]=qbpwcf_usock_path;
3200
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3201
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array($sshPrivateKeyContent,">",$dotsshFolderOfsshAgent."/".$sshPrivateKeyFileName);
3202
			#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
3203
			#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
3204
			#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
3205
			#$conf["commandInBg"]="false";
3206
			#參考資料:
3207
			#無.
3208
			#備註:
3209
			#無.
3210
			$createSshPrivateKey=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3211
			unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3212
 
3213
			#如果執行shell失敗
3214
			if($createSshPrivateKey["status"]==="false"){
3215
 
3216
				#設置執行不正常
3217
				$result["status"]="false";
3218
 
3219
				#設置執行錯誤
3220
				$result["error"]=$createSshPrivateKey;
3221
 
3222
				#回傳結果
3223
				return $result;
3224
 
3225
				}#if end
3226
 
3227
			#取得 ssh privacy key 檔案的權限與擁有着
3228
			#函式說明:
3229
			#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
3230
			#回傳結果:
3231
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3232
			#$result["error"],錯誤訊息陣列.
3233
			#$result["function"],當前執行的函式名稱.
3234
			#$result["argu"],使用的參數.
3235
			#$result["content"],執行完指令的結果.
3236
			#必填參數:
3237
			#$conf["fileArgu"],字串,變數__FILE__的內容.
3238
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
3239
			#$conf["command"],字串,要執行的指令名稱.
3240
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="getNodeInfo.php";
3241
			#可省略參數:
3242
			#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
3243
			#$conf["sock"]=qbpwcf_usock_path;
3244
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3245
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array("--node",$dotsshFolderOfsshAgent."/".$sshPrivateKeyFileName);
3246
			#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
3247
			#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
3248
			#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
3249
			#$conf["commandInBg"]="false";
3250
			#參考資料:
3251
			#無.
3252
			#備註:
3253
			#無.
3254
			$getSshPrivateKeyFileInfo=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3255
			unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3256
 
3257
			#如果執行shell失敗
3258
			if($getSshPrivateKeyFileInfo["status"]==="false"){
3259
 
3260
				#設置執行不正常
3261
				$result["status"]="false";
3262
 
3263
				#設置執行錯誤
3264
				$result["error"]=$getSshPrivateKeyFileInfo;
3265
 
3266
				#回傳結果
3267
				return $result;
3268
 
3269
				}#if end
3270
 
3271
			#如果執行異常
3272
			if($createDotsshFolderOfsshAgent["status"]==="false"){
3273
 
3274
				#設置執行不正常
3275
				$result["status"]="false";
3276
 
3277
				#設置執行錯誤
3278
				$result["error"]=$getSshPrivateKeyFileInfo;
3279
 
3280
				#回傳結果
3281
				return $result;
3282
 
3283
				}#if end
3284
 
3285
			#如果沒有得到輸出
3286
			if(!isset($createDotsshFolderOfsshAgent["content"][0])){
3287
 
3288
				#設置執行不正常
3289
				$result["status"]="false";
3290
 
3291
				#設置執行錯誤
3292
				$result["error"]=$createDotsshFolderOfsshAgent;
3293
 
3294
				#回傳結果
3295
				return $result;
3296
 
3297
				}#if end
3298
 
3299
			#如果輸出結果不是json
3300
			if(!json_validate($createDotsshFolderOfsshAgent["content"][0])){
3301
 
3302
				#設置執行不正常
3303
				$result["status"]="false";
3304
 
3305
				#設置執行錯誤
3306
				$result["error"]=$createDotsshFolderOfsshAgent;
3307
 
3308
				#回傳結果
3309
				return $result;
3310
 
3311
				}#if end
3312
 
3313
			#解析json
3314
			$node_info=json_decode($createDotsshFolderOfsshAgent["content"][0]);
3315
 
3316
			#若 ssh privacy key 檔案的擁有着不為 $sshAgentAcct:$sshAgentAcct
3317
			if($node_info->ownerName!==$sshAgentAcct || $node_info->groupName!==$sshAgentAcct){
3318
 
3319
				#更新 ssh privacy key 的檔案擁有者
3320
				#函式說明:
3321
				#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
3322
				#回傳結果:
3323
				#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3324
				#$result["error"],錯誤訊息陣列.
3325
				#$result["function"],當前執行的函式名稱.
3326
				#$result["argu"],使用的參數.
3327
				#$result["content"],執行完指令的結果.
3328
				#必填參數:
3329
				#$conf["fileArgu"],字串,變數__FILE__的內容.
3330
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
3331
				#$conf["command"],字串,要執行的指令名稱.
3332
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="chmod";
3333
				#可省略參數:
3334
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
3335
				#$conf["sock"]=qbpwcf_usock_path;
3336
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3337
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array("700",$dotsshFolderOfsshAgent);
3338
				#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
3339
				#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
3340
				#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
3341
				#$conf["commandInBg"]="false";
3342
				#參考資料:
3343
				#無.
3344
				#備註:
3345
				#無.
3346
				$createDotsshFolderOfsshAgent=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3347
				unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3348
 
3349
				#如果執行shell失敗
3350
				if($createDotsshFolderOfsshAgent["status"]==="false"){
3351
 
3352
					#設置執行不正常
3353
					$result["status"]="false";
3354
 
3355
					#設置執行錯誤
3356
					$result["error"]=$createDotsshFolderOfsshAgent;
3357
 
3358
					#回傳結果
3359
					return $result;
3360
 
3361
					}#if end
3362
 
3363
				}#if end
3364
 
3365
			#若 ssh privacy key 檔案的權限不為 "rw-------"
3366
			if($node_info->ownerPerm!=="rw-" || $node_info->groupPerm!=="---" || $node_info->otherPerm!=="---"){
3367
 
3368
				#更新 ssh privacy key 的檔案擁有者
3369
				#函式說明:
3370
				#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
3371
				#回傳結果:
3372
				#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3373
				#$result["error"],錯誤訊息陣列.
3374
				#$result["function"],當前執行的函式名稱.
3375
				#$result["argu"],使用的參數.
3376
				#$result["content"],執行完指令的結果.
3377
				#必填參數:
3378
				#$conf["fileArgu"],字串,變數__FILE__的內容.
3379
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
3380
				#$conf["command"],字串,要執行的指令名稱.
3381
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="chown";
3382
				#可省略參數:
3383
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
3384
				#$conf["sock"]=qbpwcf_usock_path;
3385
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3386
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array($sshAgentAcct.":".$sshAgentAcct,$dotsshFolderOfsshAgent."/".$sshPrivateKeyFileName);
3387
				#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
3388
				#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
3389
				#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
3390
				#$conf["commandInBg"]="false";
3391
				#參考資料:
3392
				#無.
3393
				#備註:
3394
				#無.
3395
				$createDotsshFolderOfsshAgent=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3396
				unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3397
 
3398
				#如果執行shell失敗
3399
				if($createDotsshFolderOfsshAgent["status"]==="false"){
3400
 
3401
					#設置執行不正常
3402
					$result["status"]="false";
3403
 
3404
					#設置執行錯誤
3405
					$result["error"]=$createDotsshFolderOfsshAgent;
3406
 
3407
					#回傳結果
3408
					return $result;
3409
 
3410
					}#if end
3411
 
3412
				}#if end
3413
 
3414
			#嘗試進行連線,並確認是否成功
3415
			#函式說明:
3416
			#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
3417
			#回傳結果:
3418
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3419
			#$result["error"],錯誤訊息陣列.
3420
			#$result["function"],當前執行的函式名稱.
3421
			#$result["argu"],使用的參數.
3422
			#$result["content"],執行完指令的結果.
3423
			#必填參數:
3424
			#$conf["fileArgu"],字串,變數__FILE__的內容.
3425
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
3426
			#$conf["command"],字串,要執行的指令名稱.
3427
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]="echo";
3428
			#可省略參數:
3429
			#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php(sock::unixDomainSockServer) 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
3430
			#$conf["sock"]=qbpwcf_usock_path;
3431
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3432
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=array("env","|","ssh",$sshAgentAcct."@"."127.0.0.1","-i",$dotsshFolderOfsshAgent."/".$sshPrivateKeyFileName,"|","grep","SSH_CLIENT=127.0.0.1","|","wc","-l");
3433
			#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
3434
			#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
3435
			#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
3436
			#$conf["commandInBg"]="false";
3437
			#參考資料:
3438
			#無.
3439
			#備註:
3440
			#無.
3441
			$createDotsshFolderOfsshAgent=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3442
			unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
3443
 
3444
			#如果執行shell失敗
3445
			if($createDotsshFolderOfsshAgent["status"]==="false"){
3446
 
3447
				#設置執行不正常
3448
				$result["status"]="false";
3449
 
3450
				#設置執行錯誤
3451
				$result["error"]=$createDotsshFolderOfsshAgent;
3452
 
3453
				#回傳結果
3454
				return $result;
3455
 
3456
				}#if end
3 liveuser 3457
 
66 liveuser 3458
			#若得到的輸出未含有ssh登入的資訊(SSH_CLIENT=127.0.0.1 ...)
3459
			if($createDotsshFolderOfsshAgent["content"]!=="1"){
3 liveuser 3460
 
66 liveuser 3461
				#設置執行正常
3462
				$result["status"]="true";
3463
 
3464
				#設置使用者驗證失敗
3465
				$result["valid"]="false";
3466
 
3467
				#設置使用者不存在的警告
3468
				$result["warning"][]="使用者 \"".$conf["username"]."\"可能不存在或無法被ssh登入!";
3469
 
3470
				#回傳結果
3471
				return $result;
3472
 
3473
				}#if end
3474
 
3475
			#設置執行正常
3 liveuser 3476
			$result["status"]="true";
3477
 
66 liveuser 3478
			#設置使用者驗證正常
3479
			$result["valid"]="true";
3 liveuser 3480
 
3481
			#回傳結果
3482
			return $result;
66 liveuser 3483
 
3 liveuser 3484
			}#if end
3485
 
3486
		#反之
66 liveuser 3487
		else{
3 liveuser 3488
 
66 liveuser 3489
			#可以用 echo 'password' | su username -c 'echo valid' 來檢查使用者密碼是否正確
3490
			#檢查使用者是否存在
3491
			#函式說明:
3492
			#呼叫shell執行系統命令,並取得回傳的內容.
3493
			#回傳的結果:
3494
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3495
			#$result["error"],錯誤訊息陣列.
3496
			#$result["function"],當前執行的函數名稱.
3497
			#$result["cmd"],執行的指令內容.
3498
			#$result["output"],爲執行完二元碼後的輸出陣列.
3499
			#必填的參數
3500
			#$conf["command"],字串,要執行的指令與.
3501
			$conf["external::callShell"]["command"]="echo";
3502
			#可省略參數:
3503
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
3504
			$conf["external::callShell"]["argu"]=array($conf["password"],"|","su",$conf["username"],"-c","echo valid");
3505
			#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
3506
			#$conf["enablePrintDescription"]="true";
3507
			#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容.
3508
			#$conf["printDescription"]="";
3509
			#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".
3510
			#$conf["escapeshellarg"]="false";
3511
			#$conf["username"],字串,要用什麼使用者來執行,預設為執行apache的使用者.
3512
			#$conf["external::callShell"]["username"]="";
3513
			#$conf["password"],字串,與$conf["username"]搭配的使用者密碼,預設不使用密碼.
3514
			#$conf["external::callShell"]["password"]="";
3515
			#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要;"false"代表不要,預設為"false".
3516
			$conf["external::callShell"]["useScript"]="true";
3517
			#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 ".qbpwcf_tmp/external/callShell/".
3518
			#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
3519
			#$conf["fileArgu"],字串,變數__FILE__的內容,預設為當前檔案的路徑與名稱.
3520
			$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];
3521
			#備註:
3522
			#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行.使用root身份可能會被selinux阻擋.
3523
			#參考資料:
3524
			#exec=>http://php.net/manual/en/function.exec.php
3525
			#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
3526
			#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
3527
			$callShell=external::callShell($conf["external::callShell"]);
3528
			unset($conf["external::callShell"]);
3 liveuser 3529
 
66 liveuser 3530
			#如果執行shell失敗
3531
			if($callShell["status"]==="false"){
3532
 
3533
				#設置執行不正常
3534
				$result["status"]="false";
3535
 
3536
				#設置執行錯誤
3537
				$result["error"]=$callShell;
3538
 
3539
				#回傳結果
3540
				return $result;
3541
 
3542
				}#if end
3543
 
3544
			#範例輸出:
3545
			#Script started on Sat 05 Nov 2016 06:08:31 PM CST
3546
			#Password: valid
3 liveuser 3547
 
66 liveuser 3548
			#如果輸出 "valid"
3549
			if($callShell["output"][1]=="Password: valid"){
3550
 
3551
				#代表使用者密碼正確
3552
 
3553
				#設置執行正常
3554
				$result["status"]="true";
3555
 
3556
				#設置使用者驗證失敗
3557
				$result["valid"]="true";
3558
 
3559
				#回傳結果
3560
				return $result;
3561
 
3562
				}#if end
3 liveuser 3563
 
66 liveuser 3564
			#反之如果是
3565
			else if($callShell["output"][1]==="Password: su: Authentication failure"){
3566
 
3567
				#代表使用者密碼不正確
3568
				$result["status"]="true";
3569
 
3570
				#設置使用者驗證失敗
3571
				$result["valid"]="false";
3572
 
3573
				#設置使用者不存在的警告
3574
				$result["warning"][]="使用者 \"".$conf["username"]."\" 的密碼不為 \"".$conf["password"]."\" !";
3575
 
3576
				#回傳結果
3577
				return $result;
3578
 
3579
				}#if end
3580
 
3581
			#反之
3582
			else{
3583
 
3584
				#設置執行不正常
3585
				$result["status"]="false";
3586
 
3587
				#設置錯誤訊息
3588
				$result["error"][]="非預期的輸出結果!";
3589
 
3590
				#設置錯誤訊息
3591
				$result["error"][]=$callShell;
3592
 
3593
				#回傳結果
3594
				return $result;
3595
 
3596
				}#else end
3597
 
3 liveuser 3598
			}#else end
3599
 
3600
		#設置執行不正常
3601
		$result["status"]="false";
3602
 
3603
		#設置錯誤訊息
66 liveuser 3604
		$result["error"][]="非預期的結果!";
3 liveuser 3605
 
3606
		#回傳結果
3607
		return $result;
3608
 
3609
		}#function validUser end
3610
 
3611
	/*
3612
	#函式說明:
3613
	#用php的password_hash方法來單向加密密碼.  
3614
	#回傳結果:
3615
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3616
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
3617
	#$result["function"],當前執行的函式名稱.
3618
	#$result["content"],呼叫完WebService所得回傳結果.
3619
	#必填參數:
3620
	#無
3621
	#可省略參數:
3622
	#$conf["password"],字串,要加密的密碼,預設為"qbpwcf".
3623
	#$conf["password"]="qbpwcf";
3624
	#參考資料:
3625
	#無.
3626
	#備註:
3627
	#無.
3628
	*/
3629
	public static function encodePassword(&$conf=array()){
3630
 
3631
		#初始化要回傳的結果
3632
		$result=array();
3633
 
3634
		#取得當前執行的函數名稱
3635
		$result["function"]=__FUNCTION__;
3636
 
3637
		#如果沒有參數
3638
		if(func_num_args()==0){
3639
 
3640
			#設置執行失敗
3641
			$result["status"]="false";
3642
 
3643
			#設置執行錯誤訊息
3644
			$result["error"]="函數".$result["function"]."需要參數";
3645
 
3646
			#回傳結果
3647
			return $result;
3648
 
3649
			}#if end
3650
 
3651
		#取得參數
3652
		$result["argu"]=$conf;
3653
 
3654
		#如果 $conf 不為陣列
3655
		if(gettype($conf)!=="array"){
3656
 
3657
			#設置執行失敗
3658
			$result["status"]="false";
3659
 
3660
			#設置執行錯誤訊息
3661
			$result["error"][]="\$conf變數須為陣列形態";
3662
 
3663
			#如果傳入的參數為 null
3664
			if($conf===null){
3665
 
3666
				#設置執行錯誤訊息
3667
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3668
 
3669
				}#if end
3670
 
3671
			#回傳結果
3672
			return $result;
3673
 
3674
			}#if end
3675
 
3676
		#檢查參數
3677
		#函式說明:
3678
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3679
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3680
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
3681
		#$result["function"],當前執行的函式名稱.
3682
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3683
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3684
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3685
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
3686
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
3687
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3688
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3689
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3690
		#必填寫的參數:
3691
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3692
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
3693
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3694
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3695
		#可以省略的參數:
3696
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3697
		#$conf["mustBeFilledVariableName"]=array();
3698
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
3699
		#$conf["mustBeFilledVariableType"]=array();
3700
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
3701
		#$conf["canBeEmptyString"]="false";
3702
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3703
		#$conf["canNotBeEmpty"]=array();
3704
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3705
		#$conf["canBeEmpty"]=array();
3706
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
3707
		#$conf["skipableVariableCanNotBeEmpty"]=array();
3708
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3709
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("password");
3710
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
3711
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
3712
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3713
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("qbpwcf");
3714
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
3715
		#$conf["disallowAllSkipableVarIsEmpty"]="";
3716
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
3717
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
3718
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3719
		#$conf["arrayCountEqualCheck"][]=array();
3720
		#參考資料來源:
3721
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3722
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3723
		unset($conf["variableCheck::checkArguments"]);
3724
 
3725
		#如果驗證失敗
3726
		if($checkArguments["status"]==="false"){
3727
 
3728
			#設置執行失敗
3729
			$result["status"]="false";
3730
 
3731
			#設置錯誤訊息
3732
			$result["error"]=$checkArguments;
3733
 
3734
			#回傳結果
3735
			return $result;
3736
 
3737
			}#if end
3738
 
3739
		#如果驗證不成功
3740
		if($checkArguments["passed"]==="false"){
3741
 
3742
			#設置執行失敗
3743
			$result["status"]="false";
3744
 
3745
			#設置錯誤訊息
3746
			$result["error"]=$checkArguments;
3747
 
3748
			#回傳結果
3749
			return $result;
3750
 
3751
			}#if end
3752
 
3753
		#取得加密好的密碼
3754
		$result["content"]=password_hash($conf["password"],PASSWORD_DEFAULT);
3755
 
3756
		#設置執行正常
3757
		$result["status"]="true";
3758
 
3759
		#回傳結果
3760
		return $result;
3761
 
3762
		}#function encodePassword end
3763
 
3764
	/*
3765
	#函式說明:
3766
	#用php的password_verify方法來驗證密碼是否正確.  
3767
	#回傳結果:
3768
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3769
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
3770
	#$result["function"],當前執行的函式名稱.
3771
	#$result["content"],呼叫完WebService所得回傳結果.
3772
	#必填參數:
3773
	#$conf["input"],字串,要檢查是否正確的待驗證密碼.
3774
	$conf["input"]="";
3775
	#$conf["password"],字串,透過encodePassword加密後的密碼.
3776
	$conf["password"]="";
3777
	#可省略參數:
3778
	#無.
3779
	#參考資料:
3780
	#無.
3781
	#備註:
3782
	#無.
3783
	*/
3784
	public static function validPassword(&$conf=array()){
3785
 
3786
		#初始化要回傳的結果
3787
		$result=array();
3788
 
3789
		#取得當前執行的函數名稱
3790
		$result["function"]=__FUNCTION__;
3791
 
3792
		#如果沒有參數
3793
		if(func_num_args()==0){
3794
 
3795
			#設置執行失敗
3796
			$result["status"]="false";
3797
 
3798
			#設置執行錯誤訊息
3799
			$result["error"]="函數".$result["function"]."需要參數";
3800
 
3801
			#回傳結果
3802
			return $result;
3803
 
3804
			}#if end
3805
 
3806
		#取得參數
3807
		$result["argu"]=$conf;
3808
 
3809
		#如果 $conf 不為陣列
3810
		if(gettype($conf)!=="array"){
3811
 
3812
			#設置執行失敗
3813
			$result["status"]="false";
3814
 
3815
			#設置執行錯誤訊息
3816
			$result["error"][]="\$conf變數須為陣列形態";
3817
 
3818
			#如果傳入的參數為 null
3819
			if($conf===null){
3820
 
3821
				#設置執行錯誤訊息
3822
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3823
 
3824
				}#if end
3825
 
3826
			#回傳結果
3827
			return $result;
3828
 
3829
			}#if end
3830
 
3831
		#檢查參數
3832
		#函式說明:
3833
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3834
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3835
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
3836
		#$result["function"],當前執行的函式名稱.
3837
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3838
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3839
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3840
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
3841
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
3842
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3843
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3844
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3845
		#必填寫的參數:
3846
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3847
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
3848
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3849
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3850
		#可以省略的參數:
3851
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3852
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("input","password");
3853
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
3854
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
3855
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
3856
		#$conf["canBeEmptyString"]="false";
3857
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3858
		#$conf["canNotBeEmpty"]=array();
3859
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3860
		#$conf["canBeEmpty"]=array();
3861
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
3862
		#$conf["skipableVariableCanNotBeEmpty"]=array();
3863
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3864
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("password");
3865
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
3866
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
3867
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3868
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("qbpwcf");
3869
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
3870
		#$conf["disallowAllSkipableVarIsEmpty"]="";
3871
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
3872
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
3873
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3874
		#$conf["arrayCountEqualCheck"][]=array();
3875
		#參考資料來源:
3876
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3877
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3878
		unset($conf["variableCheck::checkArguments"]);
3879
 
3880
		#如果驗證失敗
3881
		if($checkArguments["status"]==="false"){
3882
 
3883
			#設置執行失敗
3884
			$result["status"]="false";
3885
 
3886
			#設置錯誤訊息
3887
			$result["error"]=$checkArguments;
3888
 
3889
			#回傳結果
3890
			return $result;
3891
 
3892
			}#if end
3893
 
3894
		#如果驗證不成功
3895
		if($checkArguments["passed"]==="false"){
3896
 
3897
			#設置執行失敗
3898
			$result["status"]="false";
3899
 
3900
			#設置錯誤訊息
3901
			$result["error"]=$checkArguments;
3902
 
3903
			#回傳結果
3904
			return $result;
3905
 
3906
			}#if end
3907
 
3908
		#儲存驗證後的結果
3909
		$pass=password_verify($conf["input"],$conf["password"]);
3910
 
3911
		#如果驗證成功
3912
		if($pass){
3913
 
3914
			#設置驗證成功
3915
			$result["passed"]="true";
3916
 
3917
			}#if end
3918
 
3919
		#反之驗證失敗
3920
		else{
3921
 
3922
			#設置驗證成功
3923
			$result["passed"]="false";
3924
 
3925
			}#else end
3926
 
3927
		#設置執行正常
3928
		$result["status"]="true";
3929
 
3930
		#回傳結果
3931
		return $result;
3932
 
3933
		}#function validPassword end
3934
 
66 liveuser 3935
	/*
3936
	#函式說明:
3937
	#id指令來取得目標賬號的群組資訊
3938
	#回傳結果:
3939
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3940
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
3941
	#$result["function"],當前執行的函式名稱.
3942
	#$result["content"],呼叫完WebService所得回傳結果.
3943
	#$result["content"]["groupId"],群組的id.
3944
	#$result["content"]["belongGroupName"],陣列,隸屬的群組名稱陣列.
3945
	#$result["content"]["belongGroupId"],陣列,隸屬的群組id.
3946
	#必填參數:
3947
	#$conf["user"],字串,要取得群組資訊的目標使用者名稱.
3948
	$conf["user"]="";
3949
	#可省略參數:
3950
	#無.
3951
	#參考資料:
3952
	#無.
3953
	#備註:
3954
	#無.
3955
	*/
3956
	public static function getUserGroup(&$conf){
3957
 
3958
		#初始化要回傳的結果
3959
		$result=array();
3960
 
3961
		#取得當前執行的函數名稱
3962
		$result["function"]=__FUNCTION__;
3963
 
3964
		#如果沒有參數
3965
		if(func_num_args()==0){
3966
 
3967
			#設置執行失敗
3968
			$result["status"]="false";
3969
 
3970
			#設置執行錯誤訊息
3971
			$result["error"]="函數".$result["function"]."需要參數";
3972
 
3973
			#回傳結果
3974
			return $result;
3975
 
3976
			}#if end
3977
 
3978
		#取得參數
3979
		$result["argu"]=$conf;
3980
 
3981
		#如果 $conf 不為陣列
3982
		if(gettype($conf)!=="array"){
3983
 
3984
			#設置執行失敗
3985
			$result["status"]="false";
3986
 
3987
			#設置執行錯誤訊息
3988
			$result["error"][]="\$conf變數須為陣列形態";
3989
 
3990
			#如果傳入的參數為 null
3991
			if($conf===null){
3992
 
3993
				#設置執行錯誤訊息
3994
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3995
 
3996
				}#if end
3997
 
3998
			#回傳結果
3999
			return $result;
4000
 
4001
			}#if end
4002
 
4003
		#函式說明:
4004
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
4005
		#回傳結果:
4006
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4007
		#$result["error"],執行不正常結束的錯訊息陣列.
4008
		#$result["simpleError"],簡單表示的錯誤訊息.
4009
		#$result["function"],當前執行的函式名稱.
4010
		#$result["argu"],設置給予的參數.
4011
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
4012
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
4013
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
4014
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
4015
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
4016
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4017
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4018
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4019
		#必填參數:
4020
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4021
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4022
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4023
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4024
		#可省略參數:
4025
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4026
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("user");
4027
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
4028
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
4029
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
4030
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
4031
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
4032
		#$conf["canNotBeEmpty"]=array();
4033
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
4034
		#$conf["canBeEmpty"]=array();
4035
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4036
		#$conf["skipableVariableCanNotBeEmpty"]=array();
4037
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4038
		#$conf["skipableVariableName"]=array();
4039
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4040
		#$conf["skipableVariableType"]=array();
4041
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4042
		#$conf["skipableVarDefaultValue"]=array("");
4043
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4044
		#$conf["disallowAllSkipableVarIsEmpty"]="";
4045
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
4046
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
4047
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
4048
		#$conf["disallowAllSkipableVarNotExist"]="";
4049
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
4050
		#$conf["arrayCountEqualCheck"][]=array();
4051
		#參考資料:
4052
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4053
		#備註:
4054
		#無.
4055
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4056
		unset($conf["variableCheck::checkArguments"]);
4057
 
4058
		#如果驗證失敗
4059
		if($checkArguments["status"]==="false"){
4060
 
4061
			#設置執行失敗
4062
			$result["status"]="false";
4063
 
4064
			#設置錯誤訊息
4065
			$result["error"]=$checkArguments;
4066
 
4067
			#回傳結果
4068
			return $result;
4069
 
4070
			}#if end
4071
 
4072
		#如果驗證不成功
4073
		if($checkArguments["passed"]==="false"){
4074
 
4075
			#設置執行失敗
4076
			$result["status"]="false";
4077
 
4078
			#設置錯誤訊息
4079
			$result["error"]=$checkArguments;
4080
 
4081
			#回傳結果
4082
			return $result;
4083
 
4084
			}#if end
4085
 
4086
		#函式說明:
4087
		#呼叫shell執行系統命令,並取得回傳的內容.
4088
		#回傳結果:
4089
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4090
		#$result["error"],錯誤訊息陣列.
4091
		#$result["function"],當前執行的函數名稱.
4092
		#$result["argu"],使用的參數.
4093
		#$result["cmd"],執行的指令內容.
4094
		#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.
4095
		#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.
4096
		#$result["content"],為執行完後的輸出字串.
4097
		#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.
4098
		#$result["running"],是否還在執行.
4099
		#$result["pid"],pid.
4100
		#$result["statusCode"],執行結束後的代碼.
4101
		#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
4102
		#$result["noEcaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
4103
		#必填參數:
4104
		#$conf["command"],字串,要執行的指令.
4105
		$conf["external::callShell"]["command"]="id";
4106
		#$conf["fileArgu"],字串,變數__FILE__的內容.
4107
		$conf["external::callShell"]["fileArgu"]=__FILE__;
4108
		#可省略參數:
4109
		#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
4110
		$conf["external::callShell"]["argu"]=array($user);
4111
		#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
4112
		#$conf["arguIsAddr"]=array();
4113
		#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
4114
		#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
4115
		#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
4116
		#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
4117
		#$conf["enablePrintDescription"]="true";
4118
		#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.
4119
		#$conf["printDescription"]="";
4120
		#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.
4121
		$conf["external::callShell"]["escapeshellarg"]="true";
4122
		#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.
4123
		#$conf["thereIsShellVar"]=array();
4124
		#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.
4125
		#$conf["username"]="";
4126
		#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
4127
		#$conf["password"]="";
4128
		#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".
4129
		#$conf["useScript"]="";
4130
		#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".
4131
		#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
4132
		#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
4133
		#$conf["inBackGround"]="";
4134
		#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
4135
		#$conf["getErr"]="false";
4136
		#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
4137
		#$conf["doNotRun"]="false";
4138
		#參考資料:
4139
		#exec=>http://php.net/manual/en/function.exec.php
4140
		#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
4141
		#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
4142
		#備註:
4143
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
4144
		#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
4145
		$callShell=external::callShell($conf["external::callShell"]);
4146
		unset($conf["external::callShell"]);
4147
 
4148
		#如果執行異常
4149
		if($callShell["status"]==="false"){
4150
 
4151
			#設置執行失敗
4152
			$result["status"]="false";
4153
 
4154
			#設置錯誤訊息
4155
			$result["error"]=$callShell;
4156
 
4157
			#回傳結果
4158
			return $result;
4159
 
4160
			}#if end
4161
 
4162
		#若輸出不對
4163
		if(count($callShell["content"])===0){
4164
 
4165
			#設置執行失敗
4166
			$result["status"]="false";
4167
 
4168
			#設置錯誤訊息
4169
			$result["error"]=$callShell;
4170
 
4171
			#回傳結果
4172
			return $result;
4173
 
4174
			}#if end
4175
 
4176
		#解析輸出資訊
4177
		#範例輸出:
4178
		#uid=1000(liveuser) gid=1000(liveuser) groups=1000(liveuser),10(wheel),1002(web)
4179
 
4180
		#函式說明:
4181
		#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.
4182
		#回傳結果:
4183
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4184
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
4185
		#$result["function"],當前執行的函式名稱.
4186
		#$result["argu"],所使用的參數.
4187
		#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.
4188
		#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.
4189
		#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.
4190
		#必填參數:
4191
		#$conf["input"],字串,要檢查的字串.
4192
		$conf["search::findSpecifyStrFormat"]["input"]=$callShell["content"][0];
4193
		#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.
4194
		$conf["search::findSpecifyStrFormat"]["format"]="uid=\${userId}(\${userName}) gid=\${groupId}(\${groupName}) groups=\${repeatedGroupId}(\${repeatedGroupName})\${otherGroupStr}";
4195
		#可省略參數:
4196
		#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.
4197
		#$conf["varEqual"]=array(null,"found");
4198
		#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.
4199
		#$conf["varCon"]=array("no_tail"=>" not");
4200
		#參考資料:
4201
		#無.
4202
		#備註:
4203
		#無.
4204
		$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);
4205
		unset($conf["search::findSpecifyStrFormat"]);
4206
 
4207
		#如果執行異常
4208
		if($findSpecifyStrFormat["status"]==="false"){
4209
 
4210
			#設置執行失敗
4211
			$result["status"]="false";
4212
 
4213
			#設置錯誤訊息
4214
			$result["error"]=$findSpecifyStrFormat;
4215
 
4216
			#回傳結果
4217
			return $result;
4218
 
4219
			}#if end
4220
 
4221
		#如果沒有符合格式的內容
4222
		if($findSpecifyStrFormat["found"]==="false"){
4223
 
4224
			#設置執行失敗
4225
			$result["status"]="false";
4226
 
4227
			#設置錯誤訊息
4228
			$result["error"]=$findSpecifyStrFormat;
4229
 
4230
			#回傳結果
4231
			return $result;
4232
 
4233
			}#if end
4234
 
4235
		#另存使用者id
4236
		$userId=$findSpecifyStrFormat["parsedVar"]["userId"][0];
4237
 
4238
		#另存群組的id
4239
		$groupId=$findSpecifyStrFormat["parsedVar"]["groupId"][0];
4240
 
4241
		#另存隸屬其他群組的資訊
4242
		$othergGroupStr=$findSpecifyStrFormat["parsedVar"]["othergGroupStr"][0];
4243
 
4244
		#如果有其他群組資訊
4245
		if(!empty($othergGroupStr)){
4246
 
4247
			#用逗號切割結果出來
4248
			#函式說明:
4249
			#將固定格式的字串分開,並回傳分開的結果.
4250
			#回傳結果:
4251
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4252
			#$result["error"],錯誤訊息陣列
4253
			#$result["function"],當前執行的函數名稱.
4254
			#$result["argu"],使用的參數.
4255
			#$result["oriStr"],要分割的原始字串內容
4256
			#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
4257
			#$result["dataCounts"],爲總共分成幾段
4258
			#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
4259
			#必填參數:
4260
			#$conf["stringIn"],字串,要處理的字串.
4261
			$conf["stringProcess::spiltString"]["stringIn"]=$othergGroupStr;
4262
			#$conf["spiltSymbol"],字串,爲以哪個符號作爲分割.
4263
			$conf["stringProcess::spiltString"]["spiltSymbol"]=",";
4264
			#可省略參數:
4265
			#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
4266
			#$conf["allowEmptyStr"]="false";
4267
			#參考資料:
4268
			#無.
4269
			#備註:
4270
			#無.
4271
			$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
4272
			unset($conf["stringProcess::spiltString"]);
4273
 
4274
			#如果執行異常
4275
			if($spiltString["status"]==="false"){
4276
 
4277
				#設置執行失敗
4278
				$result["status"]="false";
4279
 
4280
				#設置錯誤訊息
4281
				$result["error"]=$spiltString;
4282
 
4283
				#回傳結果
4284
				return $result;
4285
 
4286
				}#if end
4287
 
4288
			#如果沒有符合格式的內容
4289
			if($spiltString["found"]==="false"){
4290
 
4291
				#設置執行失敗
4292
				$result["status"]="false";
4293
 
4294
				#設置錯誤訊息
4295
				$result["error"]=$spiltString;
4296
 
4297
				#回傳結果
4298
				return $result;
4299
 
4300
				}#if end
4301
 
4302
			#依照分隔成的段數
4303
			foreach($spiltString["dataArray"] as $oginfo){
4304
 
4305
				#解析groudId跟groupName
4306
 
4307
				#範例輸出:
4308
				#10(wheel)
4309
 
4310
				#函式說明:
4311
				#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.
4312
				#回傳結果:
4313
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4314
				#$reuslt["error"],執行不正常結束的錯訊息陣列.
4315
				#$result["function"],當前執行的函式名稱.
4316
				#$result["argu"],所使用的參數.
4317
				#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.
4318
				#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.
4319
				#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.
4320
				#必填參數:
4321
				#$conf["input"],字串,要檢查的字串.
4322
				$conf["search::findSpecifyStrFormat"]["input"]=$oginfo;
4323
				#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.
4324
				$conf["search::findSpecifyStrFormat"]["format"]="gid=\${groupId}(\${groupName})";
4325
				#可省略參數:
4326
				#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.
4327
				#$conf["varEqual"]=array(null,"found");
4328
				#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.
4329
				#$conf["varCon"]=array("no_tail"=>" not");
4330
				#參考資料:
4331
				#無.
4332
				#備註:
4333
				#無.
4334
				$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);
4335
				unset($conf["search::findSpecifyStrFormat"]);
4336
 
4337
				#如果執行異常
4338
				if($findSpecifyStrFormat["status"]==="false"){
4339
 
4340
					#設置執行失敗
4341
					$result["status"]="false";
4342
 
4343
					#設置錯誤訊息
4344
					$result["error"]=$findSpecifyStrFormat;
4345
 
4346
					#回傳結果
4347
					return $result;
4348
 
4349
					}#if end
4350
 
4351
				#如果格式異常
4352
				if($findSpecifyStrFormat["found"]==="false"){
4353
 
4354
					#設置執行失敗
4355
					$result["status"]="false";
4356
 
4357
					#設置錯誤訊息
4358
					$result["error"]=$findSpecifyStrFormat;
4359
 
4360
					#回傳結果
4361
					return $result;
4362
 
4363
					}#if end
4364
 
4365
				#如果是 user 自己的群組
4366
				if($findSpecifyStrFormat["parsedVar"]["groupName"][0]===$user){
4367
 
4368
					#跳過該群組資訊
4369
					continue;
4370
 
4371
					}#if end	
4372
 
4373
				#儲存其他 group id
4374
				$otherGroupId[]=$findSpecifyStrFormat["parsedVar"]["groupId"][0];
4375
 
4376
				#儲存其他 group name
4377
				$otherGroupName[]=$findSpecifyStrFormat["parsedVar"]["groupName"][0];
4378
 
4379
				}#foreach end
4380
 
4381
			}#if end
4382
 
4383
		#設置 group id 結果
4384
		$result["content"]["groupId"]=$groupId;
4385
 
4386
		#設置隸屬的 group 名稱
4387
		$result["content"]["belongGroupName"]=$otherGroupName;
4388
 
4389
		#設置隸屬的 group id
4390
		$result["content"]["belongGroupId"]=$otherGroupId;
4391
 
4392
		#設置執行正常
4393
		$result["status"]="true";
4394
 
4395
		#回傳結果 
4396
		return $result;
4397
 
4398
		}#function getUserGroup end 
4399
 
3 liveuser 4400
	}#class authenticate end
4401
 
4402
?>