11367Szelenkov@nginx.comimport os 21529Szelenkov@nginx.comimport re 31367Szelenkov@nginx.comimport shutil 41850Smax.romanov@nginx.comimport signal 51529Szelenkov@nginx.comimport time 61477Szelenkov@nginx.com 71635Szelenkov@nginx.comimport pytest 81019Szelenkov@nginx.comfrom unit.applications.lang.php import TestApplicationPHP 91730Szelenkov@nginx.comfrom unit.option import option 10675Szelenkov@nginx.com 111848Szelenkov@nginx.com 121019Szelenkov@nginx.comclass TestPHPApplication(TestApplicationPHP): 131467Szelenkov@nginx.com prerequisites = {'modules': {'php': 'all'}} 14675Szelenkov@nginx.com 15982Szelenkov@nginx.com def before_disable_functions(self): 16982Szelenkov@nginx.com body = self.get()['body'] 17982Szelenkov@nginx.com 181596Szelenkov@nginx.com assert re.search(r'time: \d+', body), 'disable_functions before time' 191596Szelenkov@nginx.com assert re.search(r'exec: \/\w+', body), 'disable_functions before exec' 20865Szelenkov@nginx.com 211381St.nateldemoura@f5.com def set_opcache(self, app, val): 221596Szelenkov@nginx.com assert 'success' in self.conf( 231770Szelenkov@nginx.com {"admin": {"opcache.enable": val, "opcache.enable_cli": val}}, 241596Szelenkov@nginx.com 'applications/' + app + '/options', 251381St.nateldemoura@f5.com ) 261381St.nateldemoura@f5.com 271381St.nateldemoura@f5.com opcache = self.get()['headers']['X-OPcache'] 281381St.nateldemoura@f5.com 291381St.nateldemoura@f5.com if not opcache or opcache == '-1': 301596Szelenkov@nginx.com pytest.skip('opcache is not supported') 311381St.nateldemoura@f5.com 321596Szelenkov@nginx.com assert opcache == val, 'opcache value' 331381St.nateldemoura@f5.com 34675Szelenkov@nginx.com def test_php_application_variables(self): 35675Szelenkov@nginx.com self.load('variables') 36675Szelenkov@nginx.com 37675Szelenkov@nginx.com body = 'Test body string.' 38675Szelenkov@nginx.com 391017Szelenkov@nginx.com resp = self.post( 401017Szelenkov@nginx.com headers={ 411017Szelenkov@nginx.com 'Host': 'localhost', 421017Szelenkov@nginx.com 'Content-Type': 'text/html', 431017Szelenkov@nginx.com 'Custom-Header': 'blah', 441017Szelenkov@nginx.com 'Connection': 'close', 451017Szelenkov@nginx.com }, 461017Szelenkov@nginx.com body=body, 471596Szelenkov@nginx.com url='/index.php/blah?var=val', 481017Szelenkov@nginx.com ) 49675Szelenkov@nginx.com 501596Szelenkov@nginx.com assert resp['status'] == 200, 'status' 51675Szelenkov@nginx.com headers = resp['headers'] 52675Szelenkov@nginx.com header_server = headers.pop('Server') 531596Szelenkov@nginx.com assert re.search(r'Unit/[\d\.]+', header_server), 'server header' 541596Szelenkov@nginx.com assert ( 551596Szelenkov@nginx.com headers.pop('Server-Software') == header_server 561596Szelenkov@nginx.com ), 'server software header' 57675Szelenkov@nginx.com 58675Szelenkov@nginx.com date = headers.pop('Date') 591596Szelenkov@nginx.com assert date[-4:] == ' GMT', 'date header timezone' 601596Szelenkov@nginx.com assert ( 611596Szelenkov@nginx.com abs(self.date_to_sec_epoch(date) - self.sec_epoch()) < 5 621596Szelenkov@nginx.com ), 'date header' 63675Szelenkov@nginx.com 64675Szelenkov@nginx.com if 'X-Powered-By' in headers: 65675Szelenkov@nginx.com headers.pop('X-Powered-By') 66675Szelenkov@nginx.com 67675Szelenkov@nginx.com headers.pop('Content-type') 681596Szelenkov@nginx.com assert headers == { 691596Szelenkov@nginx.com 'Connection': 'close', 701596Szelenkov@nginx.com 'Content-Length': str(len(body)), 711596Szelenkov@nginx.com 'Request-Method': 'POST', 721596Szelenkov@nginx.com 'Path-Info': '/blah', 731596Szelenkov@nginx.com 'Request-Uri': '/index.php/blah?var=val', 741596Szelenkov@nginx.com 'Http-Host': 'localhost', 751596Szelenkov@nginx.com 'Server-Protocol': 'HTTP/1.1', 761596Szelenkov@nginx.com 'Custom-Header': 'blah', 771596Szelenkov@nginx.com }, 'headers' 781596Szelenkov@nginx.com assert resp['body'] == body, 'body' 79675Szelenkov@nginx.com 80894Szelenkov@nginx.com def test_php_application_query_string(self): 81894Szelenkov@nginx.com self.load('query_string') 82894Szelenkov@nginx.com 83894Szelenkov@nginx.com resp = self.get(url='/?var1=val1&var2=val2') 84894Szelenkov@nginx.com 851596Szelenkov@nginx.com assert ( 861596Szelenkov@nginx.com resp['headers']['Query-String'] == 'var1=val1&var2=val2' 871596Szelenkov@nginx.com ), 'query string' 88894Szelenkov@nginx.com 89894Szelenkov@nginx.com def test_php_application_query_string_empty(self): 90894Szelenkov@nginx.com self.load('query_string') 91894Szelenkov@nginx.com 92894Szelenkov@nginx.com resp = self.get(url='/?') 93894Szelenkov@nginx.com 941596Szelenkov@nginx.com assert resp['status'] == 200, 'query string empty status' 951596Szelenkov@nginx.com assert resp['headers']['Query-String'] == '', 'query string empty' 96894Szelenkov@nginx.com 971850Smax.romanov@nginx.com def test_php_application_fastcgi_finish_request(self, unit_pid): 981701Szelenkov@nginx.com self.load('fastcgi_finish_request') 991701Szelenkov@nginx.com 1001862Szelenkov@nginx.com assert 'success' in self.conf( 1011862Szelenkov@nginx.com {"admin": {"auto_globals_jit": "1"}}, 1021862Szelenkov@nginx.com 'applications/fastcgi_finish_request/options', 1031862Szelenkov@nginx.com ) 1041862Szelenkov@nginx.com 1051701Szelenkov@nginx.com assert self.get()['body'] == '0123' 1061701Szelenkov@nginx.com 1071862Szelenkov@nginx.com os.kill(unit_pid, signal.SIGUSR1) 1081770Szelenkov@nginx.com 1091850Smax.romanov@nginx.com errs = self.findall(r'Error in fastcgi_finish_request') 1101701Szelenkov@nginx.com 1111850Smax.romanov@nginx.com assert len(errs) == 0, 'no error' 1121701Szelenkov@nginx.com 1131850Smax.romanov@nginx.com def test_php_application_fastcgi_finish_request_2(self, unit_pid): 1141701Szelenkov@nginx.com self.load('fastcgi_finish_request') 1151701Szelenkov@nginx.com 1161862Szelenkov@nginx.com assert 'success' in self.conf( 1171862Szelenkov@nginx.com {"admin": {"auto_globals_jit": "1"}}, 1181862Szelenkov@nginx.com 'applications/fastcgi_finish_request/options', 1191862Szelenkov@nginx.com ) 1201862Szelenkov@nginx.com 1211701Szelenkov@nginx.com resp = self.get(url='/?skip') 1221701Szelenkov@nginx.com assert resp['status'] == 200 1231701Szelenkov@nginx.com assert resp['body'] == '' 1241701Szelenkov@nginx.com 1251862Szelenkov@nginx.com os.kill(unit_pid, signal.SIGUSR1) 1261701Szelenkov@nginx.com 1271850Smax.romanov@nginx.com errs = self.findall(r'Error in fastcgi_finish_request') 1281701Szelenkov@nginx.com 1291850Smax.romanov@nginx.com assert len(errs) == 0, 'no error' 1301701Szelenkov@nginx.com 131894Szelenkov@nginx.com def test_php_application_query_string_absent(self): 132894Szelenkov@nginx.com self.load('query_string') 133894Szelenkov@nginx.com 134894Szelenkov@nginx.com resp = self.get() 135894Szelenkov@nginx.com 1361596Szelenkov@nginx.com assert resp['status'] == 200, 'query string absent status' 1371596Szelenkov@nginx.com assert resp['headers']['Query-String'] == '', 'query string absent' 138894Szelenkov@nginx.com 139675Szelenkov@nginx.com def test_php_application_phpinfo(self): 140675Szelenkov@nginx.com self.load('phpinfo') 141675Szelenkov@nginx.com 142675Szelenkov@nginx.com resp = self.get() 143675Szelenkov@nginx.com 1441596Szelenkov@nginx.com assert resp['status'] == 200, 'status' 1451596Szelenkov@nginx.com assert resp['body'] != '', 'body not empty' 146675Szelenkov@nginx.com 1471090Svbart@nginx.com def test_php_application_header_status(self): 1481090Svbart@nginx.com self.load('header') 1491090Svbart@nginx.com 1501596Szelenkov@nginx.com assert ( 1511090Svbart@nginx.com self.get( 1521090Svbart@nginx.com headers={ 1531090Svbart@nginx.com 'Host': 'localhost', 1541090Svbart@nginx.com 'Connection': 'close', 1551090Svbart@nginx.com 'X-Header': 'HTTP/1.1 404 Not Found', 1561090Svbart@nginx.com } 1571596Szelenkov@nginx.com )['status'] 1581596Szelenkov@nginx.com == 404 1591596Szelenkov@nginx.com ), 'status' 1601090Svbart@nginx.com 1611596Szelenkov@nginx.com assert ( 1621090Svbart@nginx.com self.get( 1631090Svbart@nginx.com headers={ 1641090Svbart@nginx.com 'Host': 'localhost', 1651090Svbart@nginx.com 'Connection': 'close', 1661090Svbart@nginx.com 'X-Header': 'http/1.1 404 Not Found', 1671090Svbart@nginx.com } 1681596Szelenkov@nginx.com )['status'] 1691596Szelenkov@nginx.com == 404 1701596Szelenkov@nginx.com ), 'status case insensitive' 1711090Svbart@nginx.com 1721596Szelenkov@nginx.com assert ( 1731090Svbart@nginx.com self.get( 1741090Svbart@nginx.com headers={ 1751090Svbart@nginx.com 'Host': 'localhost', 1761090Svbart@nginx.com 'Connection': 'close', 1771090Svbart@nginx.com 'X-Header': 'HTTP/ 404 Not Found', 1781090Svbart@nginx.com } 1791596Szelenkov@nginx.com )['status'] 1801596Szelenkov@nginx.com == 404 1811596Szelenkov@nginx.com ), 'status version empty' 1821090Svbart@nginx.com 183675Szelenkov@nginx.com def test_php_application_404(self): 184675Szelenkov@nginx.com self.load('404') 185675Szelenkov@nginx.com 186675Szelenkov@nginx.com resp = self.get() 187675Szelenkov@nginx.com 1881596Szelenkov@nginx.com assert resp['status'] == 404, '404 status' 1891596Szelenkov@nginx.com assert re.search( 1901596Szelenkov@nginx.com r'<title>404 Not Found</title>', resp['body'] 1911596Szelenkov@nginx.com ), '404 body' 192675Szelenkov@nginx.com 193675Szelenkov@nginx.com def test_php_application_keepalive_body(self): 194675Szelenkov@nginx.com self.load('mirror') 195675Szelenkov@nginx.com 1961596Szelenkov@nginx.com assert self.get()['status'] == 200, 'init' 1971029Szelenkov@nginx.com 1981453Szelenkov@nginx.com body = '0123456789' * 500 1991017Szelenkov@nginx.com (resp, sock) = self.post( 2001017Szelenkov@nginx.com headers={ 2011017Szelenkov@nginx.com 'Host': 'localhost', 2021017Szelenkov@nginx.com 'Connection': 'keep-alive', 2031017Szelenkov@nginx.com 'Content-Type': 'text/html', 2041017Szelenkov@nginx.com }, 2051017Szelenkov@nginx.com start=True, 2061453Szelenkov@nginx.com body=body, 2071029Szelenkov@nginx.com read_timeout=1, 2081017Szelenkov@nginx.com ) 209675Szelenkov@nginx.com 2101596Szelenkov@nginx.com assert resp['body'] == body, 'keep-alive 1' 211675Szelenkov@nginx.com 2121453Szelenkov@nginx.com body = '0123456789' 2131017Szelenkov@nginx.com resp = self.post( 2141017Szelenkov@nginx.com headers={ 2151017Szelenkov@nginx.com 'Host': 'localhost', 2161017Szelenkov@nginx.com 'Connection': 'close', 2171017Szelenkov@nginx.com 'Content-Type': 'text/html', 2181017Szelenkov@nginx.com }, 2191017Szelenkov@nginx.com sock=sock, 2201453Szelenkov@nginx.com body=body, 2211017Szelenkov@nginx.com ) 222675Szelenkov@nginx.com 2231596Szelenkov@nginx.com assert resp['body'] == body, 'keep-alive 2' 224675Szelenkov@nginx.com 225675Szelenkov@nginx.com def test_php_application_conditional(self): 226675Szelenkov@nginx.com self.load('conditional') 227675Szelenkov@nginx.com 2281596Szelenkov@nginx.com assert re.search(r'True', self.get()['body']), 'conditional true' 2291596Szelenkov@nginx.com assert re.search(r'False', self.post()['body']), 'conditional false' 230675Szelenkov@nginx.com 231675Szelenkov@nginx.com def test_php_application_get_variables(self): 232675Szelenkov@nginx.com self.load('get_variables') 233675Szelenkov@nginx.com 234675Szelenkov@nginx.com resp = self.get(url='/?var1=val1&var2=&var3') 2351596Szelenkov@nginx.com assert resp['headers']['X-Var-1'] == 'val1', 'GET variables' 2361636Svbart@nginx.com assert resp['headers']['X-Var-2'] == '', 'GET variables 2' 2371636Svbart@nginx.com assert resp['headers']['X-Var-3'] == '', 'GET variables 3' 2381636Svbart@nginx.com assert resp['headers']['X-Var-4'] == 'not set', 'GET variables 4' 239675Szelenkov@nginx.com 240675Szelenkov@nginx.com def test_php_application_post_variables(self): 241675Szelenkov@nginx.com self.load('post_variables') 242675Szelenkov@nginx.com 2431017Szelenkov@nginx.com resp = self.post( 2441017Szelenkov@nginx.com headers={ 2451017Szelenkov@nginx.com 'Content-Type': 'application/x-www-form-urlencoded', 2461017Szelenkov@nginx.com 'Host': 'localhost', 2471017Szelenkov@nginx.com 'Connection': 'close', 2481017Szelenkov@nginx.com }, 2491017Szelenkov@nginx.com body='var1=val1&var2=', 2501017Szelenkov@nginx.com ) 2511596Szelenkov@nginx.com assert resp['headers']['X-Var-1'] == 'val1', 'POST variables' 2521636Svbart@nginx.com assert resp['headers']['X-Var-2'] == '', 'POST variables 2' 2531636Svbart@nginx.com assert resp['headers']['X-Var-3'] == 'not set', 'POST variables 3' 254675Szelenkov@nginx.com 255675Szelenkov@nginx.com def test_php_application_cookies(self): 256675Szelenkov@nginx.com self.load('cookies') 257675Szelenkov@nginx.com 2581017Szelenkov@nginx.com resp = self.get( 2591017Szelenkov@nginx.com headers={ 2601017Szelenkov@nginx.com 'Cookie': 'var=val; var2=val2', 2611017Szelenkov@nginx.com 'Host': 'localhost', 2621017Szelenkov@nginx.com 'Connection': 'close', 2631017Szelenkov@nginx.com } 2641017Szelenkov@nginx.com ) 265675Szelenkov@nginx.com 2661596Szelenkov@nginx.com assert resp['headers']['X-Cookie-1'] == 'val', 'cookie' 2671596Szelenkov@nginx.com assert resp['headers']['X-Cookie-2'] == 'val2', 'cookie' 268675Szelenkov@nginx.com 269692Szelenkov@nginx.com def test_php_application_ini_precision(self): 270692Szelenkov@nginx.com self.load('ini_precision') 271692Szelenkov@nginx.com 2721596Szelenkov@nginx.com assert self.get()['headers']['X-Precision'] != '4', 'ini value default' 2731017Szelenkov@nginx.com 2741775Szelenkov@nginx.com assert 'success' in self.conf( 2751017Szelenkov@nginx.com {"file": "ini/php.ini"}, 'applications/ini_precision/options' 2761017Szelenkov@nginx.com ) 277692Szelenkov@nginx.com 2781596Szelenkov@nginx.com assert ( 2791596Szelenkov@nginx.com self.get()['headers']['X-File'] 2801596Szelenkov@nginx.com == option.test_dir + '/php/ini_precision/ini/php.ini' 2811596Szelenkov@nginx.com ), 'ini file' 2821596Szelenkov@nginx.com assert self.get()['headers']['X-Precision'] == '4', 'ini value' 283692Szelenkov@nginx.com 2841596Szelenkov@nginx.com @pytest.mark.skip('not yet') 285721Szelenkov@nginx.com def test_php_application_ini_admin_user(self): 286721Szelenkov@nginx.com self.load('ini_precision') 287721Szelenkov@nginx.com 2881596Szelenkov@nginx.com assert 'error' in self.conf( 2891596Szelenkov@nginx.com {"user": {"precision": "4"}, "admin": {"precision": "5"}}, 2901596Szelenkov@nginx.com 'applications/ini_precision/options', 2911596Szelenkov@nginx.com ), 'ini admin user' 292721Szelenkov@nginx.com 293721Szelenkov@nginx.com def test_php_application_ini_admin(self): 294721Szelenkov@nginx.com self.load('ini_precision') 295721Szelenkov@nginx.com 2961775Szelenkov@nginx.com assert 'success' in self.conf( 297*2053Szelenkov@nginx.com {"file": "ini/php.ini", "admin": {"precision": "5"}}, 2981017Szelenkov@nginx.com 'applications/ini_precision/options', 2991017Szelenkov@nginx.com ) 300721Szelenkov@nginx.com 301*2053Szelenkov@nginx.com assert ( 302*2053Szelenkov@nginx.com self.get()['headers']['X-File'] 303*2053Szelenkov@nginx.com == option.test_dir + '/php/ini_precision/ini/php.ini' 304*2053Szelenkov@nginx.com ), 'ini file' 3051596Szelenkov@nginx.com assert self.get()['headers']['X-Precision'] == '5', 'ini value admin' 306721Szelenkov@nginx.com 307721Szelenkov@nginx.com def test_php_application_ini_user(self): 308721Szelenkov@nginx.com self.load('ini_precision') 309721Szelenkov@nginx.com 3101775Szelenkov@nginx.com assert 'success' in self.conf( 311*2053Szelenkov@nginx.com {"file": "ini/php.ini", "user": {"precision": "5"}}, 3121017Szelenkov@nginx.com 'applications/ini_precision/options', 3131017Szelenkov@nginx.com ) 314721Szelenkov@nginx.com 315*2053Szelenkov@nginx.com assert ( 316*2053Szelenkov@nginx.com self.get()['headers']['X-File'] 317*2053Szelenkov@nginx.com == option.test_dir + '/php/ini_precision/ini/php.ini' 318*2053Szelenkov@nginx.com ), 'ini file' 3191596Szelenkov@nginx.com assert self.get()['headers']['X-Precision'] == '5', 'ini value user' 320721Szelenkov@nginx.com 321721Szelenkov@nginx.com def test_php_application_ini_user_2(self): 322721Szelenkov@nginx.com self.load('ini_precision') 323721Szelenkov@nginx.com 3241775Szelenkov@nginx.com assert 'success' in self.conf( 3251017Szelenkov@nginx.com {"file": "ini/php.ini"}, 'applications/ini_precision/options' 3261017Szelenkov@nginx.com ) 327721Szelenkov@nginx.com 3281596Szelenkov@nginx.com assert self.get()['headers']['X-Precision'] == '4', 'ini user file' 329721Szelenkov@nginx.com 3301775Szelenkov@nginx.com assert 'success' in self.conf( 3311017Szelenkov@nginx.com {"precision": "5"}, 'applications/ini_precision/options/user' 3321017Szelenkov@nginx.com ) 333721Szelenkov@nginx.com 3341596Szelenkov@nginx.com assert self.get()['headers']['X-Precision'] == '5', 'ini value user' 335721Szelenkov@nginx.com 336721Szelenkov@nginx.com def test_php_application_ini_set_admin(self): 337721Szelenkov@nginx.com self.load('ini_precision') 338721Szelenkov@nginx.com 3391775Szelenkov@nginx.com assert 'success' in self.conf( 3401017Szelenkov@nginx.com {"admin": {"precision": "5"}}, 'applications/ini_precision/options' 3411017Szelenkov@nginx.com ) 342721Szelenkov@nginx.com 3431596Szelenkov@nginx.com assert ( 3441596Szelenkov@nginx.com self.get(url='/?precision=6')['headers']['X-Precision'] == '5' 3451596Szelenkov@nginx.com ), 'ini set admin' 346721Szelenkov@nginx.com 347721Szelenkov@nginx.com def test_php_application_ini_set_user(self): 348721Szelenkov@nginx.com self.load('ini_precision') 349721Szelenkov@nginx.com 3501775Szelenkov@nginx.com assert 'success' in self.conf( 3511017Szelenkov@nginx.com {"user": {"precision": "5"}}, 'applications/ini_precision/options' 3521017Szelenkov@nginx.com ) 353721Szelenkov@nginx.com 3541596Szelenkov@nginx.com assert ( 3551596Szelenkov@nginx.com self.get(url='/?precision=6')['headers']['X-Precision'] == '6' 3561596Szelenkov@nginx.com ), 'ini set user' 357721Szelenkov@nginx.com 358721Szelenkov@nginx.com def test_php_application_ini_repeat(self): 359721Szelenkov@nginx.com self.load('ini_precision') 360721Szelenkov@nginx.com 3611775Szelenkov@nginx.com assert 'success' in self.conf( 3621017Szelenkov@nginx.com {"user": {"precision": "5"}}, 'applications/ini_precision/options' 3631017Szelenkov@nginx.com ) 364721Szelenkov@nginx.com 3651596Szelenkov@nginx.com assert self.get()['headers']['X-Precision'] == '5', 'ini value' 366721Szelenkov@nginx.com 3671596Szelenkov@nginx.com assert self.get()['headers']['X-Precision'] == '5', 'ini value repeat' 368721Szelenkov@nginx.com 369865Szelenkov@nginx.com def test_php_application_disable_functions_exec(self): 370982Szelenkov@nginx.com self.load('time_exec') 371982Szelenkov@nginx.com 372982Szelenkov@nginx.com self.before_disable_functions() 373865Szelenkov@nginx.com 3741775Szelenkov@nginx.com assert 'success' in self.conf( 3751017Szelenkov@nginx.com {"admin": {"disable_functions": "exec"}}, 3761017Szelenkov@nginx.com 'applications/time_exec/options', 3771017Szelenkov@nginx.com ) 378865Szelenkov@nginx.com 379982Szelenkov@nginx.com body = self.get()['body'] 380865Szelenkov@nginx.com 3811596Szelenkov@nginx.com assert re.search(r'time: \d+', body), 'disable_functions time' 3821596Szelenkov@nginx.com assert not re.search(r'exec: \/\w+', body), 'disable_functions exec' 383865Szelenkov@nginx.com 384865Szelenkov@nginx.com def test_php_application_disable_functions_comma(self): 385982Szelenkov@nginx.com self.load('time_exec') 386865Szelenkov@nginx.com 387982Szelenkov@nginx.com self.before_disable_functions() 388865Szelenkov@nginx.com 3891775Szelenkov@nginx.com assert 'success' in self.conf( 3901017Szelenkov@nginx.com {"admin": {"disable_functions": "exec,time"}}, 3911017Szelenkov@nginx.com 'applications/time_exec/options', 3921017Szelenkov@nginx.com ) 393865Szelenkov@nginx.com 394982Szelenkov@nginx.com body = self.get()['body'] 395982Szelenkov@nginx.com 3961596Szelenkov@nginx.com assert not re.search( 3971596Szelenkov@nginx.com r'time: \d+', body 3981596Szelenkov@nginx.com ), 'disable_functions comma time' 3991596Szelenkov@nginx.com assert not re.search( 4001596Szelenkov@nginx.com r'exec: \/\w+', body 4011596Szelenkov@nginx.com ), 'disable_functions comma exec' 402865Szelenkov@nginx.com 4031742Szelenkov@nginx.com def test_php_application_auth(self): 4041742Szelenkov@nginx.com self.load('auth') 4051742Szelenkov@nginx.com 4061742Szelenkov@nginx.com resp = self.get() 4071742Szelenkov@nginx.com assert resp['status'] == 200, 'status' 4081742Szelenkov@nginx.com assert resp['headers']['X-Digest'] == 'not set', 'digest' 4091742Szelenkov@nginx.com assert resp['headers']['X-User'] == 'not set', 'user' 4101742Szelenkov@nginx.com assert resp['headers']['X-Password'] == 'not set', 'password' 4111742Szelenkov@nginx.com 4121742Szelenkov@nginx.com resp = self.get( 4131742Szelenkov@nginx.com headers={ 4141742Szelenkov@nginx.com 'Host': 'localhost', 4151742Szelenkov@nginx.com 'Authorization': 'Basic dXNlcjpwYXNzd29yZA==', 4161742Szelenkov@nginx.com 'Connection': 'close', 4171742Szelenkov@nginx.com } 4181742Szelenkov@nginx.com ) 4191742Szelenkov@nginx.com assert resp['status'] == 200, 'basic status' 4201742Szelenkov@nginx.com assert resp['headers']['X-Digest'] == 'not set', 'basic digest' 4211742Szelenkov@nginx.com assert resp['headers']['X-User'] == 'user', 'basic user' 4221742Szelenkov@nginx.com assert resp['headers']['X-Password'] == 'password', 'basic password' 4231742Szelenkov@nginx.com 4241742Szelenkov@nginx.com resp = self.get( 4251742Szelenkov@nginx.com headers={ 4261742Szelenkov@nginx.com 'Host': 'localhost', 4271742Szelenkov@nginx.com 'Authorization': 'Digest username="blah", realm="", uri="/"', 4281742Szelenkov@nginx.com 'Connection': 'close', 4291742Szelenkov@nginx.com } 4301742Szelenkov@nginx.com ) 4311742Szelenkov@nginx.com assert resp['status'] == 200, 'digest status' 4321742Szelenkov@nginx.com assert ( 4331742Szelenkov@nginx.com resp['headers']['X-Digest'] == 'username="blah", realm="", uri="/"' 4341742Szelenkov@nginx.com ), 'digest digest' 4351742Szelenkov@nginx.com assert resp['headers']['X-User'] == 'not set', 'digest user' 4361742Szelenkov@nginx.com assert resp['headers']['X-Password'] == 'not set', 'digest password' 4371742Szelenkov@nginx.com 4381742Szelenkov@nginx.com def test_php_application_auth_invalid(self): 4391742Szelenkov@nginx.com self.load('auth') 4401742Szelenkov@nginx.com 4411742Szelenkov@nginx.com def check_auth(auth): 4421848Szelenkov@nginx.com resp = self.get( 4431848Szelenkov@nginx.com headers={ 4441848Szelenkov@nginx.com 'Host': 'localhost', 4451848Szelenkov@nginx.com 'Authorization': auth, 4461848Szelenkov@nginx.com 'Connection': 'close', 4471848Szelenkov@nginx.com } 4481848Szelenkov@nginx.com ) 4491742Szelenkov@nginx.com 4501742Szelenkov@nginx.com assert resp['status'] == 200, 'status' 4511742Szelenkov@nginx.com assert resp['headers']['X-Digest'] == 'not set', 'Digest' 4521742Szelenkov@nginx.com assert resp['headers']['X-User'] == 'not set', 'User' 4531742Szelenkov@nginx.com assert resp['headers']['X-Password'] == 'not set', 'Password' 4541742Szelenkov@nginx.com 4551742Szelenkov@nginx.com check_auth('Basic dXN%cjpwYXNzd29yZA==') 4561742Szelenkov@nginx.com check_auth('Basic XNlcjpwYXNzd29yZA==') 4571742Szelenkov@nginx.com check_auth('Basic DdXNlcjpwYXNzd29yZA==') 4581742Szelenkov@nginx.com check_auth('Basic blah') 4591742Szelenkov@nginx.com check_auth('Basic') 4601742Szelenkov@nginx.com check_auth('Digest') 4611742Szelenkov@nginx.com check_auth('blah') 4621742Szelenkov@nginx.com 463865Szelenkov@nginx.com def test_php_application_disable_functions_space(self): 464982Szelenkov@nginx.com self.load('time_exec') 465865Szelenkov@nginx.com 466982Szelenkov@nginx.com self.before_disable_functions() 467865Szelenkov@nginx.com 4681775Szelenkov@nginx.com assert 'success' in self.conf( 4691017Szelenkov@nginx.com {"admin": {"disable_functions": "exec time"}}, 4701017Szelenkov@nginx.com 'applications/time_exec/options', 4711017Szelenkov@nginx.com ) 472865Szelenkov@nginx.com 473982Szelenkov@nginx.com body = self.get()['body'] 474982Szelenkov@nginx.com 4751596Szelenkov@nginx.com assert not re.search( 4761596Szelenkov@nginx.com r'time: \d+', body 4771596Szelenkov@nginx.com ), 'disable_functions space time' 4781596Szelenkov@nginx.com assert not re.search( 4791596Szelenkov@nginx.com r'exec: \/\w+', body 4801596Szelenkov@nginx.com ), 'disable_functions space exec' 481865Szelenkov@nginx.com 482865Szelenkov@nginx.com def test_php_application_disable_functions_user(self): 483982Szelenkov@nginx.com self.load('time_exec') 484982Szelenkov@nginx.com 485982Szelenkov@nginx.com self.before_disable_functions() 486865Szelenkov@nginx.com 4871775Szelenkov@nginx.com assert 'success' in self.conf( 4881017Szelenkov@nginx.com {"user": {"disable_functions": "exec"}}, 4891017Szelenkov@nginx.com 'applications/time_exec/options', 4901017Szelenkov@nginx.com ) 491865Szelenkov@nginx.com 492982Szelenkov@nginx.com body = self.get()['body'] 493982Szelenkov@nginx.com 4941596Szelenkov@nginx.com assert re.search(r'time: \d+', body), 'disable_functions user time' 4951596Szelenkov@nginx.com assert not re.search( 4961596Szelenkov@nginx.com r'exec: \/\w+', body 4971596Szelenkov@nginx.com ), 'disable_functions user exec' 498865Szelenkov@nginx.com 499865Szelenkov@nginx.com def test_php_application_disable_functions_nonexistent(self): 500982Szelenkov@nginx.com self.load('time_exec') 501982Szelenkov@nginx.com 502982Szelenkov@nginx.com self.before_disable_functions() 503865Szelenkov@nginx.com 5041775Szelenkov@nginx.com assert 'success' in self.conf( 5051017Szelenkov@nginx.com {"admin": {"disable_functions": "blah"}}, 5061017Szelenkov@nginx.com 'applications/time_exec/options', 5071017Szelenkov@nginx.com ) 508865Szelenkov@nginx.com 509982Szelenkov@nginx.com body = self.get()['body'] 510865Szelenkov@nginx.com 5111596Szelenkov@nginx.com assert re.search( 5121596Szelenkov@nginx.com r'time: \d+', body 5131596Szelenkov@nginx.com ), 'disable_functions nonexistent time' 5141596Szelenkov@nginx.com assert re.search( 5151596Szelenkov@nginx.com r'exec: \/\w+', body 5161596Szelenkov@nginx.com ), 'disable_functions nonexistent exec' 517865Szelenkov@nginx.com 518865Szelenkov@nginx.com def test_php_application_disable_classes(self): 519865Szelenkov@nginx.com self.load('date_time') 520865Szelenkov@nginx.com 5211596Szelenkov@nginx.com assert re.search( 5221596Szelenkov@nginx.com r'012345', self.get()['body'] 5231596Szelenkov@nginx.com ), 'disable_classes before' 524865Szelenkov@nginx.com 5251775Szelenkov@nginx.com assert 'success' in self.conf( 5261017Szelenkov@nginx.com {"admin": {"disable_classes": "DateTime"}}, 5271017Szelenkov@nginx.com 'applications/date_time/options', 5281017Szelenkov@nginx.com ) 529865Szelenkov@nginx.com 5301596Szelenkov@nginx.com assert not re.search( 5311596Szelenkov@nginx.com r'012345', self.get()['body'] 5321596Szelenkov@nginx.com ), 'disable_classes before' 533865Szelenkov@nginx.com 534865Szelenkov@nginx.com def test_php_application_disable_classes_user(self): 535865Szelenkov@nginx.com self.load('date_time') 536865Szelenkov@nginx.com 5371596Szelenkov@nginx.com assert re.search( 5381596Szelenkov@nginx.com r'012345', self.get()['body'] 5391596Szelenkov@nginx.com ), 'disable_classes before' 540982Szelenkov@nginx.com 5411775Szelenkov@nginx.com assert 'success' in self.conf( 5421017Szelenkov@nginx.com {"user": {"disable_classes": "DateTime"}}, 5431017Szelenkov@nginx.com 'applications/date_time/options', 5441017Szelenkov@nginx.com ) 545865Szelenkov@nginx.com 5461596Szelenkov@nginx.com assert not re.search( 5471596Szelenkov@nginx.com r'012345', self.get()['body'] 5481596Szelenkov@nginx.com ), 'disable_classes before' 5491017Szelenkov@nginx.com 5501850Smax.romanov@nginx.com def test_php_application_error_log(self): 5511529Szelenkov@nginx.com self.load('error_log') 5521529Szelenkov@nginx.com 5531596Szelenkov@nginx.com assert self.get()['status'] == 200, 'status' 5541529Szelenkov@nginx.com 5551529Szelenkov@nginx.com time.sleep(1) 5561529Szelenkov@nginx.com 5571596Szelenkov@nginx.com assert self.get()['status'] == 200, 'status 2' 5581529Szelenkov@nginx.com 5591529Szelenkov@nginx.com pattern = r'\d{4}\/\d\d\/\d\d\s\d\d:.+\[notice\].+Error in application' 5601529Szelenkov@nginx.com 5611596Szelenkov@nginx.com assert self.wait_for_record(pattern) is not None, 'errors print' 5621529Szelenkov@nginx.com 5631850Smax.romanov@nginx.com errs = self.findall(pattern) 5641850Smax.romanov@nginx.com 5651850Smax.romanov@nginx.com assert len(errs) == 2, 'error_log count' 5661529Szelenkov@nginx.com 5671850Smax.romanov@nginx.com date = errs[0].split('[')[0] 5681850Smax.romanov@nginx.com date2 = errs[1].split('[')[0] 5691850Smax.romanov@nginx.com assert date != date2, 'date diff' 5701529Szelenkov@nginx.com 5711105Szelenkov@nginx.com def test_php_application_script(self): 5721596Szelenkov@nginx.com assert 'success' in self.conf( 5731596Szelenkov@nginx.com { 5741596Szelenkov@nginx.com "listeners": {"*:7080": {"pass": "applications/script"}}, 5751596Szelenkov@nginx.com "applications": { 5761596Szelenkov@nginx.com "script": { 5771596Szelenkov@nginx.com "type": "php", 5781596Szelenkov@nginx.com "processes": {"spare": 0}, 5791596Szelenkov@nginx.com "root": option.test_dir + "/php/script", 5801596Szelenkov@nginx.com "script": "phpinfo.php", 5811596Szelenkov@nginx.com } 5821596Szelenkov@nginx.com }, 5831596Szelenkov@nginx.com } 5841596Szelenkov@nginx.com ), 'configure script' 5851105Szelenkov@nginx.com 5861105Szelenkov@nginx.com resp = self.get() 5871105Szelenkov@nginx.com 5881596Szelenkov@nginx.com assert resp['status'] == 200, 'status' 5891596Szelenkov@nginx.com assert resp['body'] != '', 'body not empty' 5901105Szelenkov@nginx.com 5911105Szelenkov@nginx.com def test_php_application_index_default(self): 5921596Szelenkov@nginx.com assert 'success' in self.conf( 5931596Szelenkov@nginx.com { 5941596Szelenkov@nginx.com "listeners": {"*:7080": {"pass": "applications/phpinfo"}}, 5951596Szelenkov@nginx.com "applications": { 5961596Szelenkov@nginx.com "phpinfo": { 5971596Szelenkov@nginx.com "type": "php", 5981596Szelenkov@nginx.com "processes": {"spare": 0}, 5991596Szelenkov@nginx.com "root": option.test_dir + "/php/phpinfo", 6001596Szelenkov@nginx.com } 6011596Szelenkov@nginx.com }, 6021596Szelenkov@nginx.com } 6031596Szelenkov@nginx.com ), 'configure index default' 6041105Szelenkov@nginx.com 6051346St.nateldemoura@f5.com resp = self.get() 6061346St.nateldemoura@f5.com 6071596Szelenkov@nginx.com assert resp['status'] == 200, 'status' 6081596Szelenkov@nginx.com assert resp['body'] != '', 'body not empty' 6091346St.nateldemoura@f5.com 6101654Szelenkov@nginx.com def test_php_application_extension_check(self, temp_dir): 6111346St.nateldemoura@f5.com self.load('phpinfo') 6121346St.nateldemoura@f5.com 6131596Szelenkov@nginx.com assert self.get(url='/index.wrong')['status'] != 200, 'status' 6141596Szelenkov@nginx.com 6151654Szelenkov@nginx.com new_root = temp_dir + "/php" 6161596Szelenkov@nginx.com os.mkdir(new_root) 6171596Szelenkov@nginx.com shutil.copy(option.test_dir + '/php/phpinfo/index.wrong', new_root) 6181596Szelenkov@nginx.com 6191596Szelenkov@nginx.com assert 'success' in self.conf( 6201596Szelenkov@nginx.com { 6211596Szelenkov@nginx.com "listeners": {"*:7080": {"pass": "applications/phpinfo"}}, 6221596Szelenkov@nginx.com "applications": { 6231596Szelenkov@nginx.com "phpinfo": { 6241596Szelenkov@nginx.com "type": "php", 6251596Szelenkov@nginx.com "processes": {"spare": 0}, 6261596Szelenkov@nginx.com "root": new_root, 6271596Szelenkov@nginx.com "working_directory": new_root, 6281596Szelenkov@nginx.com } 6291596Szelenkov@nginx.com }, 6301596Szelenkov@nginx.com } 6311596Szelenkov@nginx.com ), 'configure new root' 6321596Szelenkov@nginx.com 6331596Szelenkov@nginx.com resp = self.get() 6341596Szelenkov@nginx.com assert str(resp['status']) + resp['body'] != '200', 'status new root' 6351596Szelenkov@nginx.com 6361596Szelenkov@nginx.com def run_php_application_cwd_root_tests(self): 6371596Szelenkov@nginx.com assert 'success' in self.conf_delete( 6381596Szelenkov@nginx.com 'applications/cwd/working_directory' 6391346St.nateldemoura@f5.com ) 640865Szelenkov@nginx.com 6411596Szelenkov@nginx.com script_cwd = option.test_dir + '/php/cwd' 6421367Szelenkov@nginx.com 6431596Szelenkov@nginx.com resp = self.get() 6441596Szelenkov@nginx.com assert resp['status'] == 200, 'status ok' 6451596Szelenkov@nginx.com assert resp['body'] == script_cwd, 'default cwd' 6461596Szelenkov@nginx.com 6471596Szelenkov@nginx.com assert 'success' in self.conf( 6481596Szelenkov@nginx.com '"' + option.test_dir + '"', 'applications/cwd/working_directory', 6491367Szelenkov@nginx.com ) 6501367Szelenkov@nginx.com 6511367Szelenkov@nginx.com resp = self.get() 6521596Szelenkov@nginx.com assert resp['status'] == 200, 'status ok' 6531596Szelenkov@nginx.com assert resp['body'] == script_cwd, 'wdir cwd' 6541381St.nateldemoura@f5.com 6551381St.nateldemoura@f5.com resp = self.get(url='/?chdir=/') 6561596Szelenkov@nginx.com assert resp['status'] == 200, 'status ok' 6571596Szelenkov@nginx.com assert resp['body'] == '/', 'cwd after chdir' 6581381St.nateldemoura@f5.com 6591381St.nateldemoura@f5.com # cwd must be restored 6601381St.nateldemoura@f5.com 6611381St.nateldemoura@f5.com resp = self.get() 6621596Szelenkov@nginx.com assert resp['status'] == 200, 'status ok' 6631596Szelenkov@nginx.com assert resp['body'] == script_cwd, 'cwd restored' 6641381St.nateldemoura@f5.com 6651381St.nateldemoura@f5.com resp = self.get(url='/subdir/') 6661596Szelenkov@nginx.com assert resp['body'] == script_cwd + '/subdir', 'cwd subdir' 6671381St.nateldemoura@f5.com 6681381St.nateldemoura@f5.com def test_php_application_cwd_root(self): 6691381St.nateldemoura@f5.com self.load('cwd') 6701381St.nateldemoura@f5.com self.run_php_application_cwd_root_tests() 6711381St.nateldemoura@f5.com 6721381St.nateldemoura@f5.com def test_php_application_cwd_opcache_disabled(self): 6731381St.nateldemoura@f5.com self.load('cwd') 6741381St.nateldemoura@f5.com self.set_opcache('cwd', '0') 6751381St.nateldemoura@f5.com self.run_php_application_cwd_root_tests() 6761381St.nateldemoura@f5.com 6771381St.nateldemoura@f5.com def test_php_application_cwd_opcache_enabled(self): 6781381St.nateldemoura@f5.com self.load('cwd') 6791381St.nateldemoura@f5.com self.set_opcache('cwd', '1') 6801381St.nateldemoura@f5.com self.run_php_application_cwd_root_tests() 6811381St.nateldemoura@f5.com 6821381St.nateldemoura@f5.com def run_php_application_cwd_script_tests(self): 6831381St.nateldemoura@f5.com self.load('cwd') 6841381St.nateldemoura@f5.com 6851596Szelenkov@nginx.com script_cwd = option.test_dir + '/php/cwd' 6861381St.nateldemoura@f5.com 6871596Szelenkov@nginx.com assert 'success' in self.conf_delete( 6881596Szelenkov@nginx.com 'applications/cwd/working_directory' 6891381St.nateldemoura@f5.com ) 6901381St.nateldemoura@f5.com 6911596Szelenkov@nginx.com assert 'success' in self.conf('"index.php"', 'applications/cwd/script') 6921381St.nateldemoura@f5.com 6931596Szelenkov@nginx.com assert self.get()['body'] == script_cwd, 'default cwd' 6941596Szelenkov@nginx.com 6951596Szelenkov@nginx.com assert self.get(url='/?chdir=/')['body'] == '/', 'cwd after chdir' 6961381St.nateldemoura@f5.com 6971381St.nateldemoura@f5.com # cwd must be restored 6981596Szelenkov@nginx.com assert self.get()['body'] == script_cwd, 'cwd restored' 6991381St.nateldemoura@f5.com 7001381St.nateldemoura@f5.com def test_php_application_cwd_script(self): 7011381St.nateldemoura@f5.com self.load('cwd') 7021381St.nateldemoura@f5.com self.run_php_application_cwd_script_tests() 7031381St.nateldemoura@f5.com 7041381St.nateldemoura@f5.com def test_php_application_cwd_script_opcache_disabled(self): 7051381St.nateldemoura@f5.com self.load('cwd') 7061381St.nateldemoura@f5.com self.set_opcache('cwd', '0') 7071381St.nateldemoura@f5.com self.run_php_application_cwd_script_tests() 7081381St.nateldemoura@f5.com 7091381St.nateldemoura@f5.com def test_php_application_cwd_script_opcache_enabled(self): 7101381St.nateldemoura@f5.com self.load('cwd') 7111381St.nateldemoura@f5.com self.set_opcache('cwd', '1') 7121381St.nateldemoura@f5.com self.run_php_application_cwd_script_tests() 7131381St.nateldemoura@f5.com 7141381St.nateldemoura@f5.com def test_php_application_path_relative(self): 7151381St.nateldemoura@f5.com self.load('open') 7161381St.nateldemoura@f5.com 7171596Szelenkov@nginx.com assert self.get()['body'] == 'test', 'relative path' 7181381St.nateldemoura@f5.com 7191596Szelenkov@nginx.com assert ( 7201596Szelenkov@nginx.com self.get(url='/?chdir=/')['body'] != 'test' 7211596Szelenkov@nginx.com ), 'relative path w/ chdir' 7221367Szelenkov@nginx.com 7231596Szelenkov@nginx.com assert self.get()['body'] == 'test', 'relative path 2' 7242000Smax.romanov@nginx.com 7252000Smax.romanov@nginx.com def test_php_application_shared_opcache(self): 7262000Smax.romanov@nginx.com self.load('opcache', limits={'requests': 1}) 7272000Smax.romanov@nginx.com 7282000Smax.romanov@nginx.com r = self.get() 7292000Smax.romanov@nginx.com cached = r['headers']['X-Cached'] 7302000Smax.romanov@nginx.com if cached == '-1': 7312000Smax.romanov@nginx.com pytest.skip('opcache is not supported') 7322000Smax.romanov@nginx.com 7332000Smax.romanov@nginx.com pid = r['headers']['X-Pid'] 7342000Smax.romanov@nginx.com 7352000Smax.romanov@nginx.com assert cached == '0', 'not cached' 7362000Smax.romanov@nginx.com 7372000Smax.romanov@nginx.com r = self.get() 7382000Smax.romanov@nginx.com 7392000Smax.romanov@nginx.com assert r['headers']['X-Pid'] != pid, 'new instance' 7402000Smax.romanov@nginx.com assert r['headers']['X-Cached'] == '1', 'cached' 741