Subversion Repositories php-qbpwcf

Rev

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

Rev 293 Rev 294
Line 3763... Line 3763...
3763
					return $result;
3763
					return $result;
3764
 
3764
 
3765
					}#if end
3765
					}#if end
3766
					
3766
					
3767
				#儲存程序資訊
3767
				#儲存程序資訊
3768
				$procs[]=$proc;	
3768
				$procs[$lineNo]=$proc;	
3769
				
3769
				
3770
				#換解析下一行
3770
				#換解析下一行
3771
				continue;
3771
				continue;
3772
			
3772
			
3773
				}#if end
3773
				}#if end
Line 6590... Line 6590...
6590
							continue 2;
6590
							continue 2;
6591
						
6591
						
6592
							}#else end
6592
							}#else end
6593
					
6593
					
6594
						}#if end
6594
						}#if end
6595
				
6595
					
-
 
6596
					#反之如果跟既有的 query、type有相同,且type 為 "CNAME"
-
 
6597
					else if($newRR["query"]===$oldRR["query"] && $newRR["type"]===$oldRR["type"] && $newRR["type"]==="CNAME"){
-
 
6598
					
-
 
6599
						#更新既有 RR 的 value
-
 
6600
						$result["content"][$index]["value"]=$newRR["value"];
-
 
6601
						
-
 
6602
						#換看下一筆newRR
-
 
6603
						continue 2;
-
 
6604
					
-
 
6605
						}#if end
-
 
6606
						
6596
					}#if end
6607
					}#if end
6597
					
6608
					
6598
				}#foreach end
6609
				}#foreach end
6599
				
6610
				
6600
			#儲存確定要新增的RR
6611
			#儲存確定要新增的RR
Line 8251... Line 8262...
8251
		$c_crt="certificate.crt";
8262
		$c_crt="certificate.crt";
8252
		
8263
		
8253
		#儲存成變數以便透過object呼叫
8264
		#儲存成變數以便透過object呼叫
8254
		$ca_crt="ca_bundle.crt";
8265
		$ca_crt="ca_bundle.crt";
8255
		
8266
		
-
 
8267
		#如果沒有該有的 certificate.crt 跟 ca_bundle.crt 物件
-
 
8268
		if(!isset($json->$c_crt) || !isset($json->$ca_crt)){
-
 
8269
		
-
 
8270
			#設置錯誤識別
-
 
8271
			$result["status"]="false";
-
 
8272
 
-
 
8273
			#設置錯誤訊息
-
 
8274
			$result["error"]=$json;
-
 
8275
 
-
 
8276
			#回傳結果
-
 
8277
			return $result;
-
 
8278
		
-
 
8279
			}#if end
-
 
8280
		
8256
		#取得certificate.crt的內容
8281
		#取得certificate.crt的內容
8257
		$result["certificate.crt"]=$json->$c_crt;
8282
		$result["certificate.crt"]=$json->$c_crt;
8258
		
8283
		
8259
		#取得ca_bundle.crt的內容
8284
		#取得ca_bundle.crt的內容
8260
		$result["ca_bundle.crt"]=$json->$ca_crt;
8285
		$result["ca_bundle.crt"]=$json->$ca_crt;
Line 9053... Line 9078...
9053
			$cInfo["dnsSerAddr"]=$conf["dnsSerAddr"][$index];
9078
			$cInfo["dnsSerAddr"]=$conf["dnsSerAddr"][$index];
9054
				
9079
				
9055
			#儲存 cName 的憑證更新後要做的事情.
9080
			#儲存 cName 的憑證更新後要做的事情.
9056
			$cInfo["actionAfterUpdateCert"]=$conf["actionAfterUpdateCert"][$index];
9081
			$cInfo["actionAfterUpdateCert"]=$conf["actionAfterUpdateCert"][$index];
9057
			
9082
			
-
 
9083
			#用 ";" 分割來取得有多少個動作要依序執行
-
 
9084
			#函式說明:
-
 
9085
			#將固定格式的字串分開,並回傳分開的結果.
-
 
9086
			#回傳結果:
-
 
9087
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
9088
			#$result["error"],錯誤訊息陣列
-
 
9089
			#$result["function"],當前執行的函數名稱.
-
 
9090
			#$result["argu"],使用的參數.
-
 
9091
			#$result["oriStr"],要分割的原始字串內容
-
 
9092
			#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
-
 
9093
			#$result["dataCounts"],爲總共分成幾段
-
 
9094
			#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
-
 
9095
			#必填參數:
-
 
9096
			#$conf["stringIn"],字串,要處理的字串.
-
 
9097
			$conf["stringProcess::spiltString"]["stringIn"]=$cInfo["actionAfterUpdateCert"];
-
 
9098
			#$conf["spiltSymbol"],字串,爲以哪個符號作爲分割.
-
 
9099
			$conf["stringProcess::spiltString"]["spiltSymbol"]=";";
-
 
9100
			#可省略參數:
-
 
9101
			#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
-
 
9102
			#$conf["allowEmptyStr"]="false";
-
 
9103
			#參考資料:
-
 
9104
			#無.
-
 
9105
			#備註:
-
 
9106
			#無.
-
 
9107
			$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
-
 
9108
			unset($conf["stringProcess::spiltString"]);
-
 
9109
			
-
 
9110
			#如果執行異常
-
 
9111
			if($spiltString["status"]==="false"){
-
 
9112
			
-
 
9113
				#設置錯誤識別
-
 
9114
				$result["status"]="false";
-
 
9115
 
-
 
9116
				#設置錯誤訊息
-
 
9117
				$result["error"]=$spiltString;
-
 
9118
 
-
 
9119
				#回傳結果
-
 
9120
				return $result;
-
 
9121
				
-
 
9122
				}#if end
-
 
9123
				
-
 
9124
			#如果沒有";"存在,代表格式不對
-
 
9125
			if($spiltString["found"]==="false"){
-
 
9126
			
-
 
9127
				#設置錯誤識別
-
 
9128
				$result["status"]="false";
-
 
9129
 
-
 
9130
				#設置錯誤訊息
-
 
9131
				$result["error"]=$spiltString;
-
 
9132
 
-
 
9133
				#回傳結果
-
 
9134
				return $result;
-
 
9135
			
-
 
9136
				}#if end
-
 
9137
				
-
 
9138
			#取得每個動作
-
 
9139
			$cInfo["actionAfterUpdateCert"]=$spiltString["dataArray"];
-
 
9140
			
9058
			#設置 certPath
9141
			#設置 certPath
9059
			$cInfo["ssl"]["certPath"]=$conf["certInfo"][$index]["certPath"];
9142
			$cInfo["ssl"]["certPath"]=$conf["certInfo"][$index]["certPath"];
9060
			
9143
			
9061
			#設置 pKey
9144
			#設置 pKey
9062
			$cInfo["ssl"]["pKey"]=$conf["certInfo"][$index]["pKey"];
9145
			$cInfo["ssl"]["pKey"]=$conf["certInfo"][$index]["pKey"];
Line 9453... Line 9536...
9453
				#回傳結果
9536
				#回傳結果
9454
				return $result;
9537
				return $result;
9455
			
9538
			
9456
				}#if end
9539
				}#if end
9457
			
9540
			
-
 
9541
			#如果有資料
-
 
9542
			if($getCertList["count"]>0){
-
 
9543
			
-
 
9544
				#檢查 common name
-
 
9545
				foreach($getCertList["certs"] as $certId=>$certInfo){
-
 
9546
				
-
 
9547
					#如果 common name 不符合
-
 
9548
					if($certInfo["cname"]!==$cName){
-
 
9549
					
-
 
9550
						#移除之
-
 
9551
						unset($getCertList["certs"][$certId]);
-
 
9552
						
-
 
9553
						#當頁筆數-1
-
 
9554
						$getCertList["count"]--;
-
 
9555
						
-
 
9556
						#總共筆數減少1
-
 
9557
						$getCertList["tCount"]--;
-
 
9558
					
-
 
9559
						}#if end
-
 
9560
					
-
 
9561
					}#foreach end
-
 
9562
					
-
 
9563
				}#if end
-
 
9564
			
9458
			#如果沒有憑證
9565
			#如果沒有憑證
9459
			if($getCertList["count"]===0){
9566
			if($getCertList["count"]===0){
9460
			
9567
			
9461
				#if enable debug
9568
				#if enable debug
9462
				if($debug){
9569
				if($debug){
Line 9995... Line 10102...
9995
						#回傳結果
10102
						#回傳結果
9996
						return $result;
10103
						return $result;
9997
					
10104
					
9998
						}#if end
10105
						}#if end
9999
					
10106
					
-
 
10107
					#if enable debug
-
 
10108
					if($debug){
-
 
10109
					
-
 
10110
						#debug msg
-
 
10111
						echo "Response of validating certificate for domain name(".$cName.") on zerossl".PHP_EOL;
-
 
10112
						
-
 
10113
						#debug msg
-
 
10114
						var_dump(__LINE__,$verifyDomain);
-
 
10115
					
-
 
10116
						}#if end
-
 
10117
					
10000
					/*
10118
					/*
10001
					範例json:
10119
					範例json:
10002
					{"id":"51cff04454e6a6860abfecc8072db602","type":"1","common_name":"silverblue-guest.qbpwcf.org","additional_domains":"","created":"2026-03-06 13:45:39","expires":"2026-06-04 23:59:59","status":"pending_validation","validation_type":"CNAME_CSR_HASH","validation_emails":"","replacement_for":"","fingerprint_sha1":null,"brand_validation":null,"validation":{"email_validation":{"silverblue-guest.qbpwcf.org":["admin@silverblue-guest.qbpwcf.org","administrator@silverblue-guest.qbpwcf.org","hostmaster@silverblue-guest.qbpwcf.org","postmaster@silverblue-guest.qbpwcf.org","webmaster@silverblue-guest.qbpwcf.org","admin@qbpwcf.org","administrator@qbpwcf.org","hostmaster@qbpwcf.org","postmaster@qbpwcf.org","webmaster@qbpwcf.org"]},"other_methods":{"silverblue-guest.qbpwcf.org":{"file_validation_url_http":"http:\/\/silverblue-guest.qbpwcf.org\/.well-known\/pki-validation\/383346FA54F492EC8B2A6C421A052827.txt","file_validation_url_https":"https:\/\/silverblue-guest.qbpwcf.org\/.well-known\/pki-validation\/383346FA54F492EC8B2A6C421A052827.txt","file_validation_content":["58B9EB7890F754D041698170B22D22205D710ED09B419A809E5C92C38195DD36","comodoca.com","627e45f007045f0"],"cname_validation_p1":"_383346FA54F492EC8B2A6C421A052827.silverblue-guest.qbpwcf.org","cname_validation_p2":"58B9EB7890F754D041698170B22D2220.5D710ED09B419A809E5C92C38195DD36.627e45f007045f0.comodoca.com"}}},"signature_algorithm_properties":null}
10120
					{"id":"51cff04454e6a6860abfecc8072db602","type":"1","common_name":"silverblue-guest.qbpwcf.org","additional_domains":"","created":"2026-03-06 13:45:39","expires":"2026-06-04 23:59:59","status":"pending_validation","validation_type":"CNAME_CSR_HASH","validation_emails":"","replacement_for":"","fingerprint_sha1":null,"brand_validation":null,"validation":{"email_validation":{"silverblue-guest.qbpwcf.org":["admin@silverblue-guest.qbpwcf.org","administrator@silverblue-guest.qbpwcf.org","hostmaster@silverblue-guest.qbpwcf.org","postmaster@silverblue-guest.qbpwcf.org","webmaster@silverblue-guest.qbpwcf.org","admin@qbpwcf.org","administrator@qbpwcf.org","hostmaster@qbpwcf.org","postmaster@qbpwcf.org","webmaster@qbpwcf.org"]},"other_methods":{"silverblue-guest.qbpwcf.org":{"file_validation_url_http":"http:\/\/silverblue-guest.qbpwcf.org\/.well-known\/pki-validation\/383346FA54F492EC8B2A6C421A052827.txt","file_validation_url_https":"https:\/\/silverblue-guest.qbpwcf.org\/.well-known\/pki-validation\/383346FA54F492EC8B2A6C421A052827.txt","file_validation_content":["58B9EB7890F754D041698170B22D22205D710ED09B419A809E5C92C38195DD36","comodoca.com","627e45f007045f0"],"cname_validation_p1":"_383346FA54F492EC8B2A6C421A052827.silverblue-guest.qbpwcf.org","cname_validation_p2":"58B9EB7890F754D041698170B22D2220.5D710ED09B419A809E5C92C38195DD36.627e45f007045f0.comodoca.com"}}},"signature_algorithm_properties":null}
10003
					*/
10121
					*/
10004
					
10122
					
Line 10007... Line 10125...
10007
 
10125
 
10008
					#如果回應含有 success
10126
					#如果回應含有 success
10009
					if(isset($verifyDomainRes->success)){
10127
					if(isset($verifyDomainRes->success)){
10010
					
10128
					
10011
						#如果是 zerossl 驗證失敗
10129
						#如果是 zerossl 驗證失敗
10012
						if($verifyDomainRes->success==="false"){
10130
						if($verifyDomainRes->success==="false" || $verifyDomainRes->success===false){
10013
						
10131
						
10014
							#如果是 CNAME 記錄找不到
10132
							#如果是 CNAME 記錄找不到
10015
							if($verifyDomainRes->error->code===0){
10133
							if($verifyDomainRes->error->code===0){
10016
							
10134
							
10017
								#取得錯誤訊息
10135
								#取得錯誤訊息
Line 10033... Line 10151...
10033
								
10151
								
10034
									}#if end
10152
									}#if end
10035
								
10153
								
10036
								#休息60秒
10154
								#休息60秒
10037
								sleep(60);
10155
								sleep(60);
-
 
10156
								
-
 
10157
								#再跑一次要求認證
-
 
10158
								continue;
10038
							
10159
							
10039
								}#if end
10160
								}#if end
10040
								
10161
								
10041
							#反之為不接受的錯誤訊息
10162
							#反之為不接受的錯誤訊息
10042
							else{
10163
							else{
Line 10153... Line 10274...
10153
										#debug msg
10274
										#debug msg
10154
										echo "Zerossl validated certificate for domain name(".$cName.").".PHP_EOL;
10275
										echo "Zerossl validated certificate for domain name(".$cName.").".PHP_EOL;
10155
									
10276
									
10156
										}#if end
10277
										}#if end
10157
								
10278
								
10158
									#結束等待
10279
									#結束等待,跳出 while
10159
									break 2;
10280
									break 2;
10160
								
10281
								
10161
									}#if end
10282
									}#if end
10162
									
10283
									
10163
								#如果 zerossl 尚在處理中
10284
								#如果 zerossl 尚在處理中
Line 10171... Line 10292...
10171
									
10292
									
10172
										}#if end
10293
										}#if end
10173
										
10294
										
10174
									#休息1分鐘
10295
									#休息1分鐘
10175
									sleep(60);
10296
									sleep(60);
-
 
10297
									
-
 
10298
									#再跑一次取得憑證狀態
-
 
10299
									continue;
10176
								
10300
								
10177
									}#if end
10301
									}#if end
10178
								
10302
								
10179
								#反之
10303
								#反之
10180
								else{
10304
								else{
Line 10195... Line 10319...
10195
								}#while end
10319
								}#while end
10196
						
10320
						
10197
							}#if end
10321
							}#if end
10198
						
10322
						
10199
						}#if end
10323
						}#if end
-
 
10324
					
-
 
10325
					#反之.不應該執行到這邊
-
 
10326
					else{
-
 
10327
						
-
 
10328
						#設置錯誤識別
-
 
10329
						$result["status"]="false";
-
 
10330
 
-
 
10331
						#設置錯誤訊息
-
 
10332
						$result["error"]=$verifyDomain;
-
 
10333
 
-
 
10334
						#回傳結果
-
 
10335
						return $result;
-
 
10336
					
-
 
10337
						}#else 	
10200
				
10338
				
10201
					}#while end
10339
					}#while end
10202
 
10340
				
10203
				#if enable debug
10341
				#if enable debug
10204
				if($debug){
10342
				if($debug){
10205
				
10343
				
10206
					#debug msg
10344
					#debug msg
10207
					echo "Downloading certificate for domain name(".$cName.")".PHP_EOL;
10345
					echo "Downloading certificate for domain name(".$cName.")".PHP_EOL;
Line 10314... Line 10452...
10314
					
10452
					
10315
				#儲存 actionAfterUpdateCert
10453
				#儲存 actionAfterUpdateCert
10316
				$action=$cInfo["actionAfterUpdateCert"];
10454
				$action=$cInfo["actionAfterUpdateCert"];
10317
				
10455
				
10318
				#如果有多個指令要執行
10456
				#如果有多個指令要執行
10319
				if(gettype($action[0])==="array"){
10457
				if(count($action)>1){
10320
					
10458
					
10321
					#if enable debug
10459
					#if enable debug
10322
					if($debug){
10460
					if($debug){
10323
					
10461
					
10324
						#debug msg
10462
						#debug msg
Line 10344... Line 10482...
10344
							echo ".".PHP_EOL;
10482
							echo ".".PHP_EOL;
10345
						
10483
						
10346
							}#if end
10484
							}#if end
10347
					
10485
					
10348
						#函式說明:
10486
						#函式說明:
10349
						#解析指令與參數,回傳指令與參數給 callShell 函式使用.
-
 
10350
						#回傳結果:
-
 
10351
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
10352
						#$result["error"],錯誤訊息陣列.
-
 
10353
						#$result["function"],當前執行的函數名稱.
-
 
10354
						#$result["argu"],使用的參數.
-
 
10355
						#$result["cmd"],執行的指令名稱.
-
 
10356
						#$result["params"],執行指令伴隨的參數.
-
 
10357
						#必填參數:
-
 
10358
						#$conf["cmdArray"],字串陣列,要執行的指令字串.
-
 
10359
						$conf["external::callShellHelper"]["cmdArray"]=$ac;
-
 
10360
						#可省略參數:
-
 
10361
						#無.
-
 
10362
						#參考資料:
-
 
10363
						#array_shift=>https://www.php.net/manual/en/function.array-shift.php
-
 
10364
						#備註:
-
 
10365
						#無.
-
 
10366
						$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);
-
 
10367
						unset($conf["external::callShellHelper"]);
-
 
10368
					
-
 
10369
						#如果執行異常
-
 
10370
						if($callShellHelper["status"]==="false"){
-
 
10371
						
-
 
10372
							#設置錯誤識別
-
 
10373
							$result["status"]="false";
-
 
10374
 
-
 
10375
							#設置錯誤訊息
-
 
10376
							$result["error"]=$callShellHelper;
-
 
10377
 
-
 
10378
							#回傳結果
-
 
10379
							return $result;
-
 
10380
						
-
 
10381
							}#if end
-
 
10382
							
-
 
10383
						#函式說明:
-
 
10384
						#呼叫shell執行系統命令,並取得回傳的內容.
10487
						#呼叫shell執行系統命令,並取得回傳的內容.
10385
						#回傳結果:
10488
						#回傳結果:
10386
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
10489
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
10387
						#$result["error"],錯誤訊息陣列.
10490
						#$result["error"],錯誤訊息陣列.
10388
						#$result["function"],當前執行的函數名稱.
10491
						#$result["function"],當前執行的函數名稱.
Line 10397... Line 10500...
10397
						#$result["statusCode"],執行結束後的代碼.
10500
						#$result["statusCode"],執行結束後的代碼.
10398
						#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
10501
						#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
10399
						#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
10502
						#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
10400
						#必填參數:
10503
						#必填參數:
10401
						#$conf["command"],字串,要執行的指令.
10504
						#$conf["command"],字串,要執行的指令.
10402
						$conf["external::callShell"]["command"]=$callShellHelper["cmd"];
10505
						$conf["external::callShell"]["command"]=$ac;
10403
						#$conf["fileArgu"],字串,變數__FILE__的內容.
10506
						#$conf["fileArgu"],字串,變數__FILE__的內容.
10404
						$conf["external::callShell"]["fileArgu"]=__FILE__;
10507
						$conf["external::callShell"]["fileArgu"]=__FILE__;
10405
						#可省略參數:
10508
						#可省略參數:
10406
						#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
10509
						#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
10407
						$conf["external::callShell"]["argu"]=$callShellHelper["params"];
10510
						#$conf["external::callShell"]["argu"]=$parseCmdString["argus"];
10408
						#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
10511
						#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
10409
						#$conf["arguIsAddr"]=array();
10512
						#$conf["arguIsAddr"]=array();
10410
						#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
10513
						#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
10411
						#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
10514
						#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
10412
						#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
10515
						#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
Line 10428... Line 10531...
10428
						#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
10531
						#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
10429
						#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
10532
						#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
10430
						#$conf["inBackGround"]="";
10533
						#$conf["inBackGround"]="";
10431
						#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
10534
						#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
10432
						#$conf["getErr"]="false";
10535
						#$conf["getErr"]="false";
-
 
10536
						#$conf["cmdContainArgu"],字串,cmd參數是否已經含有參數,預設為"false"代表沒有;反之為"true".
-
 
10537
						$conf["external::callShell"]["cmdContainArgu"]="true";
10433
						#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
10538
						#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
10434
						#$conf["doNotRun"]="false";
10539
						#$conf["doNotRun"]="false";
10435
						#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.
10540
						#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.
10436
						#$conf["remoteIp"]="";
10541
						#$conf["remoteIp"]="";
10437
						#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.
10542
						#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.
Line 10445... Line 10550...
10445
						#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
10550
						#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
10446
						$callShell=external::callShell($conf["external::callShell"]);
10551
						$callShell=external::callShell($conf["external::callShell"]);
10447
						unset($conf["external::callShell"]);
10552
						unset($conf["external::callShell"]);
10448
					
10553
					
10449
						#如果執行異常
10554
						#如果執行異常
10450
						if($callShellHelper["status"]==="false"){
10555
						if($callShell["status"]==="false"){
10451
						
10556
						
10452
							#設置錯誤識別
10557
							#設置錯誤識別
10453
							$result["status"]="false";
10558
							$result["status"]="false";
10454
 
10559
 
10455
							#設置錯誤訊息
10560
							#設置錯誤訊息
Line 10482... Line 10587...
10482
						echo ".".PHP_EOL;
10587
						echo ".".PHP_EOL;
10483
					
10588
					
10484
						}#if end
10589
						}#if end
10485
				
10590
				
10486
					#函式說明:
10591
					#函式說明:
10487
					#將字串進行解析,變成多個參數.
10592
					#將指令字串解析成陣列,方便給予 external::callShell 使用
10488
					#回傳結果:
10593
					#回傳結果:
10489
					#$result["status"],執行正常與否,"false"代表不正常,"true"代表正常.
10594
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
10595
					#$reuslt["error"],執行不正常結束的錯訊息陣列.
10490
					#$result["function"],當前執行的函式內容.
10596
					#$result["function"],當前執行的函式名稱.
10491
					#$result["error"],錯誤訊息陣列.
10597
					#$result["content"],解析好的指令陣列.
-
 
10598
					#$result["cmd"],解析好的指令名稱.
10492
					#$result["content"],參數陣列.
10599
					#$result["argus"],解析好的參數陣列.
10493
					#$result["count"],總共有幾個參數.
10600
					#$result["argu"],所使用的參數.
10494
					#必填參數:
10601
					#必填參數
10495
					#$conf["input"],字串,要解析成參數的字串.
10602
					#$conf["cmdStr"],字串,要解析的指令字串
10496
					$conf["stringProcess::parse"]["input"]=$action;
10603
					$conf["cmd::parseCmdString"]["cmdStr"]=$action[0];
10497
					#可省略參數:
10604
					#可省略參數:
10498
					#無.
10605
					#無.
10499
					#參考資料:
10606
					#參考資料:
10500
					#無.
10607
					#無.
10501
					#備註:
10608
					#備註:
10502
					#無.
10609
					#無.
10503
					$parse=stringProcess::parse($conf["stringProcess::parse"]);
10610
					$parseCmdString=cmd::parseCmdString($conf["cmd::parseCmdString"]);
10504
					unset($conf["stringProcess::parse"]);
10611
					unset($conf["cmd::parseCmdString"]);
10505
					
-
 
10506
					#如果執行異常
-
 
10507
					if($parse["status"]==="false"){
-
 
10508
					
-
 
10509
						#設置錯誤識別
-
 
10510
						$result["status"]="false";
-
 
10511
 
-
 
10512
						#設置錯誤訊息
-
 
10513
						$result["error"]=$parse;
-
 
10514
 
-
 
10515
						#回傳結果
-
 
10516
						return $result;
-
 
10517
					
-
 
10518
						}#if end
-
 
10519
				
-
 
10520
					#函式說明:
-
 
10521
					#解析指令與參數,回傳指令與參數給 callShell 函式使用.
-
 
10522
					#回傳結果:
-
 
10523
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
10524
					#$result["error"],錯誤訊息陣列.
-
 
10525
					#$result["function"],當前執行的函數名稱.
-
 
10526
					#$result["argu"],使用的參數.
-
 
10527
					#$result["cmd"],執行的指令名稱.
-
 
10528
					#$result["params"],執行指令伴隨的參數.
-
 
10529
					#必填參數:
-
 
10530
					#$conf["cmdArray"],字串陣列,要執行的指令字串.
-
 
10531
					$conf["external::callShellHelper"]["cmdArray"]=$parse["content"];
-
 
10532
					#可省略參數:
-
 
10533
					#無.
-
 
10534
					#參考資料:
-
 
10535
					#array_shift=>https://www.php.net/manual/en/function.array-shift.php
-
 
10536
					#備註:
-
 
10537
					#無.
-
 
10538
					$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);
-
 
10539
					unset($conf["external::callShellHelper"]);
-
 
10540
				
10612
				
10541
					#如果執行異常
10613
					#如果執行異常
10542
					if($callShellHelper["status"]==="false"){
10614
					if($parseCmdString["status"]==="false"){
10543
					
10615
					
10544
						#設置錯誤識別
10616
						#設置錯誤識別
10545
						$result["status"]="false";
10617
						$result["status"]="false";
10546
 
10618
 
10547
						#設置錯誤訊息
10619
						#設置錯誤訊息
10548
						$result["error"]=$callShellHelper;
10620
						$result["error"]=$parseCmdString;
10549
 
10621
 
10550
						#回傳結果
10622
						#回傳結果
10551
						return $result;
10623
						return $result;
10552
					
10624
					
10553
						}#if end
10625
						}#if end
10554
						
10626
					
10555
					#函式說明:
10627
					#函式說明:
10556
					#呼叫shell執行系統命令,並取得回傳的內容.
10628
					#呼叫shell執行系統命令,並取得回傳的內容.
10557
					#回傳結果:
10629
					#回傳結果:
10558
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
10630
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
10559
					#$result["error"],錯誤訊息陣列.
10631
					#$result["error"],錯誤訊息陣列.
Line 10569... Line 10641...
10569
					#$result["statusCode"],執行結束後的代碼.
10641
					#$result["statusCode"],執行結束後的代碼.
10570
					#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
10642
					#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
10571
					#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
10643
					#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
10572
					#必填參數:
10644
					#必填參數:
10573
					#$conf["command"],字串,要執行的指令.
10645
					#$conf["command"],字串,要執行的指令.
10574
					$conf["external::callShell"]["command"]=$callShellHelper["cmd"];
10646
					$conf["external::callShell"]["command"]=$parseCmdString["cmd"];
10575
					#$conf["fileArgu"],字串,變數__FILE__的內容.
10647
					#$conf["fileArgu"],字串,變數__FILE__的內容.
10576
					$conf["external::callShell"]["fileArgu"]=__FILE__;
10648
					$conf["external::callShell"]["fileArgu"]=__FILE__;
10577
					#可省略參數:
10649
					#可省略參數:
10578
					#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
10650
					#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
10579
					$conf["external::callShell"]["argu"]=$callShellHelper["params"];
10651
					$conf["external::callShell"]["argu"]=$parseCmdString["argus"];
10580
					#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
10652
					#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
10581
					#$conf["arguIsAddr"]=array();
10653
					#$conf["arguIsAddr"]=array();
10582
					#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
10654
					#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
10583
					#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
10655
					#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
10584
					#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
10656
					#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
Line 10602... Line 10674...
10602
					#$conf["inBackGround"]="";
10674
					#$conf["inBackGround"]="";
10603
					#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
10675
					#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
10604
					#$conf["getErr"]="false";
10676
					#$conf["getErr"]="false";
10605
					#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
10677
					#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
10606
					#$conf["doNotRun"]="false";
10678
					#$conf["doNotRun"]="false";
-
 
10679
					#$conf["cmdContainArgu"],字串,cmd參數是否已經含有參數,預設為"false"代表沒有;反之為"true".
-
 
10680
					$conf["external::callShell"]["cmdContainArgu"]="true";
10607
					#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.
10681
					#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.
10608
					#$conf["remoteIp"]="";
10682
					#$conf["remoteIp"]="";
10609
					#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.
10683
					#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.
10610
					#$conf["remoteUser"]="";
10684
					#$conf["remoteUser"]="";
10611
					#參考資料:
10685
					#參考資料:
Line 10615... Line 10689...
10615
					#備註:
10689
					#備註:
10616
					#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
10690
					#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
10617
					#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
10691
					#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
10618
					$callShell=external::callShell($conf["external::callShell"]);
10692
					$callShell=external::callShell($conf["external::callShell"]);
10619
					unset($conf["external::callShell"]);
10693
					unset($conf["external::callShell"]);
10620
				
10694
						
10621
					#如果執行異常
10695
					#如果執行異常
10622
					if($callShellHelper["status"]==="false"){
10696
					if($callShell["status"]==="false"){
10623
					
10697
					
10624
						#設置錯誤識別
10698
						#設置錯誤識別
10625
						$result["status"]="false";
10699
						$result["status"]="false";
10626
 
10700
 
10627
						#設置錯誤訊息
10701
						#設置錯誤訊息
Line 10723... Line 10797...
10723
				
10797
				
10724
					#if enable debug
10798
					#if enable debug
10725
					if($debug){
10799
					if($debug){
10726
					
10800
					
10727
						#debug msg
10801
						#debug msg
10728
						echo "Start requst new ssl process for domain name(".$cName.").".PHP_EOL;
10802
						echo "Start request new ssl process for domain name(".$cName.").".PHP_EOL;
10729
					
10803
					
10730
						}#if end
10804
						}#if end
10731
						
10805
						
10732
					#if enable debug
10806
					#if enable debug
10733
					if($debug){
10807
					if($debug){
Line 11188... Line 11262...
11188
						#debug msg
11262
						#debug msg
11189
						echo "Request zerossl to valid domain name(".$conf["info"]["share"]["apiDomain"].").".PHP_EOL;
11263
						echo "Request zerossl to valid domain name(".$conf["info"]["share"]["apiDomain"].").".PHP_EOL;
11190
					
11264
					
11191
						}#if end
11265
						}#if end
11192
					
11266
					
11193
					#函式說明:
-
 
11194
					#請求驗證已經透過zerossl::createCertificate要求的domain.
-
 
11195
					#回傳結果:
11267
					#無窮迴圈
11196
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
11197
					#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
11198
					#$result["function"],當前執行的函式名稱.
-
 
11199
					#$result["argu"],所使用的參數.
-
 
11200
					#$result["curl_verbose_info"],curl執行的詳細資訊.
-
 
11201
					#$result["content"],結果json字串.
-
 
11202
					#必填參數:
-
 
11203
					#$conf["id"],字串,zerossl::createCertificate回傳的id.
-
 
11204
					$conf["zerossl::verifyDomain"]["id"]=$csrId;
-
 
11205
					#可省略參數:
-
 
11206
					#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].
-
 
11207
					$conf["zerossl::verifyDomain"]["apiDomain"]=$conf["info"]["share"]["apiDomain"];
-
 
11208
					#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].
-
 
11209
					$conf["zerossl::verifyDomain"]["key"]=$conf["info"]["share"]["key"];
-
 
11210
					#參考資料:
11268
					while(true){
11211
					#https://zerossl.com/documentation/api/verify-domains/
-
 
11212
					#備註:
-
 
11213
					#無.
-
 
11214
					$verifyDomain=zerossl::verifyDomain($conf["zerossl::verifyDomain"]);
-
 
11215
					unset($conf["zerossl::verifyDomain"]);
-
 
11216
					
-
 
11217
					#如果執行異常
-
 
11218
					if($verifyDomain["status"]==="false"){
-
 
11219
					
11269
					
-
 
11270
						#函式說明:
-
 
11271
						#請求驗證已經透過zerossl::createCertificate要求的domain.
-
 
11272
						#回傳結果:
-
 
11273
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
11274
						#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
11275
						#$result["function"],當前執行的函式名稱.
-
 
11276
						#$result["argu"],所使用的參數.
-
 
11277
						#$result["curl_verbose_info"],curl執行的詳細資訊.
-
 
11278
						#$result["content"],結果json字串.
-
 
11279
						#必填參數:
-
 
11280
						#$conf["id"],字串,zerossl::createCertificate回傳的id.
-
 
11281
						$conf["zerossl::verifyDomain"]["id"]=$csrId;
-
 
11282
						#可省略參數:
-
 
11283
						#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].
-
 
11284
						$conf["zerossl::verifyDomain"]["apiDomain"]=$conf["info"]["share"]["apiDomain"];
-
 
11285
						#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].
-
 
11286
						$conf["zerossl::verifyDomain"]["key"]=$conf["info"]["share"]["key"];
-
 
11287
						#參考資料:
-
 
11288
						#https://zerossl.com/documentation/api/verify-domains/
-
 
11289
						#備註:
-
 
11290
						#無.
-
 
11291
						$verifyDomain=zerossl::verifyDomain($conf["zerossl::verifyDomain"]);
-
 
11292
						unset($conf["zerossl::verifyDomain"]);
-
 
11293
						
-
 
11294
						#如果執行異常
-
 
11295
						if($verifyDomain["status"]==="false"){
-
 
11296
						
11220
						#設置錯誤識別
11297
							#設置錯誤識別
11221
						$result["status"]="false";
11298
							$result["status"]="false";
11222
 
11299
 
11223
						#設置錯誤訊息
11300
							#設置錯誤訊息
11224
						$result["error"]=$verifyDomain;
11301
							$result["error"]=$verifyDomain;
11225
 
11302
 
-
 
11303
							#回傳結果
-
 
11304
							return $result;
-
 
11305
						
-
 
11306
							}#if end
-
 
11307
							
-
 
11308
						#如果沒有回內容
-
 
11309
						if(!isset($verifyDomain["content"])){
-
 
11310
						
-
 
11311
							#設置錯誤識別
-
 
11312
							$result["status"]="false";
-
 
11313
 
-
 
11314
							#設置錯誤訊息
-
 
11315
							$result["error"]=$verifyDomain;
-
 
11316
 
-
 
11317
							#回傳結果
-
 
11318
							return $result;
-
 
11319
						
-
 
11320
							}#if end
-
 
11321
						
-
 
11322
						#如果回應不是 json
-
 
11323
						if(!(json_validate($verifyDomain["content"]))){
-
 
11324
						
-
 
11325
							#設置錯誤識別
-
 
11326
							$result["status"]="false";
-
 
11327
 
-
 
11328
							#設置錯誤訊息
-
 
11329
							$result["error"]=$verifyDomain;
-
 
11330
 
-
 
11331
							#回傳結果
-
 
11332
							return $result;
-
 
11333
						
-
 
11334
							}#if end
-
 
11335
						
-
 
11336
						/*
-
 
11337
						範例json:
11226
						#回傳結果
11338
						{"id":"51cff04454e6a6860abfecc8072db602","type":"1","common_name":"silverblue-guest.qbpwcf.org","additional_domains":"","created":"2026-03-06 13:45:39","expires":"2026-06-04 23:59:59","status":"pending_validation","validation_type":"CNAME_CSR_HASH","validation_emails":"","replacement_for":"","fingerprint_sha1":null,"brand_validation":null,"validation":{"email_validation":{"silverblue-guest.qbpwcf.org":["admin@silverblue-guest.qbpwcf.org","administrator@silverblue-guest.qbpwcf.org","hostmaster@silverblue-guest.qbpwcf.org","postmaster@silverblue-guest.qbpwcf.org","webmaster@silverblue-guest.qbpwcf.org","admin@qbpwcf.org","administrator@qbpwcf.org","hostmaster@qbpwcf.org","postmaster@qbpwcf.org","webmaster@qbpwcf.org"]},"other_methods":{"silverblue-guest.qbpwcf.org":{"file_validation_url_http":"http:\/\/silverblue-guest.qbpwcf.org\/.well-known\/pki-validation\/383346FA54F492EC8B2A6C421A052827.txt","file_validation_url_https":"https:\/\/silverblue-guest.qbpwcf.org\/.well-known\/pki-validation\/383346FA54F492EC8B2A6C421A052827.txt","file_validation_content":["58B9EB7890F754D041698170B22D22205D710ED09B419A809E5C92C38195DD36","comodoca.com","627e45f007045f0"],"cname_validation_p1":"_383346FA54F492EC8B2A6C421A052827.silverblue-guest.qbpwcf.org","cname_validation_p2":"58B9EB7890F754D041698170B22D2220.5D710ED09B419A809E5C92C38195DD36.627e45f007045f0.comodoca.com"}}},"signature_algorithm_properties":null}
-
 
11339
						*/
-
 
11340
						
-
 
11341
						#解析json回應
-
 
11342
						$verifyDomainRes=json_decode($verifyDomain["content"]);
-
 
11343
 
-
 
11344
						#如果回應含有 success
-
 
11345
						if(isset($verifyDomainRes->success)){
-
 
11346
						
-
 
11347
							#如果是 zerossl 驗證失敗
-
 
11348
							if($verifyDomainRes->success==="false" || $verifyDomainRes->success===false){
-
 
11349
							
-
 
11350
								#如果是 CNAME 記錄找不到
-
 
11351
								if($verifyDomainRes->error->code===0){
-
 
11352
								
-
 
11353
									#取得錯誤訊息
-
 
11354
									#$error_info_zerossl=$verifyDomainRes->error->details->$cName->error_info;
-
 
11355
									
-
 
11356
									#if enable debug
-
 
11357
									if($debug){
-
 
11358
									
-
 
11359
										#debug msg
-
 
11360
										echo "Zerossl can't find DNS CNAME record to validate certificate for domain name(".$cName.").".PHP_EOL;
-
 
11361
									
-
 
11362
										}#if end
-
 
11363
									
-
 
11364
									#if enable debug
-
 
11365
									if($debug){
-
 
11366
									
-
 
11367
										#debug msg
-
 
11368
										echo "Waiting DNS CNAME record distributed to the world for domain name(".$cName.").".PHP_EOL;
-
 
11369
									
-
 
11370
										}#if end
-
 
11371
									
-
 
11372
									#休息60秒
-
 
11373
									sleep(60);
-
 
11374
									
-
 
11375
									#再跑一次要求認證憑證
-
 
11376
									continue;
-
 
11377
								
-
 
11378
									}#if end
-
 
11379
									
-
 
11380
								#反之為不接受的錯誤訊息
-
 
11381
								else{
-
 
11382
								
-
 
11383
									#設置錯誤識別
-
 
11384
									$result["status"]="false";
-
 
11385
 
-
 
11386
									#設置錯誤訊息
-
 
11387
									$result["error"]=$verifyDomain;
-
 
11388
 
-
 
11389
									#回傳結果
-
 
11390
									return $result;
-
 
11391
								
-
 
11392
									}#else end
-
 
11393
							
-
 
11394
								}#if end
-
 
11395
						
-
 
11396
							}#if end
-
 
11397
 
-
 
11398
						#反之如果回應含有 status
-
 
11399
						else if(isset($verifyDomainRes->status)){
-
 
11400
						
-
 
11401
							#如果是 zerossl 尚在驗證中
-
 
11402
							if($verifyDomainRes->status==="pending_validation"){
-
 
11403
							
-
 
11404
								#if enable debug
-
 
11405
								if($debug){
-
 
11406
								
-
 
11407
									#debug msg
-
 
11408
									echo "Waiting zerossl to validate certificate for domain name(".$cName.")...".PHP_EOL;
-
 
11409
								
-
 
11410
									}#if end
-
 
11411
									
-
 
11412
								#無窮迴圈
-
 
11413
								while(true){
-
 
11414
							
-
 
11415
									#查詢驗證狀況
-
 
11416
									#函式說明:
-
 
11417
									#取得CSR在zerossl上的狀態
-
 
11418
									#回傳結果:
-
 
11419
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
11420
									#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
11421
									#$result["function"],當前執行的函式名稱.
-
 
11422
									#$result["argu"],所使用的參數.
-
 
11423
									#$result["curl_verbose_info"],curl執行的詳細資訊.
-
 
11424
									#$result["content"],結果json字串.
11227
						return $result;
11425
									#$result["cerStatus"],csr在zerossl上的狀態,"draft"代表尚未驗證;"pending_validation"代表zerossl尚在產生憑證;"issued"代表已經可以下載來使用;"revoked"代表已經廢除;"cancelled"代表已經取消且未驗證;"expired"代表已經過期.
-
 
11426
									#必填參數:
-
 
11427
									#$conf["id"],字串,zerossl::createCertificate回傳的id.
-
 
11428
									$conf["zerossl::getCertSta"]["id"]=$csrId;
-
 
11429
									#可省略參數:
-
 
11430
									#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].
-
 
11431
									$conf["zerossl::getCertSta"]["apiDomain"]=$conf["info"]["share"]["apiDomain"];
-
 
11432
									#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].
-
 
11433
									$conf["zerossl::getCertSta"]["key"]=$conf["info"]["share"]["key"];
-
 
11434
									#參考資料:
-
 
11435
									#https://zerossl.com/documentation/api/get-certificate/
-
 
11436
									#備註:
-
 
11437
									#無.
-
 
11438
									$getCertSta=zerossl::getCertSta($conf["zerossl::getCertSta"]);
-
 
11439
									unset($conf["zerossl::getCertSta"]);
-
 
11440
									
-
 
11441
									#如果執行異常
-
 
11442
									if($getCertSta["status"]==="false"){
-
 
11443
									
-
 
11444
										#設置錯誤識別
-
 
11445
										$result["status"]="false";
-
 
11446
 
-
 
11447
										#設置錯誤訊息
-
 
11448
										$result["error"]=$getCertSta;
-
 
11449
 
-
 
11450
										#回傳結果
-
 
11451
										return $result;
-
 
11452
									
-
 
11453
										}#if end
-
 
11454
										
-
 
11455
									#如果沒有回應內容
-
 
11456
									if(!isset($getCertSta["content"])){
-
 
11457
									
-
 
11458
										#設置錯誤識別
-
 
11459
										$result["status"]="false";
-
 
11460
 
-
 
11461
										#設置錯誤訊息
-
 
11462
										$result["error"]=$getCertSta;
-
 
11463
 
-
 
11464
										#回傳結果
-
 
11465
										return $result;
-
 
11466
									
-
 
11467
										}#if end
-
 
11468
										
-
 
11469
									#如果回應不是 json
-
 
11470
									if(!(json_validate($getCertSta["content"]))){
-
 
11471
									
-
 
11472
										#設置錯誤識別
-
 
11473
										$result["status"]="false";
-
 
11474
 
-
 
11475
										#設置錯誤訊息
-
 
11476
										$result["error"]=$getCertSta;
-
 
11477
 
-
 
11478
										#回傳結果
-
 
11479
										return $result;
-
 
11480
									
-
 
11481
										}#if end
-
 
11482
										
-
 
11483
									#解析json回應
-
 
11484
									$getCertStaRes=json_decode($getCertSta["content"]);
-
 
11485
									
-
 
11486
									#如果憑證已經驗證通過了
-
 
11487
									if($getCertStaRes->status==="issued"){
-
 
11488
									
-
 
11489
										#if enable debug
-
 
11490
										if($debug){
-
 
11491
										
-
 
11492
											#debug msg
-
 
11493
											echo "Zerossl validated certificate for domain name(".$cName.").".PHP_EOL;
-
 
11494
										
-
 
11495
											}#if end
-
 
11496
									
-
 
11497
										#結束等待,離開while
-
 
11498
										break 2;
-
 
11499
									
-
 
11500
										}#if end
-
 
11501
										
-
 
11502
									#如果 zerossl 尚在處理中
-
 
11503
									else if($getCertStaRes->status==="pending_validation"){
-
 
11504
									
-
 
11505
										#if enable debug
-
 
11506
										if($debug){
-
 
11507
										
-
 
11508
											#debug msg
-
 
11509
											echo "Waiting zerossl to validate certificate for domain name(".$cName.")...".PHP_EOL;
-
 
11510
										
-
 
11511
											}#if end
-
 
11512
											
-
 
11513
										#休息1分鐘
-
 
11514
										sleep(60);
-
 
11515
										
-
 
11516
										#再次確認憑證的狀態
-
 
11517
										continue;
-
 
11518
									
-
 
11519
										}#if end
-
 
11520
									
-
 
11521
									#反之
-
 
11522
									else{
-
 
11523
									
-
 
11524
										#例外狀況
-
 
11525
										
-
 
11526
										#設置錯誤識別
-
 
11527
										$result["status"]="false";
-
 
11528
 
-
 
11529
										#設置錯誤訊息
-
 
11530
										$result["error"]=$getCertSta;
-
 
11531
 
-
 
11532
										#回傳結果
-
 
11533
										return $result;
-
 
11534
									
-
 
11535
										}#else end
-
 
11536
 
-
 
11537
									}#while end
-
 
11538
							
-
 
11539
								}#if end
-
 
11540
							
-
 
11541
							}#if end
11228
					
11542
					
11229
						}#if end
11543
						}#while end
11230
					
11544
					
-
 
11545
						
11231
					#if enable debug
11546
					#if enable debug
11232
					if($debug){
11547
					if($debug){
11233
					
11548
					
11234
						#debug msg
11549
						#debug msg
11235
						echo "Downling ssl for domain name(".$cName.") on zerossl.".PHP_EOL;
11550
						echo "Downling ssl for domain name(".$cName.") on zerossl.".PHP_EOL;
Line 11339... Line 11654...
11339
						
11654
						
11340
					#儲存 actionAfterUpdateCert
11655
					#儲存 actionAfterUpdateCert
11341
					$action=$cInfo["actionAfterUpdateCert"];
11656
					$action=$cInfo["actionAfterUpdateCert"];
11342
					
11657
					
11343
					#如果有多個指令要執行
11658
					#如果有多個指令要執行
11344
					if(gettype($action[0])==="array"){
11659
					if(count($action)>0){
11345
						
11660
						
11346
						#if enable debug
11661
						#if enable debug
11347
						if($debug){
11662
						if($debug){
11348
						
11663
						
11349
							#debug msg
11664
							#debug msg
11350
							echo "There many cmd to run to valid domain name(".$conf["info"]["share"]["apiDomain"].").".PHP_EOL;
11665
							echo "There many cmd to run to valid domain name(".$conf["info"]["share"]["apiDomain"].").".PHP_EOL;
11351
						
11666
						
11352
							}#if end
11667
							}#if end
11353
						
11668
						
11354
						#針對每的指令
11669
						#針對每個指令
11355
						foreach($action as $ac){
11670
						foreach($action as $ac){
11356
						
11671
						
11357
							#if enable debug
11672
							#if enable debug
11358
							if($debug){
11673
							if($debug){
11359
							
11674
							
Line 11361... Line 11676...
11361
								echo ".".PHP_EOL;
11676
								echo ".".PHP_EOL;
11362
							
11677
							
11363
								}#if end
11678
								}#if end
11364
						
11679
						
11365
							#函式說明:
11680
							#函式說明:
11366
							#解析指令與參數,回傳指令與參數給 callShell 函式使用.
11681
							#將指令字串解析成陣列,方便給予 external::callShell 使用
11367
							#回傳結果:
11682
							#回傳結果:
11368
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11683
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11369
							#$result["error"],錯誤訊息陣列.
11684
							#$reuslt["error"],執行不正常結束的錯訊息陣列.
11370
							#$result["function"],當前執行的函數名稱.
11685
							#$result["function"],當前執行的函式名稱.
11371
							#$result["argu"],使用的參數.
11686
							#$result["content"],解析好的指令陣列.
11372
							#$result["cmd"],執行的指令名稱.
11687
							#$result["cmd"],解析好的指令名稱.
-
 
11688
							#$result["argus"],解析好的參數陣列.
11373
							#$result["params"],執行指令伴隨的參數.
11689
							#$result["argu"],所使用的參數.
11374
							#必填參數:
11690
							#必填參數
11375
							#$conf["cmdArray"],字串陣列,要執行的指令字串.
11691
							#$conf["cmdStr"],字串,要解析的指令字串
11376
							$conf["external::callShellHelper"]["cmdArray"]=$ac;
11692
							$conf["cmd::parseCmdString"]["cmdStr"]=$ac;
11377
							#可省略參數:
11693
							#可省略參數:
11378
							#無.
11694
							#無.
11379
							#參考資料:
11695
							#參考資料:
11380
							#array_shift=>https://www.php.net/manual/en/function.array-shift.php
11696
							#無.
11381
							#備註:
11697
							#備註:
11382
							#無.
11698
							#無.
11383
							$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);
11699
							$parseCmdString=cmd::parseCmdString($conf["cmd::parseCmdString"]);
11384
							unset($conf["external::callShellHelper"]);
11700
							unset($conf["cmd::parseCmdString"]);
11385
						
11701
						
11386
							#如果執行異常
11702
							#如果執行異常
11387
							if($callShellHelper["status"]==="false"){
11703
							if($parseCmdString["status"]==="false"){
11388
							
11704
							
11389
								#設置錯誤識別
11705
								#設置錯誤識別
11390
								$result["status"]="false";
11706
								$result["status"]="false";
11391
 
11707
 
11392
								#設置錯誤訊息
11708
								#設置錯誤訊息
11393
								$result["error"]=$callShellHelper;
11709
								$result["error"]=$parseCmdString;
11394
 
11710
 
11395
								#回傳結果
11711
								#回傳結果
11396
								return $result;
11712
								return $result;
11397
							
11713
							
11398
								}#if end
11714
								}#if end
11399
								
11715
						
11400
							#函式說明:
11716
							#函式說明:
11401
							#呼叫shell執行系統命令,並取得回傳的內容.
11717
							#呼叫shell執行系統命令,並取得回傳的內容.
11402
							#回傳結果:
11718
							#回傳結果:
11403
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11719
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11404
							#$result["error"],錯誤訊息陣列.
11720
							#$result["error"],錯誤訊息陣列.
Line 11414... Line 11730...
11414
							#$result["statusCode"],執行結束後的代碼.
11730
							#$result["statusCode"],執行結束後的代碼.
11415
							#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
11731
							#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
11416
							#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
11732
							#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
11417
							#必填參數:
11733
							#必填參數:
11418
							#$conf["command"],字串,要執行的指令.
11734
							#$conf["command"],字串,要執行的指令.
11419
							$conf["external::callShell"]["command"]=$callShellHelper["cmd"];
11735
							$conf["external::callShell"]["command"]=$parseCmdString["cmd"];
11420
							#$conf["fileArgu"],字串,變數__FILE__的內容.
11736
							#$conf["fileArgu"],字串,變數__FILE__的內容.
11421
							$conf["external::callShell"]["fileArgu"]=__FILE__;
11737
							$conf["external::callShell"]["fileArgu"]=__FILE__;
11422
							#可省略參數:
11738
							#可省略參數:
11423
							#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
11739
							#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
11424
							$conf["external::callShell"]["argu"]=$callShellHelper["params"];
11740
							$conf["external::callShell"]["argu"]=$parseCmdString["argus"];
11425
							#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
11741
							#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
11426
							#$conf["arguIsAddr"]=array();
11742
							#$conf["arguIsAddr"]=array();
11427
							#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
11743
							#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
11428
							#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
11744
							#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
11429
							#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
11745
							#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
Line 11460... Line 11776...
11460
							#備註:
11776
							#備註:
11461
							#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
11777
							#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
11462
							#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
11778
							#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
11463
							$callShell=external::callShell($conf["external::callShell"]);
11779
							$callShell=external::callShell($conf["external::callShell"]);
11464
							unset($conf["external::callShell"]);
11780
							unset($conf["external::callShell"]);
11465
						
11781
							
11466
							#如果執行異常
11782
							#如果執行異常
11467
							if($callShellHelper["status"]==="false"){
11783
							if($callShell["status"]==="false"){
11468
							
11784
							
11469
								#設置錯誤識別
11785
								#設置錯誤識別
11470
								$result["status"]="false";
11786
								$result["status"]="false";
11471
 
11787
 
11472
								#設置錯誤訊息
11788
								#設置錯誤訊息
Line 11499... Line 11815...
11499
							echo ".".PHP_EOL;
11815
							echo ".".PHP_EOL;
11500
						
11816
						
11501
							}#if end
11817
							}#if end
11502
					
11818
					
11503
						#函式說明:
11819
						#函式說明:
11504
						#解析指令與參數,回傳指令與參數給 callShell 函式使用.
11820
						#將指令字串解析成陣列,方便給予 external::callShell 使用
11505
						#回傳結果:
11821
						#回傳結果:
11506
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11822
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11507
						#$result["error"],錯誤訊息陣列.
11823
						#$reuslt["error"],執行不正常結束的錯訊息陣列.
11508
						#$result["function"],當前執行的函數名稱.
11824
						#$result["function"],當前執行的函式名稱.
11509
						#$result["argu"],使用的參數.
11825
						#$result["content"],解析好的指令陣列.
11510
						#$result["cmd"],執行的指令名稱.
11826
						#$result["cmd"],解析好的指令名稱.
-
 
11827
						#$result["argus"],解析好的參數陣列.
11511
						#$result["params"],執行指令伴隨的參數.
11828
						#$result["argu"],所使用的參數.
11512
						#必填參數:
11829
						#必填參數
11513
						#$conf["cmdArray"],字串陣列,要執行的指令字串.
11830
						#$conf["cmdStr"],字串,要解析的指令字串
11514
						$conf["external::callShellHelper"]["cmdArray"]=$action;
11831
						$conf["cmd::parseCmdString"]["cmdStr"]=$action[0];
11515
						#可省略參數:
11832
						#可省略參數:
11516
						#無.
11833
						#無.
11517
						#參考資料:
11834
						#參考資料:
11518
						#array_shift=>https://www.php.net/manual/en/function.array-shift.php
11835
						#無.
11519
						#備註:
11836
						#備註:
11520
						#無.
11837
						#無.
11521
						$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);
11838
						$parseCmdString=cmd::parseCmdString($conf["cmd::parseCmdString"]);
11522
						unset($conf["external::callShellHelper"]);
11839
						unset($conf["cmd::parseCmdString"]);
11523
					
11840
					
11524
						#如果執行異常
11841
						#如果執行異常
11525
						if($callShellHelper["status"]==="false"){
11842
						if($parseCmdString["status"]==="false"){
11526
						
11843
						
11527
							#設置錯誤識別
11844
							#設置錯誤識別
11528
							$result["status"]="false";
11845
							$result["status"]="false";
11529
 
11846
 
11530
							#設置錯誤訊息
11847
							#設置錯誤訊息
11531
							$result["error"]=$callShellHelper;
11848
							$result["error"]=$parseCmdString;
11532
 
11849
 
11533
							#回傳結果
11850
							#回傳結果
11534
							return $result;
11851
							return $result;
11535
						
11852
						
11536
							}#if end
11853
							}#if end
11537
							
11854
					
11538
						#函式說明:
11855
						#函式說明:
11539
						#呼叫shell執行系統命令,並取得回傳的內容.
11856
						#呼叫shell執行系統命令,並取得回傳的內容.
11540
						#回傳結果:
11857
						#回傳結果:
11541
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11858
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
11542
						#$result["error"],錯誤訊息陣列.
11859
						#$result["error"],錯誤訊息陣列.
Line 11552... Line 11869...
11552
						#$result["statusCode"],執行結束後的代碼.
11869
						#$result["statusCode"],執行結束後的代碼.
11553
						#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
11870
						#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
11554
						#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
11871
						#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
11555
						#必填參數:
11872
						#必填參數:
11556
						#$conf["command"],字串,要執行的指令.
11873
						#$conf["command"],字串,要執行的指令.
11557
						$conf["external::callShell"]["command"]=$callShellHelper["cmd"];
11874
						$conf["external::callShell"]["command"]=$parseCmdString["cmd"];
11558
						#$conf["fileArgu"],字串,變數__FILE__的內容.
11875
						#$conf["fileArgu"],字串,變數__FILE__的內容.
11559
						$conf["external::callShell"]["fileArgu"]=__FILE__;
11876
						$conf["external::callShell"]["fileArgu"]=__FILE__;
11560
						#可省略參數:
11877
						#可省略參數:
11561
						#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
11878
						#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
11562
						$conf["external::callShell"]["argu"]=$callShellHelper["params"];
11879
						$conf["external::callShell"]["argu"]=$parseCmdString["argus"];
11563
						#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
11880
						#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
11564
						#$conf["arguIsAddr"]=array();
11881
						#$conf["arguIsAddr"]=array();
11565
						#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
11882
						#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
11566
						#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
11883
						#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
11567
						#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
11884
						#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
Line 11598... Line 11915...
11598
						#備註:
11915
						#備註:
11599
						#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
11916
						#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
11600
						#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
11917
						#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
11601
						$callShell=external::callShell($conf["external::callShell"]);
11918
						$callShell=external::callShell($conf["external::callShell"]);
11602
						unset($conf["external::callShell"]);
11919
						unset($conf["external::callShell"]);
11603
					
11920
						
11604
						#如果執行異常
11921
						#如果執行異常
11605
						if($callShellHelper["status"]==="false"){
11922
						if($callShell["status"]==="false"){
11606
						
11923
						
11607
							#設置錯誤識別
11924
							#設置錯誤識別
11608
							$result["status"]="false";
11925
							$result["status"]="false";
11609
 
11926
 
11610
							#設置錯誤訊息
11927
							#設置錯誤訊息