headers
Signed-off-by: Jeff <jeff@gotenzing.com>
Showing
73 changed files
with
7924 additions
and
847 deletions
5.16 KB
wp-content/plugins/headers-security-advanced-hsts-wp/headers-security-advanced-hsts-wp.php
deleted
100644 → 0
| 1 | <?php | ||
| 2 | /* | ||
| 3 | Plugin Name: Headers Security Advanced & HSTS WP | ||
| 4 | Plugin URI: https://www.tentacleplugins.com/ | ||
| 5 | Description: Headers Security Advanced & HSTS WP - Simple, Light and Fast. The plugin uses advanced security rules that provide huge levels of protection and it is important that your site uses it. This step is important to submit your website and/or domain to an approved HSTS list. Google officially compiles this list and it is used by Chrome, Firefox, Opera, Safari, IE11 and Edge. You can forward your site to the official HSTS preload directory. Cross Site Request Forgery (CSRF) is a common attack with the installation of Headers Security Advanced & HSTS WP will help you mitigate CSRF on your Wordpress site. | ||
| 6 | Version: 4.8.96 | ||
| 7 | Text Domain: headers-security-advanced-hsts-wp | ||
| 8 | Author: 🐙 Andrea Ferro, Augusto Bombana | ||
| 9 | Author URI: https://www.linkedin.com/in/andrea-ferro-55046186/ | ||
| 10 | __ | ||
| 11 | ___( o)> | ||
| 12 | \ <_. ) | ||
| 13 | `---' iron3 | ||
| 14 | */ | ||
| 15 | |||
| 16 | function add_Headers_Security_Advanced_HSTS_WP_htaccess( $rules ) { | ||
| 17 | $HEadersSecurityAdvancedServerCheckA = $_SERVER['SERVER_NAME']; | ||
| 18 | $HEadersSecurityAdvancedCheckB = str_replace('www.','',$HEadersSecurityAdvancedServerCheckA); | ||
| 19 | $HEadersSecurityAdvancedServerCheck3B = $_SERVER['SERVER_NAME']; | ||
| 20 | $HEadersSecurityAdvancedCheckC03 = str_replace('.','',$HEadersSecurityAdvancedCheckB); | ||
| 21 | |||
| 22 | $content = <<<EOD | ||
| 23 | # Headers Security Advanced & HSTS WP - 4.8.96 | ||
| 24 | <IfModule mod_headers.c> | ||
| 25 | Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" | ||
| 26 | Header always set X-XSS-Protection "1; mode=block" | ||
| 27 | Header always set X-Content-Type-Options "nosniff" | ||
| 28 | Header always set Referrer-Policy "no-referrer-when-downgrade" | ||
| 29 | Header always set Expect-CT "max-age=7776000, enforce" | ||
| 30 | Header set Access-Control-Allow-Origin "null" | ||
| 31 | Header set Access-Control-Allow-Methods "GET,PUT,POST,DELETE" | ||
| 32 | Header set Access-Control-Allow-Headers "Content-Type, Authorization" | ||
| 33 | Header set X-Content-Security-Policy "img-src *; media-src * data:;" | ||
| 34 | Header always set Content-Security-Policy "report-uri https://$HEadersSecurityAdvancedServerCheck3B" | ||
| 35 | Header set Cross-Origin-Embedder-Policy-Report-Only 'unsafe-none; report-to="default"' | ||
| 36 | Header set Cross-Origin-Embedder-Policy 'unsafe-none; report-to="default"' | ||
| 37 | Header set Cross-Origin-Opener-Policy-Report-Only 'same-origin; report-to="default"' | ||
| 38 | Header set Cross-Origin-Opener-Policy 'same-origin; report-to="default"' | ||
| 39 | Header set Cross-Origin-Resource-Policy 'cross-origin' | ||
| 40 | Header set strict-dynamic "https: 'self'; default-src 'self'" | ||
| 41 | Header always set X-Frame-Options "ALLOWALL" | ||
| 42 | Header always set Permissions-Policy "geolocation=(self), microphone=(), accelerometer=(), gyroscope=(), magnetometer=()" | ||
| 43 | Header set X-Permitted-Cross-Domain-Policies "none" | ||
| 44 | </IfModule> | ||
| 45 | # END Headers Security Advanced & HSTS WP\n\n | ||
| 46 | EOD; | ||
| 47 | return $content . $rules; | ||
| 48 | } | ||
| 49 | add_filter('mod_rewrite_rules', 'add_Headers_Security_Advanced_HSTS_WP_htaccess'); | ||
| 50 | |||
| 51 | function Headers_Security_Advanced_HSTS_WP_enable_flush_rules() { | ||
| 52 | global $wp_rewrite; | ||
| 53 | $wp_rewrite->flush_rules(); | ||
| 54 | } | ||
| 55 | register_activation_hook( __FILE__, 'Headers_Security_Advanced_HSTS_WP_enable_flush_rules' ); | ||
| 56 | |||
| 57 | function Headers_Security_Advanced_HSTS_WP_deactivate() { | ||
| 58 | remove_filter('mod_rewrite_rules', 'add_Headers_Security_Advanced_HSTS_WP_htaccess'); | ||
| 59 | global $wp_rewrite; | ||
| 60 | $wp_rewrite->flush_rules(); | ||
| 61 | } | ||
| 62 | register_deactivation_hook( __FILE__, 'Headers_Security_Advanced_HSTS_WP_deactivate' ); | ||
| 63 | |||
| 64 | function Headers_Security_Advanced_HSTS_WP_widgets() { | ||
| 65 | wp_add_dashboard_widget( | ||
| 66 | 'wpexplorer_dashboard_widget', | ||
| 67 | '<img style="max-width:30px;" src=" data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF0WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuOWNjYzRkZTkzLCAyMDIyLzAzLzE0LTE0OjA3OjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjMuMyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDMtMjlUMTY6Mjk6NDgrMDI6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA0LTI4VDE3OjA2OjUyKzAyOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA0LTI4VDE3OjA2OjUyKzAyOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0YjcxODEyNy05ZjQ0LTRmNjItOWVmYS0xODVhYjFiMDBhNTEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDozZWZmN2E3Ni1mMzVkLTgzNDItYTczYy0zMGMyM2NlMWU5M2YiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ODhiNGRmZi1lY2ViLTRhY2QtODQ0OS02YjA5Mzc1MWE1MDgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ4OGI0ZGZmLWVjZWItNGFjZC04NDQ5LTZiMDkzNzUxYTUwOCIgc3RFdnQ6d2hlbj0iMjAyMi0wMy0yOVQxNjoyOTo0OCswMjowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRiNzE4MTI3LTlmNDQtNGY2Mi05ZWZhLTE4NWFiMWIwMGE1MSIgc3RFdnQ6d2hlbj0iMjAyMi0wNC0yOFQxNzowNjo1MiswMjowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+y7nmEAAADnhJREFUaIHd2nm8jtXaB/Dv8zx7INveZsqhDKUZlew6iSQhkqGckHqLU71p5khFp3KS6aCj4TRQUSqJROYMkZQ5SiIkGYqdmT08z/vH2uK8b9k79Q6fd30+92c9z33fa63rt65xXdcdSSQS/j+0JLBsKUuWsHVrTPahut6f+Gcbvq5n354SIkiKEEUkv4/l91FEI8SOvpf//+j+6DGxo96P5c8Z+5n7P42LHrlftOgu5SvPc0b9F2RUWCC9TK6qF1KuWj6QSIQiRTIs/LiH9yb2lEBq/uBI9H9qU4/dIgkO7Stlw/Iqvllxg7ptB6nd7G9EsgiYicWK+fTTh0yY2FMEqVGiUUT+Fyn/mRaNklqEpCTmv3q/dZ/0FksqzmEg8+fXN2RodwQu+D+sNwnEkiiaztSn7vHVRw04DGTcuGsRdOG4F4iTl0duHrm55GQfuXKP6nNzwvO8vDDmuMGkcCibJRPacVjZFy9pc1yz5SWIJ8iLhy1JTiUplSLJFE2maAqpKYHLeTnED4PJJpFDTi7RXBJRxIjFBHEuhEQkEhTPYMOiFkeA7NhR/KfxBTElHic3Ht5LTg6TnVSKqtU5qyZVTqVCRcpUoEw5Uk8I7+YcZNdOsr5n60a+W8f6VXy7mp1bydlHdg7JMSJJRGMFb2QsiQO7048ASSQOC9nPt4hAfG4ijMgoy6mV+GM9Gjah9oWUKBXe3bGdjJIkJbPpa7Z+S0oqRYpSsiypRTn5NNKuDff37OTzT1gxl1Vz2fIVB/eQd4iUlMDhX+RQ5KdHkUQiQSSS+Bc/cdgfRPJBZMdJilLxZBpk0uY6GlwZiNv2XeBSyVI81Y+lH/Jgf7Zv5eGbieRxaH94t8a57NpGzUzqNCKzESXL/ytti6cz701WzuHHLWF8kSIkJ+X7l6Nog0iMYVsiSQWyLzfBiZVo1YybOlPrAvbsDoRNn8Qj9/JAH/bu5G+P8Wgf9u/l9rbUrsM119P3Lg4e5IcsmrSh2tmkprJiQZgnKRYIK1KMqudy/hVsXMmMEXz6Lnu/D1JzDLk/Nkdy4lQ7hUFDuerqMGLcGBbM455utGpO3kHemkC7qzi9On8fQYvzKV2eERMZ9RxvDuPGu2l6HRu/YvoYvlnF/l3IDfRF4wHU2RfRqCPnNQ7rffkxrz3AuoUUSztOjuTi8ito2oLdu1izmvvuoF0nJk9g9ZfMmMfbI/l6I2/PYMBD7NjByGmMfZnBfRj4LJmXM/AvLJpCrXpc0pxyFUhOCXIejZDI48AeNq8jYxGVzqJGJmc35PM5AcgvtAJEC8WLh0X27uXdcRzYTcuWDBvEmZUoX5oRw7nxhrDDr4+g+yPs2UXfh+nei7oN6NSAlDSeeI1KVVmzgq+/IPfQkXgrIpjq3GwWzyGzMU1uDuFJAa1gIPG80J9UMViYkmUCqK3f0OI6pr7L/t10uZ9/PErxUtz2AG0bUuNUbrqXG+pTtDjPjePL5XS9mr3bqHQOaUUEU+qIMsci7E0EKSBfP34rkJzcI5OtWs0FF5O1g00baNiUkc9SrhTF05g1g+tvZMUnLFzA25OZ8CqrPmPcApYvoNstNLiCDkODyY4IVi+ROGIlI4gfosKpYe3c3N8ByMEDoZ81k9nzeOElDu7jxyxWLmXt55xRk+WLwo42bsXwIZx2IpmX0a0zra+nfGXaN6B+A54YzpwJvPE0WVtITQSfEU3kR9zxIHLX3M2J1YOoFeCoCwayf3+Ii1Z9Rsf2/DGT3g+RhcFPsGEr/+jCmpUhDKlclc8WcU5msFDfbab9nYzoF3a2+yCmjKJvzwD8ihaccVa+J4/nA0FeNhVrhDlzDgQ9+k1A9uwJVqhVa5o2ZuAgZs/lzGpsWscB1LucIb1CuLJvT9jBs89j3nQqluKU05g0ito1Oa027S6idCo9hnH6eaxeHJxmeimy9wXLdUIaFaqRl8uBvQWeiwoGkrUzOMASJbn1VuZ8wKjRrF1G9z7c34XsvUycRrcegRs/bKd+MwY/RJXTAhFbd9KiE2tXsSObG+/iwib0voFtX1CiDNvXU7YCaenhf5WaAdC+HwuMvY4NJJIPZPcuihWj7sV07UqZDB5/l3p1eeAxut0ViO14G3e0pVxFypZn/RekZ/DSk2SkUetipo2mYhrXduW5nny1jAFvs3YJz/6F2o1p0DbMV+Vctm9g744CgRybXzFBqbduocKJNGvEzOlc0YSMdEaO4q2RjB7DsyOY+z4TP6DXYGZPYPPGoDuvP0VGBjUv5r1XqFWbjPJMGh30p+JpjB/LQSyazIg+fPo+RdLYm8WerPwT6/FyJIYdO/lhW/j/5mtMeo9ej9G2JW+8zoOP0O8RzjyD5vVpegV/bEijOsGbn12LFwZxaSY7t5O1nVa3sPxDoslc1JSXH2XzSh4YFpR8949Uqh7W3LU9xHG/jSMR9uWyeUv43+FmXhrJGZWDiD3+CIP60f4mbr85EDH0Jfo9wLZvePx5sg+GUOf2v/L20yGMb9iG0YOodSGlT2T6aNr/Ow3/xO6dpJ3ASdXCmjs3s+t7osfe82M/jUaCo/pqHRKkJNNrAHOncMH5TJlFmeLBLK9dzqQ5LJjN8y8wYCjbNjFyBB1voXg6Y0dzWaMQ+a5cyA3dQ5+czAWNGd2P1wZw7vmUrxpo2LqeAzlkxBzr5HhsIIfHfTKPzz8L1uSSi+jcOUS6Uycy8ClOymD6JyH8uLUznW6kWVu6NA9Kfm8/urUlkc3dA3i1bzjdNelIn46cWZfSFRj/NFd1on1P0suydR3rFpESLTBMObZoJXBChC+/ZulyKp1MZiZz3ufadjz+MDdczztT+WgGXW6kdRseGshjXVm+lAEjmDmWebO57eFwLnnjdTrcx46tfL6ES69h2ezgR85rFCxVemnWLuaLRRQrfkxuFAyEcDLMibN4cfCumzcFoi6/lFmL+VM7etzJnfdwx308MYS+9/HOOG7vzh+qMLAn513A9V3p1TEYhmvvZMCtVDuHS1oydgjVz6PS6cFHwYYV7DsYMiYFkVngG3EkY+7UEKY0a0mt88N5/On+jJ/GiUUZO4Hq1bmvC+9NoHQSyz7iw/dDmDFoDK/056uVPDeF90eydi2DxzL7XbZk0aUD2zZw6XVsWcuK2RRPzSfi2K1w+dDUCF+uYcmi4OFnzeLmjiyYG+KuifPZv4PrrmbOVDrfQpEUln7MxnUMn8Gnsxk2mC49KfcH/tmbFh2pXINhf+Gq9sEBrvqIClWDg/xmVcgsFiI7VDggsSh743w4O4Qrl13GyDGM/yAchW/vSMc/UzadaYtp3prd8XDiGz4l6EKvrlzdio7d6NGO9BLc+ihD7w3OtmknJg/n9LpI8Pl89vwYjEIhWuEz1Gl47S0WLeTMc/huE22volV71q/hmaGMnMTMd+nciZMrMG4J+3ZxTyfqXsQj/6R3J75bz9/e5MOJfDiN6+9ny3o+X8QlrVk1n1kjKXpCockrPJDUGPsP8uqIEHtlXspZZ4Uj79TF/KEiHa/kwYdpWJ9xn7L8I27rSJ2Lg44M7sbiufR4KqRO+9zDNTdR61LGDOauIcGgzHmLbVnBeRYyDV04vhH0rUSUt8fQvAWt/8TgF3l/DB2asGgNtSrzxjvBoT12J+PGctO/cX9fHr2N98ZQqSRzJ7DyUy6+lJt7M/QuzsgMqaCFE5k+nNLp4eQYK9xe/7riRzRKPJeXnmHTRkqVZvxb4d7zzzBmdkiLXn1RyHn1f5o7enPvdcycxDWt2bePme+FbOSDzzN6IN9u4Pb+7PiOyS+GsCZWUMr0twCBtGSmzmfkcHIOMWIcoyYHf3P9Zdz575xXh8lLObkabTL5YgUvTKBdV7IPcca5DHiH6W+EHNeTbwel/mA0MydwQvqvJuvXA4knKBWhz+OMfTN43Z076Neb8hV5dzK9hvBMHzo0p+qpjFnI1k3c2oxzMxk0PojXK/14/DXKV2HeOJ7vTqnCK/jRrfA6cnSLxUiL8+DdlClDo2bMWBESFaOG8fLToar0cB+u7sCzj/Ha81zVip7/YPQQxr9I/7HUasDSWQy7JySsYykKVxb4PYAQ6h4//MgdnXhlLBfWY9u3zJpE82u5rQdbNtGxPt9t46H+XNWBJ+9g9SKenkaN2uH3k7eESLlEScdbLTt+IPEEJVP4fgc3teLvL9C4JROXhef3d2D8GC6sQ9+XQvR6W2NOqcGbK0kpysdTGPBntm+iVMn8CtbxVc0KLiv8VGY+6vnR5emkCAfz806PDqRNJ0qX5b3XObSP+i0Y+yILp9PhThq1ZXcWM95k6D3Ec8K5PhI/dnk66eh1/2sS+7cDiUZIjpCTw/44za7k3r9y7gXBEq1eFjx2684h/bpmGcP7htA+LSV470i84Dp7oYBEI4mQqjxOILF8zkSw8xDlT6DDrbTsQJUaIeO+fjVT3+Cd5/g+i3LFjxRfC/PBwC8CiTJsaz6QjBLZdu9K/omY4wFy+F5SLGQG9ySoWJwr24Rq08yxIewoESOtWMiw/5ovH34OSDyPImk5Bm9MCcpeu/Zcc2ZfXhilKrDF46E2WC4aso4jXw6Ll4hQNi0QEc8Xpd/SIlH2/0jVOh9y2CHWrzdCUlL8OMz3L7dEIsh/uWLhKlos/9z9O3yMEImEsCg3wen1XuUwkJo1Z2vSdIq8/Nr579USiX+9fpcWCWmn/buo2/IDFc/+gMN+pF69zUqX6uGbDcWs+Ky+vAQp+Sn+w5t4mI7E73xRAJMSR7q8vHBF4pxy/nxX3nWfk07fxGE/8tWaILeffFLBqJE9fLnmIlnfV5aXXTRfmROFVvb/js+ckkREkZp6QLH0TSqettAFrQeoUmeTpGTKVz/qM6f9+ylWbJvmLR6XMbuxhR83tDurVP73Wj8PJFIIIP95zPEAiYqIJkgvu1PlM2erXnea1GI7ZO8nuQT4D6tRb7pVw9zlAAAAAElFTkSuQmCC" />Headers Security Advanced & HSTS WP', | ||
| 68 | 'Headers_Security_Advanced_HSTS_WP_widget_function' | ||
| 69 | ); | ||
| 70 | } | ||
| 71 | add_action( 'wp_dashboard_setup', 'Headers_Security_Advanced_HSTS_WP_widgets' ); | ||
| 72 | |||
| 73 | function Headers_Security_Advanced_HSTS_WP_widget_function() { | ||
| 74 | echo '<h2><span style="color:#0ca533;">👋 <b>Congratulations</b> you are safe,</span></h2><br><b>The Headers Security Advanced & HSTS WP</b> project implements HTTP response headers that your site can use to increase the security of your website. The plug-in will automatically set up all Best Practices (you don’t have to think about anything).<br /><br /><span style="color:#0ca533;"></span> <br />'; | ||
| 75 | echo '<script type="text/javascript" src="https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js" data-name="bmc-button" data-slug="tentacleplugins" data-color="#FFDD00" data-emoji="" data-font="Inter" data-text="Buy me a coffee" data-outline-color="#000000" data-font-color="#000000" data-coffee-color="#ffffff" ></script>'; | ||
| 76 | } | ||
| 77 | |||
| 78 | function Headers_Security_Advanced_HSTS_WP_send_header() { | ||
| 79 | header( 'Strict-Transport-Security: max-age=63072000; includeSubDomains; preload' ); | ||
| 80 | } | ||
| 81 | add_action( 'send_headers', 'Headers_Security_Advanced_HSTS_WP_send_header' ); | ||
| 82 | |||
| 83 | function Headers_Security_Advanced_HSTS_WP_Headers( $headers ) { | ||
| 84 | $HEadersSecurityAdvancedServerCheck = $_SERVER['SERVER_NAME']; | ||
| 85 | $HEadersSecurityAdvancedCheck = str_replace('www.','',$HEadersSecurityAdvancedServerCheck); | ||
| 86 | |||
| 87 | $HEadersSecurityAdvancedServerCheck3 = $_SERVER['SERVER_NAME']; | ||
| 88 | |||
| 89 | $headers['X-XSS-Protection'] = '1; mode=block'; | ||
| 90 | $headers['Expect-CT'] = 'max-age=7776000, enforce'; | ||
| 91 | $headers['Access-Control-Allow-Origin'] = 'null'; | ||
| 92 | $headers['Access-Control-Allow-Methods'] = 'GET,PUT,POST,DELETE'; | ||
| 93 | $headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'; | ||
| 94 | $headers['X-Content-Security-Policy'] = 'default-src \'self\'; img-src *; media-src * data:;'; | ||
| 95 | $headers['X-Content-Type-Options'] = 'nosniff'; | ||
| 96 | $headers['Content-Security-Policy'] = "report-uri https://$HEadersSecurityAdvancedCheck"; | ||
| 97 | $headers['Referrer-Policy'] = 'no-referrer-when-downgrade'; | ||
| 98 | $headers['Cross-Origin-Embedder-Policy-Report-Only'] = 'require-corp; report-to="default"'; | ||
| 99 | $headers['Cross-Origin-Embedder-Policy'] = 'unsafe-none; report-to="default"'; | ||
| 100 | $headers['Cross-Origin-Opener-Policy-Report-Only'] = 'same-origin; report-to="default"'; | ||
| 101 | $headers['Cross-Origin-Opener-Policy'] = 'same-origin; report-to="default"'; | ||
| 102 | $headers['Cross-Origin-Resource-Policy'] = 'cross-origin'; | ||
| 103 | $headers['strict-dynamic'] = "https: 'self'; default-src 'self'"; | ||
| 104 | $headers['X-Frame-Options'] = 'ALLOWALL'; | ||
| 105 | $headers['Permissions-Policy'] = "geolocation=(self), microphone=(), accelerometer=(), gyroscope=(), magnetometer=()"; | ||
| 106 | $headers['Feature-Policy'] = "payment 'self'; display-capture 'self'"; | ||
| 107 | $headers['X-Permitted-Cross-Domain-Policies'] = "none"; | ||
| 108 | |||
| 109 | return $headers; | ||
| 110 | } | ||
| 111 | add_filter( 'wp_headers', 'Headers_Security_Advanced_HSTS_WP_Headers' ); | ||
| 112 | |||
| 113 | defined( 'ABSPATH' ) or die( 'No script kiddies please!' ); | ||
| 114 | |||
| 115 | // Headers Security Advanced & HSTS WP - VERSION | ||
| 116 | if( ! defined( 'headers-security-advanced-hsts-wp-login-version' ) ) { | ||
| 117 | define( 'headers-security-advanced-hsts-wp-login-version', '4.3.0' ); | ||
| 118 | } | ||
| 119 | |||
| 120 | // Headers Security Advanced & HSTS WP | ||
| 121 | if( ! defined( 'headers-security-advanced-hsts-wp-login-name' ) ) { | ||
| 122 | define( 'headers-security-advanced-hsts-wp-login-name', 'Headers Security Advanced & HSTS WP' ); | ||
| 123 | } | ||
| 124 | |||
| 125 | // Headers Security Advanced & HSTS WP - DIR | ||
| 126 | if ( ! defined( 'headers_security_advanced_hsts_wp_login_path' ) ) { | ||
| 127 | define( 'headers_security_advanced_hsts_wp_login_path', plugin_dir_path( __FILE__ ) ); | ||
| 128 | } | ||
| 129 | |||
| 130 | // Headers Security Advanced & HSTS WP - URI | ||
| 131 | if ( ! defined( 'headers-security-advanced-hsts-wp-base-uri' ) ) { | ||
| 132 | define( 'headers-security-advanced-hsts-wp-base-uri', plugin_dir_url( __FILE__ ) ); | ||
| 133 | } | ||
| 134 | |||
| 135 | // Headers Security Advanced & HSTS WP - MENU | ||
| 136 | add_action( 'admin_menu', 'csrf_Headers_Security_Advanced_HSTS_WP_auth' ); | ||
| 137 | |||
| 138 | function csrf_Headers_Security_Advanced_HSTS_WP_auth() { | ||
| 139 | add_options_page( 'Headers Security Advanced & HSTS WP', 'Headers Security Advanced & HSTS WP', 'manage_options', 'headers_security_advanced_hsts_wp_option_menu', 'csrf_Headers_Security_Advanced_HSTS_WP_options' ); | ||
| 140 | } | ||
| 141 | |||
| 142 | function csrf_Headers_Security_Advanced_HSTS_WP_options() { | ||
| 143 | if ( !current_user_can( 'manage_options' ) ) { | ||
| 144 | wp_die( __( 'You do not have sufficient permissions to access this page.' ) ); | ||
| 145 | } | ||
| 146 | echo '<div class="wrap">'; | ||
| 147 | echo '<h2><span style="color:#0ca533;">👋 <b>Congratulations</b> you are safe,</span></h2><br><b>The Headers Security Advanced & HSTS WP</b> project implements HTTP response headers that your site can use to increase the security of your website. <br /><br />The plug-in will automatically set up all Best Practices (you don’t have to think about anything).<br /><br /> | ||
| 148 | <br /></div></div>'; | ||
| 149 | echo '<script type="text/javascript" src="https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js" data-name="bmc-button" data-slug="tentacleplugins" data-color="#FFDD00" data-emoji="" data-font="Inter" data-text="Buy me a coffee" data-outline-color="#000000" data-font-color="#000000" data-coffee-color="#ffffff" ></script>'; | ||
| 150 | echo '</div>'; | ||
| 151 | } | ||
| 152 | |||
| 153 | add_filter('plugin_action_links', 'Headers_Security_Advanced_HSTS_WP_hs_links', 10, 2); | ||
| 154 | function Headers_Security_Advanced_HSTS_WP_hs_links($links, $file) { | ||
| 155 | static $this_plugin; | ||
| 156 | |||
| 157 | if (!$this_plugin) { | ||
| 158 | $this_plugin = plugin_basename(__FILE__); | ||
| 159 | } | ||
| 160 | |||
| 161 | if ($file == $this_plugin) { | ||
| 162 | $settings_link = '<a href="https://www.buymeacoffee.com/tentacleplugins">Donate a coffee</a>'; | ||
| 163 | array_unshift($links, $settings_link); | ||
| 164 | } | ||
| 165 | return $links; | ||
| 166 | } | ||
| 167 | ?> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | msgid "" | ||
| 2 | msgstr "" | ||
| 3 | "Project-Id-Version: Headers Security Advanced & HSTS WP\n" | ||
| 4 | "POT-Creation-Date: 2021-11-04 20:22+0000\n" | ||
| 5 | "PO-Revision-Date: \n" | ||
| 6 | "Language-Team: \n" | ||
| 7 | "MIME-Version: 1.0\n" | ||
| 8 | "Content-Type: text/plain; charset=UTF-8\n" | ||
| 9 | "Content-Transfer-Encoding: 8bit\n" | ||
| 10 | "X-Generator: Poedit 2.4.2\n" | ||
| 11 | "X-Poedit-Basepath: .\n" | ||
| 12 | "X-Poedit-KeywordsList: _e;__\n" | ||
| 13 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||
| 14 | "Last-Translator: \n" | ||
| 15 | "Language: it\n" | ||
| 16 | "X-Poedit-SearchPath-0: ..\n" | ||
| 17 | |||
| 18 | #: ../includes/headers-security-advanced-hsts-admin-login.php:109 | ||
| 19 | msgid "Please upgrade to the latest version of WordPress to activate" | ||
| 20 | msgstr "Effettua l’aggiornamento all’ultima versione di WordPress" | ||
| 21 | |||
| 22 | #. Plugin Name | ||
| 23 | #: ../includes/headers-security-advanced-hsts-admin-login.php:109 | ||
| 24 | #: ../includes/headers-security-advanced-hsts-admin-login.php:141 | ||
| 25 | #: ../includes/headers-security-advanced-hsts-admin-login.php:168 | ||
| 26 | msgid "Headers Security Advanced & HSTS WP" | ||
| 27 | msgstr "Headers Security Advanced & HSTS WP" | ||
| 28 | |||
| 29 | #: ../includes/headers-security-advanced-hsts-admin-login.php:142 | ||
| 30 | msgid "" | ||
| 31 | "This option allows you to set a networkwide default, which can be overridden " | ||
| 32 | "by individual sites. Simply go to to the site’s permalink settings to change " | ||
| 33 | "the url." | ||
| 34 | msgstr "" | ||
| 35 | "Questa opzione consente di impostare un valore predefinito per l’intera " | ||
| 36 | "rete, che può essere ignorato dai singoli siti. Basta andare alle " | ||
| 37 | "impostazioni permalink del sito per modificare l’URL." | ||
| 38 | |||
| 39 | #: ../includes/headers-security-advanced-hsts-admin-login.php:145 | ||
| 40 | msgid "Networkwide default" | ||
| 41 | msgstr "Predefinito per l’intera rete" | ||
| 42 | |||
| 43 | #: ../includes/headers-security-advanced-hsts-admin-login.php:175 | ||
| 44 | msgid "Login url" | ||
| 45 | msgstr "Url di accesso" | ||
| 46 | |||
| 47 | #: ../includes/headers-security-advanced-hsts-admin-login.php:183 | ||
| 48 | msgid "Redirect URL" | ||
| 49 | msgstr " | ||
| 50 | |||
| 51 | #: ../includes/headers-security-advanced-hsts-admin-login.php:226 | ||
| 52 | #, php-format | ||
| 53 | msgid "" | ||
| 54 | "To set a networkwide default, go to <a href=\"%s\">Network Settings</a>." | ||
| 55 | msgstr "" | ||
| 56 | "Per impostare una rete predefinita ampia, andate a <a href=\\”%s" | ||
| 57 | "\\”>Impostazioni di rete</a>." | ||
| 58 | |||
| 59 | #: ../includes/headers-security-advanced-hsts-admin-login.php.php:235 | ||
| 60 | msgid "Use the slug name, example: "contact-me" - DO NOT USE the full website URL. If you leave the above field empty the plugin will add a redirect to the website homepage." | ||
| 61 | msgstr "" | ||
| 62 | |||
| 63 | #: ../includes/headers-security-advanced-hsts-admin-login.php:250 | ||
| 64 | #, php-format | ||
| 65 | msgid "" | ||
| 66 | "Your login page is now here: <strong><a href=\"%1$s\">%2$s</a></strong>. " | ||
| 67 | "Bookmark this page!" | ||
| 68 | msgstr "" | ||
| 69 | "La tua pagina di accesso adesso si trova qui: <strong><a href=\\”%1$s\\”>" | ||
| 70 | "%2$s</a></strong>. Metti questa pagina nei preferiti!" | ||
| 71 | |||
| 72 | #: ../includes/headers-security-advanced-hsts-admin-login.php:256 | ||
| 73 | #: ../includes/headers-security-advanced-hsts-admin-login.php:258 | ||
| 74 | msgid "Settings" | ||
| 75 | msgstr "Impostazioni" | ||
| 76 | |||
| 77 | #: ../includes/headers-security-advanced-hsts-admin-login.php:275 | ||
| 78 | msgid "This feature is not enabled." | ||
| 79 | msgstr "Questa funzione non è abilitata." |
| 1 | === Plugin Name === | ||
| 2 | Contributors: unicorn03, unicorn07 | ||
| 3 | Donate link: https://tentacleplugins.com/ | ||
| 4 | Tags: headers security, hsts, http headers, insecure content, force ssl, headers, login security, xss, clickjacking, mitm, cross origin, cross site, privacy, csp | ||
| 5 | Requires at least: 4.7 | ||
| 6 | Tested up to: 6.0 | ||
| 7 | Stable tag: 4.8.96 | ||
| 8 | Requires PHP: 7.0 | ||
| 9 | License: GPLv2 or later | ||
| 10 | License URI: https://www.gnu.org/licenses/gpl-2.0.html | ||
| 11 | |||
| 12 | Best all-in-one WordPress security plugin, uses HTTP & HSTS response headers to avoid vulnerabilities: XSS, injection, clickjacking. Force HTTP/HTTPS. | ||
| 13 | |||
| 14 | == Description == | ||
| 15 | |||
| 16 | = ENGLISH = | ||
| 17 | |||
| 18 | **Headers Security Advanced & HSTS WP** is Best all-in-one a free plug-in for all WordPress users. Deactivating this plugin will return your site configuration exactly to the state it was in before. | ||
| 19 | |||
| 20 | The **Headers Security Advanced & HSTS WP** project implements HTTP response headers that your site can use to increase the security of your website. The plug-in will automatically set up all Best Practices (you don't have to think about anything), these HTTP response headers can prevent modern browsers from running into easily predictable vulnerabilities. The Headers Security Advanced & HSTS WP project wants to popularize and increase awareness and usage of these headers for all wordpress users. | ||
| 21 | |||
| 22 | This plugin is developed by TentaclePlugins, we care about WordPress security and best practices. | ||
| 23 | |||
| 24 | Check out the best features of **Headers Security Advanced & HSTS WP:** | ||
| 25 | |||
| 26 | * HSA Limit Login to block brute force attacks. | ||
| 27 | * X-XSS-Protection | ||
| 28 | * Expect-CT | ||
| 29 | * Access-Control-Allow-Origin | ||
| 30 | * Access-Control-Allow-Methods | ||
| 31 | * Access-Control-Allow-Headers | ||
| 32 | * X-Content-Security-Policy | ||
| 33 | * X-Content-Type-Options | ||
| 34 | * X-Frame-Options | ||
| 35 | * X-Permitted-Cross-Domain-Policies | ||
| 36 | * X-Powered-By | ||
| 37 | * Content-Security-Policy | ||
| 38 | * Referrer-Policy | ||
| 39 | * HTTP Strict Transport Security / HSTS | ||
| 40 | * Content-Security-Policy | ||
| 41 | * Clear-Site-Data | ||
| 42 | * Cross-Origin-Embedder-Policy-Report-Only | ||
| 43 | * Cross-Origin-Opener-Policy-Report-Only | ||
| 44 | * Cross-Origin-Embedder-Policy | ||
| 45 | * Cross-Origin-Opener-Policy | ||
| 46 | * Cross-Origin-Resource-Policy | ||
| 47 | * Permissions-Policy | ||
| 48 | * Strict-dynamic | ||
| 49 | * Strict-Transport-Security | ||
| 50 | * FLoC (Federated Learning of Cohorts) | ||
| 51 | |||
| 52 | **Headers Security Advanced & HSTS WP** is based on **OWASP CSRF** to protect your wordpress site. Using OWASP CSRF, once the plugin is installed, it will provide full CSRF mitigation without having to call a method to use nonce on the output. The site will be secure despite having other vulnerable plugins (CSRF). | ||
| 53 | |||
| 54 | HTTP security headers are a critical part of your website's security. After automatic implementation with Headers Security Advanced & HSTS WP, they protect you from the most notorious types of attacks your site might encounter. These headers protect against XSS, code injection, clickjacking, etc. | ||
| 55 | |||
| 56 | We have implemented **FLoC (Federated Learning of Cohorts)**, using best practices. First, using **Headers Security Advanced & HSTS WP** prevents the browser from including your site in the "cohort calculation" on **FLoC (Federated Learning of Cohorts)**. This means that nothing can call document.interestCohort() to get the FLoC ID of the currently used client. Obviously, this does nothing outside of your currently visited site and does not "disable" FLoC on the client beyond that scope. | ||
| 57 | |||
| 58 | Even though **FLoC** is still fairly new and not yet widely supported, as programmers we think that privacy protection elements are important, so we choose to give you the feature of being opt out of FLoC! We’ve created a special **“automatic blocking of FLoC”** feature, trying to always **offer the best tool with privacy protection and cyber security** as main targets and focus. | ||
| 59 | |||
| 60 | Analyze your site before and after using *Headers Security Advanced & HSTS WP* security headers are self-configured according to HTTP Security Headers and HTTP Strict Transport Security / HSTS best practices. | ||
| 61 | |||
| 62 | * Check HTTP Security Headers on <a href="https://securityheaders.com/" target="_blank">securityheaders.com</a> | ||
| 63 | * Check HTTP Strict Transport Security / HSTS at <a href="https://hstspreload.org/" target="_blank">hstspreload.org</a> | ||
| 64 | * Check WebPageTest at <a href="https://www.webpagetest.org/" target="_blank">webpagetest.org</a> | ||
| 65 | * Check HSTS test website <a href="https://gf.dev/hsts-test/" target="_blank">gf.dev/hsts-test</a> | ||
| 66 | |||
| 67 | This plugin is updated periodically, our limited support is free, we are available for your feedback (bugs, compatibility issues or recommendations for next updates). We are usually fast :-D. | ||
| 68 | |||
| 69 | == Frequently Asked Questions == | ||
| 70 | |||
| 71 | = How do you get an A+ grade? = | ||
| 72 | |||
| 73 | To earn an A+ grade, your site must issue all HTTP response headers that we check. This indicates a high level of commitment to improving the security of your visitors. | ||
| 74 | |||
| 75 | = What headers are recommended? = | ||
| 76 | |||
| 77 | Over an HTTP connection we get Content-Security-Policy, X-Content-Type-Options, X-Frame-Options and X-XSS-Protection. Via an HTTPS connection, 2 additional headers are checked for presence which are Strict-Transport-Security and Public-Key-Pins. | ||
| 78 | |||
| 79 | * Once the plug-in is activated it performs a test (before and after): <a href="https://securityheaders.com/" target="_blank">https://securityheaders.com/</a> | ||
| 80 | |||
| 81 | = Can the plugin create slowdowns? = | ||
| 82 | |||
| 83 | No, Headers Security Advanced & HSTS WP is Fast, Secure and does not affect the SEO and speed of your website. | ||
| 84 | |||
| 85 | = What is HSTS (Strict Transport Security)? = | ||
| 86 | |||
| 87 | It was created as a solution to force the browser to use secure connections when a site is running on HTTPS. It is a security header that is added to the web server and reflected in the response header as Strict-Transport-Security. HSTS is important because it addresses the following anomalies: | ||
| 88 | |||
| 89 | = Check before and after using Preload HSTS = | ||
| 90 | |||
| 91 | This step is important to submit your website and/or domain to an approved HSTS list. Google officially compiles this list and it is used by Chrome, Firefox, Opera, Safari, IE11 and Edge. You can forward your site to the official HSTS preload directory. ('https://hstspreload.org/') | ||
| 92 | |||
| 93 | = how to use HTTP Strict Transport Security (HSTS) = | ||
| 94 | |||
| 95 | If you want to use Preload HSTS for your site, there are a few requirements before you can activate it. | ||
| 96 | |||
| 97 | * Have a valid SSL certificate. You can't do any of this anyway without it. | ||
| 98 | * You must redirect all HTTP traffic to HTTPS (recommended via permanent 301 redirects). This means that your site should be HTTPS only. | ||
| 99 | * You need to serve all subdomains in HTTPS as well. If you have subdomains, you will need an SSL certificate. | ||
| 100 | |||
| 101 | The HSTS header on your base domain (for example: example.com) is already configured you just need to activate the plug-in. | ||
| 102 | |||
| 103 | If you want to check the HSTS status of your site, you can do so here: <a href="https://hstspreload.org/" target="_blank">https://hstspreload.org/</a> | ||
| 104 | |||
| 105 | = Can I report a bug or request a feature? = | ||
| 106 | |||
| 107 | You can report bugs or request new features right <a href="mailto:tentacleplugins.support@protonmail.com">click here !</a> | ||
| 108 | |||
| 109 | = Disable FLoC, Google's advertising technology = | ||
| 110 | |||
| 111 | FLoC is a mega tracker that monitors user activity on all sites, stores the information in the browser, and then uses machine learning to place users into cohorts with similar interests. This way, advertisers can target groups of people with similar interests. Plus, according to Google's own testing, FLoC achieves at least 95% more conversions than cookies. | ||
| 112 | |||
| 113 | = Who is disabling FLoC by Google? = | ||
| 114 | |||
| 115 | Scott Helme reported that as of May 3, already 967 of the first 1 million domains had disabled FLoC's interest-cohort in their Permissions-Policy header. That list included some big sites like The Guardian and IKEA. | ||
| 116 | |||
| 117 | == Installation == | ||
| 118 | |||
| 119 | = ITALIAN = | ||
| 120 | |||
| 121 | 1. Vai in Plugin 'Aggiungi nuovo'. | ||
| 122 | 2. Cerca Headers Security Advanced & HSTS WP. | ||
| 123 | 3. Cerca questo plugin, scaricalo e attivalo. | ||
| 124 | 4. Vai in 'impostazioni' > 'Permalink'. Cambia il tuo url di login alla voce 'Security Url'. | ||
| 125 | 5. Puoi cambiare questa opzione quando vuoi, Headers Security Advanced & HSTS WP viene impostato in automatico. | ||
| 126 | |||
| 127 | = ENGLISH = | ||
| 128 | |||
| 129 | 1. Go to Plugins 'Add New'. | ||
| 130 | 2. Search for Headers Security Advanced & HSTS WP. | ||
| 131 | 3. Search for this plugin, download and activate it. | ||
| 132 | 4. Go to 'settings' > 'Permalink'. Change your login url to 'Security Url'. | ||
| 133 | 5. You can change this option whenever you want, Headers Security Advanced & HSTS WP is set automatically. | ||
| 134 | |||
| 135 | = FRANÇAIS = | ||
| 136 | |||
| 137 | 1. Allez dans Plugins 'Add new'. | ||
| 138 | 2. Recherchez Headers Security Advanced & HSTS WP. | ||
| 139 | 3. Recherchez ce plugin, téléchargez-le et activez-le. | ||
| 140 | 4. Allez dans "Paramètres" > "Lien permanent". Changez votre url de connexion en 'Security Url'. | ||
| 141 | 5. Vous pouvez modifier cette option quand vous le souhaitez, Headers Security Advanced & HSTS WP est réglé automatiquement. | ||
| 142 | |||
| 143 | = DEUTSCH = | ||
| 144 | |||
| 145 | 1. Gehen Sie zu Plugins 'Neu hinzufügen'. | ||
| 146 | 2. Suchen Sie nach Headers Security Advanced & HSTS WP. | ||
| 147 | 3. Suchen Sie nach diesem Plugin, laden Sie es herunter und aktivieren Sie es. | ||
| 148 | 4. Gehen Sie zu "Einstellungen" > "Permalink". Ändern Sie Ihre Login-Url in 'Security Url'. | ||
| 149 | 5. Sie können diese Option jederzeit ändern, Headers Security Advanced & HSTS WP wird automatisch eingestellt. | ||
| 150 | |||
| 151 | == Screenshots == | ||
| 152 | |||
| 153 | 1. Check HTTP Security Headers (AFTER) | ||
| 154 | 2. Check HTTP Security Headers (BEFORE) | ||
| 155 | 3. Check HTTP Strict Transport Security / HSTS (list) | ||
| 156 | 4. Check WebPageTest (AFTER) | ||
| 157 | 5. Check WebPageTest (BEFORE) | ||
| 158 | 6. Setting on single site installation | ||
| 159 | 7. Check HTTP Security Headers - Serpworx (AFTER) | ||
| 160 | 8. Check HTTP Security Headers - Serpworx (BEFORE) | ||
| 161 | 9. Site-wide security setting | ||
| 162 | |||
| 163 | == Changelog == | ||
| 164 | |||
| 165 | = 4.8.96 = | ||
| 166 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.96 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 167 | - Fixed: Fixed issue that could show in own console log an error of (syntax error); | ||
| 168 | - Upgrade: Speeded up loading and compatibility with some third-party plugins; | ||
| 169 | - Upgrade: Updated some optimization functions of Wordpress version 6.0; | ||
| 170 | |||
| 171 | = 4.8.94 = | ||
| 172 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.94 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 173 | - Update: optimization and resolution external application compatibility; | ||
| 174 | - Fixed: solved problem with some headers and debug optimizations; | ||
| 175 | |||
| 176 | = 4.8.93 = | ||
| 177 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.93 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 178 | - Fixed: optimization and resolution external application compatibility; | ||
| 179 | - Fixed: solved problem with some headers and debug optimizations; | ||
| 180 | - Update: We fixed some issues that could occur with the "full screen" method; | ||
| 181 | |||
| 182 | = 4.8.92 = | ||
| 183 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.90 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 184 | - Fixed: Compatibility with version 6.0 of Wordpress | ||
| 185 | - Fixed: redirection errors could occur ERR_TOO_MANY_REDIRECTS | ||
| 186 | |||
| 187 | = 4.8.91 = | ||
| 188 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.90 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 189 | - New: Compatibility with version 6.0 of Wordpress | ||
| 190 | - Update: We fixed some issues that could occur with the "full screen" method | ||
| 191 | |||
| 192 | = 4.8.90 = | ||
| 193 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.90 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 194 | - New: compatibility Wordpress 6.0 | ||
| 195 | |||
| 196 | = 4.8.89 = | ||
| 197 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.89 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 198 | - Fixed: We fixed an issue that could occur with a renamed version of a header parameter, now we have optimized the request; | ||
| 199 | |||
| 200 | = 4.8.88 = | ||
| 201 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.88 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 202 | - New: Added New X-Permitted-Cross-Domain-Policies; | ||
| 203 | - New: Optimization with the Serpworx tool (Check Your Security Headers); | ||
| 204 | - Add: Added new "Feature-Policies" such as: push=(), vibrate=(), fullscreen(); | ||
| 205 | - Fixed: We fixed a problem with the debug.log file that could show the following warning (PHP Notice: Undefined index); | ||
| 206 | |||
| 207 | = 4.8.86 = | ||
| 208 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.86 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 209 | - Fixed: We fixed a problem with the debug.log file that could show the following warning (PHP Notice: Undefined index); | ||
| 210 | - Fixed: fixed the problem with the wordpress widget, it could cause the wrong display of the favicon; | ||
| 211 | |||
| 212 | = 4.8.85 = | ||
| 213 | We don't want to tell you what to do, but here's the thing: if you updated Headers Security Advanced & HSTS WP plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.85 (we've exterminated some bugs, fixed some annoying pixels and refreshed the graphics) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Enjoy | ||
| 214 | - Fixed: We fixed a problem with the debug.log file that could show the following warning (PHP Notice: Undefined index); | ||
| 215 | |||
| 216 | = 4.8.6 = | ||
| 217 | We don't want to tell you what to do, but here's the thing: if you updated the plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.6 (we've improved some crazy programmer stuff) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Now let's get started right away to the next code and update to do 😀 we're crazy but we like this one | ||
| 218 | - Fixed: We have fixed an issue with the X-Frame-Options header; | ||
| 219 | |||
| 220 | = 4.8.3 = | ||
| 221 | We don't want to tell you what to do, but here's the thing: if you updated the plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.3 (we've improved some crazy programmer stuff) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Now let's get started right away to the next code and update to do 😀 we're crazy but we like this one | ||
| 222 | - Fixed: This is the latest version to fix and make compatible with themes, plugins that could create conflicts with Vimeo and Youtube implementation. | ||
| 223 | |||
| 224 | = 4.8.0 = | ||
| 225 | We don't want to tell you what to do, but here's the thing: if you updated the plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.8.0 (we've improved some crazy programmer stuff) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Now let's get started right away to the next code and update to do 😀 we're crazy but we like this one | ||
| 226 | - Fixed: We have fixed some issues with Vimeo viewing | ||
| 227 | |||
| 228 | = 4.7.30 = | ||
| 229 | We don't want to tell you what to do, but here's the thing: if you updated the plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.7.30 (we've improved some crazy programmer stuff) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Now let's get started right away to the next code and update to do 😀 we're crazy but we like this one | ||
| 230 | - Fixed: We found some bugs and now the plugin is more optimized and happy :-D | ||
| 231 | - Fixed: We have fixed some issues with Vimeo viewing | ||
| 232 | - Update: Wordpress 5.9 | ||
| 233 | |||
| 234 | = 4.7.20 = | ||
| 235 | We don't want to tell you what to do, but here's the thing: if you updated the plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this version 4.7.20 (we've improved some crazy programmer stuff) and everything works like a charm. So we're in agreement? Tap "update" and we'll give you the coolest, fastest and most awesome plugin out there with the best updates in the world. Now let's get started right away to the next code and update to do 😀 we're crazy but we like this one | ||
| 236 | - New: Wordpress 5.9 | ||
| 237 | - Fixed: We've listened to your feedback and have momentarily disabled the ability to customize the url | ||
| 238 | |||
| 239 | = 4.7.15 = | ||
| 240 | We don’t want to tell you what to do, but here’s the thing: if you updated the plugin last time, you saw that when we propose to do it, we don’t just say it. Well, we’ve added and fixed a lot of things with this 4.7.15 version (we’ve improved some crazy programmer stuff) and everything works like a charm. So are we on board? Tap on “update” and we’ll give you the coolest, fastest, most awesome plugin out there with the best updates in the world. Now let’s get started right away to the next code and update to do 😀 we are crazy but we like this | ||
| 241 | * Fixed: we have solved the error that was shown in QueryMonitor Undefined property | ||
| 242 | |||
| 243 | = 4.7.1 = | ||
| 244 | We don’t want to tell you what to do, but here’s the thing: if you updated the plugin last time, you saw that when we propose to do it, we don’t just say it. Well, we’ve added and fixed a lot of things with this 4.7.1 version (we’ve improved some crazy programmer stuff) and everything works like a charm. So are we on board? Tap on “update” and we’ll give you the coolest, fastest, most awesome plugin out there with the best updates in the world. Now let’s get started right away to the next code and update to do 😀 we are crazy but we like this | ||
| 245 | * Fixed: "All the little beings that generated errors and bugs have been exterminated. We know we are very attentive to details" | ||
| 246 | * Update: "Third-party plugin optimization such as cache, cloudflare and redirects" | ||
| 247 | |||
| 248 | = 4.7.0 = | ||
| 249 | IMPORTANT: This update optimizes and fixes some issues that may occur with a cache manager. | ||
| 250 | We don't want to tell you what to do, but here's the thing: if you updated the plugin last time, you saw that when we propose to do it, we don't just say it. Well, we've added and fixed a lot of things with this 4.7.0 version (we've improved some crazy programmer stuff) and everything works like a charm. So are we on board? Tap on "update" and we'll give you the coolest, fastest, most awesome plugin out there with the best updates in the world. Now let's get started right away to the next code and update to do :D we are crazy but we like this | ||
| 251 | * Update: "X Powered By" | ||
| 252 | * Update: Content Security Policy optimization (CSP Header) and internal testing with Chrome, Firefox, Safari, Edge | ||
| 253 | * Updated: "accelerometer block" | ||
| 254 | * Updated: "gyroscope block" | ||
| 255 | * Updated: "magnetometer block" | ||
| 256 | * Updated: "usb block" | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | GNU GENERAL PUBLIC LICENSE | 1 | GNU GENERAL PUBLIC LICENSE |
| 2 | Version 2, June 1991 | 2 | Version 2, June 1991 |
| 3 | 3 | ||
| 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., |
| 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 6 | Everyone is permitted to copy and distribute verbatim copies | 6 | Everyone is permitted to copy and distribute verbatim copies |
| 7 | of this license document, but changing it is not allowed. | 7 | of this license document, but changing it is not allowed. |
| 8 | 8 | ||
| 9 | Preamble | 9 | Preamble |
| 10 | 10 | ||
| 11 | The licenses for most software are designed to take away your | 11 | The licenses for most software are designed to take away your |
| 12 | freedom to share and change it. By contrast, the GNU General Public | 12 | freedom to share and change it. By contrast, the GNU General Public |
| 13 | License is intended to guarantee your freedom to share and change free | 13 | License is intended to guarantee your freedom to share and change free |
| 14 | software--to make sure the software is free for all its users. This | 14 | software--to make sure the software is free for all its users. This |
| 15 | General Public License applies to most of the Free Software | 15 | General Public License applies to most of the Free Software |
| 16 | Foundation's software and to any other program whose authors commit to | 16 | Foundation's software and to any other program whose authors commit to |
| 17 | using it. (Some other Free Software Foundation software is covered by | 17 | using it. (Some other Free Software Foundation software is covered by |
| 18 | the GNU Lesser General Public License instead.) You can apply it to | 18 | the GNU Lesser General Public License instead.) You can apply it to |
| 19 | your programs, too. | 19 | your programs, too. |
| 20 | 20 | ||
| 21 | When we speak of free software, we are referring to freedom, not | 21 | When we speak of free software, we are referring to freedom, not |
| 22 | price. Our General Public Licenses are designed to make sure that you | 22 | price. Our General Public Licenses are designed to make sure that you |
| 23 | have the freedom to distribute copies of free software (and charge for | 23 | have the freedom to distribute copies of free software (and charge for |
| 24 | this service if you wish), that you receive source code or can get it | 24 | this service if you wish), that you receive source code or can get it |
| 25 | if you want it, that you can change the software or use pieces of it | 25 | if you want it, that you can change the software or use pieces of it |
| 26 | in new free programs; and that you know you can do these things. | 26 | in new free programs; and that you know you can do these things. |
| 27 | 27 | ||
| 28 | To protect your rights, we need to make restrictions that forbid | 28 | To protect your rights, we need to make restrictions that forbid |
| 29 | anyone to deny you these rights or to ask you to surrender the rights. | 29 | anyone to deny you these rights or to ask you to surrender the rights. |
| 30 | These restrictions translate to certain responsibilities for you if you | 30 | These restrictions translate to certain responsibilities for you if you |
| 31 | distribute copies of the software, or if you modify it. | 31 | distribute copies of the software, or if you modify it. |
| 32 | 32 | ||
| 33 | For example, if you distribute copies of such a program, whether | 33 | For example, if you distribute copies of such a program, whether |
| 34 | gratis or for a fee, you must give the recipients all the rights that | 34 | gratis or for a fee, you must give the recipients all the rights that |
| 35 | you have. You must make sure that they, too, receive or can get the | 35 | you have. You must make sure that they, too, receive or can get the |
| 36 | source code. And you must show them these terms so they know their | 36 | source code. And you must show them these terms so they know their |
| 37 | rights. | 37 | rights. |
| 38 | 38 | ||
| 39 | We protect your rights with two steps: (1) copyright the software, and | 39 | We protect your rights with two steps: (1) copyright the software, and |
| 40 | (2) offer you this license which gives you legal permission to copy, | 40 | (2) offer you this license which gives you legal permission to copy, |
| 41 | distribute and/or modify the software. | 41 | distribute and/or modify the software. |
| 42 | 42 | ||
| 43 | Also, for each author's protection and ours, we want to make certain | 43 | Also, for each author's protection and ours, we want to make certain |
| 44 | that everyone understands that there is no warranty for this free | 44 | that everyone understands that there is no warranty for this free |
| 45 | software. If the software is modified by someone else and passed on, we | 45 | software. If the software is modified by someone else and passed on, we |
| 46 | want its recipients to know that what they have is not the original, so | 46 | want its recipients to know that what they have is not the original, so |
| 47 | that any problems introduced by others will not reflect on the original | 47 | that any problems introduced by others will not reflect on the original |
| 48 | authors' reputations. | 48 | authors' reputations. |
| 49 | 49 | ||
| 50 | Finally, any free program is threatened constantly by software | 50 | Finally, any free program is threatened constantly by software |
| 51 | patents. We wish to avoid the danger that redistributors of a free | 51 | patents. We wish to avoid the danger that redistributors of a free |
| 52 | program will individually obtain patent licenses, in effect making the | 52 | program will individually obtain patent licenses, in effect making the |
| 53 | program proprietary. To prevent this, we have made it clear that any | 53 | program proprietary. To prevent this, we have made it clear that any |
| 54 | patent must be licensed for everyone's free use or not licensed at all. | 54 | patent must be licensed for everyone's free use or not licensed at all. |
| 55 | 55 | ||
| 56 | The precise terms and conditions for copying, distribution and | 56 | The precise terms and conditions for copying, distribution and |
| 57 | modification follow. | 57 | modification follow. |
| 58 | 58 | ||
| 59 | GNU GENERAL PUBLIC LICENSE | 59 | GNU GENERAL PUBLIC LICENSE |
| 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
| 61 | 61 | ||
| 62 | 0. This License applies to any program or other work which contains | 62 | 0. This License applies to any program or other work which contains |
| 63 | a notice placed by the copyright holder saying it may be distributed | 63 | a notice placed by the copyright holder saying it may be distributed |
| 64 | under the terms of this General Public License. The "Program", below, | 64 | under the terms of this General Public License. The "Program", below, |
| 65 | refers to any such program or work, and a "work based on the Program" | 65 | refers to any such program or work, and a "work based on the Program" |
| 66 | means either the Program or any derivative work under copyright law: | 66 | means either the Program or any derivative work under copyright law: |
| 67 | that is to say, a work containing the Program or a portion of it, | 67 | that is to say, a work containing the Program or a portion of it, |
| 68 | either verbatim or with modifications and/or translated into another | 68 | either verbatim or with modifications and/or translated into another |
| 69 | language. (Hereinafter, translation is included without limitation in | 69 | language. (Hereinafter, translation is included without limitation in |
| 70 | the term "modification".) Each licensee is addressed as "you". | 70 | the term "modification".) Each licensee is addressed as "you". |
| 71 | 71 | ||
| 72 | Activities other than copying, distribution and modification are not | 72 | Activities other than copying, distribution and modification are not |
| 73 | covered by this License; they are outside its scope. The act of | 73 | covered by this License; they are outside its scope. The act of |
| 74 | running the Program is not restricted, and the output from the Program | 74 | running the Program is not restricted, and the output from the Program |
| 75 | is covered only if its contents constitute a work based on the | 75 | is covered only if its contents constitute a work based on the |
| 76 | Program (independent of having been made by running the Program). | 76 | Program (independent of having been made by running the Program). |
| 77 | Whether that is true depends on what the Program does. | 77 | Whether that is true depends on what the Program does. |
| 78 | 78 | ||
| 79 | 1. You may copy and distribute verbatim copies of the Program's | 79 | 1. You may copy and distribute verbatim copies of the Program's |
| 80 | source code as you receive it, in any medium, provided that you | 80 | source code as you receive it, in any medium, provided that you |
| 81 | conspicuously and appropriately publish on each copy an appropriate | 81 | conspicuously and appropriately publish on each copy an appropriate |
| 82 | copyright notice and disclaimer of warranty; keep intact all the | 82 | copyright notice and disclaimer of warranty; keep intact all the |
| 83 | notices that refer to this License and to the absence of any warranty; | 83 | notices that refer to this License and to the absence of any warranty; |
| 84 | and give any other recipients of the Program a copy of this License | 84 | and give any other recipients of the Program a copy of this License |
| 85 | along with the Program. | 85 | along with the Program. |
| 86 | 86 | ||
| 87 | You may charge a fee for the physical act of transferring a copy, and | 87 | You may charge a fee for the physical act of transferring a copy, and |
| 88 | you may at your option offer warranty protection in exchange for a fee. | 88 | you may at your option offer warranty protection in exchange for a fee. |
| 89 | 89 | ||
| 90 | 2. You may modify your copy or copies of the Program or any portion | 90 | 2. You may modify your copy or copies of the Program or any portion |
| 91 | of it, thus forming a work based on the Program, and copy and | 91 | of it, thus forming a work based on the Program, and copy and |
| 92 | distribute such modifications or work under the terms of Section 1 | 92 | distribute such modifications or work under the terms of Section 1 |
| 93 | above, provided that you also meet all of these conditions: | 93 | above, provided that you also meet all of these conditions: |
| 94 | 94 | ||
| 95 | a) You must cause the modified files to carry prominent notices | 95 | a) You must cause the modified files to carry prominent notices |
| 96 | stating that you changed the files and the date of any change. | 96 | stating that you changed the files and the date of any change. |
| 97 | 97 | ||
| 98 | b) You must cause any work that you distribute or publish, that in | 98 | b) You must cause any work that you distribute or publish, that in |
| 99 | whole or in part contains or is derived from the Program or any | 99 | whole or in part contains or is derived from the Program or any |
| 100 | part thereof, to be licensed as a whole at no charge to all third | 100 | part thereof, to be licensed as a whole at no charge to all third |
| 101 | parties under the terms of this License. | 101 | parties under the terms of this License. |
| 102 | 102 | ||
| 103 | c) If the modified program normally reads commands interactively | 103 | c) If the modified program normally reads commands interactively |
| 104 | when run, you must cause it, when started running for such | 104 | when run, you must cause it, when started running for such |
| 105 | interactive use in the most ordinary way, to print or display an | 105 | interactive use in the most ordinary way, to print or display an |
| 106 | announcement including an appropriate copyright notice and a | 106 | announcement including an appropriate copyright notice and a |
| 107 | notice that there is no warranty (or else, saying that you provide | 107 | notice that there is no warranty (or else, saying that you provide |
| 108 | a warranty) and that users may redistribute the program under | 108 | a warranty) and that users may redistribute the program under |
| 109 | these conditions, and telling the user how to view a copy of this | 109 | these conditions, and telling the user how to view a copy of this |
| 110 | License. (Exception: if the Program itself is interactive but | 110 | License. (Exception: if the Program itself is interactive but |
| 111 | does not normally print such an announcement, your work based on | 111 | does not normally print such an announcement, your work based on |
| 112 | the Program is not required to print an announcement.) | 112 | the Program is not required to print an announcement.) |
| 113 | 113 | ||
| 114 | These requirements apply to the modified work as a whole. If | 114 | These requirements apply to the modified work as a whole. If |
| 115 | identifiable sections of that work are not derived from the Program, | 115 | identifiable sections of that work are not derived from the Program, |
| 116 | and can be reasonably considered independent and separate works in | 116 | and can be reasonably considered independent and separate works in |
| 117 | themselves, then this License, and its terms, do not apply to those | 117 | themselves, then this License, and its terms, do not apply to those |
| 118 | sections when you distribute them as separate works. But when you | 118 | sections when you distribute them as separate works. But when you |
| 119 | distribute the same sections as part of a whole which is a work based | 119 | distribute the same sections as part of a whole which is a work based |
| 120 | on the Program, the distribution of the whole must be on the terms of | 120 | on the Program, the distribution of the whole must be on the terms of |
| 121 | this License, whose permissions for other licensees extend to the | 121 | this License, whose permissions for other licensees extend to the |
| 122 | entire whole, and thus to each and every part regardless of who wrote it. | 122 | entire whole, and thus to each and every part regardless of who wrote it. |
| 123 | 123 | ||
| 124 | Thus, it is not the intent of this section to claim rights or contest | 124 | Thus, it is not the intent of this section to claim rights or contest |
| 125 | your rights to work written entirely by you; rather, the intent is to | 125 | your rights to work written entirely by you; rather, the intent is to |
| 126 | exercise the right to control the distribution of derivative or | 126 | exercise the right to control the distribution of derivative or |
| 127 | collective works based on the Program. | 127 | collective works based on the Program. |
| 128 | 128 | ||
| 129 | In addition, mere aggregation of another work not based on the Program | 129 | In addition, mere aggregation of another work not based on the Program |
| 130 | with the Program (or with a work based on the Program) on a volume of | 130 | with the Program (or with a work based on the Program) on a volume of |
| 131 | a storage or distribution medium does not bring the other work under | 131 | a storage or distribution medium does not bring the other work under |
| 132 | the scope of this License. | 132 | the scope of this License. |
| 133 | 133 | ||
| 134 | 3. You may copy and distribute the Program (or a work based on it, | 134 | 3. You may copy and distribute the Program (or a work based on it, |
| 135 | under Section 2) in object code or executable form under the terms of | 135 | under Section 2) in object code or executable form under the terms of |
| 136 | Sections 1 and 2 above provided that you also do one of the following: | 136 | Sections 1 and 2 above provided that you also do one of the following: |
| 137 | 137 | ||
| 138 | a) Accompany it with the complete corresponding machine-readable | 138 | a) Accompany it with the complete corresponding machine-readable |
| 139 | source code, which must be distributed under the terms of Sections | 139 | source code, which must be distributed under the terms of Sections |
| 140 | 1 and 2 above on a medium customarily used for software interchange; or, | 140 | 1 and 2 above on a medium customarily used for software interchange; or, |
| 141 | 141 | ||
| 142 | b) Accompany it with a written offer, valid for at least three | 142 | b) Accompany it with a written offer, valid for at least three |
| 143 | years, to give any third party, for a charge no more than your | 143 | years, to give any third party, for a charge no more than your |
| 144 | cost of physically performing source distribution, a complete | 144 | cost of physically performing source distribution, a complete |
| 145 | machine-readable copy of the corresponding source code, to be | 145 | machine-readable copy of the corresponding source code, to be |
| 146 | distributed under the terms of Sections 1 and 2 above on a medium | 146 | distributed under the terms of Sections 1 and 2 above on a medium |
| 147 | customarily used for software interchange; or, | 147 | customarily used for software interchange; or, |
| 148 | 148 | ||
| 149 | c) Accompany it with the information you received as to the offer | 149 | c) Accompany it with the information you received as to the offer |
| 150 | to distribute corresponding source code. (This alternative is | 150 | to distribute corresponding source code. (This alternative is |
| 151 | allowed only for noncommercial distribution and only if you | 151 | allowed only for noncommercial distribution and only if you |
| 152 | received the program in object code or executable form with such | 152 | received the program in object code or executable form with such |
| 153 | an offer, in accord with Subsection b above.) | 153 | an offer, in accord with Subsection b above.) |
| 154 | 154 | ||
| 155 | The source code for a work means the preferred form of the work for | 155 | The source code for a work means the preferred form of the work for |
| 156 | making modifications to it. For an executable work, complete source | 156 | making modifications to it. For an executable work, complete source |
| 157 | code means all the source code for all modules it contains, plus any | 157 | code means all the source code for all modules it contains, plus any |
| 158 | associated interface definition files, plus the scripts used to | 158 | associated interface definition files, plus the scripts used to |
| 159 | control compilation and installation of the executable. However, as a | 159 | control compilation and installation of the executable. However, as a |
| 160 | special exception, the source code distributed need not include | 160 | special exception, the source code distributed need not include |
| 161 | anything that is normally distributed (in either source or binary | 161 | anything that is normally distributed (in either source or binary |
| 162 | form) with the major components (compiler, kernel, and so on) of the | 162 | form) with the major components (compiler, kernel, and so on) of the |
| 163 | operating system on which the executable runs, unless that component | 163 | operating system on which the executable runs, unless that component |
| 164 | itself accompanies the executable. | 164 | itself accompanies the executable. |
| 165 | 165 | ||
| 166 | If distribution of executable or object code is made by offering | 166 | If distribution of executable or object code is made by offering |
| 167 | access to copy from a designated place, then offering equivalent | 167 | access to copy from a designated place, then offering equivalent |
| 168 | access to copy the source code from the same place counts as | 168 | access to copy the source code from the same place counts as |
| 169 | distribution of the source code, even though third parties are not | 169 | distribution of the source code, even though third parties are not |
| 170 | compelled to copy the source along with the object code. | 170 | compelled to copy the source along with the object code. |
| 171 | 171 | ||
| 172 | 4. You may not copy, modify, sublicense, or distribute the Program | 172 | 4. You may not copy, modify, sublicense, or distribute the Program |
| 173 | except as expressly provided under this License. Any attempt | 173 | except as expressly provided under this License. Any attempt |
| 174 | otherwise to copy, modify, sublicense or distribute the Program is | 174 | otherwise to copy, modify, sublicense or distribute the Program is |
| 175 | void, and will automatically terminate your rights under this License. | 175 | void, and will automatically terminate your rights under this License. |
| 176 | However, parties who have received copies, or rights, from you under | 176 | However, parties who have received copies, or rights, from you under |
| 177 | this License will not have their licenses terminated so long as such | 177 | this License will not have their licenses terminated so long as such |
| 178 | parties remain in full compliance. | 178 | parties remain in full compliance. |
| 179 | 179 | ||
| 180 | 5. You are not required to accept this License, since you have not | 180 | 5. You are not required to accept this License, since you have not |
| 181 | signed it. However, nothing else grants you permission to modify or | 181 | signed it. However, nothing else grants you permission to modify or |
| 182 | distribute the Program or its derivative works. These actions are | 182 | distribute the Program or its derivative works. These actions are |
| 183 | prohibited by law if you do not accept this License. Therefore, by | 183 | prohibited by law if you do not accept this License. Therefore, by |
| 184 | modifying or distributing the Program (or any work based on the | 184 | modifying or distributing the Program (or any work based on the |
| 185 | Program), you indicate your acceptance of this License to do so, and | 185 | Program), you indicate your acceptance of this License to do so, and |
| 186 | all its terms and conditions for copying, distributing or modifying | 186 | all its terms and conditions for copying, distributing or modifying |
| 187 | the Program or works based on it. | 187 | the Program or works based on it. |
| 188 | 188 | ||
| 189 | 6. Each time you redistribute the Program (or any work based on the | 189 | 6. Each time you redistribute the Program (or any work based on the |
| 190 | Program), the recipient automatically receives a license from the | 190 | Program), the recipient automatically receives a license from the |
| 191 | original licensor to copy, distribute or modify the Program subject to | 191 | original licensor to copy, distribute or modify the Program subject to |
| 192 | these terms and conditions. You may not impose any further | 192 | these terms and conditions. You may not impose any further |
| 193 | restrictions on the recipients' exercise of the rights granted herein. | 193 | restrictions on the recipients' exercise of the rights granted herein. |
| 194 | You are not responsible for enforcing compliance by third parties to | 194 | You are not responsible for enforcing compliance by third parties to |
| 195 | this License. | 195 | this License. |
| 196 | 196 | ||
| 197 | 7. If, as a consequence of a court judgment or allegation of patent | 197 | 7. If, as a consequence of a court judgment or allegation of patent |
| 198 | infringement or for any other reason (not limited to patent issues), | 198 | infringement or for any other reason (not limited to patent issues), |
| 199 | conditions are imposed on you (whether by court order, agreement or | 199 | conditions are imposed on you (whether by court order, agreement or |
| 200 | otherwise) that contradict the conditions of this License, they do not | 200 | otherwise) that contradict the conditions of this License, they do not |
| 201 | excuse you from the conditions of this License. If you cannot | 201 | excuse you from the conditions of this License. If you cannot |
| 202 | distribute so as to satisfy simultaneously your obligations under this | 202 | distribute so as to satisfy simultaneously your obligations under this |
| 203 | License and any other pertinent obligations, then as a consequence you | 203 | License and any other pertinent obligations, then as a consequence you |
| 204 | may not distribute the Program at all. For example, if a patent | 204 | may not distribute the Program at all. For example, if a patent |
| 205 | license would not permit royalty-free redistribution of the Program by | 205 | license would not permit royalty-free redistribution of the Program by |
| 206 | all those who receive copies directly or indirectly through you, then | 206 | all those who receive copies directly or indirectly through you, then |
| 207 | the only way you could satisfy both it and this License would be to | 207 | the only way you could satisfy both it and this License would be to |
| 208 | refrain entirely from distribution of the Program. | 208 | refrain entirely from distribution of the Program. |
| 209 | 209 | ||
| 210 | If any portion of this section is held invalid or unenforceable under | 210 | If any portion of this section is held invalid or unenforceable under |
| 211 | any particular circumstance, the balance of the section is intended to | 211 | any particular circumstance, the balance of the section is intended to |
| 212 | apply and the section as a whole is intended to apply in other | 212 | apply and the section as a whole is intended to apply in other |
| 213 | circumstances. | 213 | circumstances. |
| 214 | 214 | ||
| 215 | It is not the purpose of this section to induce you to infringe any | 215 | It is not the purpose of this section to induce you to infringe any |
| 216 | patents or other property right claims or to contest validity of any | 216 | patents or other property right claims or to contest validity of any |
| 217 | such claims; this section has the sole purpose of protecting the | 217 | such claims; this section has the sole purpose of protecting the |
| 218 | integrity of the free software distribution system, which is | 218 | integrity of the free software distribution system, which is |
| 219 | implemented by public license practices. Many people have made | 219 | implemented by public license practices. Many people have made |
| 220 | generous contributions to the wide range of software distributed | 220 | generous contributions to the wide range of software distributed |
| 221 | through that system in reliance on consistent application of that | 221 | through that system in reliance on consistent application of that |
| 222 | system; it is up to the author/donor to decide if he or she is willing | 222 | system; it is up to the author/donor to decide if he or she is willing |
| 223 | to distribute software through any other system and a licensee cannot | 223 | to distribute software through any other system and a licensee cannot |
| 224 | impose that choice. | 224 | impose that choice. |
| 225 | 225 | ||
| 226 | This section is intended to make thoroughly clear what is believed to | 226 | This section is intended to make thoroughly clear what is believed to |
| 227 | be a consequence of the rest of this License. | 227 | be a consequence of the rest of this License. |
| 228 | 228 | ||
| 229 | 8. If the distribution and/or use of the Program is restricted in | 229 | 8. If the distribution and/or use of the Program is restricted in |
| 230 | certain countries either by patents or by copyrighted interfaces, the | 230 | certain countries either by patents or by copyrighted interfaces, the |
| 231 | original copyright holder who places the Program under this License | 231 | original copyright holder who places the Program under this License |
| 232 | may add an explicit geographical distribution limitation excluding | 232 | may add an explicit geographical distribution limitation excluding |
| 233 | those countries, so that distribution is permitted only in or among | 233 | those countries, so that distribution is permitted only in or among |
| 234 | countries not thus excluded. In such case, this License incorporates | 234 | countries not thus excluded. In such case, this License incorporates |
| 235 | the limitation as if written in the body of this License. | 235 | the limitation as if written in the body of this License. |
| 236 | 236 | ||
| 237 | 9. The Free Software Foundation may publish revised and/or new versions | 237 | 9. The Free Software Foundation may publish revised and/or new versions |
| 238 | of the General Public License from time to time. Such new versions will | 238 | of the General Public License from time to time. Such new versions will |
| 239 | be similar in spirit to the present version, but may differ in detail to | 239 | be similar in spirit to the present version, but may differ in detail to |
| 240 | address new problems or concerns. | 240 | address new problems or concerns. |
| 241 | 241 | ||
| 242 | Each version is given a distinguishing version number. If the Program | 242 | Each version is given a distinguishing version number. If the Program |
| 243 | specifies a version number of this License which applies to it and "any | 243 | specifies a version number of this License which applies to it and "any |
| 244 | later version", you have the option of following the terms and conditions | 244 | later version", you have the option of following the terms and conditions |
| 245 | either of that version or of any later version published by the Free | 245 | either of that version or of any later version published by the Free |
| 246 | Software Foundation. If the Program does not specify a version number of | 246 | Software Foundation. If the Program does not specify a version number of |
| 247 | this License, you may choose any version ever published by the Free Software | 247 | this License, you may choose any version ever published by the Free Software |
| 248 | Foundation. | 248 | Foundation. |
| 249 | 249 | ||
| 250 | 10. If you wish to incorporate parts of the Program into other free | 250 | 10. If you wish to incorporate parts of the Program into other free |
| 251 | programs whose distribution conditions are different, write to the author | 251 | programs whose distribution conditions are different, write to the author |
| 252 | to ask for permission. For software which is copyrighted by the Free | 252 | to ask for permission. For software which is copyrighted by the Free |
| 253 | Software Foundation, write to the Free Software Foundation; we sometimes | 253 | Software Foundation, write to the Free Software Foundation; we sometimes |
| 254 | make exceptions for this. Our decision will be guided by the two goals | 254 | make exceptions for this. Our decision will be guided by the two goals |
| 255 | of preserving the free status of all derivatives of our free software and | 255 | of preserving the free status of all derivatives of our free software and |
| 256 | of promoting the sharing and reuse of software generally. | 256 | of promoting the sharing and reuse of software generally. |
| 257 | 257 | ||
| 258 | NO WARRANTY | 258 | NO WARRANTY |
| 259 | 259 | ||
| 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
| 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
| 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
| 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
| 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
| 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
| 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
| 268 | REPAIR OR CORRECTION. | 268 | REPAIR OR CORRECTION. |
| 269 | 269 | ||
| 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
| 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
| 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
| 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
| 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
| 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
| 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
| 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
| 278 | POSSIBILITY OF SUCH DAMAGES. | 278 | POSSIBILITY OF SUCH DAMAGES. |
| 279 | 279 | ||
| 280 | END OF TERMS AND CONDITIONS | 280 | END OF TERMS AND CONDITIONS |
| 281 | 281 | ||
| 282 | How to Apply These Terms to Your New Programs | 282 | How to Apply These Terms to Your New Programs |
| 283 | 283 | ||
| 284 | If you develop a new program, and you want it to be of the greatest | 284 | If you develop a new program, and you want it to be of the greatest |
| 285 | possible use to the public, the best way to achieve this is to make it | 285 | possible use to the public, the best way to achieve this is to make it |
| 286 | free software which everyone can redistribute and change under these terms. | 286 | free software which everyone can redistribute and change under these terms. |
| 287 | 287 | ||
| 288 | To do so, attach the following notices to the program. It is safest | 288 | To do so, attach the following notices to the program. It is safest |
| 289 | to attach them to the start of each source file to most effectively | 289 | to attach them to the start of each source file to most effectively |
| 290 | convey the exclusion of warranty; and each file should have at least | 290 | convey the exclusion of warranty; and each file should have at least |
| 291 | the "copyright" line and a pointer to where the full notice is found. | 291 | the "copyright" line and a pointer to where the full notice is found. |
| 292 | 292 | ||
| 293 | <one line to give the program's name and a brief idea of what it does.> | 293 | <one line to give the program's name and a brief idea of what it does.> |
| 294 | Copyright (C) <year> <name of author> | 294 | Copyright (C) <year> <name of author> |
| 295 | 295 | ||
| 296 | This program is free software; you can redistribute it and/or modify | 296 | This program is free software; you can redistribute it and/or modify |
| 297 | it under the terms of the GNU General Public License as published by | 297 | it under the terms of the GNU General Public License as published by |
| 298 | the Free Software Foundation; either version 2 of the License, or | 298 | the Free Software Foundation; either version 2 of the License, or |
| 299 | (at your option) any later version. | 299 | (at your option) any later version. |
| 300 | 300 | ||
| 301 | This program is distributed in the hope that it will be useful, | 301 | This program is distributed in the hope that it will be useful, |
| 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 304 | GNU General Public License for more details. | 304 | GNU General Public License for more details. |
| 305 | 305 | ||
| 306 | You should have received a copy of the GNU General Public License along | 306 | You should have received a copy of the GNU General Public License along |
| 307 | with this program; if not, write to the Free Software Foundation, Inc., | 307 | with this program; if not, write to the Free Software Foundation, Inc., |
| 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| 309 | 309 | ||
| 310 | Also add information on how to contact you by electronic and paper mail. | 310 | Also add information on how to contact you by electronic and paper mail. |
| 311 | 311 | ||
| 312 | If the program is interactive, make it output a short notice like this | 312 | If the program is interactive, make it output a short notice like this |
| 313 | when it starts in an interactive mode: | 313 | when it starts in an interactive mode: |
| 314 | 314 | ||
| 315 | Gnomovision version 69, Copyright (C) year name of author | 315 | Gnomovision version 69, Copyright (C) year name of author |
| 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
| 317 | This is free software, and you are welcome to redistribute it | 317 | This is free software, and you are welcome to redistribute it |
| 318 | under certain conditions; type `show c' for details. | 318 | under certain conditions; type `show c' for details. |
| 319 | 319 | ||
| 320 | The hypothetical commands `show w' and `show c' should show the appropriate | 320 | The hypothetical commands `show w' and `show c' should show the appropriate |
| 321 | parts of the General Public License. Of course, the commands you use may | 321 | parts of the General Public License. Of course, the commands you use may |
| 322 | be called something other than `show w' and `show c'; they could even be | 322 | be called something other than `show w' and `show c'; they could even be |
| 323 | mouse-clicks or menu items--whatever suits your program. | 323 | mouse-clicks or menu items--whatever suits your program. |
| 324 | 324 | ||
| 325 | You should also get your employer (if you work as a programmer) or your | 325 | You should also get your employer (if you work as a programmer) or your |
| 326 | school, if any, to sign a "copyright disclaimer" for the program, if | 326 | school, if any, to sign a "copyright disclaimer" for the program, if |
| 327 | necessary. Here is a sample; alter the names: | 327 | necessary. Here is a sample; alter the names: |
| 328 | 328 | ||
| 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
| 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. | 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. |
| 331 | 331 | ||
| 332 | <signature of Ty Coon>, 1 April 1989 | 332 | <signature of Ty Coon>, 1 April 1989 |
| 333 | Ty Coon, President of Vice | 333 | Ty Coon, President of Vice |
| 334 | 334 | ||
| 335 | This General Public License does not permit incorporating your program into | 335 | This General Public License does not permit incorporating your program into |
| 336 | proprietary programs. If your program is a subroutine library, you may | 336 | proprietary programs. If your program is a subroutine library, you may |
| 337 | consider it more useful to permit linking proprietary applications with the | 337 | consider it more useful to permit linking proprietary applications with the |
| 338 | library. If this is what you want to do, use the GNU Lesser General | 338 | library. If this is what you want to do, use the GNU Lesser General |
| 339 | Public License instead of this License. | 339 | Public License instead of this License. |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
wp-content/plugins/http-headers/README.txt
0 → 100644
| 1 | === HTTP Headers === | ||
| 2 | Contributors: zinoui | ||
| 3 | Donate link: https://zinoui.com/donation | ||
| 4 | Tags: custom headers, http headers, headers, security, http header, header, cross domain, cors, xss, clickjacking, mitm, cross origin, cross site, privacy, p3p, hsts, referrer, csp, caching, compression, access control, authentication | ||
| 5 | Requires at least: 3.2 | ||
| 6 | Tested up to: 5.7.1 | ||
| 7 | Requires PHP: 5.3 | ||
| 8 | Stable tag: 1.18.5 | ||
| 9 | License: GPLv2 or later | ||
| 10 | License URI: https://www.gnu.org/licenses/gpl-2.0.html | ||
| 11 | |||
| 12 | HTTP Headers adds CORS & security HTTP headers to your website. | ||
| 13 | |||
| 14 | == Description == | ||
| 15 | |||
| 16 | HTTP Headers gives your control over the http headers returned by your blog or website. | ||
| 17 | |||
| 18 | Headers supported by HTTP Headers includes: | ||
| 19 | |||
| 20 | - Access-Control-Allow-Origin | ||
| 21 | - Access-Control-Allow-Credentials | ||
| 22 | - Access-Control-Max-Age | ||
| 23 | - Access-Control-Allow-Methods | ||
| 24 | - Access-Control-Allow-Headers | ||
| 25 | - Access-Control-Expose-Headers | ||
| 26 | - Age | ||
| 27 | - Content-Security-Policy | ||
| 28 | - Content-Security-Policy-Report-Only | ||
| 29 | - Cache-Control | ||
| 30 | - Clear-Site-Data | ||
| 31 | - Connection | ||
| 32 | - Content-Encoding | ||
| 33 | - Content-Type | ||
| 34 | - Cross-Origin-Embedder-Policy | ||
| 35 | - Cross-Origin-Opener-Policy | ||
| 36 | - Cross-Origin-Resource-Policy | ||
| 37 | - Expect-CT | ||
| 38 | - Expires | ||
| 39 | - Feature-Policy | ||
| 40 | - NEL | ||
| 41 | - Permissions-Policy | ||
| 42 | - Pragma | ||
| 43 | - P3P | ||
| 44 | - Referrer-Policy | ||
| 45 | - Report-To | ||
| 46 | - Strict-Transport-Security | ||
| 47 | - Timing-Allow-Origin | ||
| 48 | - Vary | ||
| 49 | - WWW-Authenticate | ||
| 50 | - X-Content-Type-Options | ||
| 51 | - X-DNS-Prefetch-Control | ||
| 52 | - X-Download-Options | ||
| 53 | - X-Frame-Options | ||
| 54 | - X-Permitted-Cross-Domain-Policies | ||
| 55 | - X-Powered-By | ||
| 56 | - X-Robots-Tag | ||
| 57 | - X-UA-Compatible | ||
| 58 | - X-XSS-Protection | ||
| 59 | |||
| 60 | The [getting started tutorial](https://zinoui.com/blog/http-headers-for-wordpress) describes a typical configuration of this plugin. | ||
| 61 | |||
| 62 | == Installation == | ||
| 63 | |||
| 64 | Upload the HTTP Headers plugin to your blog. Then activate it. | ||
| 65 | |||
| 66 | That's all. | ||
| 67 | |||
| 68 | == Frequently Asked Questions == | ||
| 69 | |||
| 70 | = Why to use this plugin? = | ||
| 71 | |||
| 72 | Nowadays security of your social data at the web is essential. This plugin helps you to improve your website overall security. | ||
| 73 | |||
| 74 | = Who use these headers? = | ||
| 75 | |||
| 76 | These HTTP headers are being used in production services by popular websites as Facebook, Google+, Twitter, LinkedIn, YouTube, Yahoo, Amazon, Instagram, Pinterest. | ||
| 77 | |||
| 78 | == Screenshots == | ||
| 79 | |||
| 80 | 1. This screenshot shows up the dashboard with categories of the supported headers. | ||
| 81 | 2. This screenshot shows up the headers of a chosen category and their current values. | ||
| 82 | 3. This screenshot shows up the settings page where you can adjust the security headers. | ||
| 83 | 4. This screenshot shows up the response headers returned by the web server. | ||
| 84 | |||
| 85 | == Upgrade Notice == | ||
| 86 | |||
| 87 | Updates are on they way, so stay tuned at [@DimitarIvanov](https://twitter.com/DimitarIvanov) | ||
| 88 | |||
| 89 | == Changelog == | ||
| 90 | |||
| 91 | = 1.18.5 = | ||
| 92 | *Release Date - 30th April, 2021* | ||
| 93 | |||
| 94 | * Configurable paths to files who store passwords for basic/digest auth | ||
| 95 | * Fixed issue with plugin activation, due missing file | ||
| 96 | |||
| 97 | = 1.18.4 = | ||
| 98 | *Release Date - 30th April, 2021* | ||
| 99 | |||
| 100 | * Initial value of X-Robots-Tag fixed | ||
| 101 | |||
| 102 | = 1.18.3 = | ||
| 103 | *Release Date - 30th April, 2021* | ||
| 104 | |||
| 105 | * Added "X-Robots-Tag" header | ||
| 106 | * Added "interest-cohort", "layout-animations", "legacy-image-formats", "oversized-images", and "wake-lock" directive to "Permissions-Policy" header | ||
| 107 | * Added "cross-origin" value to "Cross-Origin-Resource-Policy" header | ||
| 108 | * Added "navigate-to" and "prefetch-src" directives to "Content-Security-Policy" header | ||
| 109 | |||
| 110 | = 1.18.2 = | ||
| 111 | *Release Date - 24th April, 2021* | ||
| 112 | |||
| 113 | * Configurable paths to .htaccess and .user.ini files | ||
| 114 | |||
| 115 | = 1.18.1 = | ||
| 116 | *Release Date - 29th October, 2020* | ||
| 117 | |||
| 118 | * Added "allow-downloads" and "allow-top-navigation-by-user-activation" to "sandbox" directive, part of CSP | ||
| 119 | |||
| 120 | = 1.18.0 = | ||
| 121 | *Release Date - 20th September, 2020* | ||
| 122 | |||
| 123 | * Added "Permissions-Policy" header | ||
| 124 | * Fixed "Cookie Security" | ||
| 125 | |||
| 126 | = 1.17.0 = | ||
| 127 | *Release Date - 26th July, 2020* | ||
| 128 | |||
| 129 | * Added "Cross-Origin-Embedder-Policy" header | ||
| 130 | * Added "Cross-Origin-Opener-Policy" header | ||
| 131 | |||
| 132 | = 1.16.1 = | ||
| 133 | *Release Date - 23rd July, 2020* | ||
| 134 | |||
| 135 | * Fixed JS/CSS versioning | ||
| 136 | |||
| 137 | = 1.16.0 = | ||
| 138 | *Release Date - 23rd July, 2020* | ||
| 139 | |||
| 140 | * Added the "NEL" header | ||
| 141 | * Fixed the "Report-To" header | ||
| 142 | |||
| 143 | = 1.15.2 = | ||
| 144 | *Release Date - 18th June, 2020* | ||
| 145 | |||
| 146 | * Fixed a PHP Notice at "Expires" page | ||
| 147 | * Fixed comments in .user.ini file | ||
| 148 | |||
| 149 | = 1.15.1 = | ||
| 150 | *Release Date - 9th May, 2020* | ||
| 151 | |||
| 152 | * Fixed the "Access-Control-Allow-Origin" header | ||
| 153 | |||
| 154 | = 1.15.0 = | ||
| 155 | *Release Date - 26th January, 2020* | ||
| 156 | |||
| 157 | * Added the "Cross-Origin-Resource-Policy" header | ||
| 158 | * Removed the "Public-Key-Pins" header | ||
| 159 | |||
| 160 | = 1.14.2 = | ||
| 161 | *Release Date - 25th November, 2019* | ||
| 162 | |||
| 163 | * CORS headers updated (added "Vary: Origin") | ||
| 164 | |||
| 165 | = 1.14.1 = | ||
| 166 | *Release Date - 15th September, 2019* | ||
| 167 | |||
| 168 | * Simple filtering was replaced with Dynamic filtering | ||
| 169 | |||
| 170 | = 1.14.0 = | ||
| 171 | *Release Date - 1st September, 2019* | ||
| 172 | |||
| 173 | * Added the "Content-Type" header | ||
| 174 | * Fixed the "Access-Control-Allow-Credentials" header | ||
| 175 | * Improvement to "Access-Control-Allow-Headers" header | ||
| 176 | * Improvement to "Access-Control-Allow-Methods" header | ||
| 177 | * Improvement to "Access-Control-Expose-Headers" header | ||
| 178 | * Improvement to "Cache-Control" header | ||
| 179 | * Improvement to "Vary" header | ||
| 180 | |||
| 181 | = 1.13.4 = | ||
| 182 | *Release Date - 14th July, 2019* | ||
| 183 | |||
| 184 | * Added the "always" condition to Header (unset) directive | ||
| 185 | * Fixed the "import" function | ||
| 186 | * Fixed the "Access-Control-Allow-Origin" header | ||
| 187 | |||
| 188 | = 1.13.3 = | ||
| 189 | *Release Date - 16th June, 2019* | ||
| 190 | |||
| 191 | * Bugfix in "WWW-Authenticate" header | ||
| 192 | * Added support of Apache 2.4 | ||
| 193 | |||
| 194 | = 1.13.2 = | ||
| 195 | *Release Date - 13th June, 2019* | ||
| 196 | |||
| 197 | * Bugfix in "Content-Encoding" header | ||
| 198 | * Bugfix in "Vary" header | ||
| 199 | |||
| 200 | = 1.13.1 = | ||
| 201 | *Release Date - 8th June, 2019* | ||
| 202 | |||
| 203 | * Added Brotli compression | ||
| 204 | |||
| 205 | = 1.13.0 = | ||
| 206 | *Release Date - 7th June, 2019* | ||
| 207 | |||
| 208 | * Added "SameSite" to Cookie Security | ||
| 209 | * Fixed import/export function | ||
| 210 | * Code refactoring | ||
| 211 | |||
| 212 | = 1.12.2 = | ||
| 213 | *Release Date - 5th April, 2019* | ||
| 214 | |||
| 215 | * UI improvement for Content-Security-Policy | ||
| 216 | * Fix for Access-Control-Allow-Headers | ||
| 217 | * Fix for Access-Control-Allow-Origin | ||
| 218 | * Fix for Feature-Policy | ||
| 219 | |||
| 220 | = 1.12.1 = | ||
| 221 | *Release Date - 9th January, 2019* | ||
| 222 | |||
| 223 | * Remove direct calls to cURL | ||
| 224 | |||
| 225 | = 1.12.0 = | ||
| 226 | *Release Date - 5th January, 2019* | ||
| 227 | |||
| 228 | * Better handling of activate/deactivate functions | ||
| 229 | |||
| 230 | = 1.11.0 = | ||
| 231 | *Release Date - 9th December, 2018* | ||
| 232 | |||
| 233 | * Added support of "Clear-Site-Data" header | ||
| 234 | |||
| 235 | = 1.10.5 = | ||
| 236 | *Release Date - 6th November, 2018* | ||
| 237 | |||
| 238 | * Hotfix: parallel work with third-party plugins | ||
| 239 | |||
| 240 | = 1.10.4 = | ||
| 241 | *Release Date - 30th September, 2018* | ||
| 242 | |||
| 243 | * Support of following Server APIs: CGI, FastCGI, PHP-FPM | ||
| 244 | * Error handling improvement | ||
| 245 | |||
| 246 | = 1.10.3 = | ||
| 247 | *Release Date - 8th August, 2018* | ||
| 248 | |||
| 249 | * HSTS improvement | ||
| 250 | * CORS improvement | ||
| 251 | |||
| 252 | = 1.10.2 = | ||
| 253 | *Release Date - 31st July, 2018* | ||
| 254 | |||
| 255 | * Export feature bug-fixed | ||
| 256 | |||
| 257 | = 1.10.1 = | ||
| 258 | *Release Date - 18th July, 2018* | ||
| 259 | |||
| 260 | * Feature-Policy header update: new features added | ||
| 261 | |||
| 262 | = 1.10.0 = | ||
| 263 | *Release Date - 17th July, 2018* | ||
| 264 | |||
| 265 | * Added support of "Feature-Policy" header | ||
| 266 | |||
| 267 | = 1.9.5 = | ||
| 268 | *Release Date - 12th July, 2018* | ||
| 269 | |||
| 270 | * CORS bugfix | ||
| 271 | |||
| 272 | = 1.9.4 = | ||
| 273 | *Release Date - 13th January, 2018* | ||
| 274 | |||
| 275 | * In-plugin security improvement | ||
| 276 | |||
| 277 | = 1.9.3 = | ||
| 278 | *Release Date - 10th January, 2018* | ||
| 279 | |||
| 280 | * Bug fix | ||
| 281 | |||
| 282 | = 1.9.2 = | ||
| 283 | *Release Date - 4th January, 2018* | ||
| 284 | |||
| 285 | * Security improvements | ||
| 286 | |||
| 287 | = 1.9.1 = | ||
| 288 | *Release Date - 27th December, 2017* | ||
| 289 | |||
| 290 | * Updated translations | ||
| 291 | |||
| 292 | = 1.9.0 = | ||
| 293 | *Release Date - 23th December, 2017* | ||
| 294 | |||
| 295 | * Added support of "Report-To" header | ||
| 296 | * Added support of translations | ||
| 297 | * Added support of Import/Export | ||
| 298 | * Updated "Content-Security-Policy" header (added directives: object-src, frame-src, worker-src, manifest-src, base-uri, report-to) | ||
| 299 | * Updated "WWW-Authenticate" header (support multiple users) | ||
| 300 | * Updated "Access-Control" headers (added list of origins) | ||
| 301 | |||
| 302 | = 1.8.0 = | ||
| 303 | *Release Date - 31st August, 2017* | ||
| 304 | |||
| 305 | * Added support of "Timing-Allow-Origin" header | ||
| 306 | * Added support of "X-Download-Options" header | ||
| 307 | * Added support of "X-DNS-Prefetch-Control" header | ||
| 308 | * Added support of "X-Permitted-Cross-Domain-Policies" header | ||
| 309 | * Added support of Custom headers | ||
| 310 | |||
| 311 | = 1.7.1 = | ||
| 312 | *Release Date - 18th August, 2017* | ||
| 313 | |||
| 314 | * PHP notice bugfixed | ||
| 315 | |||
| 316 | = 1.7.0 = | ||
| 317 | *Release Date - 15th August, 2017* | ||
| 318 | |||
| 319 | * Added support of "Content-Security-Policy-Report-Only" header | ||
| 320 | * Added support of "Public-Key-Pins-Report-Only" header | ||
| 321 | * Added "1; report=<reporting-URI>" directive to the "X-XSS-Protection" header | ||
| 322 | * Added "Inspect headers" tool | ||
| 323 | * UI bugfixes | ||
| 324 | |||
| 325 | = 1.6.0 = | ||
| 326 | *Release Date - 5th August, 2017* | ||
| 327 | |||
| 328 | * Added support of "Expect-CT" header | ||
| 329 | |||
| 330 | = 1.5.0 = | ||
| 331 | *Release Date - 30th July, 2017* | ||
| 332 | |||
| 333 | * Added support of "Age" header | ||
| 334 | * Added support of "Cache-Control" header | ||
| 335 | * Added support of "Connection" header | ||
| 336 | * Added support of "Content-Encoding" header | ||
| 337 | * Added support of "Expires" header | ||
| 338 | * Added support of "Pragma" header | ||
| 339 | * Added support of "Vary" header | ||
| 340 | * Added support of "WWW-Authenticate" header | ||
| 341 | * Added support of "X-Powered-By" header | ||
| 342 | * Added support of "Secure" and "HttpOnly" cookies | ||
| 343 | |||
| 344 | = 1.4.0 = | ||
| 345 | *Release Date - 5th July, 2017* | ||
| 346 | |||
| 347 | * Added support of Apache (via htaccess) inclusion method | ||
| 348 | |||
| 349 | = 1.3.0 = | ||
| 350 | *Release Date - 3rd June, 2017* | ||
| 351 | |||
| 352 | * Added support of Content-Security-Policy header | ||
| 353 | * Added dashboard | ||
| 354 | |||
| 355 | = 1.2.0 = | ||
| 356 | *Release Date - 28th April, 2017* | ||
| 357 | |||
| 358 | * Added support of Referrer-Policy header | ||
| 359 | |||
| 360 | = 1.1.2 = | ||
| 361 | *Release Date - 13th February, 2017* | ||
| 362 | |||
| 363 | * Added support of 'preload' directive to HSTS header | ||
| 364 | |||
| 365 | = 1.1.1 = | ||
| 366 | *Release Date - 8th November, 2016* | ||
| 367 | |||
| 368 | * Fixed typo in the X-Frame-Options header | ||
| 369 | |||
| 370 | = 1.1.0 = | ||
| 371 | *Release Date - 20th May, 2016* | ||
| 372 | |||
| 373 | * Added support of P3P header | ||
| 374 | |||
| 375 | = 1.0.0 = | ||
| 376 | *Release Date - 10th May, 2016* | ||
| 377 | |||
| 378 | * Initial version |
| 1 | (function ($, undefined) { | ||
| 2 | $(function() { | ||
| 3 | "use strict"; | ||
| 4 | |||
| 5 | $(document).on('change', 'select[name="hh_x_frame_options_value"]', function () { | ||
| 6 | var $el = $('input[name="hh_x_frame_options_domain"]'), | ||
| 7 | readOnly = $(this).find('option:selected').val() != 'allow-from'; | ||
| 8 | if ($el.length) { | ||
| 9 | $el.prop('readOnly', readOnly).toggle(!readOnly); | ||
| 10 | } | ||
| 11 | }).on('change', 'select[name="hh_x_xxs_protection_value"]', function (e) { | ||
| 12 | var $el = $('input[name="hh_x_xxs_protection_uri"]'), | ||
| 13 | readOnly = $(this).find('option:selected').val() != '1; report='; | ||
| 14 | if ($el.length) { | ||
| 15 | $el.prop('readOnly', readOnly).toggle(!readOnly); | ||
| 16 | } | ||
| 17 | }).on('change', 'select[name="hh_x_powered_by_option"]', function () { | ||
| 18 | var $el = $('input[name="hh_x_powered_by_value"]'), | ||
| 19 | readOnly = $(this).find('option:selected').val() != 'set'; | ||
| 20 | if ($el.length) { | ||
| 21 | $el.prop('readOnly', readOnly).toggle(!readOnly); | ||
| 22 | } | ||
| 23 | }).on("change", "input[name^='hh_vary_value[']", function () { | ||
| 24 | |||
| 25 | if (this.name === "hh_vary_value[*]") { | ||
| 26 | if (this.checked) { | ||
| 27 | $("input[name^='hh_vary_value[']").not(this).prop("checked", false); | ||
| 28 | } | ||
| 29 | } else { | ||
| 30 | if (this.checked) { | ||
| 31 | $("input[name='hh_vary_value[*]']").prop("checked", false); | ||
| 32 | } | ||
| 33 | } | ||
| 34 | |||
| 35 | }).on("change", "input[name^='hh_access_control_allow_methods_value[']", function () { | ||
| 36 | |||
| 37 | if (this.name === "hh_access_control_allow_methods_value[*]") { | ||
| 38 | if (this.checked) { | ||
| 39 | $("input[name^='hh_access_control_allow_methods_value[']").not(this).prop("checked", false); | ||
| 40 | } | ||
| 41 | } else { | ||
| 42 | if (this.checked) { | ||
| 43 | $("input[name='hh_access_control_allow_methods_value[*]']").prop("checked", false); | ||
| 44 | } | ||
| 45 | } | ||
| 46 | |||
| 47 | }).on('change', 'select[name="hh_access_control_allow_origin_value"]', function () { | ||
| 48 | var $el = $('input[name="hh_access_control_allow_origin_url"]'), | ||
| 49 | readOnly = $(this).find('option:selected').val() != 'origin'; | ||
| 50 | if ($el.length) { | ||
| 51 | $el.prop('readOnly', readOnly);//.toggle(!readOnly); | ||
| 52 | } | ||
| 53 | if (readOnly) { | ||
| 54 | $(".hh-acao").addClass("hh-hidden"); | ||
| 55 | } else { | ||
| 56 | $(".hh-acao").removeClass("hh-hidden"); | ||
| 57 | } | ||
| 58 | }).on('change', 'select[name="hh_timing_allow_origin_value"]', function () { | ||
| 59 | var $el = $('input[name="hh_timing_allow_origin_url"]'), | ||
| 60 | readOnly = $(this).find('option:selected').val() != 'origin'; | ||
| 61 | if ($el.length) { | ||
| 62 | $el.prop('readOnly', readOnly).toggle(!readOnly); | ||
| 63 | } | ||
| 64 | }).on('change', '.http-header', function () { | ||
| 65 | var $this = $(this), | ||
| 66 | $el = $this.closest('table').find('.http-header-value'); | ||
| 67 | |||
| 68 | if (!$el.length) { | ||
| 69 | return; | ||
| 70 | } | ||
| 71 | |||
| 72 | if (Number($this.val()) === 1) { | ||
| 73 | $el.prop('readOnly', false).removeAttr('readonly').removeClass('readonly'); | ||
| 74 | } else { | ||
| 75 | $el.prop('readOnly', true).addClass('readonly'); | ||
| 76 | } | ||
| 77 | }).on('change', 'input[name="hh_x_frame_options"]', function () { | ||
| 78 | $('select[name="hh_x_frame_options_value"]').trigger('change'); | ||
| 79 | }).on('change', 'input[name="hh_x_powered_by"]', function () { | ||
| 80 | $('select[name="hh_x_powered_by_option"]').trigger('change'); | ||
| 81 | }).on('change', 'input[name="hh_access_control_allow_origin"]', function () { | ||
| 82 | $('select[name="hh_access_control_allow_origin_value"]').trigger('change'); | ||
| 83 | }).on('change', 'input[name="hh_timing_allow_origin"]', function () { | ||
| 84 | $('select[name="hh_timing_allow_origin_value"]').trigger('change'); | ||
| 85 | }).on('submit', '#frmIspect', function (e) { | ||
| 86 | e.preventDefault(); | ||
| 87 | var $this = $(this), | ||
| 88 | $box = $('#hh-result').empty(); | ||
| 89 | $.post($this.attr('action'), $this.serialize()).done(function (data) { | ||
| 90 | $box.html(data); | ||
| 91 | }); | ||
| 92 | return false; | ||
| 93 | }).on('change', '#authentication', function () { | ||
| 94 | var $a = $('#box-authentication'); | ||
| 95 | if (this.checked) { | ||
| 96 | $a.show(); | ||
| 97 | } else { | ||
| 98 | $a.hide(); | ||
| 99 | } | ||
| 100 | }).on('click', '#hh-btn-add-header', function () { | ||
| 101 | $(this).closest('tr').before('<tr> \ | ||
| 102 | <td><input type="text" name="hh_custom_headers_value[name][]" class="http-header-value" placeholder="X-Custom-Name"></td> \ | ||
| 103 | <td><input type="text" name="hh_custom_headers_value[value][]" class="http-header-value" placeholder="' + hh.lbl_value + '"></td> \ | ||
| 104 | <td><button type="button" class="button button-small hh-btn-delete-header" title="' + hh.lbl_delete + '">x</button></td> \ | ||
| 105 | </tr>'); | ||
| 106 | }).on('click', '.hh-btn-add-endpoint', function () { | ||
| 107 | |||
| 108 | var $tr = $(this).closest("tr"); | ||
| 109 | |||
| 110 | $tr.children("td").each(function() { | ||
| 111 | if ($(this).attr("rowspan") !== undefined) { | ||
| 112 | this.rowSpan = this.rowSpan + 1; | ||
| 113 | } | ||
| 114 | }); | ||
| 115 | |||
| 116 | var name, | ||
| 117 | $clone = $tr.clone().removeClass("hh-tr-first hh-tr-group-start"), | ||
| 118 | $this = $(this), | ||
| 119 | index = Math.ceil(Math.random() * 9999); | ||
| 120 | |||
| 121 | if ($tr.hasClass("hh-tr-group-end")) { | ||
| 122 | name = $tr.find("input[name$='[url]']").attr("name"); | ||
| 123 | } else { | ||
| 124 | name = $tr.nextAll(".hh-tr-group-end:eq(0)").find("input[name$='[url]']").attr("name"); | ||
| 125 | } | ||
| 126 | |||
| 127 | var m = name.match(/\[(\d+)\]\[url\]$/), | ||
| 128 | index = Number(m[1]) + 1; | ||
| 129 | |||
| 130 | $clone.find("td").each(function() { | ||
| 131 | if ($(this).attr("rowspan") !== undefined) { | ||
| 132 | $(this).remove(); | ||
| 133 | } | ||
| 134 | }); | ||
| 135 | |||
| 136 | $clone.find('input[type="text"]').val(""); | ||
| 137 | $clone.find('input[type="number"]').val(""); | ||
| 138 | $clone.find("td:last").html('<button type="button" class="button hh-btn-delete-endpoint" title="' + hh.lbl_delete + '">' + hh.lbl_remove_endpoint + '</button>'); | ||
| 139 | $clone.find(":input").each(function () { | ||
| 140 | this.name = this.name.replace('[endpoints][0]', '[endpoints][' + index + ']'); | ||
| 141 | }); | ||
| 142 | |||
| 143 | $clone.addClass("hh-tr-group-end"); | ||
| 144 | if ($tr.hasClass("hh-tr-group-end")) { | ||
| 145 | $tr.removeClass("hh-tr-group-end"); | ||
| 146 | $tr.after($clone); | ||
| 147 | } else { | ||
| 148 | $tr.nextAll(".hh-tr-group-end:eq(0)").removeClass("hh-tr-group-end").after($clone); | ||
| 149 | } | ||
| 150 | |||
| 151 | }).on('click', '#hh-btn-add-endpoint-group', function () { | ||
| 152 | var $this = $(this), | ||
| 153 | index = Math.ceil(Math.random() * 9999), | ||
| 154 | $table = $this.closest("table"), | ||
| 155 | $clone = $table.find("tr.hh-tr-first").eq(0).clone(), | ||
| 156 | name = $table.find("tr:nth-last-child(2)").find(":input:first").attr("name"), | ||
| 157 | m = name.match(/^hh_report_to_value\[(\d+)\]/), | ||
| 158 | index = Number(m[1]) + 1; | ||
| 159 | |||
| 160 | $clone.find("td").each(function() { | ||
| 161 | if ($(this).attr("rowspan") !== undefined) { | ||
| 162 | this.rowSpan = 1; | ||
| 163 | } | ||
| 164 | }); | ||
| 165 | |||
| 166 | $clone.find('input[type="text"]').val(""); | ||
| 167 | $clone.find('input[type="number"]').val(""); | ||
| 168 | $clone.find('input[type="checkbox"]').prop("checked", false); | ||
| 169 | $clone.find("option:first").prop("selected", true); | ||
| 170 | $clone.find("td:last").html('<button type="button" class="button hh-btn-delete-endpoint-group" title="' + hh.lbl_delete + '">' + hh.lbl_remove_group + '</button>'); | ||
| 171 | $clone.find(":input").each(function () { | ||
| 172 | this.name = this.name.replace('[0]', '[' + index + ']'); | ||
| 173 | }); | ||
| 174 | $clone.addClass("hh-tr-group-end").removeClass("hh-tr-first"); | ||
| 175 | |||
| 176 | $this.closest('tr').before($clone); | ||
| 177 | }).on('click', '.hh-btn-delete-header, .hh-btn-delete-origin, .hh-btn-delete-user, .hh-btn-delete-ac', function () { | ||
| 178 | |||
| 179 | $(this).closest('tr').remove(); | ||
| 180 | |||
| 181 | }).on('click', '.hh-btn-delete-endpoint', function() { | ||
| 182 | |||
| 183 | var $group, | ||
| 184 | $tr = $(this).closest("tr"); | ||
| 185 | |||
| 186 | if ($tr.prev("tr").hasClass("hh-tr-group-start")) { | ||
| 187 | $group = $tr.prev("tr"); | ||
| 188 | } else { | ||
| 189 | $group = $tr.prevUntil("tr.hh-tr-group-start").prev("tr"); | ||
| 190 | } | ||
| 191 | |||
| 192 | $group.children("td").each(function() { | ||
| 193 | if (this.rowSpan > 1) { | ||
| 194 | this.rowSpan = this.rowSpan - 1; | ||
| 195 | } | ||
| 196 | }); | ||
| 197 | |||
| 198 | if ($tr.hasClass("hh-tr-group-end")) { | ||
| 199 | $tr.prev("tr").addClass("hh-tr-group-end"); | ||
| 200 | } | ||
| 201 | |||
| 202 | $tr.remove(); | ||
| 203 | |||
| 204 | }).on('click', '.hh-btn-delete-endpoint-group', function () { | ||
| 205 | var rows = $(this).closest("td").attr("rowspan"); | ||
| 206 | if (rows === undefined || rows < 2) { | ||
| 207 | $(this).closest('tr').remove(); | ||
| 208 | } else { | ||
| 209 | $(this).closest('tr').nextAll("tr").addBack().slice(0, rows).remove(); | ||
| 210 | } | ||
| 211 | }).on("click", ".hh-btn-add-ac", function () { | ||
| 212 | var $this = $(this); | ||
| 213 | $this.closest('tr').before('<tr> \ | ||
| 214 | <td><input type="text" name="' + $this.data("name") + '" class="http-header-value" size="35" /></td> \ | ||
| 215 | <td><button type="button" class="button button-small hh-btn-delete-ac" title="' + hh.lbl_delete + '">x</button></td> \ | ||
| 216 | </tr>'); | ||
| 217 | }).on("click", ".hh-btn-add-origin", function () { | ||
| 218 | $(this).closest('tr').before('<tr class="hh-acao"> \ | ||
| 219 | <td> </td> \ | ||
| 220 | <td><input type="text" name="hh_access_control_allow_origin_url[]" class="http-header-value" placeholder="http://domain.com" size="35" /></td> \ | ||
| 221 | <td><button type="button" class="button button-small hh-btn-delete-origin" title="' + hh.lbl_delete + '">x</button></td> \ | ||
| 222 | </tr>'); | ||
| 223 | }).on("click", ".hh-btn-add-user", function () { | ||
| 224 | $(this).closest('tr').before('<tr> \ | ||
| 225 | <td> </td> \ | ||
| 226 | <td><input type="text" name="hh_www_authenticate_user[]" class="http-header-value" /></td> \ | ||
| 227 | <td><input type="text" name="hh_www_authenticate_pswd[]" class="http-header-value" /></td> \ | ||
| 228 | <td><button type="button" class="button button-small hh-btn-delete-user" title="' + hh.lbl_delete + '">x</button></td> \ | ||
| 229 | </tr>'); | ||
| 230 | }).on("click", ".hh-btn-import-choose", function () { | ||
| 231 | $("#hh-import-file").trigger("click"); | ||
| 232 | }).on("change", "#hh-import-file", function () { | ||
| 233 | $("#hh-import-name").html(this.files[0].name); | ||
| 234 | }).on("change", 'select[name^="hh_feature_policy_value"]', function () { | ||
| 235 | var $this = $(this), | ||
| 236 | value = $this.find("option:selected").val(), | ||
| 237 | $input = $this.siblings('input[name^="hh_feature_policy_origin"]'); | ||
| 238 | if (value === "'self'" || value === "origin(s)") { | ||
| 239 | $input.show(); | ||
| 240 | } else { | ||
| 241 | $input.hide(); | ||
| 242 | } | ||
| 243 | }).on("change", 'select[name^="hh_permissions_policy_value"]', function () { | ||
| 244 | var $this = $(this), | ||
| 245 | value = $this.find("option:selected").val(), | ||
| 246 | $input = $this.siblings('input[name^="hh_permissions_policy_origin"]'); | ||
| 247 | if (value === "self" || value === "origin(s)") { | ||
| 248 | $input.show(); | ||
| 249 | } else { | ||
| 250 | $input.hide(); | ||
| 251 | } | ||
| 252 | }).on("change", 'input[name^="hh_content_security_policy_value"]', function () { | ||
| 253 | |||
| 254 | var $this = $(this); | ||
| 255 | |||
| 256 | if (this.checked) { | ||
| 257 | if (/\[\*\]$/.test(this.name)) { | ||
| 258 | $this.closest("td").find('input[type="checkbox"]').not(this).prop("checked", false); | ||
| 259 | $this.closest("p").siblings("p").hide(); | ||
| 260 | } else { | ||
| 261 | $this.closest("td").find('input[type="checkbox"][name$="[*]"]').prop("checked", false); | ||
| 262 | } | ||
| 263 | } else { | ||
| 264 | if (/\[\*\]$/.test(this.name)) { | ||
| 265 | $this.closest("p").siblings("p").show(); | ||
| 266 | } | ||
| 267 | } | ||
| 268 | }).on("change", 'input[type="checkbox"][name="hh_cookie_security_value[SameSite]"]', function () { | ||
| 269 | if (this.checked) { | ||
| 270 | $(".hh-csv-value") | ||
| 271 | .removeClass("hh-hidden") | ||
| 272 | .find('input[type="radio"]') | ||
| 273 | .prop("disabled", false) | ||
| 274 | .filter(":first") | ||
| 275 | .prop("checked", true); | ||
| 276 | } else { | ||
| 277 | $(".hh-csv-value") | ||
| 278 | .addClass("hh-hidden") | ||
| 279 | .find('input[type="radio"]') | ||
| 280 | .prop("disabled", true); | ||
| 281 | } | ||
| 282 | }); | ||
| 283 | |||
| 284 | $('.hh-tabs').on('click', 'ul a', function (e) { | ||
| 285 | e.preventDefault(); | ||
| 286 | |||
| 287 | var $this = $(this); | ||
| 288 | $($this.attr('href')) | ||
| 289 | .removeClass('hh-hidden').addClass('hh-tab-active').attr('aria-hidden', 'false').attr('aria-expanded', 'true') | ||
| 290 | .siblings('div').addClass('hh-hidden').removeClass('hh-tab-active').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); | ||
| 291 | $this.closest('li') | ||
| 292 | .addClass('hh-active').attr('aria-selected', 'true').attr('tabindex', 0) | ||
| 293 | .siblings('li').removeClass('hh-active').attr('aria-selected', 'false').attr('tabindex', -1); | ||
| 294 | }).each(function () { | ||
| 295 | var $this = $(this), | ||
| 296 | $ul = $this.children('ul').attr('role', 'tablist'), | ||
| 297 | $li = $ul.children('li').attr('role', 'tab') | ||
| 298 | .not(':first').attr('aria-selected', 'false').attr('tabindex', -1) | ||
| 299 | .end().eq(0).attr('aria-selected', 'true').attr('tabindex', 0) | ||
| 300 | .end(), | ||
| 301 | $a = $li.find('a').attr('role', 'presentation').attr('tabindex', -1), | ||
| 302 | $div = $this.children('div').attr('role', 'tabpanel') | ||
| 303 | .not(':first').attr('aria-hidden', 'true').attr('aria-expanded', 'false') | ||
| 304 | .end().eq(0).attr('aria-hidden', 'false').attr('aria-expanded', 'true') | ||
| 305 | .end(); | ||
| 306 | |||
| 307 | $li.each(function (i) { | ||
| 308 | var $this = $(this), | ||
| 309 | id = 'hh-tabs-' + Math.ceil(Math.random() * 999999) + '-' + i, | ||
| 310 | $a = $this.attr('aria-labelledby', id).find('a').attr('id', id), | ||
| 311 | href = $a.attr('href'); | ||
| 312 | $this.attr('aria-controls', href.substring(1)).attr('aria-labelledby', id); | ||
| 313 | $(href).attr('aria-labelledby', id); | ||
| 314 | }); | ||
| 315 | |||
| 316 | }); | ||
| 317 | }); | ||
| 318 | })(jQuery); | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | select.readonly, | ||
| 2 | select[readonly] { | ||
| 3 | background-color: #eee; | ||
| 4 | } | ||
| 5 | .hh-table > tbody > tr > th, | ||
| 6 | .hh-table > tbody > tr > td, | ||
| 7 | .hh-table td{ | ||
| 8 | vertical-align: top; | ||
| 9 | } | ||
| 10 | .hh-table tbody td.hh-td-inner{ | ||
| 11 | padding: 0; | ||
| 12 | } | ||
| 13 | .hh-table > tbody > tr > th{ | ||
| 14 | width: 35%; | ||
| 15 | } | ||
| 16 | .hh-table > tbody > tr > td:nth-child(2){ | ||
| 17 | width: 10%; | ||
| 18 | } | ||
| 19 | .hh-table > tbody > tr > th .description{ | ||
| 20 | font-weight: normal; | ||
| 21 | } | ||
| 22 | .hh-table .hh-center{ | ||
| 23 | text-align: center; | ||
| 24 | } | ||
| 25 | .hh-table .hh-middle{ | ||
| 26 | vertical-align: middle; | ||
| 27 | } | ||
| 28 | .hh-table .hh-p-sm td, | ||
| 29 | .hh-table .hh-p-sm th{ | ||
| 30 | padding: 8px 5px; | ||
| 31 | } | ||
| 32 | .hh-bordered{ | ||
| 33 | border-collapse: collapse; | ||
| 34 | } | ||
| 35 | .hh-bordered th, | ||
| 36 | .hh-bordered td{ | ||
| 37 | border: dashed 1px #999; | ||
| 38 | } | ||
| 39 | .hh-panel{ | ||
| 40 | background-color: #fff; | ||
| 41 | padding: .7em 2em 1em; | ||
| 42 | -webkit-box-shadow: 0 1px 1px rgba(0,0,0,.04); | ||
| 43 | -moz-box-shadow: 0 1px 1px rgba(0,0,0,.04); | ||
| 44 | box-shadow: 0 1px 1px rgba(0,0,0,.04); | ||
| 45 | border: 1px solid #e5e5e5; | ||
| 46 | margin: 20px 0 0; | ||
| 47 | } | ||
| 48 | |||
| 49 | .hh-index-table{ | ||
| 50 | border-collapse: separate; | ||
| 51 | border-spacing: 0; | ||
| 52 | width: 100%; | ||
| 53 | } | ||
| 54 | .hh-index-table tbody{ | ||
| 55 | border-left: solid 1px rgba(0,0,0,.1); | ||
| 56 | border-right: solid 1px rgba(0,0,0,.1); | ||
| 57 | } | ||
| 58 | .hh-index-table th{ | ||
| 59 | background-color: #fff; | ||
| 60 | font-weight: normal; | ||
| 61 | padding: 8px 10px; | ||
| 62 | text-align: left; | ||
| 63 | } | ||
| 64 | .hh-index-table td{ | ||
| 65 | background-color: #fff; | ||
| 66 | color: gray; | ||
| 67 | padding: 8px 10px; | ||
| 68 | } | ||
| 69 | .hh-index-table td:first-child{ | ||
| 70 | border-left: 4px solid #fff; | ||
| 71 | } | ||
| 72 | .hh-index-table .active td{ | ||
| 73 | background-color: #f7fcfe; | ||
| 74 | color: green; | ||
| 75 | } | ||
| 76 | .hh-index-table .active td:first-child{ | ||
| 77 | border-left: 4px solid #00a0d2; | ||
| 78 | } | ||
| 79 | .hh-index-table td{ | ||
| 80 | box-shadow: 0 -1px 0 rgba(0,0,0,.1); | ||
| 81 | } | ||
| 82 | .hh-index-table .hh-status{ | ||
| 83 | text-align: center; | ||
| 84 | } | ||
| 85 | .hh-index-table .hh-status span{ | ||
| 86 | display: inline-block; | ||
| 87 | border-radius: 3px; | ||
| 88 | padding: 2px 5px; | ||
| 89 | } | ||
| 90 | .hh-index-table .hh-status-on span{ | ||
| 91 | background-color: green; | ||
| 92 | color: #fff; | ||
| 93 | } | ||
| 94 | .hh-index-table .hh-status-off span{ | ||
| 95 | background-color: #aaa; | ||
| 96 | color: #fff; | ||
| 97 | } | ||
| 98 | .hh-notice{ | ||
| 99 | background-color: #FFFFCC; | ||
| 100 | margin: 20px 0; | ||
| 101 | padding: 8px 10px; | ||
| 102 | } | ||
| 103 | .hh-breadcrumbs{ | ||
| 104 | |||
| 105 | } | ||
| 106 | .hh-breadcrumbs li{ | ||
| 107 | display: inline-block; | ||
| 108 | } | ||
| 109 | .hh-breadcrumbs li:not(:last-child):after { | ||
| 110 | content: "\00A0\00BB\00A0"; | ||
| 111 | display: inline-block; | ||
| 112 | } | ||
| 113 | .hh-breadcrumbs li a{ | ||
| 114 | |||
| 115 | } | ||
| 116 | .hh-highlight{ | ||
| 117 | background-color: #333; | ||
| 118 | color: #fff; | ||
| 119 | font-weight: 400; | ||
| 120 | padding: 3px 7px; | ||
| 121 | } | ||
| 122 | .hh-results{ | ||
| 123 | border-collapse: collapse; | ||
| 124 | width: 100%; | ||
| 125 | } | ||
| 126 | .hh-results thead th, | ||
| 127 | .hh-results tbody td{ | ||
| 128 | border-top: solid 1px #e0e0e0; | ||
| 129 | padding: 5px 5px 5px 0; | ||
| 130 | text-align: left; | ||
| 131 | } | ||
| 132 | .hh-results thead th{ | ||
| 133 | border: none; | ||
| 134 | } | ||
| 135 | .hh-results tbody tr td:first-child{ | ||
| 136 | white-space: nowrap; | ||
| 137 | } | ||
| 138 | .hh-results tbody tr.hh-found td{ | ||
| 139 | background-color: #f7fcfe; | ||
| 140 | } | ||
| 141 | .hh-results tbody tr.hh-found td:first-child{ | ||
| 142 | color: green; | ||
| 143 | } | ||
| 144 | .form-field .form-label{ | ||
| 145 | font-weight: bold; | ||
| 146 | } | ||
| 147 | .form-field .form-lbl{ | ||
| 148 | display: inline-block; | ||
| 149 | margin: 0 10px 0 0; | ||
| 150 | } | ||
| 151 | .form-row .form-col-6{ | ||
| 152 | float: left; | ||
| 153 | width: 50%; | ||
| 154 | } | ||
| 155 | .form-row:after{ | ||
| 156 | clear: left; | ||
| 157 | content: ''; | ||
| 158 | display: table; | ||
| 159 | zoom: 1; | ||
| 160 | } | ||
| 161 | .hh-tabs > ul{ | ||
| 162 | margin-bottom: -1px; | ||
| 163 | } | ||
| 164 | .hh-tabs > ul:after{ | ||
| 165 | content: ''; | ||
| 166 | display: table; | ||
| 167 | clear: left; | ||
| 168 | zoom: 1; | ||
| 169 | } | ||
| 170 | .hh-tabs > ul > li{ | ||
| 171 | background-color: #fff; | ||
| 172 | border: solid 1px #ccc; | ||
| 173 | border-bottom: none; | ||
| 174 | display: inline-block; | ||
| 175 | float: left; | ||
| 176 | margin: 0 5px 0 0; | ||
| 177 | padding: 0; | ||
| 178 | } | ||
| 179 | .hh-tabs > ul > li a{ | ||
| 180 | color: #222; | ||
| 181 | display: inline-block; | ||
| 182 | padding: 5px 10px; | ||
| 183 | text-decoration: none; | ||
| 184 | } | ||
| 185 | .hh-tabs > ul > li.hh-active{ | ||
| 186 | border: solid 1px #222; | ||
| 187 | border-bottom-color: #fff; | ||
| 188 | } | ||
| 189 | .hh-tabs .hh-tab-active{ | ||
| 190 | background-color: #fff; | ||
| 191 | border: solid 1px #222; | ||
| 192 | padding: 20px; | ||
| 193 | } | ||
| 194 | .hh-textarea-manual{ | ||
| 195 | width: 100%; | ||
| 196 | } | ||
| 197 | .hh-hidden{ | ||
| 198 | display: none; | ||
| 199 | } | ||
| 200 | .hh-wrapper{ | ||
| 201 | |||
| 202 | } | ||
| 203 | .hh-sidebar{ | ||
| 204 | float: right; | ||
| 205 | width: 20%; | ||
| 206 | } | ||
| 207 | .hh-sidebar-inner{ | ||
| 208 | background-color: #fff; | ||
| 209 | border: solid 1px #92D295; | ||
| 210 | padding: 15px; | ||
| 211 | } | ||
| 212 | .hh-sidebar-inner h3{ | ||
| 213 | margin: 0; | ||
| 214 | } | ||
| 215 | .hh-categories{ | ||
| 216 | float: left; | ||
| 217 | width: 80%; | ||
| 218 | } | ||
| 219 | .hh-categories *{ | ||
| 220 | -webkit-box-sizing: border-box; | ||
| 221 | -moz-box-sizing: border-box; | ||
| 222 | box-sizing: border-box; | ||
| 223 | } | ||
| 224 | .hh-wrapper:after, | ||
| 225 | .hh-categories:after{ | ||
| 226 | content: ''; | ||
| 227 | clear: both; | ||
| 228 | display: table; | ||
| 229 | zoom: 1; | ||
| 230 | } | ||
| 231 | a.hh-category{ | ||
| 232 | background-color: #fff; | ||
| 233 | border: solid 1px #92D295; | ||
| 234 | display: inline-block; | ||
| 235 | float: left; | ||
| 236 | font-size: 16px; | ||
| 237 | height: 168px; | ||
| 238 | margin: 0 3% 3% 0; | ||
| 239 | position: relative; | ||
| 240 | text-align: center; | ||
| 241 | text-decoration: none; | ||
| 242 | text-transform: uppercase; | ||
| 243 | width: 30%; | ||
| 244 | } | ||
| 245 | |||
| 246 | a.hh-category i { | ||
| 247 | background-color: #92D295; | ||
| 248 | display: inline-block; | ||
| 249 | height: 48px; | ||
| 250 | margin: 35px 0 0; | ||
| 251 | text-align: center; | ||
| 252 | width: 48px; | ||
| 253 | -webkit-transform: rotate(20deg); | ||
| 254 | -moz-transform: rotate(20deg); | ||
| 255 | -ms-transform: rotate(20deg); | ||
| 256 | -o-transform: rotate(20deg); | ||
| 257 | } | ||
| 258 | a.hh-category i:after { | ||
| 259 | background-color: #92D295; | ||
| 260 | content: ""; | ||
| 261 | display: inline-block; | ||
| 262 | height: 48px; | ||
| 263 | width: 48px; | ||
| 264 | -webkit-transform: rotate(135deg); | ||
| 265 | -moz-transform: rotate(135deg); | ||
| 266 | -ms-transform: rotate(135deg); | ||
| 267 | -o-transform: rotate(135deg); | ||
| 268 | } | ||
| 269 | |||
| 270 | a.hh-category span{ | ||
| 271 | display: block; | ||
| 272 | color: #fff; | ||
| 273 | font-size: 24px; | ||
| 274 | font-weight: 600; | ||
| 275 | text-transform: uppercase; | ||
| 276 | left: 0; | ||
| 277 | position: absolute; | ||
| 278 | top: 48px; | ||
| 279 | width: 100%; | ||
| 280 | } | ||
| 281 | |||
| 282 | a.hh-category strong{ | ||
| 283 | display: block; | ||
| 284 | font-weight: normal; | ||
| 285 | margin: 20px 0 0; | ||
| 286 | } | ||
| 287 | |||
| 288 | a.hh-category:hover{ | ||
| 289 | box-shadow: 0 0 3px #6EC271; | ||
| 290 | } | ||
| 291 | a.hh-category:hover i{ | ||
| 292 | -webkit-transform: rotate(160deg); | ||
| 293 | -moz-transform: rotate(160deg); | ||
| 294 | -ms-transform: rotate(160deg); | ||
| 295 | -o-transform: rotate(160deg); | ||
| 296 | |||
| 297 | -webkit-transition: -webkit-transform 0.5s ease-out; | ||
| 298 | -moz-transition: -moz-transform 0.5s ease-out; | ||
| 299 | -o-transition: -o-transform 0.5s ease-out; | ||
| 300 | transition: transform 0.5s ease-out; | ||
| 301 | } | ||
| 302 | .hh-p{ | ||
| 303 | margin: 0.5em 0; | ||
| 304 | } | ||
| 305 | .hh-csv-value { | ||
| 306 | padding-left: 25px; | ||
| 307 | } | ||
| 308 | @media (min-width: 1280px) { | ||
| 309 | a.hh-category{ | ||
| 310 | max-width: 260px; | ||
| 311 | } | ||
| 312 | } | ||
| 313 | @media (max-width: 960px) { | ||
| 314 | a.hh-category{ | ||
| 315 | margin: 0 5% 20px; | ||
| 316 | width: 40%; | ||
| 317 | } | ||
| 318 | .hh-categories{ | ||
| 319 | width: 70%; | ||
| 320 | } | ||
| 321 | .hh-sidebar{ | ||
| 322 | width: 30%; | ||
| 323 | } | ||
| 324 | } | ||
| 325 | @media (max-width: 768px) { | ||
| 326 | .hh-categories{ | ||
| 327 | width: 65%; | ||
| 328 | } | ||
| 329 | .hh-sidebar{ | ||
| 330 | width: 35%; | ||
| 331 | } | ||
| 332 | } | ||
| 333 | @media (max-width: 640px) { | ||
| 334 | a.hh-category{ | ||
| 335 | float: none; | ||
| 336 | margin: 0 0 20px; | ||
| 337 | width: 100%; | ||
| 338 | } | ||
| 339 | .hh-categories{ | ||
| 340 | width: 55%; | ||
| 341 | } | ||
| 342 | .hh-sidebar{ | ||
| 343 | width: 40%; | ||
| 344 | } | ||
| 345 | } | ||
| 346 | @media (max-width: 468px) { | ||
| 347 | a.hh-category{ | ||
| 348 | max-width: 260px; | ||
| 349 | } | ||
| 350 | .hh-categories, | ||
| 351 | .hh-sidebar{ | ||
| 352 | float: none; | ||
| 353 | margin: 0 auto; | ||
| 354 | max-width: 250px; | ||
| 355 | width: 100%; | ||
| 356 | } | ||
| 357 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | /* | ||
| 3 | Plugin Name: HTTP Headers | ||
| 4 | Plugin URI: https://zinoui.com/blog/http-headers-for-wordpress | ||
| 5 | Description: A plugin for HTTP headers management including security, access-control (CORS), caching, compression, and authentication. | ||
| 6 | Version: 1.18.5 | ||
| 7 | Author: Dimitar Ivanov | ||
| 8 | Author URI: https://zinoui.com | ||
| 9 | License: GPLv2 or later | ||
| 10 | Text Domain: http-headers | ||
| 11 | */ | ||
| 12 | |||
| 13 | /* | ||
| 14 | This program is free software; you can redistribute it and/or | ||
| 15 | modify it under the terms of the GNU General Public License | ||
| 16 | as published by the Free Software Foundation; either version 2 | ||
| 17 | of the License, or (at your option) any later version. | ||
| 18 | |||
| 19 | This program is distributed in the hope that it will be useful, | ||
| 20 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | GNU General Public License for more details. | ||
| 23 | |||
| 24 | You should have received a copy of the GNU General Public License | ||
| 25 | along with this program. If not, see <http://www.gnu.org/copyleft/gpl.html>. | ||
| 26 | |||
| 27 | Copyright (c) 2017-2021 Zino UI | ||
| 28 | */ | ||
| 29 | |||
| 30 | if (!defined('ABSPATH')) { | ||
| 31 | exit; | ||
| 32 | } | ||
| 33 | |||
| 34 | $options = include dirname(__FILE__) . '/views/includes/options.inc.php'; | ||
| 35 | foreach ($options as $option) { | ||
| 36 | if (get_option($option[0]) === false) { | ||
| 37 | add_option($option[0], $option[1], null, 'yes'); | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | function build_csp_value($value) { | ||
| 42 | $csp = array(); | ||
| 43 | foreach ($value as $key => $val) | ||
| 44 | { | ||
| 45 | if (is_array($val)) | ||
| 46 | { | ||
| 47 | $source = NULL; | ||
| 48 | if (isset($val['source'])) | ||
| 49 | { | ||
| 50 | $source = $val['source']; | ||
| 51 | unset($val['source']); | ||
| 52 | } | ||
| 53 | if (!empty($val)) | ||
| 54 | { | ||
| 55 | $val = join(" ", array_keys($val)); | ||
| 56 | if ($source) | ||
| 57 | { | ||
| 58 | $val .= " " . $source; | ||
| 59 | } | ||
| 60 | $csp[] = sprintf("%s %s", $key, $val); | ||
| 61 | } elseif ($source) { | ||
| 62 | $csp[] = sprintf("%s %s", $key, $source); | ||
| 63 | } | ||
| 64 | } else { | ||
| 65 | if (in_array($key, array('block-all-mixed-content', 'upgrade-insecure-requests'))) | ||
| 66 | { | ||
| 67 | $csp[] = $key; | ||
| 68 | } | ||
| 69 | if (in_array($key, array('plugin-types', 'report-to')) && !empty($val)) | ||
| 70 | { | ||
| 71 | $csp[] = sprintf("%s %s", $key, $val); | ||
| 72 | } | ||
| 73 | } | ||
| 74 | } | ||
| 75 | |||
| 76 | if (!$csp) | ||
| 77 | { | ||
| 78 | return NULL; | ||
| 79 | } | ||
| 80 | |||
| 81 | return join('; ', $csp); | ||
| 82 | } | ||
| 83 | |||
| 84 | function get_htaccess_filename() { | ||
| 85 | return get_option('hh_htaccess_path'); | ||
| 86 | } | ||
| 87 | |||
| 88 | function get_user_ini_filename() { | ||
| 89 | return get_option('hh_user_ini_path'); | ||
| 90 | } | ||
| 91 | |||
| 92 | function get_htpasswd_filename() { | ||
| 93 | return get_option('hh_htpasswd_path'); | ||
| 94 | } | ||
| 95 | |||
| 96 | function get_htdigest_filename() { | ||
| 97 | return get_option('hh_htdigest_path'); | ||
| 98 | } | ||
| 99 | |||
| 100 | function get_http_headers() { | ||
| 101 | $statuses = array(); | ||
| 102 | $unset = array(); | ||
| 103 | $headers = array(); | ||
| 104 | $append = array(); | ||
| 105 | if (get_option('hh_x_frame_options') == 1) { | ||
| 106 | $x_frame_options_value = strtoupper(get_option('hh_x_frame_options_value')); | ||
| 107 | if ($x_frame_options_value == 'ALLOW-FROM') { | ||
| 108 | $x_frame_options_value .= ' ' . get_option('hh_x_frame_options_domain'); | ||
| 109 | } | ||
| 110 | $headers['X-Frame-Options'] = $x_frame_options_value; | ||
| 111 | } | ||
| 112 | if (get_option('hh_x_powered_by') == 1) { | ||
| 113 | if (get_option('hh_x_powered_by_option') == 'set') { | ||
| 114 | $headers['X-Powered-By'] = get_option('hh_x_powered_by_value'); | ||
| 115 | } else { | ||
| 116 | $unset[] = 'X-Powered-By'; | ||
| 117 | } | ||
| 118 | } | ||
| 119 | if (get_option('hh_x_xxs_protection') == 1) { | ||
| 120 | $headers['X-XSS-Protection'] = get_option('hh_x_xxs_protection_value'); | ||
| 121 | if ($headers['X-XSS-Protection'] == '1; report=') { | ||
| 122 | $headers['X-XSS-Protection'] .= get_option('hh_x_xxs_protection_uri'); | ||
| 123 | } | ||
| 124 | } | ||
| 125 | if (get_option('hh_x_content_type_options') == 1) { | ||
| 126 | $headers['X-Content-Type-Options'] = get_option('hh_x_content_type_options_value'); | ||
| 127 | } | ||
| 128 | if (get_option('hh_x_download_options') == 1) { | ||
| 129 | $headers['X-Download-Options'] = get_option('hh_x_download_options_value'); | ||
| 130 | } | ||
| 131 | if (get_option('hh_x_permitted_cross_domain_policies') == 1) { | ||
| 132 | $headers['X-Permitted-Cross-Domain-Policies'] = get_option('hh_x_permitted_cross_domain_policies_value'); | ||
| 133 | } | ||
| 134 | if (get_option('hh_x_dns_prefetch_control') == 1) { | ||
| 135 | $headers['X-DNS-Prefetch-Control'] = get_option('hh_x_dns_prefetch_control_value'); | ||
| 136 | } | ||
| 137 | if (get_option('hh_connection') == 1) { | ||
| 138 | $headers['Connection'] = get_option('hh_connection_value'); | ||
| 139 | } | ||
| 140 | if (get_option('hh_pragma') == 1) { | ||
| 141 | $headers['Pragma'] = get_option('hh_pragma_value'); | ||
| 142 | } | ||
| 143 | if (get_option('hh_age') == 1) { | ||
| 144 | $headers['Age'] = sprintf("%u", get_option('hh_age_value')); | ||
| 145 | } | ||
| 146 | if (get_option('hh_cache_control') == 1) { | ||
| 147 | $hh_cache_control_value = get_option('hh_cache_control_value', array()); | ||
| 148 | $tmp = array(); | ||
| 149 | foreach ($hh_cache_control_value as $k => $v) { | ||
| 150 | if (in_array($k, array('max-age', 's-maxage', 'stale-while-revalidate', 'stale-if-error'))) { | ||
| 151 | if (strlen($v) > 0) { | ||
| 152 | $tmp[] = sprintf("%s=%u", $k, $v); | ||
| 153 | } | ||
| 154 | } else { | ||
| 155 | $tmp[] = $k; | ||
| 156 | } | ||
| 157 | } | ||
| 158 | $hh_cache_control_value = join(', ', $tmp); | ||
| 159 | $headers['Cache-Control'] = $hh_cache_control_value; | ||
| 160 | } | ||
| 161 | if (get_option('hh_strict_transport_security') == 1) { | ||
| 162 | $hh_strict_transport_security = array(); | ||
| 163 | |||
| 164 | $hh_strict_transport_security_max_age = get_option('hh_strict_transport_security_max_age'); | ||
| 165 | if ($hh_strict_transport_security_max_age !== false) | ||
| 166 | { | ||
| 167 | $hh_strict_transport_security[] = sprintf('max-age=%u', get_option('hh_strict_transport_security_max_age')); | ||
| 168 | if (get_option('hh_strict_transport_security_sub_domains')) | ||
| 169 | { | ||
| 170 | $hh_strict_transport_security[] = 'includeSubDomains'; | ||
| 171 | } | ||
| 172 | if (get_option('hh_strict_transport_security_preload')) | ||
| 173 | { | ||
| 174 | $hh_strict_transport_security[] = 'preload'; | ||
| 175 | } | ||
| 176 | } else { | ||
| 177 | $hh_strict_transport_security = array(get_option('hh_strict_transport_security_value')); | ||
| 178 | } | ||
| 179 | $headers['Strict-Transport-Security'] = join('; ', $hh_strict_transport_security); | ||
| 180 | } | ||
| 181 | if (get_option('hh_x_ua_compatible') == 1) { | ||
| 182 | $headers['X-UA-Compatible'] = get_option('hh_x_ua_compatible_value'); | ||
| 183 | } | ||
| 184 | |||
| 185 | if (get_option('hh_content_security_policy') == 1) | ||
| 186 | { | ||
| 187 | $value = get_option('hh_content_security_policy_value'); | ||
| 188 | $csp = build_csp_value($value); | ||
| 189 | if ($csp) | ||
| 190 | { | ||
| 191 | $csp_report_only = get_option('hh_content_security_policy_report_only'); | ||
| 192 | $headers['Content-Security-Policy'.($csp_report_only ? '-Report-Only' : NULL)] = $csp; | ||
| 193 | } | ||
| 194 | } | ||
| 195 | |||
| 196 | if (get_option('hh_access_control_allow_origin') == 1) | ||
| 197 | { | ||
| 198 | $value = get_option('hh_access_control_allow_origin_value'); | ||
| 199 | switch ($value) | ||
| 200 | { | ||
| 201 | case 'origin': | ||
| 202 | $value = get_option('hh_access_control_allow_origin_url', array()); | ||
| 203 | if (is_scalar($value)) | ||
| 204 | { | ||
| 205 | $value = array($value); | ||
| 206 | } | ||
| 207 | break; | ||
| 208 | } | ||
| 209 | if (!empty($value)) | ||
| 210 | { | ||
| 211 | $headers['Access-Control-Allow-Origin'] = $value; | ||
| 212 | } | ||
| 213 | } | ||
| 214 | if (get_option('hh_access_control_allow_credentials') == 1) | ||
| 215 | { | ||
| 216 | $headers['Access-Control-Allow-Credentials'] = get_option('hh_access_control_allow_credentials_value'); | ||
| 217 | } | ||
| 218 | if (get_option('hh_access_control_max_age') == 1) | ||
| 219 | { | ||
| 220 | $value = get_option('hh_access_control_max_age_value'); | ||
| 221 | if (!empty($value)) | ||
| 222 | { | ||
| 223 | $headers['Access-Control-Max-Age'] = intval($value); | ||
| 224 | } | ||
| 225 | } | ||
| 226 | if (get_option('hh_access_control_allow_methods') == 1) | ||
| 227 | { | ||
| 228 | $value = get_option('hh_access_control_allow_methods_value'); | ||
| 229 | if (!empty($value)) | ||
| 230 | { | ||
| 231 | $headers['Access-Control-Allow-Methods'] = join(', ', array_keys($value)); | ||
| 232 | } | ||
| 233 | } | ||
| 234 | if (get_option('hh_access_control_allow_headers') == 1) | ||
| 235 | { | ||
| 236 | $tmp = array(); | ||
| 237 | $value = get_option('hh_access_control_allow_headers_value'); | ||
| 238 | if (!empty($value)) | ||
| 239 | { | ||
| 240 | $tmp = array_merge($tmp, array_keys($value)); | ||
| 241 | } | ||
| 242 | $custom = get_option('hh_access_control_allow_headers_custom'); | ||
| 243 | if (!empty($custom)) | ||
| 244 | { | ||
| 245 | $tmp = array_merge($tmp, $custom); | ||
| 246 | } | ||
| 247 | if ($tmp) | ||
| 248 | { | ||
| 249 | $tmp = array_filter($tmp, 'trim'); | ||
| 250 | $tmp = array_unique($tmp); | ||
| 251 | $headers['Access-Control-Allow-Headers'] = join(', ', $tmp); | ||
| 252 | } | ||
| 253 | } | ||
| 254 | if (get_option('hh_access_control_expose_headers') == 1) | ||
| 255 | { | ||
| 256 | $tmp = array(); | ||
| 257 | $value = get_option('hh_access_control_expose_headers_value'); | ||
| 258 | if (!empty($value)) | ||
| 259 | { | ||
| 260 | $tmp = array_merge($tmp, array_keys($value)); | ||
| 261 | } | ||
| 262 | $custom = get_option('hh_access_control_expose_headers_custom'); | ||
| 263 | if (!empty($custom)) | ||
| 264 | { | ||
| 265 | $tmp = array_merge($tmp, $custom); | ||
| 266 | } | ||
| 267 | if ($tmp) | ||
| 268 | { | ||
| 269 | $tmp = array_filter($tmp, 'trim'); | ||
| 270 | $tmp = array_unique($tmp); | ||
| 271 | $headers['Access-Control-Expose-Headers'] = join(', ', $tmp); | ||
| 272 | } | ||
| 273 | } | ||
| 274 | if (get_option('hh_p3p') == 1) | ||
| 275 | { | ||
| 276 | $value = get_option('hh_p3p_value'); | ||
| 277 | if (!empty($value)) | ||
| 278 | { | ||
| 279 | $headers['P3P'] = 'CP="' . join(' ', array_keys($value)) . '"'; | ||
| 280 | } | ||
| 281 | } | ||
| 282 | if (get_option('hh_referrer_policy') == 1) { | ||
| 283 | $headers['Referrer-Policy'] = get_option('hh_referrer_policy_value'); | ||
| 284 | } | ||
| 285 | if (get_option('hh_cross_origin_resource_policy') == 1) { | ||
| 286 | $headers['Cross-Origin-Resource-Policy'] = get_option('hh_cross_origin_resource_policy_value'); | ||
| 287 | } | ||
| 288 | if (get_option('hh_cross_origin_embedder_policy') == 1) { | ||
| 289 | $headers['Cross-Origin-Embedder-Policy'] = get_option('hh_cross_origin_embedder_policy_value'); | ||
| 290 | } | ||
| 291 | if (get_option('hh_cross_origin_opener_policy') == 1) { | ||
| 292 | $headers['Cross-Origin-Opener-Policy'] = get_option('hh_cross_origin_opener_policy_value'); | ||
| 293 | } | ||
| 294 | if (get_option('hh_www_authenticate') == 1) { | ||
| 295 | |||
| 296 | switch (get_option('hh_www_authenticate_type')) { | ||
| 297 | case 'Basic': | ||
| 298 | if (!(isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) | ||
| 299 | && $_SERVER['PHP_AUTH_USER'] == get_option('hh_www_authenticate_user') | ||
| 300 | && $_SERVER['PHP_AUTH_PW'] == get_option('hh_www_authenticate_pswd'))) { | ||
| 301 | $headers['WWW-Authenticate'] = sprintf("Basic realm='%s'", get_option('hh_www_authenticate_realm')); | ||
| 302 | $statuses['HTTP/1.1'] = '401 Unauthorized'; | ||
| 303 | } | ||
| 304 | break; | ||
| 305 | case 'Digest': | ||
| 306 | if (empty($_SERVER['PHP_AUTH_DIGEST'])) { | ||
| 307 | $realm = get_option('hh_www_authenticate_realm'); | ||
| 308 | $headers['WWW-Authenticate'] = sprintf("Digest realm='%s',qop='auth',nonce='%s',opaque='%s'", | ||
| 309 | $realm, uniqid(), md5($realm)); | ||
| 310 | $statuses['HTTP/1.1'] = '401 Unauthorized'; | ||
| 311 | } | ||
| 312 | break; | ||
| 313 | } | ||
| 314 | } | ||
| 315 | if (get_option('hh_vary') == 1) | ||
| 316 | { | ||
| 317 | $value = get_option('hh_vary_value'); | ||
| 318 | if (!empty($value)) | ||
| 319 | { | ||
| 320 | $append['Vary'] = join(', ', array_keys($value)); | ||
| 321 | } | ||
| 322 | } | ||
| 323 | |||
| 324 | if (get_option('hh_expect_ct') == 1) { | ||
| 325 | $expect_ct_max_age = get_option('hh_expect_ct_max_age'); | ||
| 326 | $expect_ct_report_uri = get_option('hh_expect_ct_report_uri'); | ||
| 327 | if (!empty($expect_ct_report_uri) && !empty($expect_ct_max_age)) { | ||
| 328 | |||
| 329 | $expect_ct = array(); | ||
| 330 | $expect_ct[] = sprintf("max-age=%u", $expect_ct_max_age); | ||
| 331 | if (get_option('hh_expect_ct_enforce') == 1) { | ||
| 332 | $expect_ct[] = "enforce"; | ||
| 333 | } | ||
| 334 | $expect_ct[] = sprintf('report-uri="%s"', $expect_ct_report_uri); | ||
| 335 | $headers['Expect-CT'] = join(', ', $expect_ct); | ||
| 336 | } | ||
| 337 | } | ||
| 338 | if (get_option('hh_custom_headers') == 1) { | ||
| 339 | $custom_headers = get_option('hh_custom_headers_value'); | ||
| 340 | if (isset($custom_headers['name'], $custom_headers['value']) && !empty($custom_headers['name'])) { | ||
| 341 | foreach ($custom_headers['name'] as $key => $name) { | ||
| 342 | $name = trim($name); | ||
| 343 | $value = trim($custom_headers['value'][$key]); | ||
| 344 | if (empty($name) || empty($value)) { | ||
| 345 | continue; | ||
| 346 | } | ||
| 347 | $headers[$name] = $value; | ||
| 348 | } | ||
| 349 | } | ||
| 350 | } | ||
| 351 | |||
| 352 | $value = get_http_header('report_to'); | ||
| 353 | if ($value) { | ||
| 354 | $headers['Report-To'] = $value; | ||
| 355 | } | ||
| 356 | |||
| 357 | $value = get_http_header('nel'); | ||
| 358 | if ($value) { | ||
| 359 | $headers['NEL'] = $value; | ||
| 360 | } | ||
| 361 | |||
| 362 | $value = get_http_header('feature_policy'); | ||
| 363 | if ($value) { | ||
| 364 | $headers['Feature-Policy'] = $value; | ||
| 365 | } | ||
| 366 | |||
| 367 | $value = get_http_header('permissions_policy'); | ||
| 368 | if ($value) { | ||
| 369 | $headers['Permissions-Policy'] = $value; | ||
| 370 | } | ||
| 371 | |||
| 372 | $value = get_http_header('x_robots_tag'); | ||
| 373 | if ($value) { | ||
| 374 | $headers['X-Robots-Tag'] = $value; | ||
| 375 | } | ||
| 376 | |||
| 377 | return array($headers, $statuses, $unset, $append); | ||
| 378 | } | ||
| 379 | |||
| 380 | function get_http_header($header_name) { | ||
| 381 | $fn = sprintf('get_%s_header', $header_name); | ||
| 382 | if (!function_exists($fn)) { | ||
| 383 | return NULL; | ||
| 384 | } | ||
| 385 | |||
| 386 | return call_user_func($fn); | ||
| 387 | } | ||
| 388 | |||
| 389 | function get_report_to_header() { | ||
| 390 | if (get_option('hh_report_to') != 1) { | ||
| 391 | return NULL; | ||
| 392 | } | ||
| 393 | $report_to = get_option('hh_report_to_value'); | ||
| 394 | $tmp = array(); | ||
| 395 | foreach ($report_to as $item) { | ||
| 396 | $endpoints = array(); | ||
| 397 | foreach ($item['endpoints'] as $endpoint) { | ||
| 398 | $endpoints[] = sprintf('{"url": "%s"%s%s}', | ||
| 399 | $endpoint['url'], | ||
| 400 | is_numeric($endpoint['priority']) ? sprintf(', "priority": %u', $endpoint['priority']) : NULL, | ||
| 401 | is_numeric($endpoint['weight']) ? sprintf(', "weight": %u', $endpoint['weight']) : NULL | ||
| 402 | ); | ||
| 403 | } | ||
| 404 | |||
| 405 | $tmp[] = sprintf('{"max_age": %u%s%s, "endpoints": [%s]}', | ||
| 406 | $item['max_age'], | ||
| 407 | $item['group'] ? sprintf(', "group": "%s"', $item['group']) : NULL, | ||
| 408 | $item['include_subdomains'] ? sprintf(', "include_subdomains": true') : NULL, | ||
| 409 | join(", ", $endpoints) | ||
| 410 | ); | ||
| 411 | } | ||
| 412 | |||
| 413 | return join(', ', $tmp); | ||
| 414 | } | ||
| 415 | |||
| 416 | function get_x_robots_tag_header() { | ||
| 417 | if (get_option('hh_x_robots_tag') != 1) { | ||
| 418 | return NULL; | ||
| 419 | } | ||
| 420 | |||
| 421 | $hh_x_robots_tag_value = get_option('hh_x_robots_tag_value', array()); | ||
| 422 | $tmp = array(); | ||
| 423 | foreach ($hh_x_robots_tag_value as $k => $v) { | ||
| 424 | if ($k == 'max-snippet') { | ||
| 425 | if (is_numeric($v) && $v >= -1) { | ||
| 426 | $tmp[] = "$k:$v"; | ||
| 427 | } | ||
| 428 | } elseif ($k == 'max-image-preview') { | ||
| 429 | if (!empty($v)) { | ||
| 430 | $tmp[] = "$k:$v"; | ||
| 431 | } | ||
| 432 | } elseif ($k == 'max-video-preview') { | ||
| 433 | if (is_numeric($v) && $v >= -1) { | ||
| 434 | $tmp[] = "$k:$v"; | ||
| 435 | } | ||
| 436 | } elseif ($k == 'unavailable_after') { | ||
| 437 | if (!empty($v)) { | ||
| 438 | $tmp[] = "$k:$v"; | ||
| 439 | } | ||
| 440 | } else { | ||
| 441 | $tmp[] = $k; | ||
| 442 | } | ||
| 443 | } | ||
| 444 | return join(', ', $tmp); | ||
| 445 | } | ||
| 446 | |||
| 447 | function get_nel_header() { | ||
| 448 | if (get_option('hh_nel') != 1) { | ||
| 449 | return NULL; | ||
| 450 | } | ||
| 451 | |||
| 452 | $nel = get_option('hh_nel_value', array()); | ||
| 453 | return sprintf('{"report_to": "%s", "max_age": %u%s%s%s%s%s}', | ||
| 454 | @$nel['report_to'], @$nel['max_age'], | ||
| 455 | isset($nel['include_subdomains']) ? ', "include_subdomains": true' : NULL, | ||
| 456 | array_key_exists('success_fraction', $nel) && is_numeric($nel['success_fraction']) ? ', "success_fraction": '. $nel['success_fraction'] : NULL, | ||
| 457 | array_key_exists('failure_fraction', $nel) && is_numeric($nel['failure_fraction']) ? ', "failure_fraction": '. $nel['failure_fraction'] : NULL, | ||
| 458 | isset($nel['request_headers']) && !empty($nel['request_headers']) ? sprintf(', "request_headers": ["%s"]', join('", "', array_map('trim', explode(',', $nel['request_headers'])))) : NULL, | ||
| 459 | isset($nel['response_headers']) && !empty($nel['response_headers']) ? sprintf(', "response_headers": ["%s"]', join('", "', array_map('trim', explode(',', $nel['response_headers'])))) : NULL | ||
| 460 | ); | ||
| 461 | } | ||
| 462 | |||
| 463 | function get_feature_policy_header() { | ||
| 464 | if (get_option('hh_feature_policy') != 1) { | ||
| 465 | return NULL; | ||
| 466 | } | ||
| 467 | $feature_policy_feature = get_option('hh_feature_policy_feature'); | ||
| 468 | $feature_policy_value = get_option('hh_feature_policy_value'); | ||
| 469 | $feature_policy_origin = get_option('hh_feature_policy_origin'); | ||
| 470 | $tmp = array(); | ||
| 471 | $feature_policy_feature = is_array($feature_policy_feature) ? $feature_policy_feature : array(); | ||
| 472 | foreach (array_keys($feature_policy_feature) as $feature) { | ||
| 473 | $value = NULL; | ||
| 474 | switch ($feature_policy_value[$feature]) { | ||
| 475 | case '*': | ||
| 476 | case "'none'": | ||
| 477 | $value = $feature_policy_value[$feature]; | ||
| 478 | break; | ||
| 479 | case "'self'": | ||
| 480 | $value = $feature_policy_value[$feature]; | ||
| 481 | if (!empty($feature_policy_origin[$feature])) { | ||
| 482 | $value .= " " . $feature_policy_origin[$feature]; | ||
| 483 | } | ||
| 484 | break; | ||
| 485 | case 'origin(s)': | ||
| 486 | $value = $feature_policy_origin[$feature]; | ||
| 487 | break; | ||
| 488 | } | ||
| 489 | |||
| 490 | $tmp[] = sprintf("%s %s", $feature, $value); | ||
| 491 | } | ||
| 492 | |||
| 493 | return join('; ', $tmp); | ||
| 494 | } | ||
| 495 | |||
| 496 | function get_permissions_policy_header() { | ||
| 497 | if (get_option('hh_permissions_policy') != 1) { | ||
| 498 | return NULL; | ||
| 499 | } | ||
| 500 | $permissions_policy_feature = get_option('hh_permissions_policy_feature'); | ||
| 501 | $permissions_policy_value = get_option('hh_permissions_policy_value'); | ||
| 502 | $permissions_policy_origin = get_option('hh_permissions_policy_origin'); | ||
| 503 | |||
| 504 | $tmp = array(); | ||
| 505 | $permissions_policy_feature = is_array($permissions_policy_feature) ? $permissions_policy_feature : array(); | ||
| 506 | foreach (array_keys($permissions_policy_feature) as $feature) { | ||
| 507 | |||
| 508 | $origins = NULL; | ||
| 509 | if (!empty($permissions_policy_origin[$feature])) | ||
| 510 | { | ||
| 511 | $origins = $permissions_policy_origin[$feature]; | ||
| 512 | $origins = str_replace(array('"', "'"), '', $origins); | ||
| 513 | $origins = explode(' ', $origins); | ||
| 514 | $origins = array_filter($origins); | ||
| 515 | $origins = array_unique($origins); | ||
| 516 | $origins = '"' . join('" "', $origins) . '"'; | ||
| 517 | } | ||
| 518 | |||
| 519 | $value = NULL; | ||
| 520 | switch ($permissions_policy_value[$feature]) { | ||
| 521 | case '*': | ||
| 522 | $value = '*'; | ||
| 523 | break; | ||
| 524 | case "none": | ||
| 525 | $value = '()'; | ||
| 526 | break; | ||
| 527 | case "self": | ||
| 528 | $value = 'self'; | ||
| 529 | if ($origins) | ||
| 530 | { | ||
| 531 | $value .= ' ' . $origins; | ||
| 532 | } | ||
| 533 | $value = sprintf('(%s)', $value); | ||
| 534 | break; | ||
| 535 | case 'origin(s)': | ||
| 536 | $value = sprintf('(%s)', $origins); | ||
| 537 | break; | ||
| 538 | } | ||
| 539 | |||
| 540 | $tmp[] = sprintf('%s=%s', $feature, $value); | ||
| 541 | } | ||
| 542 | |||
| 543 | return join(', ', $tmp); | ||
| 544 | } | ||
| 545 | |||
| 546 | function http_digest_parse($txt) { | ||
| 547 | $txt = stripslashes($txt); | ||
| 548 | |||
| 549 | $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); | ||
| 550 | $data = array(); | ||
| 551 | $keys = implode('|', array_keys($needed_parts)); | ||
| 552 | |||
| 553 | $matches = null; | ||
| 554 | preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER); | ||
| 555 | |||
| 556 | foreach ($matches as $m) { | ||
| 557 | $data[$m[1]] = $m[3] ? $m[3] : $m[4]; | ||
| 558 | unset($needed_parts[$m[1]]); | ||
| 559 | } | ||
| 560 | |||
| 561 | return $needed_parts ? false : $data; | ||
| 562 | } | ||
| 563 | |||
| 564 | function php_auth_digest() { | ||
| 565 | if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || get_option('hh_www_authenticate_user') != $data['username']) { | ||
| 566 | die('Wrong Credentials!'); | ||
| 567 | } | ||
| 568 | |||
| 569 | $A1 = md5($data['username'] . ':' . get_option('hh_www_authenticate_realm') . ':' . get_option('hh_www_authenticate_pswd')); | ||
| 570 | $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']); | ||
| 571 | $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2); | ||
| 572 | if ($data['response'] != $valid_response) { | ||
| 573 | die('Wrong Credentials!'); | ||
| 574 | } | ||
| 575 | } | ||
| 576 | |||
| 577 | function php_content_encoding() { | ||
| 578 | if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) { | ||
| 579 | ob_start('ob_gzhandler'); | ||
| 580 | } else { | ||
| 581 | ob_start(); | ||
| 582 | } | ||
| 583 | } | ||
| 584 | |||
| 585 | function php_cookie_security_directives() { | ||
| 586 | $lines = array(); | ||
| 587 | if (get_option('hh_cookie_security') == 1) { | ||
| 588 | $value = get_option('hh_cookie_security_value', array()); | ||
| 589 | if (isset($value['HttpOnly'])) { | ||
| 590 | $lines[] = 'session.cookie_httponly = on'; | ||
| 591 | } | ||
| 592 | if (isset($value['Secure'])) { | ||
| 593 | $lines[] = 'session.cookie_secure = on'; | ||
| 594 | } | ||
| 595 | if (isset($value['SameSite']) && in_array($value['SameSite'], array('None', 'Lax', 'Strict'))) { | ||
| 596 | $lines[] = sprintf('session.cookie_samesite = "%s"', $value['SameSite']); | ||
| 597 | } | ||
| 598 | } | ||
| 599 | |||
| 600 | return $lines; | ||
| 601 | } | ||
| 602 | |||
| 603 | function http_headers() { | ||
| 604 | if (!is_php_mode()) { | ||
| 605 | return; | ||
| 606 | } | ||
| 607 | // PHP method below | ||
| 608 | list($headers, $statuses, $unset, $append) = get_http_headers(); | ||
| 609 | $isCors = false; | ||
| 610 | foreach ($headers as $key => $value) { | ||
| 611 | if ($key == 'Access-Control-Allow-Origin') { | ||
| 612 | if (isset($_SERVER['HTTP_ORIGIN'])) { | ||
| 613 | if (in_array($value, array('*', 'null'))) { | ||
| 614 | $isCors = true; | ||
| 615 | header(sprintf("%s: *", $key)); | ||
| 616 | } | ||
| 617 | |||
| 618 | if (is_array($value) && in_array($_SERVER['HTTP_ORIGIN'], $value)) { | ||
| 619 | $isCors = true; | ||
| 620 | header(sprintf("%s: %s", $key, $_SERVER['HTTP_ORIGIN'])); | ||
| 621 | header("Vary: Origin", false); | ||
| 622 | } | ||
| 623 | } | ||
| 624 | continue; | ||
| 625 | } | ||
| 626 | if (in_array($key, array('Access-Control-Allow-Headers', 'Access-Control-Allow-Methods', 'Access-Control-Allow-Credentials', 'Access-Control-Max-Age', 'Access-Control-Expose-Headers'))) { | ||
| 627 | if ($isCors) { | ||
| 628 | header(sprintf("%s: %s", $key, $value)); | ||
| 629 | } | ||
| 630 | continue; | ||
| 631 | } | ||
| 632 | header(sprintf("%s: %s", $key, $value)); | ||
| 633 | } | ||
| 634 | foreach ($append as $key => $value) { | ||
| 635 | header(sprintf("%s: %s", $key, $value), false); | ||
| 636 | } | ||
| 637 | foreach ($unset as $header) { | ||
| 638 | if (function_exists('header_remove')) { | ||
| 639 | header_remove($header); | ||
| 640 | } else { | ||
| 641 | header("$header:"); | ||
| 642 | } | ||
| 643 | } | ||
| 644 | foreach ($statuses as $key => $value) { | ||
| 645 | header(sprintf("%s %s", $key, $value)); | ||
| 646 | exit; | ||
| 647 | } | ||
| 648 | |||
| 649 | if (get_option('hh_www_authenticate') == 1) { | ||
| 650 | php_auth_digest(); | ||
| 651 | } | ||
| 652 | |||
| 653 | if (get_option('hh_content_encoding') == 1) { | ||
| 654 | php_content_encoding(); | ||
| 655 | } | ||
| 656 | } | ||
| 657 | |||
| 658 | function http_headers_admin_add_page() { | ||
| 659 | add_options_page('HTTP Headers', 'HTTP Headers', 'manage_options', 'http-headers', 'http_headers_admin_page'); | ||
| 660 | } | ||
| 661 | |||
| 662 | function http_headers_admin() { | ||
| 663 | register_setting('http-headers-mtd', 'hh_method'); | ||
| 664 | register_setting('http-headers-mtd', 'hh_htaccess_path'); | ||
| 665 | register_setting('http-headers-mtd', 'hh_user_ini_path'); | ||
| 666 | register_setting('http-headers-mtd', 'hh_htpasswd_path'); | ||
| 667 | register_setting('http-headers-mtd', 'hh_htdigest_path'); | ||
| 668 | register_setting('http-headers-xfo', 'hh_x_frame_options'); | ||
| 669 | register_setting('http-headers-xfo', 'hh_x_frame_options_value'); | ||
| 670 | register_setting('http-headers-xfo', 'hh_x_frame_options_domain'); | ||
| 671 | register_setting('http-headers-xss', 'hh_x_xxs_protection'); | ||
| 672 | register_setting('http-headers-xss', 'hh_x_xxs_protection_value'); | ||
| 673 | register_setting('http-headers-xss', 'hh_x_xxs_protection_uri'); | ||
| 674 | register_setting('http-headers-cto', 'hh_x_content_type_options'); | ||
| 675 | register_setting('http-headers-cto', 'hh_x_content_type_options_value'); | ||
| 676 | register_setting('http-headers-sts', 'hh_strict_transport_security'); | ||
| 677 | register_setting('http-headers-sts', 'hh_strict_transport_security_value'); //obsolete | ||
| 678 | register_setting('http-headers-sts', 'hh_strict_transport_security_max_age'); | ||
| 679 | register_setting('http-headers-sts', 'hh_strict_transport_security_sub_domains'); | ||
| 680 | register_setting('http-headers-sts', 'hh_strict_transport_security_preload'); | ||
| 681 | register_setting('http-headers-uac', 'hh_x_ua_compatible'); | ||
| 682 | register_setting('http-headers-uac', 'hh_x_ua_compatible_value'); | ||
| 683 | register_setting('http-headers-p3p', 'hh_p3p'); | ||
| 684 | register_setting('http-headers-p3p', 'hh_p3p_value'); | ||
| 685 | register_setting('http-headers-rp', 'hh_referrer_policy'); | ||
| 686 | register_setting('http-headers-rp', 'hh_referrer_policy_value'); | ||
| 687 | register_setting('http-headers-csp', 'hh_content_security_policy'); | ||
| 688 | register_setting('http-headers-csp', 'hh_content_security_policy_value'); | ||
| 689 | register_setting('http-headers-csp', 'hh_content_security_policy_report_only'); | ||
| 690 | register_setting('http-headers-acao', 'hh_access_control_allow_origin'); | ||
| 691 | register_setting('http-headers-acao', 'hh_access_control_allow_origin_value'); | ||
| 692 | register_setting('http-headers-acao', 'hh_access_control_allow_origin_url'); | ||
| 693 | register_setting('http-headers-acac', 'hh_access_control_allow_credentials'); | ||
| 694 | register_setting('http-headers-acac', 'hh_access_control_allow_credentials_value'); | ||
| 695 | register_setting('http-headers-acam', 'hh_access_control_allow_methods'); | ||
| 696 | register_setting('http-headers-acam', 'hh_access_control_allow_methods_value'); | ||
| 697 | register_setting('http-headers-acah', 'hh_access_control_allow_headers'); | ||
| 698 | register_setting('http-headers-acah', 'hh_access_control_allow_headers_value'); | ||
| 699 | register_setting('http-headers-acah', 'hh_access_control_allow_headers_custom'); | ||
| 700 | register_setting('http-headers-aceh', 'hh_access_control_expose_headers'); | ||
| 701 | register_setting('http-headers-aceh', 'hh_access_control_expose_headers_value'); | ||
| 702 | register_setting('http-headers-aceh', 'hh_access_control_expose_headers_custom'); | ||
| 703 | register_setting('http-headers-acma', 'hh_access_control_max_age'); | ||
| 704 | register_setting('http-headers-acma', 'hh_access_control_max_age_value'); | ||
| 705 | register_setting('http-headers-ce', 'hh_content_encoding'); | ||
| 706 | register_setting('http-headers-ce', 'hh_content_encoding_module'); | ||
| 707 | register_setting('http-headers-ce', 'hh_content_encoding_value'); | ||
| 708 | register_setting('http-headers-ce', 'hh_content_encoding_ext'); | ||
| 709 | register_setting('http-headers-vary', 'hh_vary'); | ||
| 710 | register_setting('http-headers-vary', 'hh_vary_value'); | ||
| 711 | register_setting('http-headers-xpb', 'hh_x_powered_by'); | ||
| 712 | register_setting('http-headers-xpb', 'hh_x_powered_by_option'); | ||
| 713 | register_setting('http-headers-xpb', 'hh_x_powered_by_value'); | ||
| 714 | register_setting('http-headers-wwa', 'hh_www_authenticate'); | ||
| 715 | register_setting('http-headers-wwa', 'hh_www_authenticate_type'); | ||
| 716 | register_setting('http-headers-wwa', 'hh_www_authenticate_realm'); | ||
| 717 | register_setting('http-headers-wwa', 'hh_www_authenticate_user'); | ||
| 718 | register_setting('http-headers-wwa', 'hh_www_authenticate_pswd'); | ||
| 719 | register_setting('http-headers-cc', 'hh_cache_control'); | ||
| 720 | register_setting('http-headers-cc', 'hh_cache_control_value'); | ||
| 721 | register_setting('http-headers-age', 'hh_age'); | ||
| 722 | register_setting('http-headers-age', 'hh_age_value'); | ||
| 723 | register_setting('http-headers-pra', 'hh_pragma'); | ||
| 724 | register_setting('http-headers-pra', 'hh_pragma_value'); | ||
| 725 | register_setting('http-headers-exp', 'hh_expires'); | ||
| 726 | register_setting('http-headers-exp', 'hh_expires_value'); | ||
| 727 | register_setting('http-headers-exp', 'hh_expires_type'); | ||
| 728 | register_setting('http-headers-con', 'hh_connection'); | ||
| 729 | register_setting('http-headers-con', 'hh_connection_value'); | ||
| 730 | register_setting('http-headers-cose', 'hh_cookie_security'); | ||
| 731 | register_setting('http-headers-cose', 'hh_cookie_security_value'); | ||
| 732 | register_setting('http-headers-ect', 'hh_expect_ct'); | ||
| 733 | register_setting('http-headers-ect', 'hh_expect_ct_max_age'); | ||
| 734 | register_setting('http-headers-ect', 'hh_expect_ct_report_uri'); | ||
| 735 | register_setting('http-headers-ect', 'hh_expect_ct_enforce'); | ||
| 736 | register_setting('http-headers-tao', 'hh_timing_allow_origin'); | ||
| 737 | register_setting('http-headers-tao', 'hh_timing_allow_origin_value'); | ||
| 738 | register_setting('http-headers-tao', 'hh_timing_allow_origin_url'); | ||
| 739 | register_setting('http-headers-che', 'hh_custom_headers'); | ||
| 740 | register_setting('http-headers-che', 'hh_custom_headers_value'); | ||
| 741 | register_setting('http-headers-xdo', 'hh_x_download_options'); | ||
| 742 | register_setting('http-headers-xdo', 'hh_x_download_options_value'); | ||
| 743 | register_setting('http-headers-xpcd', 'hh_x_permitted_cross_domain_policies'); | ||
| 744 | register_setting('http-headers-xpcd', 'hh_x_permitted_cross_domain_policies_value'); | ||
| 745 | register_setting('http-headers-xdpc', 'hh_x_dns_prefetch_control'); | ||
| 746 | register_setting('http-headers-xdpc', 'hh_x_dns_prefetch_control_value'); | ||
| 747 | register_setting('http-headers-rt', 'hh_report_to'); | ||
| 748 | register_setting('http-headers-rt', 'hh_report_to_value'); | ||
| 749 | register_setting('http-headers-fp', 'hh_feature_policy'); | ||
| 750 | register_setting('http-headers-fp', 'hh_feature_policy_value'); | ||
| 751 | register_setting('http-headers-fp', 'hh_feature_policy_feature'); | ||
| 752 | register_setting('http-headers-fp', 'hh_feature_policy_origin'); | ||
| 753 | register_setting('http-headers-pp', 'hh_permissions_policy'); | ||
| 754 | register_setting('http-headers-pp', 'hh_permissions_policy_value'); | ||
| 755 | register_setting('http-headers-pp', 'hh_permissions_policy_feature'); | ||
| 756 | register_setting('http-headers-pp', 'hh_permissions_policy_origin'); | ||
| 757 | register_setting('http-headers-csd', 'hh_clear_site_data'); | ||
| 758 | register_setting('http-headers-csd', 'hh_clear_site_data_value'); | ||
| 759 | register_setting('http-headers-cty', 'hh_content_type'); | ||
| 760 | register_setting('http-headers-cty', 'hh_content_type_value'); | ||
| 761 | register_setting('http-headers-corp', 'hh_cross_origin_resource_policy'); | ||
| 762 | register_setting('http-headers-corp', 'hh_cross_origin_resource_policy_value'); | ||
| 763 | register_setting('http-headers-nel', 'hh_nel'); | ||
| 764 | register_setting('http-headers-nel', 'hh_nel_value'); | ||
| 765 | register_setting('http-headers-coep', 'hh_cross_origin_embedder_policy'); | ||
| 766 | register_setting('http-headers-coep', 'hh_cross_origin_embedder_policy_value'); | ||
| 767 | register_setting('http-headers-coop', 'hh_cross_origin_opener_policy'); | ||
| 768 | register_setting('http-headers-coop', 'hh_cross_origin_opener_policy_value'); | ||
| 769 | register_setting('http-headers-rob', 'hh_x_robots_tag'); | ||
| 770 | register_setting('http-headers-rob', 'hh_x_robots_tag_value'); | ||
| 771 | } | ||
| 772 | |||
| 773 | function http_headers_option($option) { | ||
| 774 | |||
| 775 | include_once ABSPATH . 'wp-admin/includes/admin.php'; | ||
| 776 | |||
| 777 | require_once ABSPATH . WPINC . '/pluggable.php'; | ||
| 778 | |||
| 779 | if (isset($_POST['hh_method'])) | ||
| 780 | { | ||
| 781 | check_admin_referer('http-headers-mtd-options'); | ||
| 782 | # When method is changed | ||
| 783 | http_headers_activate(); | ||
| 784 | |||
| 785 | } elseif (is_apache_mode()) { | ||
| 786 | # When particular header is changed | ||
| 787 | switch (true) { | ||
| 788 | case array_key_exists('hh_www_authenticate', $_POST): | ||
| 789 | check_admin_referer('http-headers-wwa-options'); | ||
| 790 | update_auth_credentials(); | ||
| 791 | update_auth_directives(); | ||
| 792 | break; | ||
| 793 | case array_key_exists('hh_content_encoding', $_POST): | ||
| 794 | check_admin_referer('http-headers-ce-options'); | ||
| 795 | update_content_encoding_directives(); | ||
| 796 | break; | ||
| 797 | case array_key_exists('hh_content_type', $_POST): | ||
| 798 | check_admin_referer('http-headers-cty-options'); | ||
| 799 | update_content_type_directives(); | ||
| 800 | break; | ||
| 801 | case array_key_exists('hh_expires', $_POST): | ||
| 802 | check_admin_referer('http-headers-exp-options'); | ||
| 803 | update_expires_directives(); | ||
| 804 | break; | ||
| 805 | case array_key_exists('hh_cookie_security', $_POST): | ||
| 806 | check_admin_referer('http-headers-cose-options'); | ||
| 807 | update_cookie_security_directives(); | ||
| 808 | break; | ||
| 809 | case array_key_exists('hh_timing_allow_origin', $_POST): | ||
| 810 | check_admin_referer('http-headers-tao-options'); | ||
| 811 | update_timing_directives(); | ||
| 812 | break; | ||
| 813 | case array_key_exists('option_page', $_POST) && strpos($_POST['option_page'], 'http-headers-') === 0: | ||
| 814 | check_admin_referer($_POST['option_page'].'-options'); | ||
| 815 | update_headers_directives(); | ||
| 816 | break; | ||
| 817 | } | ||
| 818 | } | ||
| 819 | } | ||
| 820 | |||
| 821 | function nginx_headers_directives() { | ||
| 822 | $lines = array(); | ||
| 823 | list($headers, , $unset, $append) = get_http_headers(); | ||
| 824 | |||
| 825 | foreach ($unset as $header) { | ||
| 826 | $lines[] = sprintf(' more_clear_headers "%s";', $header); | ||
| 827 | } | ||
| 828 | $cors = $cors_header = $cors_inner = $cors_footer = array(); | ||
| 829 | $all = array(); | ||
| 830 | foreach ($headers as $key => $value) { | ||
| 831 | if (in_array($key, array('WWW-Authenticate'))) { | ||
| 832 | continue; | ||
| 833 | } | ||
| 834 | if (in_array($key, array('X-Content-Type-Options'))) { | ||
| 835 | $all[] = sprintf('add_header %s %s always;', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 836 | continue; | ||
| 837 | } | ||
| 838 | if ($key == 'Access-Control-Allow-Origin' && is_array($value)) { | ||
| 839 | $cors_header[] = sprintf('if ($http_origin ~* ^(%s)$) {', str_replace('.', '\.', join('|', $value))); | ||
| 840 | $cors_footer[] = '}'; | ||
| 841 | $cors_inner[] = ' add_header Access-Control-Allow-Origin "$http_origin";'; | ||
| 842 | if (!in_array('*', $value)) | ||
| 843 | { | ||
| 844 | $cors_inner[] = ' add_header Vary "Origin";'; | ||
| 845 | } | ||
| 846 | continue; | ||
| 847 | } | ||
| 848 | if (in_array($key, array('Access-Control-Allow-Headers', 'Access-Control-Allow-Methods', 'Access-Control-Allow-Credentials', 'Access-Control-Max-Age', 'Access-Control-Expose-Headers'))) { | ||
| 849 | $cors_inner[] = sprintf(' add_header %s %s;', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 850 | continue; | ||
| 851 | } | ||
| 852 | $lines[] = sprintf(' add_header %s %s;', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 853 | } | ||
| 854 | foreach ($append as $key => $value) { | ||
| 855 | $lines[] = sprintf(' add_header %s %s;', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 856 | } | ||
| 857 | if (!empty($cors_inner)) | ||
| 858 | { | ||
| 859 | $cors = array_merge( | ||
| 860 | $cors_header, | ||
| 861 | $cors_inner, | ||
| 862 | $cors_footer | ||
| 863 | ); | ||
| 864 | } | ||
| 865 | if (!empty($lines)) { | ||
| 866 | $lines = array_merge( | ||
| 867 | $all, | ||
| 868 | $cors, | ||
| 869 | array('location ~* \.(php|html)$ {'), | ||
| 870 | $lines, | ||
| 871 | array('}') | ||
| 872 | ); | ||
| 873 | } | ||
| 874 | return $lines; | ||
| 875 | } | ||
| 876 | |||
| 877 | function nginx_content_encoding_directives() { | ||
| 878 | $lines = array(); | ||
| 879 | if (get_option('hh_content_encoding') == 1) { | ||
| 880 | |||
| 881 | $lines[] = 'gzip on;'; | ||
| 882 | |||
| 883 | $content_encoding_value = get_option('hh_content_encoding_value'); | ||
| 884 | if (!$content_encoding_value) { | ||
| 885 | $content_encoding_value = array(); | ||
| 886 | } | ||
| 887 | |||
| 888 | $content_encoding_ext = get_option('hh_content_encoding_ext'); | ||
| 889 | if (!$content_encoding_ext) { | ||
| 890 | $content_encoding_ext = array(); | ||
| 891 | } | ||
| 892 | if (!empty($content_encoding_ext)) { | ||
| 893 | //$lines[] = sprintf('<FilesMatch "\.(%s)$">', join('|', array_keys($content_encoding_ext))); | ||
| 894 | } | ||
| 895 | if (!empty($content_encoding_value)) { | ||
| 896 | $lines[] = sprintf('gzip_types %s;', join(' ', array_keys($content_encoding_value))); | ||
| 897 | } | ||
| 898 | } | ||
| 899 | return $lines; | ||
| 900 | } | ||
| 901 | |||
| 902 | function nginx_content_type_directives() { | ||
| 903 | $lines = array(); | ||
| 904 | if (get_option('hh_content_type') == 1) { | ||
| 905 | $values = get_option('hh_content_type_value', array()); | ||
| 906 | foreach ($values as $ext => $media_type) { | ||
| 907 | $lines[] = sprintf("%s %s;", $media_type, $ext); | ||
| 908 | } | ||
| 909 | } | ||
| 910 | |||
| 911 | return $lines; | ||
| 912 | } | ||
| 913 | |||
| 914 | function nginx_expires_directives() { | ||
| 915 | $lines = array(); | ||
| 916 | if (get_option('hh_expires') == 1) { | ||
| 917 | |||
| 918 | $types = get_option('hh_expires_type', array()); | ||
| 919 | $values = get_option('hh_expires_value', array()); | ||
| 920 | |||
| 921 | $lines[] = 'map $sent_http_content_type $expires {'; | ||
| 922 | foreach (array_keys($types) as $type) { | ||
| 923 | list($base, $period, $suffix) = explode('_', $values[$type]); | ||
| 924 | if (in_array($base, array('access', 'modification'))) { | ||
| 925 | $lines[] = $type != 'default' | ||
| 926 | ? sprintf(' %s %u%s;', $type, $period, $suffix[0]) | ||
| 927 | : sprintf(' default %u%s;', $period, $suffix[0]); | ||
| 928 | } elseif ($base == 'invalid') { | ||
| 929 | $lines[] = $type != 'default' | ||
| 930 | ? sprintf(' %s 0;', $type) | ||
| 931 | : sprintf(' default 0;'); | ||
| 932 | } | ||
| 933 | } | ||
| 934 | $lines[] = '}'; | ||
| 935 | |||
| 936 | $lines[] = 'expires $expires;'; | ||
| 937 | } | ||
| 938 | return $lines; | ||
| 939 | } | ||
| 940 | |||
| 941 | function nginx_timing_directives() { | ||
| 942 | $lines = array(); | ||
| 943 | if (get_option('hh_timing_allow_origin') == 1) { | ||
| 944 | $value = get_option('hh_timing_allow_origin_value'); | ||
| 945 | switch ($value) | ||
| 946 | { | ||
| 947 | case 'origin': | ||
| 948 | $value = get_option('hh_timing_allow_origin_url'); | ||
| 949 | break; | ||
| 950 | } | ||
| 951 | if (!empty($value)) | ||
| 952 | { | ||
| 953 | $lines[] = 'location ~* \.(js|css|jpe?g|png|gif|eot|otf|svg|ttf|woff2?)$ {'; | ||
| 954 | $lines[] = sprintf(' add_header Timing-Allow-Origin "%s";', $value); | ||
| 955 | $lines[] = '}'; | ||
| 956 | } | ||
| 957 | } | ||
| 958 | return $lines; | ||
| 959 | } | ||
| 960 | |||
| 961 | function nginx_auth_directives() { | ||
| 962 | $lines = array(); | ||
| 963 | if (get_option('hh_www_authenticate') == 1) { | ||
| 964 | |||
| 965 | $type = get_option('hh_www_authenticate_type'); | ||
| 966 | |||
| 967 | $file = $type == 'Basic' ? get_htpasswd_filename() : get_htdigest_filename(); | ||
| 968 | |||
| 969 | $lines[] = sprintf('location ~ ^%s$ {', str_replace('.', '\.', basename($file))); | ||
| 970 | $lines[] = ' deny all;'; | ||
| 971 | $lines[] = '}'; | ||
| 972 | |||
| 973 | $lines[] = sprintf('location %s {', get_home_path()); | ||
| 974 | if ($type == 'Basic') { | ||
| 975 | $lines[] = sprintf(' auth_basic "%s";', get_option('hh_www_authenticate_realm')); | ||
| 976 | $lines[] = sprintf(' auth_basic_user_file %s;', $file); | ||
| 977 | } else { | ||
| 978 | $lines[] = sprintf(' auth_digest "%s";', get_option('hh_www_authenticate_realm')); | ||
| 979 | $lines[] = sprintf(' auth_digest_user_file %s;', $file); | ||
| 980 | } | ||
| 981 | $lines[] = '}'; | ||
| 982 | } | ||
| 983 | return $lines; | ||
| 984 | } | ||
| 985 | |||
| 986 | function nginx_auth_credentials() { | ||
| 987 | return apache_auth_credentials(); | ||
| 988 | } | ||
| 989 | |||
| 990 | function nginx_cookie_security_directives() { | ||
| 991 | $lines = array(); | ||
| 992 | |||
| 993 | //TODO | ||
| 994 | |||
| 995 | return $lines; | ||
| 996 | } | ||
| 997 | |||
| 998 | function nginx_check_requirements() { | ||
| 999 | //TODO scheduled for v2.0.0 | ||
| 1000 | return true; | ||
| 1001 | } | ||
| 1002 | |||
| 1003 | function iis_headers_directives() { | ||
| 1004 | //TODO scheduled for v2.0.0 | ||
| 1005 | } | ||
| 1006 | |||
| 1007 | function iis_content_encoding_directives() { | ||
| 1008 | //TODO scheduled for v2.0.0 | ||
| 1009 | } | ||
| 1010 | |||
| 1011 | function iis_content_type_directives() { | ||
| 1012 | //TODO scheduled for v2.0.0 | ||
| 1013 | } | ||
| 1014 | |||
| 1015 | function iis_expires_directives() { | ||
| 1016 | //TODO scheduled for v2.0.0 | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | function iis_timing_directives() { | ||
| 1020 | //TODO scheduled for v2.0.0 | ||
| 1021 | } | ||
| 1022 | |||
| 1023 | function iis_auth_directives() { | ||
| 1024 | //TODO scheduled for v2.0.0 | ||
| 1025 | } | ||
| 1026 | |||
| 1027 | function iis_auth_credentials() { | ||
| 1028 | //TODO scheduled for v2.0.0 | ||
| 1029 | } | ||
| 1030 | |||
| 1031 | function iis_cookie_security_directives() { | ||
| 1032 | //TODO scheduled for v2.0.0 | ||
| 1033 | } | ||
| 1034 | |||
| 1035 | function iis_check_requirements() { | ||
| 1036 | //TODO scheduled for v2.0.0 | ||
| 1037 | return true; | ||
| 1038 | } | ||
| 1039 | |||
| 1040 | function apache_headers_directives() { | ||
| 1041 | $lines = array(); | ||
| 1042 | list($headers, , $unset, $append) = get_http_headers(); | ||
| 1043 | |||
| 1044 | foreach ($unset as $header) { | ||
| 1045 | $lines[] = sprintf(' Header always unset %s', $header); | ||
| 1046 | $lines[] = sprintf(' Header unset %s', $header); | ||
| 1047 | } | ||
| 1048 | $all = array(); | ||
| 1049 | foreach ($headers as $key => $value) { | ||
| 1050 | if (in_array($key, array('WWW-Authenticate'))) { | ||
| 1051 | continue; | ||
| 1052 | } | ||
| 1053 | if (in_array($key, array('X-Content-Type-Options'))) { | ||
| 1054 | $all[] = sprintf(' Header always set %s %s', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 1055 | continue; | ||
| 1056 | } | ||
| 1057 | if ($key == 'Strict-Transport-Security') { | ||
| 1058 | $lines[] = sprintf(' Header set %s %s env=HTTPS', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 1059 | continue; | ||
| 1060 | } | ||
| 1061 | if ($key == 'Access-Control-Allow-Origin') { | ||
| 1062 | $all[] = ' <IfModule mod_setenvif.c>'; | ||
| 1063 | if (!is_array($value)) { | ||
| 1064 | if ($value) { | ||
| 1065 | $value = array($value); | ||
| 1066 | } else { | ||
| 1067 | $value = array(); | ||
| 1068 | } | ||
| 1069 | } | ||
| 1070 | //$value[] = 'null'; | ||
| 1071 | if (is_array($value)) | ||
| 1072 | { | ||
| 1073 | $all[] = sprintf(' SetEnvIf Origin "^(%s)$" CORS=$0', str_replace(array('.', '*'), array('\.', '.+'), join('|', $value))); | ||
| 1074 | } else { | ||
| 1075 | $all[] = ' SetEnvIf Origin "^(.+)$" CORS=$0'; | ||
| 1076 | } | ||
| 1077 | $all[] = ' </IfModule>'; | ||
| 1078 | $all[] = ' Header set Access-Control-Allow-Origin %{CORS}e env=CORS'; | ||
| 1079 | if (!in_array('*', $value)) | ||
| 1080 | { | ||
| 1081 | $all[] = ' Header append Vary "Origin" env=CORS'; | ||
| 1082 | } | ||
| 1083 | continue; | ||
| 1084 | } | ||
| 1085 | if (in_array($key, array('Access-Control-Allow-Headers', 'Access-Control-Allow-Methods', 'Access-Control-Allow-Credentials', 'Access-Control-Max-Age', 'Access-Control-Expose-Headers'))) { | ||
| 1086 | $all[] = sprintf(' Header set %s %s env=CORS', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 1087 | continue; | ||
| 1088 | } | ||
| 1089 | $lines[] = sprintf(' Header set %s %s', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 1090 | } | ||
| 1091 | foreach ($append as $key => $value) { | ||
| 1092 | $lines[] = sprintf(' Header append %s %s', $key, sprintf('%1$s%2$s%1$s', strpos($value, '"') === false ? '"' : "'", $value)); | ||
| 1093 | } | ||
| 1094 | if (!empty($lines) || !empty($all)) { | ||
| 1095 | $lines = array_merge( | ||
| 1096 | array('<IfModule mod_headers.c>'), | ||
| 1097 | $all, | ||
| 1098 | array(' <FilesMatch "\.(php|html)$">'), | ||
| 1099 | $lines, | ||
| 1100 | array(' </FilesMatch>', '</IfModule>') | ||
| 1101 | ); | ||
| 1102 | } | ||
| 1103 | return $lines; | ||
| 1104 | } | ||
| 1105 | |||
| 1106 | function apache_content_encoding_directives() { | ||
| 1107 | $lines = array(); | ||
| 1108 | if (get_option('hh_content_encoding') == 1) { | ||
| 1109 | |||
| 1110 | $content_encoding_module = get_option('hh_content_encoding_module'); | ||
| 1111 | |||
| 1112 | $module = 'mod_deflate.c'; | ||
| 1113 | $filter = 'DEFLATE'; | ||
| 1114 | $accept_encoding = 'gzip'; | ||
| 1115 | |||
| 1116 | if ($content_encoding_module == 'brotli') { | ||
| 1117 | $module = 'mod_brotli.c'; | ||
| 1118 | $filter = 'BROTLI_COMPRESS'; | ||
| 1119 | $accept_encoding = 'br'; | ||
| 1120 | } | ||
| 1121 | |||
| 1122 | $content_encoding_value = get_option('hh_content_encoding_value'); | ||
| 1123 | if (!$content_encoding_value) { | ||
| 1124 | $content_encoding_value = array(); | ||
| 1125 | } | ||
| 1126 | |||
| 1127 | $content_encoding_ext = get_option('hh_content_encoding_ext'); | ||
| 1128 | if (!$content_encoding_ext) { | ||
| 1129 | $content_encoding_ext = array(); | ||
| 1130 | } | ||
| 1131 | |||
| 1132 | $type = join('|', array_keys($content_encoding_value)); | ||
| 1133 | $ext = join('|', array_keys($content_encoding_ext)); | ||
| 1134 | |||
| 1135 | if (!empty($type) && !empty($ext)) { | ||
| 1136 | $expression = sprintf('(%%{CONTENT_TYPE} =~ m#^(%1$s)# || %%{REQUEST_FILENAME} =~ /.(%2$s)$/)', $type, $ext); | ||
| 1137 | } elseif (!empty($type)) { | ||
| 1138 | $expression = sprintf('%%{CONTENT_TYPE} =~ m#^(%1$s)#', $type); | ||
| 1139 | } elseif (!empty($ext)) { | ||
| 1140 | $expression = sprintf('%%{REQUEST_FILENAME} =~ /.(%1$s)$/', $ext); | ||
| 1141 | } | ||
| 1142 | |||
| 1143 | if (isset($expression)) { | ||
| 1144 | $lines[] = '<IfModule mod_filter.c>'; | ||
| 1145 | $lines[] = ' FilterDeclare HttpHeaders'; | ||
| 1146 | if (in_array($content_encoding_module, array('brotli', 'deflate'))) { | ||
| 1147 | $lines[] = sprintf('<IfModule %s>', $module); | ||
| 1148 | $lines[] = sprintf(' FilterProvider HttpHeaders %1$s "%%{HTTP:Accept-Encoding} =~ /%2$s/ && %3$s"', $filter, $accept_encoding, $expression); | ||
| 1149 | $lines[] = ' </IfModule>'; | ||
| 1150 | } else { | ||
| 1151 | $lines[] = ' <IfModule mod_deflate.c>'; | ||
| 1152 | $lines[] = ' <IfModule !mod_brotli.c>'; | ||
| 1153 | $lines[] = sprintf(' FilterProvider HttpHeaders DEFLATE "%%{HTTP:Accept-Encoding} =~ /gzip/ && %1$s"', $expression); | ||
| 1154 | $lines[] = ' </IfModule>'; | ||
| 1155 | $lines[] = ' </IfModule>'; | ||
| 1156 | $lines[] = ' <IfModule mod_brotli.c>'; | ||
| 1157 | $lines[] = sprintf(' FilterProvider HttpHeaders BROTLI_COMPRESS "%%{HTTP:Accept-Encoding} =~ /br/ && %1$s"', $expression); | ||
| 1158 | $lines[] = ' </IfModule>'; | ||
| 1159 | } | ||
| 1160 | $lines[] = ' FilterChain HttpHeaders'; | ||
| 1161 | $lines[] = '</IfModule>'; | ||
| 1162 | } | ||
| 1163 | } | ||
| 1164 | |||
| 1165 | return $lines; | ||
| 1166 | } | ||
| 1167 | |||
| 1168 | function apache_expires_directives() { | ||
| 1169 | $lines = array(); | ||
| 1170 | if (get_option('hh_expires') == 1) { | ||
| 1171 | |||
| 1172 | $types = get_option('hh_expires_type', array()); | ||
| 1173 | $values = get_option('hh_expires_value', array()); | ||
| 1174 | |||
| 1175 | $lines[] = '<IfModule mod_expires.c>'; | ||
| 1176 | $lines[] = ' ExpiresActive On'; | ||
| 1177 | foreach (array_keys($types) as $type) { | ||
| 1178 | list($base, $period, $suffix) = explode('_', $values[$type]); | ||
| 1179 | if (in_array($base, array('access', 'modification'))) { | ||
| 1180 | $lines[] = $type != 'default' | ||
| 1181 | ? sprintf(' ExpiresByType %s "%s plus %u %s"', $type, $base, $period, $suffix) | ||
| 1182 | : sprintf(' ExpiresDefault "%s plus %u %s"', $base, $period, $suffix); | ||
| 1183 | } elseif ($base == 'invalid') { | ||
| 1184 | $lines[] = $type != 'default' | ||
| 1185 | ? sprintf(' ExpiresByType %s A0', $type) | ||
| 1186 | : sprintf(' ExpiresDefault A0'); | ||
| 1187 | } | ||
| 1188 | } | ||
| 1189 | $lines[] = '</IfModule>'; | ||
| 1190 | } | ||
| 1191 | |||
| 1192 | return $lines; | ||
| 1193 | } | ||
| 1194 | |||
| 1195 | function apache_content_type_directives() { | ||
| 1196 | $lines = array(); | ||
| 1197 | if (get_option('hh_content_type') == 1) { | ||
| 1198 | $values = get_option('hh_content_type_value', array()); | ||
| 1199 | $lines[] = '<IfModule mod_mime.c>'; | ||
| 1200 | foreach ($values as $ext => $media_type) { | ||
| 1201 | $lines[] = sprintf(" AddType %s .%s", $media_type, $ext); | ||
| 1202 | } | ||
| 1203 | $lines[] = '</IfModule>'; | ||
| 1204 | } | ||
| 1205 | |||
| 1206 | return $lines; | ||
| 1207 | } | ||
| 1208 | |||
| 1209 | function apache_timing_directives() { | ||
| 1210 | $lines = array(); | ||
| 1211 | if (get_option('hh_timing_allow_origin') == 1) { | ||
| 1212 | $value = get_option('hh_timing_allow_origin_value'); | ||
| 1213 | switch ($value) | ||
| 1214 | { | ||
| 1215 | case 'origin': | ||
| 1216 | $value = get_option('hh_timing_allow_origin_url'); | ||
| 1217 | break; | ||
| 1218 | } | ||
| 1219 | if (!empty($value)) | ||
| 1220 | { | ||
| 1221 | $lines[] = '<IfModule mod_headers.c>'; | ||
| 1222 | $lines[] = ' <FilesMatch "\\.(js|css|jpe?g|png|gif|eot|otf|svg|ttf|woff2?)$">'; | ||
| 1223 | $lines[] = sprintf(' Header set Timing-Allow-Origin "%s"', $value); | ||
| 1224 | $lines[] = ' </FilesMatch>'; | ||
| 1225 | $lines[] = '</IfModule>'; | ||
| 1226 | } | ||
| 1227 | } | ||
| 1228 | |||
| 1229 | return $lines; | ||
| 1230 | } | ||
| 1231 | |||
| 1232 | function apache_auth_directives() { | ||
| 1233 | $lines = array(); | ||
| 1234 | if (get_option('hh_www_authenticate') == 1) { | ||
| 1235 | |||
| 1236 | $type = get_option('hh_www_authenticate_type'); | ||
| 1237 | |||
| 1238 | $file = $type == 'Basic' ? get_htpasswd_filename() : get_htdigest_filename(); | ||
| 1239 | |||
| 1240 | $lines[] = sprintf('<FilesMatch "^%s$">', str_replace('.', '\.', basename($file))); | ||
| 1241 | $lines[] = ' <IfModule mod_authz_core.c>'; | ||
| 1242 | $lines[] = ' Require all denied'; | ||
| 1243 | $lines[] = ' </IfModule>'; | ||
| 1244 | $lines[] = ' <IfModule !mod_authz_core.c>'; | ||
| 1245 | $lines[] = ' Order deny,allow'; | ||
| 1246 | $lines[] = ' Deny from all'; | ||
| 1247 | $lines[] = ' </IfModule>'; | ||
| 1248 | $lines[] = '</FilesMatch>'; | ||
| 1249 | // no empty AuthName | ||
| 1250 | $realm = get_option('hh_www_authenticate_realm'); // AuthName | ||
| 1251 | $realm = ($realm == '') ? 'restricted area':$realm; // Empty => give fixed value | ||
| 1252 | |||
| 1253 | $lines[] = sprintf('<IfModule mod_auth_%s.c>', strtolower($type)); | ||
| 1254 | $lines[] = sprintf(' AuthType %s', get_option('hh_www_authenticate_type')); | ||
| 1255 | $lines[] = sprintf(' AuthName "%s"', $realm); | ||
| 1256 | $lines[] = sprintf(' AuthUserFile "%s"', $file); | ||
| 1257 | $lines[] = ' Require valid-user'; | ||
| 1258 | $lines[] = '</IfModule>'; | ||
| 1259 | } | ||
| 1260 | |||
| 1261 | return $lines; | ||
| 1262 | } | ||
| 1263 | |||
| 1264 | function apache_auth_credentials() { | ||
| 1265 | if (get_option('hh_www_authenticate') == 1) { | ||
| 1266 | $type = get_option('hh_www_authenticate_type'); | ||
| 1267 | $usernames = get_option('hh_www_authenticate_user', array()); | ||
| 1268 | $passwords = get_option('hh_www_authenticate_pswd', array()); | ||
| 1269 | if (!is_array($usernames)) { | ||
| 1270 | $usernames = array($usernames); | ||
| 1271 | } | ||
| 1272 | if (!is_array($passwords)) { | ||
| 1273 | $passwords = array($passwords); | ||
| 1274 | } | ||
| 1275 | $realm = get_option('hh_www_authenticate_realm'); | ||
| 1276 | $auth = array(); | ||
| 1277 | switch ($type) { | ||
| 1278 | case 'Basic': | ||
| 1279 | $ht_file = get_htpasswd_filename(); | ||
| 1280 | foreach ($usernames as $k => $user) { | ||
| 1281 | $auth[] = sprintf('%s:{SHA}%s', $user, base64_encode(sha1($passwords[$k], true))); | ||
| 1282 | } | ||
| 1283 | break; | ||
| 1284 | case 'Digest': | ||
| 1285 | $ht_file = get_htdigest_filename(); | ||
| 1286 | foreach ($usernames as $k => $user) { | ||
| 1287 | $auth[] = sprintf('%s:%s:%s', $user, $realm, md5($user.':'.$realm.':'.$passwords[$k])); | ||
| 1288 | } | ||
| 1289 | break; | ||
| 1290 | } | ||
| 1291 | $auth = join("\n", $auth); | ||
| 1292 | |||
| 1293 | return compact('ht_file', 'auth'); | ||
| 1294 | } | ||
| 1295 | return false; | ||
| 1296 | } | ||
| 1297 | |||
| 1298 | function apache_cookie_security_directives() { | ||
| 1299 | $lines = array(); | ||
| 1300 | if (get_option('hh_cookie_security') == 1) { | ||
| 1301 | $value = get_option('hh_cookie_security_value', array()); | ||
| 1302 | $str = ''; | ||
| 1303 | if (isset($value['HttpOnly'])) { | ||
| 1304 | $str .= ';HttpOnly'; | ||
| 1305 | } | ||
| 1306 | if (isset($value['Secure'])) { | ||
| 1307 | $str .= ';Secure'; | ||
| 1308 | } | ||
| 1309 | if (isset($value['SameSite']) && in_array($value['SameSite'], array('None', 'Lax', 'Strict'))) { | ||
| 1310 | $str .= ';SameSite=' . $value['SameSite']; | ||
| 1311 | } | ||
| 1312 | if ($str) { | ||
| 1313 | $lines[] = '<IfModule mod_headers.c>'; | ||
| 1314 | $lines[] = ' Header always edit Set-Cookie (.*) "$1'.$str.'"'; | ||
| 1315 | $lines[] = '</IfModule>'; | ||
| 1316 | } | ||
| 1317 | } | ||
| 1318 | |||
| 1319 | return $lines; | ||
| 1320 | } | ||
| 1321 | |||
| 1322 | function apache_check_requirements() { | ||
| 1323 | return check_filename(get_htaccess_filename()); | ||
| 1324 | } | ||
| 1325 | |||
| 1326 | function update_headers_directives() { | ||
| 1327 | $result = false; | ||
| 1328 | if (is_apache_mode()) { | ||
| 1329 | $lines = apache_headers_directives(); | ||
| 1330 | $result = insert_with_markers(get_htaccess_filename(), "HttpHeaders", $lines); | ||
| 1331 | } | ||
| 1332 | |||
| 1333 | return $result; | ||
| 1334 | } | ||
| 1335 | |||
| 1336 | function update_content_encoding_directives() { | ||
| 1337 | $lines = array(); | ||
| 1338 | if (is_apache_mode()) { | ||
| 1339 | $lines = apache_content_encoding_directives(); | ||
| 1340 | } | ||
| 1341 | |||
| 1342 | return insert_with_markers(get_htaccess_filename(), "HttpHeadersCompression", $lines); | ||
| 1343 | } | ||
| 1344 | |||
| 1345 | function update_expires_directives() { | ||
| 1346 | $lines = array(); | ||
| 1347 | if (is_apache_mode()) { | ||
| 1348 | $lines = apache_expires_directives(); | ||
| 1349 | } | ||
| 1350 | |||
| 1351 | return insert_with_markers(get_htaccess_filename(), "HttpHeadersExpires", $lines); | ||
| 1352 | } | ||
| 1353 | |||
| 1354 | function update_content_type_directives() { | ||
| 1355 | $lines = array(); | ||
| 1356 | if (is_apache_mode()) { | ||
| 1357 | $lines = apache_content_type_directives(); | ||
| 1358 | } | ||
| 1359 | |||
| 1360 | return insert_with_markers(get_htaccess_filename(), "HttpHeadersContentType", $lines); | ||
| 1361 | } | ||
| 1362 | |||
| 1363 | function update_timing_directives() { | ||
| 1364 | $lines = array(); | ||
| 1365 | if (is_apache_mode()) { | ||
| 1366 | $lines = apache_timing_directives(); | ||
| 1367 | } | ||
| 1368 | |||
| 1369 | return insert_with_markers(get_htaccess_filename(), "HttpHeadersTiming", $lines); | ||
| 1370 | } | ||
| 1371 | |||
| 1372 | function update_auth_directives() { | ||
| 1373 | $lines = array(); | ||
| 1374 | if (is_apache_mode()) { | ||
| 1375 | $lines = apache_auth_directives(); | ||
| 1376 | } | ||
| 1377 | |||
| 1378 | return insert_with_markers(get_htaccess_filename(), "HttpHeadersAuth", $lines); | ||
| 1379 | } | ||
| 1380 | |||
| 1381 | function update_auth_credentials() { | ||
| 1382 | if (is_apache_mode()) { | ||
| 1383 | $credentials = apache_auth_credentials(); | ||
| 1384 | if (isset($credentials['ht_file']) && !empty($credentials['ht_file'])) | ||
| 1385 | { | ||
| 1386 | return @file_put_contents($credentials['ht_file'], $credentials['auth'], LOCK_EX); | ||
| 1387 | } | ||
| 1388 | } | ||
| 1389 | |||
| 1390 | return false; | ||
| 1391 | } | ||
| 1392 | |||
| 1393 | function update_cookie_security_directives() { | ||
| 1394 | $lines = array(); | ||
| 1395 | $is_apache = is_apache_mode(); | ||
| 1396 | $htaccess = get_htaccess_filename(); | ||
| 1397 | $is_cgi = strpos(PHP_SAPI, 'cgi') !== false; | ||
| 1398 | if ($is_cgi) { | ||
| 1399 | $filename = get_user_ini_filename(); | ||
| 1400 | $lines = php_cookie_security_directives(); | ||
| 1401 | } elseif ($is_apache) { | ||
| 1402 | $filename = $htaccess; | ||
| 1403 | $lines = apache_cookie_security_directives(); | ||
| 1404 | } | ||
| 1405 | |||
| 1406 | if (!$is_apache) { | ||
| 1407 | insert_with_markers($htaccess, "HttpHeadersCookieSecurity", array()); | ||
| 1408 | } | ||
| 1409 | |||
| 1410 | if ($is_cgi) { | ||
| 1411 | return update_user_ini_filename($filename, "HttpHeadersCookieSecurity", $lines); | ||
| 1412 | } | ||
| 1413 | |||
| 1414 | return insert_with_markers($filename, "HttpHeadersCookieSecurity", $lines); | ||
| 1415 | } | ||
| 1416 | |||
| 1417 | function update_user_ini_filename($filename, $marker, $insertion) { | ||
| 1418 | if (!is_array($insertion)) { | ||
| 1419 | $insertion = explode("\n", $insertion); | ||
| 1420 | } | ||
| 1421 | |||
| 1422 | $start_marker = "; BEGIN " . $marker; | ||
| 1423 | $end_marker = "; END " . $marker; | ||
| 1424 | |||
| 1425 | $data = ""; | ||
| 1426 | if (is_file($filename)) { | ||
| 1427 | $data = @file_get_contents($filename); | ||
| 1428 | } | ||
| 1429 | |||
| 1430 | $string = $start_marker; | ||
| 1431 | if ($insertion) | ||
| 1432 | { | ||
| 1433 | $string .= "\n".join("\n", $insertion); | ||
| 1434 | } | ||
| 1435 | $string .= "\n".$end_marker; | ||
| 1436 | |||
| 1437 | $pattern = '/'.$start_marker.'.*'.$end_marker.'/isU'; | ||
| 1438 | |||
| 1439 | if (preg_match($pattern, $data)) { | ||
| 1440 | $data = preg_replace($pattern, $string, $data); | ||
| 1441 | } else { | ||
| 1442 | $data .= "\n".$string; | ||
| 1443 | } | ||
| 1444 | |||
| 1445 | $bytes = @file_put_contents($filename, $data, LOCK_EX); | ||
| 1446 | |||
| 1447 | return !!$bytes; | ||
| 1448 | } | ||
| 1449 | |||
| 1450 | function is_php_mode() { | ||
| 1451 | return get_option('hh_method') == 'php'; | ||
| 1452 | } | ||
| 1453 | |||
| 1454 | function is_apache_mode() { | ||
| 1455 | return get_option('hh_method') == 'htaccess'; | ||
| 1456 | } | ||
| 1457 | |||
| 1458 | function is_samesite_supported() { | ||
| 1459 | return version_compare(PHP_VERSION, '7.3.0', '>='); | ||
| 1460 | } | ||
| 1461 | |||
| 1462 | function http_headers_text_domain() { | ||
| 1463 | load_plugin_textdomain('http-headers', false, basename( dirname( __FILE__ ) ) . '/languages/'); | ||
| 1464 | } | ||
| 1465 | |||
| 1466 | function http_headers_settings_link( $links ) { | ||
| 1467 | $url = get_admin_url() . 'options-general.php?page=http-headers'; | ||
| 1468 | $settings_link = '<a href="' . $url . '">' . __('Settings', 'http-headers') . '</a>'; | ||
| 1469 | array_unshift( $links, $settings_link ); | ||
| 1470 | return $links; | ||
| 1471 | } | ||
| 1472 | |||
| 1473 | function http_headers_after_setup_theme() { | ||
| 1474 | add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'http_headers_settings_link'); | ||
| 1475 | } | ||
| 1476 | |||
| 1477 | function http_headers_enqueue($hook) { | ||
| 1478 | if ( 'http-headers.php' != $hook ) { | ||
| 1479 | # FIXME | ||
| 1480 | //return; | ||
| 1481 | } | ||
| 1482 | |||
| 1483 | wp_enqueue_script('http_headers_admin_scripts', plugin_dir_url( __FILE__ ) . 'assets/scripts.js', array(), '1.16.1', true); | ||
| 1484 | wp_localize_script('http_headers_admin_scripts', 'hh', array( | ||
| 1485 | 'lbl_delete' => __('Delete', 'http-headers'), | ||
| 1486 | 'lbl_value' => __('Value', 'http-headers'), | ||
| 1487 | 'lbl_remove_endpoint' => __('Remove endpoint', 'http-headers'), | ||
| 1488 | 'lbl_remove_group' => __('Remove group', 'http-headers'), | ||
| 1489 | )); | ||
| 1490 | wp_enqueue_style('http_headers_admin_styles', plugin_dir_url( __FILE__ ) . 'assets/styles.css', array(), '1.16.1'); | ||
| 1491 | } | ||
| 1492 | |||
| 1493 | function http_headers_ajax_inspect() { | ||
| 1494 | check_ajax_referer('inspect'); | ||
| 1495 | if (current_user_can('manage_options')) { | ||
| 1496 | include 'views/ajax-inspect.php'; | ||
| 1497 | } | ||
| 1498 | wp_die(); | ||
| 1499 | } | ||
| 1500 | |||
| 1501 | function http_headers_post_import() { | ||
| 1502 | check_admin_referer('import'); | ||
| 1503 | global $wpdb; | ||
| 1504 | if (!(isset($_FILES['file']['tmp_name']) | ||
| 1505 | && is_uploaded_file($_FILES['file']['tmp_name']) | ||
| 1506 | && $_FILES['file']['error'] == UPLOAD_ERR_OK | ||
| 1507 | )) { | ||
| 1508 | wp_redirect(sprintf("%soptions-general.php?page=http-headers&tab=advanced&status=ERR&code=100", get_admin_url())); | ||
| 1509 | exit; | ||
| 1510 | } | ||
| 1511 | |||
| 1512 | $string = @file_get_contents($_FILES['file']['tmp_name']); | ||
| 1513 | if ($string === false) { | ||
| 1514 | wp_redirect(sprintf("%soptions-general.php?page=http-headers&tab=advanced&status=ERR&code=101", get_admin_url())); | ||
| 1515 | exit; | ||
| 1516 | } | ||
| 1517 | |||
| 1518 | $arr = preg_split('/;(\s+)?\n/', $string); | ||
| 1519 | foreach ($arr as $statement) { | ||
| 1520 | $statement = preg_replace("/(INSERT\s*INTO\s*)[\w\_]+options/", '${1}'.$wpdb->options, $statement); | ||
| 1521 | $wpdb->query($statement); | ||
| 1522 | } | ||
| 1523 | |||
| 1524 | wp_redirect(sprintf("%soptions-general.php?page=http-headers&tab=advanced&status=OK", get_admin_url())); | ||
| 1525 | exit; | ||
| 1526 | } | ||
| 1527 | |||
| 1528 | function http_headers_post_export() { | ||
| 1529 | check_admin_referer('export'); | ||
| 1530 | global $wpdb; | ||
| 1531 | $options = include dirname(__FILE__) . '/views/includes/options.inc.php'; | ||
| 1532 | $opts = array(); | ||
| 1533 | foreach ($options as $option) | ||
| 1534 | { | ||
| 1535 | $opts[] = $option[0]; | ||
| 1536 | } | ||
| 1537 | $statement = sprintf("SELECT * FROM %s WHERE option_name IN ('%s');", $wpdb->options, join("','", $opts)); | ||
| 1538 | $results = $wpdb->get_results($statement, ARRAY_A); | ||
| 1539 | $sql = array(); | ||
| 1540 | |||
| 1541 | $indexes = array(); | ||
| 1542 | foreach ($options as $option) | ||
| 1543 | { | ||
| 1544 | foreach ($results as $item) | ||
| 1545 | { | ||
| 1546 | if ($item['option_name'] == $option[0]) | ||
| 1547 | { | ||
| 1548 | $indexes[$option[0]] = 1; | ||
| 1549 | |||
| 1550 | $value = str_replace("'", "''", $item['option_value']); | ||
| 1551 | $query = array(); | ||
| 1552 | $query[] = sprintf("INSERT INTO %s (option_id, option_name, option_value, autoload)", $wpdb->options); | ||
| 1553 | $query[] = sprintf("VALUES (NULL, '%s', '%s', '%s')", $item['option_name'], $value, $item['autoload']); | ||
| 1554 | $query[] = sprintf("ON DUPLICATE KEY UPDATE option_value = '%s', autoload = '%s';", $value, $item['autoload']); | ||
| 1555 | $sql[] = join("\n", $query); | ||
| 1556 | break; | ||
| 1557 | } | ||
| 1558 | } | ||
| 1559 | |||
| 1560 | if (!isset($indexes[$option[0]])) | ||
| 1561 | { | ||
| 1562 | $query = array(); | ||
| 1563 | $query[] = sprintf("INSERT INTO %s (option_id, option_name, option_value, autoload)", $wpdb->options); | ||
| 1564 | $query[] = sprintf("VALUES (NULL, '%s', '%s', 'yes')", $option[0], $option[1]); | ||
| 1565 | $query[] = sprintf("ON DUPLICATE KEY UPDATE option_value = '%s', autoload = 'yes';", $option[1]); | ||
| 1566 | $sql[] = join("\n", $query); | ||
| 1567 | } | ||
| 1568 | } | ||
| 1569 | |||
| 1570 | $sql = join("\n\n", $sql); | ||
| 1571 | $length = function_exists('mb_strlen') ? mb_strlen($sql) : strlen($sql); | ||
| 1572 | $name = sprintf('WP-HTTP-Headers-%u.sql', time()); | ||
| 1573 | |||
| 1574 | # Send headers | ||
| 1575 | header('Pragma: public'); | ||
| 1576 | header('Expires: 0'); | ||
| 1577 | header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); | ||
| 1578 | header('Cache-Control: private', false); | ||
| 1579 | header('Content-Transfer-Encoding: binary'); | ||
| 1580 | header('Content-Disposition: attachment; filename="'.$name.'";'); | ||
| 1581 | header('Content-Type: application/sql'); | ||
| 1582 | header('Content-Length: ' . $length); | ||
| 1583 | |||
| 1584 | echo $sql; | ||
| 1585 | exit; | ||
| 1586 | } | ||
| 1587 | |||
| 1588 | function check_filename($filename) { | ||
| 1589 | if (!is_file($filename)) { | ||
| 1590 | return -1; | ||
| 1591 | } | ||
| 1592 | |||
| 1593 | clearstatcache(); | ||
| 1594 | if (!is_writable($filename)) { | ||
| 1595 | return -2; | ||
| 1596 | } | ||
| 1597 | |||
| 1598 | return true; | ||
| 1599 | } | ||
| 1600 | |||
| 1601 | function get_web_server_filename() { | ||
| 1602 | if (is_apache_mode()) { | ||
| 1603 | return get_htaccess_filename(); | ||
| 1604 | } | ||
| 1605 | |||
| 1606 | return NULL; | ||
| 1607 | } | ||
| 1608 | |||
| 1609 | function check_web_server_requirements() { | ||
| 1610 | if (is_apache_mode()) { | ||
| 1611 | return apache_check_requirements(); | ||
| 1612 | } | ||
| 1613 | |||
| 1614 | return true; | ||
| 1615 | } | ||
| 1616 | |||
| 1617 | function check_php_requirements() { | ||
| 1618 | if (strpos(PHP_SAPI, 'cgi') !== false) { | ||
| 1619 | // cgi, cgi-fcgi, fpm-fcgi | ||
| 1620 | return check_filename(get_user_ini_filename()); | ||
| 1621 | } | ||
| 1622 | |||
| 1623 | return true; | ||
| 1624 | } | ||
| 1625 | |||
| 1626 | function http_headers_logout() { | ||
| 1627 | if (get_option('hh_clear_site_data') == 1) { | ||
| 1628 | $values = get_option('hh_clear_site_data_value', array()); | ||
| 1629 | $tmp = array_keys($values); | ||
| 1630 | if ($tmp) { | ||
| 1631 | header(sprintf('Clear-Site-Data: "%s"', join('", "', $tmp))); | ||
| 1632 | } | ||
| 1633 | } | ||
| 1634 | } | ||
| 1635 | |||
| 1636 | function http_headers_activate() { | ||
| 1637 | update_headers_directives(); | ||
| 1638 | update_auth_credentials(); | ||
| 1639 | update_auth_directives(); | ||
| 1640 | update_content_encoding_directives(); | ||
| 1641 | update_content_type_directives(); | ||
| 1642 | update_expires_directives(); | ||
| 1643 | update_cookie_security_directives(); | ||
| 1644 | update_timing_directives(); | ||
| 1645 | } | ||
| 1646 | |||
| 1647 | function http_headers_deactivate() { | ||
| 1648 | $filename = get_htaccess_filename(); | ||
| 1649 | |||
| 1650 | insert_with_markers($filename, "HttpHeaders", array()); | ||
| 1651 | insert_with_markers($filename, "HttpHeadersCompression", array()); | ||
| 1652 | insert_with_markers($filename, "HttpHeadersContentType", array()); | ||
| 1653 | insert_with_markers($filename, "HttpHeadersExpires", array()); | ||
| 1654 | insert_with_markers($filename, "HttpHeadersTiming", array()); | ||
| 1655 | insert_with_markers($filename, "HttpHeadersAuth", array()); | ||
| 1656 | insert_with_markers($filename, "HttpHeadersCookieSecurity", array()); | ||
| 1657 | } | ||
| 1658 | |||
| 1659 | register_activation_hook(__FILE__, 'http_headers_activate'); | ||
| 1660 | register_deactivation_hook(__FILE__, 'http_headers_deactivate'); | ||
| 1661 | add_action('wp_logout', 'http_headers_logout'); | ||
| 1662 | |||
| 1663 | if ( is_admin() ){ // admin actions | ||
| 1664 | add_action('admin_menu', 'http_headers_admin_add_page'); | ||
| 1665 | add_action('admin_init', 'http_headers_admin'); | ||
| 1666 | add_action("added_option", 'http_headers_option'); | ||
| 1667 | add_action("updated_option", 'http_headers_option'); | ||
| 1668 | add_action('admin_enqueue_scripts', 'http_headers_enqueue'); | ||
| 1669 | add_action('after_setup_theme', 'http_headers_after_setup_theme'); | ||
| 1670 | add_action('plugins_loaded', 'http_headers_text_domain'); | ||
| 1671 | add_action('wp_ajax_inspect', 'http_headers_ajax_inspect'); | ||
| 1672 | add_action('admin_post_import', 'http_headers_post_import'); | ||
| 1673 | add_action('admin_post_export', 'http_headers_post_export'); | ||
| 1674 | } else { | ||
| 1675 | // non-admin enqueues, actions, and filters | ||
| 1676 | add_action('send_headers', 'http_headers'); | ||
| 1677 | } | ||
| 1678 | |||
| 1679 | function http_headers_admin_page() { | ||
| 1680 | include 'views/index.php'; | ||
| 1681 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
No preview for this file type
| 1 | msgid "" | ||
| 2 | msgstr "" | ||
| 3 | "Project-Id-Version: HTTP Headers in Bulgarian\n" | ||
| 4 | "POT-Creation-Date: 2017-17-12 19:26:00+02:00\n" | ||
| 5 | "Content-Type: text/plain; charset=UTF-8\n" | ||
| 6 | "Content-Transfer-Encoding: 8bit\n" | ||
| 7 | "MIME-Version: 1.0\n" | ||
| 8 | "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/http-headers\n" | ||
| 9 | "PO-Revision-Date: 2017-17-12 19:26:00+02:00\n" | ||
| 10 | "Last-Translator: Dimitar Ivanov <biggie4life@gmail.com>\n" | ||
| 11 | "Language-Team: Dimitar Ivanov <biggie4life@gmail.com>\n" | ||
| 12 | |||
| 13 | #: views/includes/config.inc.php:2 | ||
| 14 | msgid "Off" | ||
| 15 | msgstr "Изкл." | ||
| 16 | |||
| 17 | #: views/includes/config.inc.php:2 | ||
| 18 | msgid "On" | ||
| 19 | msgstr "Вкл." | ||
| 20 | |||
| 21 | #: includes/config.inc.php:5 | ||
| 22 | msgid "Security" | ||
| 23 | msgstr "Сигурност" | ||
| 24 | |||
| 25 | #: includes/config.inc.php:6 | ||
| 26 | msgid "Access control" | ||
| 27 | msgstr "Контрол на достъпа" | ||
| 28 | |||
| 29 | #: includes/config.inc.php:7 | ||
| 30 | msgid "Authentication" | ||
| 31 | msgstr "Удостоверяване" | ||
| 32 | |||
| 33 | #: includes/config.inc.php:8 | ||
| 34 | msgid "Compression" | ||
| 35 | msgstr "Компресия" | ||
| 36 | |||
| 37 | #: includes/config.inc.php:10 | ||
| 38 | msgid "Caching" | ||
| 39 | msgstr "Кеширане" | ||
| 40 | |||
| 41 | #: includes/config.inc.php:11 | ||
| 42 | msgid "Miscellaneous" | ||
| 43 | msgstr "Общи" | ||
| 44 | |||
| 45 | #: includes/breadcrumbs.inc.php:2 | ||
| 46 | msgid "Dashboard" | ||
| 47 | msgstr "Табло" | ||
| 48 | |||
| 49 | #: includes/breadcrumbs.inc.php:11 | ||
| 50 | msgid "Advanced settings" | ||
| 51 | msgstr "Разширени настройки" | ||
| 52 | |||
| 53 | #: includes/breadcrumbs.inc.php:13 | ||
| 54 | msgid "Inspect headers" | ||
| 55 | msgstr "Проверка на хедърите" | ||
| 56 | |||
| 57 | #: views/index.php:13 | ||
| 58 | msgid "Error!" | ||
| 59 | msgstr "Грешка!" | ||
| 60 | |||
| 61 | #: views/index.php:16 | ||
| 62 | msgid "The following file was not found. Please make sure the file exists and has write permissions:" | ||
| 63 | msgstr "Следният файл не бе намерен. Моля уверете се, че файла съществува и има права за писане:" | ||
| 64 | |||
| 65 | #: views/index.php:18 | ||
| 66 | msgid "Please make sure the following file has write permissions:" | ||
| 67 | msgstr "Моля уверете се, че следният файл има права за писане:" | ||
| 68 | |||
| 69 | #: views/index.php:28 | ||
| 70 | msgid "Warning!" | ||
| 71 | msgstr "Внимание!" | ||
| 72 | |||
| 73 | #: views/index.php:40 | ||
| 74 | msgid "Quick links" | ||
| 75 | msgstr "Бързи връзки" | ||
| 76 | |||
| 77 | #: views/index.php:41 | ||
| 78 | msgid "Getting started" | ||
| 79 | msgstr "Ръководство за начинаещи" | ||
| 80 | |||
| 81 | #: views/index.php:43 | ||
| 82 | msgid "Manual setup" | ||
| 83 | msgstr "Ръчна настройка" | ||
| 84 | |||
| 85 | #: views/dashboard.php:47 | ||
| 86 | msgid "Donate" | ||
| 87 | msgstr "Дари" | ||
| 88 | |||
| 89 | #: views/dashboard.php:34 | ||
| 90 | msgid "Rate us" | ||
| 91 | msgstr "Оцени ни" | ||
| 92 | |||
| 93 | #: views/dashboard.php:35 | ||
| 94 | msgid "Tell us what you think about this plugin" | ||
| 95 | msgstr "Кажете ни какво мислите за този плъгин" | ||
| 96 | |||
| 97 | #: views/dashboard.php:35 | ||
| 98 | msgid "writing a review" | ||
| 99 | msgstr "като напишете ревю" | ||
| 100 | |||
| 101 | #: views/dashboard.php:36 | ||
| 102 | msgid "Contribution" | ||
| 103 | msgstr "Принос" | ||
| 104 | |||
| 105 | #: views/dashboard.php:37 | ||
| 106 | msgid "Help us to continue developing this plugin with a small donation." | ||
| 107 | msgstr "Помогнете ни да продължим да развиваме този плъгин с малко дарение." | ||
| 108 | |||
| 109 | #: views/category.php:8 | ||
| 110 | msgid "Header" | ||
| 111 | msgstr "Хедър" | ||
| 112 | |||
| 113 | #: views/category.php:9 | ||
| 114 | msgid "Value" | ||
| 115 | msgstr "Стойност" | ||
| 116 | |||
| 117 | #: views/category.php:10 | ||
| 118 | msgid "Status" | ||
| 119 | msgstr "Статус" | ||
| 120 | |||
| 121 | #: views/category.php:230 | ||
| 122 | msgid "Edit" | ||
| 123 | msgstr "Редактирай" | ||
| 124 | |||
| 125 | #: views/category.php:223 | ||
| 126 | msgid "On" | ||
| 127 | msgstr "Вкл." | ||
| 128 | |||
| 129 | #: views/category.php:223 | ||
| 130 | msgid "Off" | ||
| 131 | msgstr "Изкл." | ||
| 132 | |||
| 133 | #: views/advanced.php:10 | ||
| 134 | msgid "Default mode" | ||
| 135 | msgstr "Режим по подразбиране" | ||
| 136 | |||
| 137 | #: views/advanced.php:11 | ||
| 138 | msgid "Choose a method for sending of headers. Usually, the PHP method works perfectly. However, some third-party plugins like WP Super Cache may require switching to Apache method." | ||
| 139 | msgstr "Режима по подразбиране представлява технологията с която този плъгин изпраща хедърите. Използвайте PHP само ако никоя от останалите технологии не е налична." | ||
| 140 | |||
| 141 | #: views/advanced.php:20 | ||
| 142 | msgid "Use PHP to send headers (deprecated)" | ||
| 143 | msgstr "PHP режим" | ||
| 144 | |||
| 145 | #: views/advanced.php:21 | ||
| 146 | msgid "Use Apache (mod_headers) to send headers" | ||
| 147 | msgstr "Apache режим (препоръчва се)" | ||
| 148 | |||
| 149 | #: views/advanced.php:40 | ||
| 150 | msgid "Export" | ||
| 151 | msgstr "Експорт" | ||
| 152 | |||
| 153 | #: views/advanced.php:41 | ||
| 154 | msgid "Export the plugin current state of settings for later use if recovery needs." | ||
| 155 | msgstr "Експортирайте текущото състояние на настройките на плъгина за по-нататъшна употреба, ако е необходимо възстановяване." | ||
| 156 | |||
| 157 | #: views/advanced.php:46 | ||
| 158 | msgid "Export settings" | ||
| 159 | msgstr "Експортирай настройките" | ||
| 160 | |||
| 161 | #: views/advanced.php:51 | ||
| 162 | msgid "Import" | ||
| 163 | msgstr "Импорт" | ||
| 164 | |||
| 165 | #: views/advanced.php:52 | ||
| 166 | msgid "Import a previously saved state of settings." | ||
| 167 | msgstr "Възстановяване на предварително запазено състояние на настройките." | ||
| 168 | |||
| 169 | #: views/advanced.php:58 | ||
| 170 | msgid "Import settings" | ||
| 171 | msgstr "Импортирай" | ||
| 172 | |||
| 173 | #: views/advanced.php:58 | ||
| 174 | msgid "Choose file..." | ||
| 175 | msgstr "Избери файл..." | ||
| 176 | |||
| 177 | #: views/access-control-allow-credentials.php:3 | ||
| 178 | msgid "The Access-Control-Allow-Credentials header indicates whether the response to request can be exposed when the credentials flag is true." | ||
| 179 | msgstr "Access-Control-Allow-Credentials хедъра посочва дали в отговор на заявка може да се съдържат идентификационни данни." | ||
| 180 | |||
| 181 | #: views/access-control-allow-credentials.php:10 | ||
| 182 | msgid "Read more at" | ||
| 183 | msgstr "Прочети повече на" | ||
| 184 | |||
| 185 | #: views/access-control-allow-credentials.php:11 | ||
| 186 | msgid "MDN Web Docs" | ||
| 187 | msgstr "MDN Web Docs" | ||
| 188 | |||
| 189 | #: views/access-control-allow-headers.php:3 | ||
| 190 | msgid "The Access-Control-Allow-Headers header is returned by the server in a response to a preflight request and informs the browser about the HTTP headers that can be used in the actual request." | ||
| 191 | msgstr "Access-Control-Allow-Headers хедъра се връща от сървъра в отговор на preflight заявка и информира браузъра за HTTP хедърите които могат да се използват в действителната заявка." | ||
| 192 | |||
| 193 | #: views/access-control-allow-methods.php:3 | ||
| 194 | msgid "The Access-Control-Allow-Methods header is returned by the server in a response to a preflight request and informs the browser about the HTTP methods that can be used in the actual request." | ||
| 195 | msgstr "Access-Control-Allow-Methods хедъра се връща от сървъра в отговор на preflight заявка и информира браузъра за HTTP методите които могат да се използват в действителната заявка." | ||
| 196 | |||
| 197 | #: views/access-control-allow-origin.php:3 | ||
| 198 | msgid "The Access-Control-Allow-Origin header indicates whether a resource can be shared." | ||
| 199 | msgstr "Access-Control-Allow-Origin хедъра посочва дали един ресурс (например шрифт) може да се ползва от външни origins и кои са позволените такива." | ||
| 200 | |||
| 201 | #: views/access-control-allow-origin.php:65 | ||
| 202 | msgid "Add origin" | ||
| 203 | msgstr "Добави origin" | ||
| 204 | |||
| 205 | #: views/access-control-expose-headers.php:3 | ||
| 206 | msgid "The Access-Control-Expose-Headers response header brings information about headers that browsers could allow accessing." | ||
| 207 | msgstr "Access-Control-Expose-Headers хедъра носи информация за хедърите които браузърите биха могли да позволят достъп до тях." | ||
| 208 | |||
| 209 | #: views/access-control-max-age.php:3 | ||
| 210 | msgid "The Access-Control-Max-Age header indicates how much time, the result of a preflight request, can be cached." | ||
| 211 | msgstr "Access-Control-Max-Age хедъра показва колко време резултатът от preflight искането може да бъде кеширан." | ||
| 212 | |||
| 213 | #: views/age.php:3 | ||
| 214 | msgid "The Age header contains the time in seconds the object has been in a proxy cache." | ||
| 215 | msgstr "Age хедъра съдържа времето в секунди които обектът е бил в кеша на прокси сървъра. Приема само положителни цели числа и обикновено е близо до 0." | ||
| 216 | |||
| 217 | #: views/age.php:21 | ||
| 218 | msgid "seconds" | ||
| 219 | msgstr "секунди" | ||
| 220 | |||
| 221 | #: views/cache-control.php:3 | ||
| 222 | msgid "The Cache-Control general-header field is used to specify directives for caching mechanisms in both, requests and responses. Caching directives are unidirectional, meaning that a given directive in a request is not implying that the same directive is to be given in the response." | ||
| 223 | msgstr "Cache-Control хедъра се използва за уточняване на директивите за механизмите на кеширане, както в исканията, така и в отговорите. Директивите за кеширането са еднопосочни, което означава, че дадена директива в искането не означава, че в отговора трябва да бъде върната същата директива." | ||
| 224 | |||
| 225 | #: views/connection.php:3 | ||
| 226 | msgid "The Connection general header controls whether or not the network connection stays open after the current transaction finishes. If the value sent is keep-alive, the connection is persistent and not closed, allowing for subsequent requests to the same server to be done." | ||
| 227 | msgstr "Connection хедъра контролира дали мрежовата връзка да остане отворена след завършване на текущата транзакция. Ако изпратената стойност е 'keep-alive', връзката е постоянна и не се затваря, което позволява да бъдат извършени последващите заявки към същия сървър." | ||
| 228 | |||
| 229 | #: views/content-encoding.php:3 | ||
| 230 | msgid "Compression is an important way to increase the performance of a Web site. For some documents, size reduction of up to 70% lowers the bandwidth capacity needs." | ||
| 231 | msgstr "Компресирането е важен начин за увеличаване на ефективността на един уеб сайт. За някои документи, намаляването на размера им до 70% понижава нуждата от по-висок капацитет на честотната лента." | ||
| 232 | |||
| 233 | #: views/content-encoding.php:28 | ||
| 234 | msgid "Module" | ||
| 235 | msgstr "Модул" | ||
| 236 | |||
| 237 | #: views/content-encoding.php:53 | ||
| 238 | msgid "By content type" | ||
| 239 | msgstr "По съдържание" | ||
| 240 | |||
| 241 | #: views/content-encoding.php:98 | ||
| 242 | msgid "By extension" | ||
| 243 | msgstr "По разширение" | ||
| 244 | |||
| 245 | #: views/content-security-policy.php:6 | ||
| 246 | msgid "Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement or distribution of malware." | ||
| 247 | msgstr "Content Security Policy (CSP) хедъра е допълнителен слой за сигурност, който помага за откриването и смекчаването на определени видове атаки, включително Cross Site Scripting (XSS) и атаки с инжектиране на данни. Тези атаки се използват за всичко, от кражбата на данни до site defacement (частична или пълна подмяна на сайта) или разпространението на злонамерен софтуер." | ||
| 248 | |||
| 249 | #: views/content-security-policy.php:32 | ||
| 250 | msgid "Directive" | ||
| 251 | msgstr "Директива" | ||
| 252 | |||
| 253 | #: views/content-security-policy.php:12 | ||
| 254 | msgid "for reporting-only purposes" | ||
| 255 | msgstr "генерира само отчет/доклад" | ||
| 256 | |||
| 257 | #: views/content-type.php:8 | ||
| 258 | msgid "The Content-Type entity header is used to indicate the media type of the resource. In responses, a Content-Type header tells the client what the content type of the returned content actually is. Browsers will do MIME sniffing in some cases and will not necessarily follow the value of this header; to prevent this behavior, the header X-Content-Type-Options can be set to nosniff." | ||
| 259 | msgstr "Content-Type хедъра се използва за посочване на типа медия на ресурса. В отговорите на сървъра, Content-Type хедъра казва на клиента какъв всъщност е типа на върнатото съдържание. Браузърите ще направят MIME проврека в някои случаи и не е задължително да следват стойността на този хедър; за да се предотврати това поведение, хедъра X-Content-Type-Options може да бъде настроен с nosniff стойността." | ||
| 260 | |||
| 261 | #: views/cookie-security.php:8 | ||
| 262 | msgid "A secure cookie is only sent to the server with a encrypted request over the HTTPS protocol." | ||
| 263 | msgstr "Сигурните (Secure) 'бисквитки' се изпращат към сървъра само при криптирани заявки чрез HTTPS протокола." | ||
| 264 | |||
| 265 | #: views/cookie-security.php:9 | ||
| 266 | msgid "To prevent cross-site scripting (XSS) attacks, HttpOnly cookies are inaccessible to JavaScript's Document.cookie API; they are only sent to the server." | ||
| 267 | msgstr "За да се предотвратят атаки между сървъри (XSS), HttpOnly 'бисквитките' са недостъпни за JavaScript's Document.cookie API; те се изпращат само до сървъра." | ||
| 268 | |||
| 269 | #: views/cookie-security.php:10 | ||
| 270 | msgid "SameSite prevents the browser from sending this cookie along with cross-site requests. The main goal is mitigate the risk of cross-origin information leakage. It also provides some protection against cross-site request forgery attacks." | ||
| 271 | msgstr "SameSite не позволява на браузъра да изпраща 'бисквитката' заедно с cross-site заявки. Основната цел е да се намали рискът от изтичане на информация от различни източници. Също така осигурява известна защита срещу CSRF атаки." | ||
| 272 | |||
| 273 | #: views/cookie-security.php:45 | ||
| 274 | msgid "(PHP 7.3+ only)" | ||
| 275 | msgstr "(поддържа се само от PHP 7.3+)" | ||
| 276 | |||
| 277 | #: views/cross-origin-resource-policy.php:8 | ||
| 278 | msgid "The HTTP Cross-Origin-Resource-Policy response header conveys a desire that the browser blocks no-cors cross-origin/cross-site requests to the given resource." | ||
| 279 | msgstr "HTTP Cross-Origin-Resource-Policy хедъра изразява желание браузърът да блокира no-cors cross-origin/cross-site заявки за даден ресурс." | ||
| 280 | |||
| 281 | #: views/cross-origin-embedder-policy.php:8 | ||
| 282 | msgid "The HTTP Cross-Origin-Embedder-Policy (COEP) response header prevents a document from loading any cross-origin resources that don't explicitly grant the document permission (using CORP or CORS)." | ||
| 283 | msgstr "The HTTP Cross-Origin-Embedder-Policy (COEP) response header prevents a document from loading any cross-origin resources that don't explicitly grant the document permission (using CORP or CORS)." | ||
| 284 | |||
| 285 | #: views/cross-origin-opener-policy.php:8 | ||
| 286 | msgid "The HTTP Cross-Origin-Opener-Policy (COOP) response header allows you to ensure a top-level document does not share a browsing context group with cross-origin documents." | ||
| 287 | msgstr "The HTTP Cross-Origin-Opener-Policy (COOP) response header allows you to ensure a top-level document does not share a browsing context group with cross-origin documents." | ||
| 288 | |||
| 289 | #: views/cross-origin-opener-policy.php:9 | ||
| 290 | msgid "COOP will process-isolate your document and potential attackers can't access to your global object if they were opening it in a popup, preventing a set of cross-origin attacks dubbed XS-Leaks." | ||
| 291 | msgstr "COOP will process-isolate your document and potential attackers can't access to your global object if they were opening it in a popup, preventing a set of cross-origin attacks dubbed XS-Leaks." | ||
| 292 | |||
| 293 | #: views/cross-origin-opener-policy.php:10 | ||
| 294 | msgid "If a cross-origin document with COOP is opened in a new window, the opening document will not have a reference to it, and the window.opener property of the new window will be null. This allows you to have more control over references to a window than rel=noopener, which only affects outgoing navigations." | ||
| 295 | msgstr "If a cross-origin document with COOP is opened in a new window, the opening document will not have a reference to it, and the window.opener property of the new window will be null. This allows you to have more control over references to a window than rel=noopener, which only affects outgoing navigations." | ||
| 296 | |||
| 297 | #: views/custom-headers.php:3 | ||
| 298 | msgid "Common non-standard response fields:" | ||
| 299 | msgstr "Често срещани нестандартни хедъри:" | ||
| 300 | |||
| 301 | #: views/custom-headers.php:73 | ||
| 302 | msgid "Add header" | ||
| 303 | msgstr "Добави хедър" | ||
| 304 | |||
| 305 | #: views/custom-headers.php:66 | ||
| 306 | msgid "Delete" | ||
| 307 | msgstr "Изтрий" | ||
| 308 | |||
| 309 | #: views/expect-ct.php:3 | ||
| 310 | msgid "Expect-CT is an HTTP header that allows sites to opt in to reporting and/or enforcement of Certificate Transparency requirements, which prevents the use of misissued certificates for that site from going unnoticed. When a site enables the Expect-CT header, they are requesting that Chrome check that any certificate for that site appears in public CT logs." | ||
| 311 | msgstr "Expect-CT е хедър, който позволява на сайтовете да се включат в отчитането и/или изпълнението на изискванията за прозрачност на сертификатите, което пречи на използването на невалидни сертификати за този сайт да останат незабелязани. Когато даден сайт активира заглавката Expect-CT, те искат Chrome да провери дали всеки сертификат за този сайт фигурира в обществени CT регистри." | ||
| 312 | |||
| 313 | #: views/expires.php:3 | ||
| 314 | msgid "The Expires header contains the date/time after which the response is considered stale." | ||
| 315 | msgstr "Expires хедъра съдържа датата и времето след което отговорът се счита за остарял." | ||
| 316 | |||
| 317 | #: views/expires.php:4 | ||
| 318 | msgid "Invalid dates, like the value 0, represent a date in the past and mean that the resource is already expired." | ||
| 319 | msgstr "Невалидни дати, като стойноста 0, представляват дата в миналото и означават, че ресурсът вече е изтекъл." | ||
| 320 | |||
| 321 | #: views/expires.php:5 | ||
| 322 | msgid "If there is a Cache-Control header with the 'max-age' or 's-max-age' directive in the response, the Expires header is ignored." | ||
| 323 | msgstr "Ако в отговора има 'Cache-Control' хедър с една от директивите 'max-age' или 's-max-age', тогава Expires хедъра се игнорира." | ||
| 324 | |||
| 325 | #: views/expires.php:6 | ||
| 326 | msgid "* Works only in Apache mode" | ||
| 327 | msgstr "* Работи само в режим Apache" | ||
| 328 | |||
| 329 | #: views/feature-policy.php:8 | ||
| 330 | msgid "With Feature Policy, you opt-in to a set of policies for the browser to enforce on specific features used throughout your site. These policies restrict what APIs the site can access or modify the browser's default behavior for certain features." | ||
| 331 | msgstr "С Feature Policy хедъра се присъединявате към набор от правила, които браузърът може да прилага по отношение на конкретни функции, използвани в сайта Ви. Тези правила ограничават какви API може да има достъп до сайта или да променя поведението му по подразбиране за определени функции." | ||
| 332 | |||
| 333 | #: views/p3p.php:3 | ||
| 334 | msgid "The Platform for Privacy Preferences Project (P3P) is a protocol allowing websites to declare their intended use of information they collect about web browser users." | ||
| 335 | msgstr "P3P е протокол, позволяващ на уебсайтовете да декларират предназначението на информацията, която събират за уеб потребителите." | ||
| 336 | |||
| 337 | #: views/pragma.php:3 | ||
| 338 | msgid "The Pragma HTTP/1.0 general header is an implementation-specific header that may have various effects along the request-response chain. It is used for backwards compatibility with HTTP/1.0 caches where the Cache-Control HTTP/1.1 header is not yet present." | ||
| 339 | msgstr "Pragma хедъра, част от HTTP/1.0 протокола, е специфичен за внедряване, който може да има различни ефекти по веригата на заявка-отговор. Използва се за обратна съвместимост с HTTP/1.0 кеширане, където Cache-Control хедъра, част от HTTP/1.1 протокола, все още не е налице." | ||
| 340 | |||
| 341 | #: views/referrer-policy.php:3 | ||
| 342 | msgid "The Referrer-Policy HTTP header governs which referrer information, sent in the Referer header, should be included with requests made." | ||
| 343 | msgstr "Referrer-Policy хедъра указва коя референтна информация, изпратена в Referer хедъра, трябва да бъде включена при направени заявки." | ||
| 344 | |||
| 345 | #: views/nel.php:8 | ||
| 346 | msgid "Network Error Logging is a mechanism that can be configured via the NEL HTTP response header. This experimental header allows web sites and applications to opt-in to receive reports about failed (and, if desired, successful) network fetches from supporting browsers." | ||
| 347 | msgstr "Network Error Logging е механизъм, който може да бъде конфигуриран чрез NEL хедъра. Този експериментален хедър позволява на уебсайтовете и приложенията да се включат, за да получават отчети за неуспешни (и по желание успешни) мрежови заявки от поддържащи браузъри." | ||
| 348 | |||
| 349 | #: views/report-to.php:3 | ||
| 350 | msgid "The Report-To HTTP response header field instructs the user agent to store reporting endpoints for an origin." | ||
| 351 | msgstr "Report-To хедъра казва на потребителския агент (браузър) да съхранява крайните точки за отчитане за даден origin." | ||
| 352 | |||
| 353 | #: views/report-to.php:110 | ||
| 354 | msgid "Add endpoint" | ||
| 355 | msgstr "Добави крайна точка" | ||
| 356 | |||
| 357 | #: views/report-to.php:114 | ||
| 358 | msgid "Remove endpoint" | ||
| 359 | msgstr "Премахни крайна точка" | ||
| 360 | |||
| 361 | #: views/report-to.php:126 | ||
| 362 | msgid "Remove group" | ||
| 363 | msgstr "Премахни група" | ||
| 364 | |||
| 365 | #: views/report-to.php:171 | ||
| 366 | msgid "Add endpoint group" | ||
| 367 | msgstr "Добави група" | ||
| 368 | |||
| 369 | #: views/strict-transport-security.php:3 | ||
| 370 | msgid "HTTP Strict-Transport-Security (HSTS) enforces secure (HTTP over SSL/TLS) connections to the server. This reduces impact of bugs in web applications leaking session data through cookies and external links and defends against Man-in-the-middle attacks. HSTS also disables the ability for user's to ignore SSL negotiation warnings." | ||
| 371 | msgstr "HTTP Strict-Transport-Security (HSTS) налага сигурни (HTTP over SSL/TLS) връзки към сървъра. Това намалява въздействието на бъгове в уеб приложенията, изтичащи сесийни данни чрез 'бисквитки' и външни връзки и защитава срещу атаки от вида 'човек-в-средата' (Man-in-the-middle). HSTS също така забранява възможността потребителят да пренебрегва предупрежденията за преговори по SSL." | ||
| 372 | |||
| 373 | #: views/timing-allow-origin.php:3 | ||
| 374 | msgid "The Timing-Allow-Origin header indicates whether a resource provides the complete timing information. SEO tools use the Resource Timing API to analyze the speed and weight of your web page resources." | ||
| 375 | msgstr "Timing-Allow-Origin хедъра показва дали даден ресурс предоставя пълната информация за времето. SEO инструментите използват Resource Timing API, за да анализират скоростта и теглото на ресурсите на уеб страниците." | ||
| 376 | |||
| 377 | #: views/vary.php:3 | ||
| 378 | msgid "The Vary HTTP response header determines how to match future request headers to decide whether a cached response can be used rather than requesting a fresh one from the origin server. It is used by the server to indicate which headers it used when selecting a representation of a resource in a content negotiation algorithm." | ||
| 379 | msgstr "Vary хедъра определя как да се сравняват хедърите на бъдещите заявки, за да се реши дали може да се използва кеширана заявка, а не да се поиска нова от сървъра. Той се използва от сървъра, за да посочи кои хедъри използва при избора на представяне на ресурс в алгоритъма за договаряне на съдържание." | ||
| 380 | |||
| 381 | #: views/www-authenticate.php:3 | ||
| 382 | msgid "HTTP supports the use of several authentication mechanisms to control access to pages and other resources. These mechanisms are all based around the use of the 401 status code and the WWW-Authenticate response header." | ||
| 383 | msgstr "HTTP поддържа няколко механизма за удостоверяване, за да контролира достъпа до страници и други ресурси. Всички тези механизми се основават на използването на 401 кода на състоянието и на WWW-Authenticate хедъра." | ||
| 384 | |||
| 385 | #: views/www-authenticate.php:79 | ||
| 386 | msgid "Add user" | ||
| 387 | msgstr "Добави потребител" | ||
| 388 | |||
| 389 | #: views/www-authenticate.php:43 | ||
| 390 | msgid "Username" | ||
| 391 | msgstr "Потребител" | ||
| 392 | |||
| 393 | #: views/www-authenticate.php:44 | ||
| 394 | msgid "Password" | ||
| 395 | msgstr "Парола" | ||
| 396 | |||
| 397 | #: views/x-content-type-options.php:3 | ||
| 398 | msgid "Prevents Internet Explorer and Google Chrome from MIME-sniffing a response away from the declared content-type. This also applies to Google Chrome, when downloading extensions. This reduces exposure to drive-by download attacks and sites serving user uploaded content that, by clever naming, could be treated by MSIE as executable or dynamic HTML files." | ||
| 399 | msgstr "Предотвратява Internet Explorer и Google Chrome от MIME-sniffing на отговор извън обявения тип съдържание. Това важи и за Google Chrome, когато изтегляте разширения. Това намалява излагането на атаки за изтегляне и страници, показващи качено от потребителите съдържание, което чрез подходящо име може да бъде третирано от MSIE като изпълним или динамичен HTML файл." | ||
| 400 | |||
| 401 | #: views/x-dns-prefetch-control.php:3 | ||
| 402 | msgid "The X-DNS-Prefetch-Control HTTP response header controls DNS prefetching, a feature by which browsers proactively perform domain name resolution on both links that the user may choose to follow as well as URLs for items referenced by the document, including images, CSS, JavaScript, and so forth." | ||
| 403 | msgstr "X-DNS-Prefetch-Control хедъра контролира предварителното изтегляне на DNS - функция, чрез която браузърите проактивно преобразуват домейн име към IP адрес и на двете: линкове, които потребителят може да последва, както и URL адреси за елементите, посочени от документа, включително изображения, CSS, JavaScript и т.н." | ||
| 404 | |||
| 405 | #: views/x-dns-prefetch-control.php:4 | ||
| 406 | msgid "This prefetching is performed in the background, so that the DNS is likely to have been resolved by the time the referenced items are needed. This reduces latency when the user clicks a link." | ||
| 407 | msgstr "Това предварително зареждане се извършва във фонов режим, така че DNS е вероятно да бъде resolved до момента, в който са необходими референтните елементи. Това намалява латентността, когато потребителят кликне върху връзка." | ||
| 408 | |||
| 409 | #: views/x-download-options.php:3 | ||
| 410 | msgid "For web applications that need to serve untrusted HTML files, Microsoft IE introduced a mechanism to help prevent the untrusted content from compromising your site's security. When the X-Download-Options header is present with the value noopen, the user is prevented from opening a file download directly; instead, they must first save the file locally. When the locally saved file is later opened, it no longer executes in the security context of your site, helping to prevent script injection." | ||
| 411 | msgstr "За уеб приложения, които трябва да обслужват ненадеждни HTML файлове, Microsoft IE въведе механизъм за предотвратяване на несигурното съдържание от компрометиране на сигурността на сайта ви. Когато X-Download-Options хедъра е налице със стойността noopen, потребителят е възпрепятстван да отваря директно файл за изтегляне; вместо това те трябва първо да запазят файла локално. Когато локално запазеният файл се отвори по-късно, той вече не се изпълнява в контекста за сигурност на вашия сайт, което помага да се предотврати инжектирането на скриптове." | ||
| 412 | |||
| 413 | #: views/x-frame-options.php:3 | ||
| 414 | msgid "This header can be used to indicate whether or not a browser should be allowed to render a page in a <frame>, <iframe> or <object>. Use this to avoid clickjacking attacks." | ||
| 415 | msgstr "Този хедър може за се използва за индикация дали е позволено на браузъра да зарежда страница в <frame>, <iframe> или <object>. Използвайте този хедър за да избегнете clickjacking атаки." | ||
| 416 | |||
| 417 | #: views/x-permitted-cross-domain-policies.php:3 | ||
| 418 | msgid "A cross-domain policy file is an XML document that grants a web client, such as Adobe Flash Player or Adobe Acrobat (though not necessarily limited to these), permission to handle data across domains." | ||
| 419 | msgstr "Файла полица за кръстосани домейни е XML документ, който предоставя на уеб клиент като Adobe Flash Player или Adobe Acrobat разрешение за обработка на данни между домейни." | ||
| 420 | |||
| 421 | #: views/x-powered-by.php:3 | ||
| 422 | msgid "Specifies the technology (e.g. ASP.NET, PHP, JBoss, Express) supporting the web application, i.e. the scripting language. It is recommended to remove it or provide misleading information to throw off hackers that might target a particular technology/version." | ||
| 423 | msgstr "Определя технологията (например ASP.NET, PHP, JBoss, Express), поддържаща уеб приложението, т.е. скрипт езика. Препоръчително е да го премахнете или да предоставите подвеждаща информация, за да отклоните хакери, които биха могли да се насочат към определена технология/версия." | ||
| 424 | |||
| 425 | #: views/x-robots-tag.php:8 | ||
| 426 | msgid 'The X-Robots-Tag HTTP header is used to indicate how a web page is to be indexed within public search engine results. The header is effectively equivalent to <code><meta name="robots" content="..."></code>.' | ||
| 427 | msgstr 'X-Robots-Tag HTTP хедъра се използва, за да покаже как да се индексира уеб страница в резултатите от публичната търсачка. Хедъра е ефективно еквивалентен на <code><meta name="robots" content="..."></code>.' | ||
| 428 | |||
| 429 | #: views/x-robots-tag.php:11 | ||
| 430 | msgid "Google Search Central" | ||
| 431 | msgstr "Google Search Central" | ||
| 432 | |||
| 433 | #: views/x-ua-compatible.php:3 | ||
| 434 | msgid "In some cases, it might be necessary to restrict a webpage to a document mode supported by an older version of Windows Internet Explorer. Here we look at the x-ua-compatible header, which allows a webpage to be displayed as if it were viewed by an earlier version of the browser." | ||
| 435 | msgstr "В някои случаи може да е необходимо да ограничите уеб страница до режим на документи, поддържан от по-стара версия на Windows Internet Explorer. X-UA-Compatible хедъра позволява на уеб страницата да се показва така, сякаш е била разглеждана от по-ранна версия на браузъра." | ||
| 436 | |||
| 437 | #: views/x-xss-protection.php:3 | ||
| 438 | msgid "This header enables the Cross-site scripting (XSS) filter built into most recent web browsers. It's usually enabled by default anyway, so the role of this header is to re-enable the filter for this particular website if it was disabled by the user." | ||
| 439 | msgstr "Този хедър активира вградения филтър за Cross-site scripting (XSS) в най-новите уеб браузъри. Обикновено това е активирано по подразбиране така, че ролята на този хедър е да активира отново филтъра за този конкретен уебсайт, ако е бил деактивиран от потребителя." | ||
| 440 | |||
| 441 | #: views/inspect.php:19 | ||
| 442 | msgid "Use this tool to inspect the HTTP headers of your website or your competitor's website." | ||
| 443 | msgstr "Използвайте този инструмент, за да проверите HTTP хедърите на уебсайта си или уебсайта на вашия конкурент." | ||
| 444 | |||
| 445 | #: views/inspect.php:35 | ||
| 446 | msgid "Auth Type" | ||
| 447 | msgstr "Тип удостоверяване" | ||
| 448 | |||
| 449 | #: views/inspect.php:52 | ||
| 450 | msgid "Inspect" | ||
| 451 | msgstr "Провери" | ||
| 452 | |||
| 453 | #: views/ajax.php:123 | ||
| 454 | msgid "Category" | ||
| 455 | msgstr "Категория" | ||
| 456 | |||
| 457 | #: views/ajax.php:118 | ||
| 458 | msgid "Missing headers" | ||
| 459 | msgstr "Липсващи хедъри" | ||
| 460 | |||
| 461 | #: views/ajax.php:72 | ||
| 462 | msgid "Response headers" | ||
| 463 | msgstr "Хедъри в отговора" | ||
| 464 | |||
| 465 | #: views/ajax.php:45 | ||
| 466 | msgid "HTTP status" | ||
| 467 | msgstr "HTTP статус" | ||
| 468 | |||
| 469 | #: views/ajax.php:17 | ||
| 470 | msgid "URL malformed" | ||
| 471 | msgstr "Неправилен URL" | ||
| 472 | |||
| 473 | #: http-headers.php:1110 | ||
| 474 | msgid "Settings" | ||
| 475 | msgstr "Настройки" | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | # Copyright (C) 2017 HTTP Headers | ||
| 2 | # This file is distributed under the same license as the HTTP Headers package. | ||
| 3 | msgid "" | ||
| 4 | msgstr "" | ||
| 5 | "Project-Id-Version: HTTP Headers\n" | ||
| 6 | "POT-Creation-Date: 2017-17-12 19:26:00+02:00\n" | ||
| 7 | "Content-Type: text/plain; charset=UTF-8\n" | ||
| 8 | "Content-Transfer-Encoding: 8bit\n" | ||
| 9 | "MIME-Version: 1.0\n" | ||
| 10 | "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/http-headers\n" | ||
| 11 | "PO-Revision-Date: 2017-17-12 19:26:00+02:00\n" | ||
| 12 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||
| 13 | "Language-Team: LANGUAGE <LL@li.org>\n" | ||
| 14 | |||
| 15 | #: views/includes/config.inc.php:2 | ||
| 16 | msgid "Off" | ||
| 17 | msgstr "" | ||
| 18 | |||
| 19 | #: views/includes/config.inc.php:2 | ||
| 20 | msgid "On" | ||
| 21 | msgstr "" | ||
| 22 | |||
| 23 | #: views/includes/config.inc.php:5 | ||
| 24 | msgid "Security" | ||
| 25 | msgstr "" | ||
| 26 | |||
| 27 | #: views/includes/config.inc.php:6 | ||
| 28 | msgid "Access control" | ||
| 29 | msgstr "" | ||
| 30 | |||
| 31 | #: views/includes/config.inc.php:7 | ||
| 32 | msgid "Authentication" | ||
| 33 | msgstr "" | ||
| 34 | |||
| 35 | #: views/includes/config.inc.php:8 | ||
| 36 | msgid "Compression" | ||
| 37 | msgstr "" | ||
| 38 | |||
| 39 | #: views/includes/config.inc.php:9 | ||
| 40 | msgid "Caching" | ||
| 41 | msgstr "" | ||
| 42 | |||
| 43 | #: views/includes/config.inc.php:10 | ||
| 44 | msgid "Miscellaneous" | ||
| 45 | msgstr "" | ||
| 46 | |||
| 47 | #: views/includes/breadcrumbs.inc.php:2 | ||
| 48 | msgid "Dashboard" | ||
| 49 | msgstr "" | ||
| 50 | |||
| 51 | #: views/includes/breadcrumbs.inc.php:11 | ||
| 52 | msgid "Advanced settings" | ||
| 53 | msgstr "" | ||
| 54 | |||
| 55 | #: views/includes/breadcrumbs.inc.php:13 | ||
| 56 | msgid "Inspect headers" | ||
| 57 | msgstr "" | ||
| 58 | |||
| 59 | #: views/index.php:13 | ||
| 60 | msgid "Error!" | ||
| 61 | msgstr "" | ||
| 62 | |||
| 63 | #: views/index.php:16 | ||
| 64 | msgid "The following file was not found. Please make sure the file exists and has write permissions:" | ||
| 65 | msgstr "" | ||
| 66 | |||
| 67 | #: views/index.php:18 | ||
| 68 | msgid "Please make sure the following file has write permissions:" | ||
| 69 | msgstr "" | ||
| 70 | |||
| 71 | #: views/index.php:28 | ||
| 72 | msgid "Warning!" | ||
| 73 | msgstr "" | ||
| 74 | |||
| 75 | #: views/index.php:40 | ||
| 76 | msgid "Quick links" | ||
| 77 | msgstr "" | ||
| 78 | |||
| 79 | #: views/index.php:41 | ||
| 80 | msgid "Getting started" | ||
| 81 | msgstr "" | ||
| 82 | |||
| 83 | #: views/index.php:43 | ||
| 84 | msgid "Manual setup" | ||
| 85 | msgstr "" | ||
| 86 | |||
| 87 | #: views/dashboard.php:47 | ||
| 88 | msgid "Donate" | ||
| 89 | msgstr "" | ||
| 90 | |||
| 91 | #: views/dashboard.php:34 | ||
| 92 | msgid "Rate us" | ||
| 93 | msgstr "" | ||
| 94 | |||
| 95 | #: views/dashboard.php:35 | ||
| 96 | msgid "Tell us what you think about this plugin" | ||
| 97 | msgstr "" | ||
| 98 | |||
| 99 | #: views/dashboard.php:35 | ||
| 100 | msgid "writing a review" | ||
| 101 | msgstr "" | ||
| 102 | |||
| 103 | #: views/dashboard.php:36 | ||
| 104 | msgid "Contribution" | ||
| 105 | msgstr "" | ||
| 106 | |||
| 107 | #: views/dashboard.php:37 | ||
| 108 | msgid "Help us to continue developing this plugin with a small donation." | ||
| 109 | msgstr "" | ||
| 110 | |||
| 111 | #: views/category.php:8 | ||
| 112 | msgid "Header" | ||
| 113 | msgstr "" | ||
| 114 | |||
| 115 | #: views/category.php:9 | ||
| 116 | msgid "Value" | ||
| 117 | msgstr "" | ||
| 118 | |||
| 119 | #: views/category.php:10 | ||
| 120 | msgid "Status" | ||
| 121 | msgstr "" | ||
| 122 | |||
| 123 | #: views/category.php:230 | ||
| 124 | msgid "Edit" | ||
| 125 | msgstr "" | ||
| 126 | |||
| 127 | #: views/category.php:223 | ||
| 128 | msgid "On" | ||
| 129 | msgstr "" | ||
| 130 | |||
| 131 | #: views/category.php:223 | ||
| 132 | msgid "Off" | ||
| 133 | msgstr "" | ||
| 134 | |||
| 135 | #: views/advanced.php:10 | ||
| 136 | msgid "Default mode" | ||
| 137 | msgstr "" | ||
| 138 | |||
| 139 | #: views/advanced.php:11 | ||
| 140 | msgid "Choose a method for sending of headers. Usually, the PHP method works perfectly. However, some third-party plugins like WP Super Cache may require switching to Apache method." | ||
| 141 | msgstr "" | ||
| 142 | |||
| 143 | #: views/advanced.php:20 | ||
| 144 | msgid "Use PHP to send headers (deprecated)" | ||
| 145 | msgstr "" | ||
| 146 | |||
| 147 | #: views/advanced.php:21 | ||
| 148 | msgid "Use Apache (mod_headers) to send headers" | ||
| 149 | msgstr "" | ||
| 150 | |||
| 151 | #: views/advanced.php:40 | ||
| 152 | msgid "Export" | ||
| 153 | msgstr "" | ||
| 154 | |||
| 155 | #: views/advanced.php:41 | ||
| 156 | msgid "Export the plugin current state of settings for later use if recovery needs." | ||
| 157 | msgstr "" | ||
| 158 | |||
| 159 | #: views/advanced.php:46 | ||
| 160 | msgid "Export settings" | ||
| 161 | msgstr "" | ||
| 162 | |||
| 163 | #: views/advanced.php:51 | ||
| 164 | msgid "Import" | ||
| 165 | msgstr "" | ||
| 166 | |||
| 167 | #: views/advanced.php:52 | ||
| 168 | msgid "Import a previously saved state of settings." | ||
| 169 | msgstr "" | ||
| 170 | |||
| 171 | #: views/advanced.php:58 | ||
| 172 | msgid "Import settings" | ||
| 173 | msgstr "" | ||
| 174 | |||
| 175 | #: views/advanced.php:58 | ||
| 176 | msgid "Choose file..." | ||
| 177 | msgstr "" | ||
| 178 | |||
| 179 | #: views/access-control-allow-credentials.php:3 | ||
| 180 | msgid "The Access-Control-Allow-Credentials header indicates whether the response to request can be exposed when the credentials flag is true." | ||
| 181 | msgstr "" | ||
| 182 | |||
| 183 | #: views/access-control-allow-credentials.php:10 | ||
| 184 | msgid "Read more at" | ||
| 185 | msgstr "" | ||
| 186 | |||
| 187 | #: views/access-control-allow-credentials.php:11 | ||
| 188 | msgid "MDN Web Docs" | ||
| 189 | msgstr "" | ||
| 190 | |||
| 191 | #: views/access-control-allow-headers.php:3 | ||
| 192 | msgid "The Access-Control-Allow-Headers header is returned by the server in a response to a preflight request and informs the browser about the HTTP headers that can be used in the actual request." | ||
| 193 | msgstr "" | ||
| 194 | |||
| 195 | #: views/access-control-allow-methods.php:3 | ||
| 196 | msgid "The Access-Control-Allow-Methods header is returned by the server in a response to a preflight request and informs the browser about the HTTP methods that can be used in the actual request." | ||
| 197 | msgstr "" | ||
| 198 | |||
| 199 | #: views/access-control-allow-origin.php:3 | ||
| 200 | msgid "The Access-Control-Allow-Origin header indicates whether a resource can be shared." | ||
| 201 | msgstr "" | ||
| 202 | |||
| 203 | #: views/access-control-allow-origin.php:65 | ||
| 204 | msgid "Add origin" | ||
| 205 | msgstr "" | ||
| 206 | |||
| 207 | #: views/access-control-expose-headers.php:3 | ||
| 208 | msgid "The Access-Control-Expose-Headers response header brings information about headers that browsers could allow accessing." | ||
| 209 | msgstr "" | ||
| 210 | |||
| 211 | #: views/access-control-max-age.php:3 | ||
| 212 | msgid "The Access-Control-Max-Age header indicates how much time, the result of a preflight request, can be cached." | ||
| 213 | msgstr "" | ||
| 214 | |||
| 215 | #: views/age.php:3 | ||
| 216 | msgid "The Age header contains the time in seconds the object has been in a proxy cache." | ||
| 217 | msgstr "" | ||
| 218 | |||
| 219 | #: views/age.php:21 | ||
| 220 | msgid "seconds" | ||
| 221 | msgstr "" | ||
| 222 | |||
| 223 | #: views/cache-control.php:3 | ||
| 224 | msgid "The Cache-Control general-header field is used to specify directives for caching mechanisms in both, requests and responses. Caching directives are unidirectional, meaning that a given directive in a request is not implying that the same directive is to be given in the response." | ||
| 225 | msgstr "" | ||
| 226 | |||
| 227 | #: views/connection.php:3 | ||
| 228 | msgid "The Connection general header controls whether or not the network connection stays open after the current transaction finishes. If the value sent is keep-alive, the connection is persistent and not closed, allowing for subsequent requests to the same server to be done." | ||
| 229 | msgstr "" | ||
| 230 | |||
| 231 | #: views/content-encoding.php:3 | ||
| 232 | msgid "Compression is an important way to increase the performance of a Web site. For some documents, size reduction of up to 70% lowers the bandwidth capacity needs." | ||
| 233 | msgstr "" | ||
| 234 | |||
| 235 | #: views/content-encoding.php:28 | ||
| 236 | msgid "Module" | ||
| 237 | msgstr "" | ||
| 238 | |||
| 239 | #: views/content-encoding.php:53 | ||
| 240 | msgid "By content type" | ||
| 241 | msgstr "" | ||
| 242 | |||
| 243 | #: views/content-encoding.php:98 | ||
| 244 | msgid "By extension" | ||
| 245 | msgstr "" | ||
| 246 | |||
| 247 | #: views/content-security-policy.php:6 | ||
| 248 | msgid "Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement or distribution of malware." | ||
| 249 | msgstr "" | ||
| 250 | |||
| 251 | #: views/content-security-policy.php:32 | ||
| 252 | msgid "Directive" | ||
| 253 | msgstr "" | ||
| 254 | |||
| 255 | #: views/content-security-policy.php:12 | ||
| 256 | msgid "for reporting-only purposes" | ||
| 257 | msgstr "" | ||
| 258 | |||
| 259 | #: views/content-type.php:8 | ||
| 260 | msgid "The Content-Type entity header is used to indicate the media type of the resource. In responses, a Content-Type header tells the client what the content type of the returned content actually is. Browsers will do MIME sniffing in some cases and will not necessarily follow the value of this header; to prevent this behavior, the header X-Content-Type-Options can be set to nosniff." | ||
| 261 | msgstr "" | ||
| 262 | |||
| 263 | #: views/cookie-security.php:8 | ||
| 264 | msgid "A secure cookie is only sent to the server with a encrypted request over the HTTPS protocol." | ||
| 265 | msgstr "" | ||
| 266 | |||
| 267 | #: views/cookie-security.php:9 | ||
| 268 | msgid "To prevent cross-site scripting (XSS) attacks, HttpOnly cookies are inaccessible to JavaScript's Document.cookie API; they are only sent to the server." | ||
| 269 | msgstr "" | ||
| 270 | |||
| 271 | #: views/cookie-security.php:10 | ||
| 272 | msgid "SameSite prevents the browser from sending this cookie along with cross-site requests. The main goal is mitigate the risk of cross-origin information leakage. It also provides some protection against cross-site request forgery attacks." | ||
| 273 | msgstr "" | ||
| 274 | |||
| 275 | #: views/cookie-security.php:45 | ||
| 276 | msgid "(PHP 7.3+ only)" | ||
| 277 | msgstr "" | ||
| 278 | |||
| 279 | #: views/cross-origin-resource-policy.php:8 | ||
| 280 | msgid "The HTTP Cross-Origin-Resource-Policy response header conveys a desire that the browser blocks no-cors cross-origin/cross-site requests to the given resource." | ||
| 281 | msgstr "" | ||
| 282 | |||
| 283 | #: views/cross-origin-embedder-policy.php:8 | ||
| 284 | msgid "The HTTP Cross-Origin-Embedder-Policy (COEP) response header prevents a document from loading any cross-origin resources that don't explicitly grant the document permission (using CORP or CORS)." | ||
| 285 | msgstr "" | ||
| 286 | |||
| 287 | #: views/cross-origin-opener-policy.php:8 | ||
| 288 | msgid "The HTTP Cross-Origin-Opener-Policy (COOP) response header allows you to ensure a top-level document does not share a browsing context group with cross-origin documents." | ||
| 289 | msgstr "" | ||
| 290 | |||
| 291 | #: views/cross-origin-opener-policy.php:9 | ||
| 292 | msgid "COOP will process-isolate your document and potential attackers can't access to your global object if they were opening it in a popup, preventing a set of cross-origin attacks dubbed XS-Leaks." | ||
| 293 | msgstr "" | ||
| 294 | |||
| 295 | #: views/cross-origin-opener-policy.php:10 | ||
| 296 | msgid "If a cross-origin document with COOP is opened in a new window, the opening document will not have a reference to it, and the window.opener property of the new window will be null. This allows you to have more control over references to a window than rel=noopener, which only affects outgoing navigations." | ||
| 297 | msgstr "" | ||
| 298 | |||
| 299 | #: views/custom-headers.php:3 | ||
| 300 | msgid "Common non-standard response fields:" | ||
| 301 | msgstr "" | ||
| 302 | |||
| 303 | #: views/custom-headers.php:73 | ||
| 304 | msgid "Add header" | ||
| 305 | msgstr "" | ||
| 306 | |||
| 307 | #: views/custom-headers.php:66 | ||
| 308 | msgid "Delete" | ||
| 309 | msgstr "" | ||
| 310 | |||
| 311 | #: views/expect-ct.php:3 | ||
| 312 | msgid "Expect-CT is an HTTP header that allows sites to opt in to reporting and/or enforcement of Certificate Transparency requirements, which prevents the use of misissued certificates for that site from going unnoticed. When a site enables the Expect-CT header, they are requesting that Chrome check that any certificate for that site appears in public CT logs." | ||
| 313 | msgstr "" | ||
| 314 | |||
| 315 | #: views/expires.php:3 | ||
| 316 | msgid "The Expires header contains the date/time after which the response is considered stale." | ||
| 317 | msgstr "" | ||
| 318 | |||
| 319 | #: views/expires.php:4 | ||
| 320 | msgid "Invalid dates, like the value 0, represent a date in the past and mean that the resource is already expired." | ||
| 321 | msgstr "" | ||
| 322 | |||
| 323 | #: views/expires.php:5 | ||
| 324 | msgid "If there is a Cache-Control header with the 'max-age' or 's-max-age' directive in the response, the Expires header is ignored." | ||
| 325 | msgstr "" | ||
| 326 | |||
| 327 | #: views/expires.php:6 | ||
| 328 | msgid "* Works only in Apache mode" | ||
| 329 | msgstr "" | ||
| 330 | |||
| 331 | #: views/feature-policy.php:8 | ||
| 332 | msgid "With Feature Policy, you opt-in to a set of policies for the browser to enforce on specific features used throughout your site. These policies restrict what APIs the site can access or modify the browser's default behavior for certain features." | ||
| 333 | msgstr "" | ||
| 334 | |||
| 335 | #: views/p3p.php:3 | ||
| 336 | msgid "The Platform for Privacy Preferences Project (P3P) is a protocol allowing websites to declare their intended use of information they collect about web browser users." | ||
| 337 | msgstr "" | ||
| 338 | |||
| 339 | #: views/pragma.php:3 | ||
| 340 | msgid "The Pragma HTTP/1.0 general header is an implementation-specific header that may have various effects along the request-response chain. It is used for backwards compatibility with HTTP/1.0 caches where the Cache-Control HTTP/1.1 header is not yet present." | ||
| 341 | msgstr "" | ||
| 342 | |||
| 343 | #: views/referrer-policy.php:3 | ||
| 344 | msgid "The Referrer-Policy HTTP header governs which referrer information, sent in the Referer header, should be included with requests made." | ||
| 345 | msgstr "" | ||
| 346 | |||
| 347 | #: views/nel.php:8 | ||
| 348 | msgid "Network Error Logging is a mechanism that can be configured via the NEL HTTP response header. This experimental header allows web sites and applications to opt-in to receive reports about failed (and, if desired, successful) network fetches from supporting browsers." | ||
| 349 | msgstr "" | ||
| 350 | |||
| 351 | #: views/report-to.php:3 | ||
| 352 | msgid "The Report-To HTTP response header field instructs the user agent to store reporting endpoints for an origin." | ||
| 353 | msgstr "" | ||
| 354 | |||
| 355 | #: views/report-to.php:110 | ||
| 356 | msgid "Add endpoint" | ||
| 357 | msgstr "" | ||
| 358 | |||
| 359 | #: views/report-to.php:114 | ||
| 360 | msgid "Remove endpoint" | ||
| 361 | msgstr "" | ||
| 362 | |||
| 363 | #: views/report-to.php:126 | ||
| 364 | msgid "Remove group" | ||
| 365 | msgstr "" | ||
| 366 | |||
| 367 | #: views/report-to.php:171 | ||
| 368 | msgid "Add endpoint group" | ||
| 369 | msgstr "" | ||
| 370 | |||
| 371 | #: views/strict-transport-security.php:3 | ||
| 372 | msgid "HTTP Strict-Transport-Security (HSTS) enforces secure (HTTP over SSL/TLS) connections to the server. This reduces impact of bugs in web applications leaking session data through cookies and external links and defends against Man-in-the-middle attacks. HSTS also disables the ability for user's to ignore SSL negotiation warnings." | ||
| 373 | msgstr "" | ||
| 374 | |||
| 375 | #: views/timing-allow-origin.php:3 | ||
| 376 | msgid "The Timing-Allow-Origin header indicates whether a resource provides the complete timing information. SEO tools use the Resource Timing API to analyze the speed and weight of your web page resources." | ||
| 377 | msgstr "" | ||
| 378 | |||
| 379 | #: views/vary.php:3 | ||
| 380 | msgid "The Vary HTTP response header determines how to match future request headers to decide whether a cached response can be used rather than requesting a fresh one from the origin server. It is used by the server to indicate which headers it used when selecting a representation of a resource in a content negotiation algorithm." | ||
| 381 | msgstr "" | ||
| 382 | |||
| 383 | #: views/www-authenticate.php:3 | ||
| 384 | msgid "HTTP supports the use of several authentication mechanisms to control access to pages and other resources. These mechanisms are all based around the use of the 401 status code and the WWW-Authenticate response header." | ||
| 385 | msgstr "" | ||
| 386 | |||
| 387 | #: views/www-authenticate.php:79 | ||
| 388 | msgid "Add user" | ||
| 389 | msgstr "" | ||
| 390 | |||
| 391 | #: views/www-authenticate.php:43 | ||
| 392 | msgid "Username" | ||
| 393 | msgstr "" | ||
| 394 | |||
| 395 | #: views/www-authenticate.php:44 | ||
| 396 | msgid "Password" | ||
| 397 | msgstr "" | ||
| 398 | |||
| 399 | #: views/x-content-type-options.php:3 | ||
| 400 | msgid "Prevents Internet Explorer and Google Chrome from MIME-sniffing a response away from the declared content-type. This also applies to Google Chrome, when downloading extensions. This reduces exposure to drive-by download attacks and sites serving user uploaded content that, by clever naming, could be treated by MSIE as executable or dynamic HTML files." | ||
| 401 | msgstr "" | ||
| 402 | |||
| 403 | #: views/x-dns-prefetch-control.php:3 | ||
| 404 | msgid "The X-DNS-Prefetch-Control HTTP response header controls DNS prefetching, a feature by which browsers proactively perform domain name resolution on both links that the user may choose to follow as well as URLs for items referenced by the document, including images, CSS, JavaScript, and so forth." | ||
| 405 | msgstr "" | ||
| 406 | |||
| 407 | #: views/x-dns-prefetch-control.php:4 | ||
| 408 | msgid "This prefetching is performed in the background, so that the DNS is likely to have been resolved by the time the referenced items are needed. This reduces latency when the user clicks a link." | ||
| 409 | msgstr "" | ||
| 410 | |||
| 411 | #: views/x-download-options.php:3 | ||
| 412 | msgid "For web applications that need to serve untrusted HTML files, Microsoft IE introduced a mechanism to help prevent the untrusted content from compromising your site’s security. When the X-Download-Options header is present with the value noopen, the user is prevented from opening a file download directly; instead, they must first save the file locally. When the locally saved file is later opened, it no longer executes in the security context of your site, helping to prevent script injection." | ||
| 413 | msgstr "" | ||
| 414 | |||
| 415 | #: views/x-frame-options.php:3 | ||
| 416 | msgid "This header can be used to indicate whether or not a browser should be allowed to render a page in a <frame>, <iframe> or <object>. Use this to avoid clickjacking attacks." | ||
| 417 | msgstr "" | ||
| 418 | |||
| 419 | #: views/x-permitted-cross-domain-policies.php:3 | ||
| 420 | msgid "A cross-domain policy file is an XML document that grants a web client, such as Adobe Flash Player or Adobe Acrobat (though not necessarily limited to these), permission to handle data across domains." | ||
| 421 | msgstr "" | ||
| 422 | |||
| 423 | #: views/x-powered-by.php:3 | ||
| 424 | msgid "Specifies the technology (e.g. ASP.NET, PHP, JBoss, Express) supporting the web application, i.e. the scripting language. It is recommended to remove it or provide misleading information to throw off hackers that might target a particular technology/version." | ||
| 425 | msgstr "" | ||
| 426 | |||
| 427 | #: views/x-robots-tag.php:8 | ||
| 428 | msgid 'The X-Robots-Tag HTTP header is used to indicate how a web page is to be indexed within public search engine results. The header is effectively equivalent to <code><meta name="robots" content="..."></code>.' | ||
| 429 | msgstr "" | ||
| 430 | |||
| 431 | #: views/x-robots-tag.php:11 | ||
| 432 | msgid "Google Search Central" | ||
| 433 | msgstr "" | ||
| 434 | |||
| 435 | #: views/x-ua-compatible.php:3 | ||
| 436 | msgid "In some cases, it might be necessary to restrict a webpage to a document mode supported by an older version of Windows Internet Explorer. Here we look at the x-ua-compatible header, which allows a webpage to be displayed as if it were viewed by an earlier version of the browser." | ||
| 437 | msgstr "" | ||
| 438 | |||
| 439 | #: views/x-xss-protection.php:3 | ||
| 440 | msgid "This header enables the Cross-site scripting (XSS) filter built into most recent web browsers. It's usually enabled by default anyway, so the role of this header is to re-enable the filter for this particular website if it was disabled by the user." | ||
| 441 | msgstr "" | ||
| 442 | |||
| 443 | #: views/inspect.php:19 | ||
| 444 | msgid "Use this tool to inspect the HTTP headers of your website or your competitor's website." | ||
| 445 | msgstr "" | ||
| 446 | |||
| 447 | #: views/inspect.php:35 | ||
| 448 | msgid "Auth Type" | ||
| 449 | msgstr "" | ||
| 450 | |||
| 451 | #: views/inspect.php:52 | ||
| 452 | msgid "Inspect" | ||
| 453 | msgstr "" | ||
| 454 | |||
| 455 | #: views/ajax.php:123 | ||
| 456 | msgid "Category" | ||
| 457 | msgstr "" | ||
| 458 | |||
| 459 | #: views/inspect.php:52 | ||
| 460 | msgid "Inspect" | ||
| 461 | msgstr "" | ||
| 462 | |||
| 463 | #: views/ajax.php:118 | ||
| 464 | msgid "Missing headers" | ||
| 465 | msgstr "" | ||
| 466 | |||
| 467 | #: views/ajax.php:72 | ||
| 468 | msgid "Response headers" | ||
| 469 | msgstr "" | ||
| 470 | |||
| 471 | #: views/ajax.php:45 | ||
| 472 | msgid "HTTP Status" | ||
| 473 | msgstr "" | ||
| 474 | |||
| 475 | #: views/ajax.php:17 | ||
| 476 | msgid "URL malformed" | ||
| 477 | msgstr "" | ||
| 478 | |||
| 479 | #: http-headers.php:1110 | ||
| 480 | msgid "Settings" | ||
| 481 | msgstr "" | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | // If uninstall is not called from WordPress, exit | ||
| 3 | if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) { | ||
| 4 | exit(); | ||
| 5 | } | ||
| 6 | |||
| 7 | $options = include dirname(__FILE__) . '/views/includes/options.inc.php'; | ||
| 8 | |||
| 9 | foreach ($options as $option) | ||
| 10 | { | ||
| 11 | delete_option( $option[0] ); | ||
| 12 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Access-Control-Allow-Credentials | ||
| 8 | <p class="description"><?php _e('The Access-Control-Allow-Credentials header indicates whether the response to request can be exposed when the credentials flag is true.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Access-Control-Allow-Credentials</legend> | ||
| 17 | <?php | ||
| 18 | $access_control_allow_credentials = get_option('hh_access_control_allow_credentials', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_access_control_allow_credentials" value="<?php echo $k; ?>"<?php checked($access_control_allow_credentials, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-acac' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-acac' ); ?> | ||
| 29 | <select name="hh_access_control_allow_credentials_value" class="http-header-value"<?php echo $access_control_allow_credentials == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('true'); | ||
| 32 | $access_control_allow_credentials_value = get_option('hh_access_control_allow_credentials_value'); | ||
| 33 | foreach ($items as $item) { | ||
| 34 | ?><option value="<?php echo $item; ?>"<?php selected($access_control_allow_credentials_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | </td> | ||
| 39 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Access-Control-Allow-Headers | ||
| 8 | <p class="description"><?php _e('The Access-Control-Allow-Headers header is returned by the server in a response to a preflight request and informs the browser about the HTTP headers that can be used in the actual request.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Access-Control-Allow-Credentials</legend> | ||
| 17 | <?php | ||
| 18 | $access_control_allow_headers = get_option('hh_access_control_allow_headers', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_access_control_allow_headers" value="<?php echo $k; ?>"<?php checked($access_control_allow_headers, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-acah' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-acah' ); ?> | ||
| 29 | <table><tbody><tr> | ||
| 30 | <?php | ||
| 31 | $access_control_allow_headers_value = get_option('hh_access_control_allow_headers_value'); | ||
| 32 | if (!$access_control_allow_headers_value) | ||
| 33 | { | ||
| 34 | $access_control_allow_headers_value = array(); | ||
| 35 | } | ||
| 36 | $i = 0; | ||
| 37 | array_unshift($headers_list, '*'); | ||
| 38 | foreach ($headers_list as $item) { | ||
| 39 | if (in_array($item, $cors_safe_request_headers)) { | ||
| 40 | continue; | ||
| 41 | } | ||
| 42 | if ($i % 3 === 0) { | ||
| 43 | ?></tr><tr><?php | ||
| 44 | } | ||
| 45 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_access_control_allow_headers_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $access_control_allow_headers_value) ? NULL : ' checked'; ?><?php echo $access_control_allow_headers == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 46 | $i += 1; | ||
| 47 | } | ||
| 48 | ?> | ||
| 49 | </tr></tbody></table> | ||
| 50 | <table><tbody> | ||
| 51 | <?php | ||
| 52 | $access_control_allow_headers_custom = get_option('hh_access_control_allow_headers_custom'); | ||
| 53 | if (is_array($access_control_allow_headers_custom)) | ||
| 54 | { | ||
| 55 | foreach ($access_control_allow_headers_custom as $header) | ||
| 56 | { | ||
| 57 | ?> | ||
| 58 | <tr> | ||
| 59 | <td><input type="text" name="hh_access_control_allow_headers_custom[]" | ||
| 60 | class="http-header-value" size="35" | ||
| 61 | value="<?php echo esc_attr($header); ?>"<?php echo $access_control_allow_headers == 1 ? NULL : ' readonly'; ?> /> | ||
| 62 | </td> | ||
| 63 | <td> | ||
| 64 | <button type="button" class="button button-small hh-btn-delete-ac" | ||
| 65 | title="<?php esc_attr_e('Delete', 'http-headers'); ?>">x</button> | ||
| 66 | </td> | ||
| 67 | </tr> | ||
| 68 | <?php | ||
| 69 | } | ||
| 70 | } | ||
| 71 | ?> | ||
| 72 | <tr> | ||
| 73 | <td colspan="2"> | ||
| 74 | <button type="button" class="button hh-btn-add-ac" data-name="hh_access_control_allow_headers_custom[]">+ <?php _e('Add header', 'http-headers'); ?></button> | ||
| 75 | </td> | ||
| 76 | </tr> | ||
| 77 | </tbody></table> | ||
| 78 | </td> | ||
| 79 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Access-Control-Allow-Methods | ||
| 8 | <p class="description"><?php _e('The Access-Control-Allow-Methods header is returned by the server in a response to a preflight request and informs the browser about the HTTP methods that can be used in the actual request.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Access-Control-Allow-Methods</legend> | ||
| 17 | <?php | ||
| 18 | $access_control_allow_methods = get_option('hh_access_control_allow_methods', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_access_control_allow_methods" value="<?php echo $k; ?>"<?php checked($access_control_allow_methods, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-acam' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-acam' ); ?> | ||
| 29 | <?php | ||
| 30 | $items = array('*', 'GET', 'POST', 'OPTIONS', 'HEAD', 'PUT', 'DELETE', 'TRACE', 'CONNECT', 'PATCH'); | ||
| 31 | $access_control_allow_methods_value = get_option('hh_access_control_allow_methods_value'); | ||
| 32 | if (!$access_control_allow_methods_value) | ||
| 33 | { | ||
| 34 | $access_control_allow_methods_value = array(); | ||
| 35 | } | ||
| 36 | foreach ($items as $item) | ||
| 37 | { | ||
| 38 | ?><p><label><input type="checkbox" class="http-header-value" name="hh_access_control_allow_methods_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $access_control_allow_methods_value) ? NULL : ' checked'; ?><?php echo $access_control_allow_methods == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></p><?php | ||
| 39 | } | ||
| 40 | ?> | ||
| 41 | </td> | ||
| 42 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Access-Control-Allow-Origin | ||
| 8 | <p class="description"><?php _e('The Access-Control-Allow-Origin header indicates whether a resource can be shared.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Access-Control-Allow-Origin</legend> | ||
| 17 | <?php | ||
| 18 | $access_control_allow_origin = get_option('hh_access_control_allow_origin', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_access_control_allow_origin" value="<?php echo $k; ?>"<?php checked($access_control_allow_origin, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-acao' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-acao' ); ?> | ||
| 29 | <?php | ||
| 30 | $access_control_allow_origin_url = get_option('hh_access_control_allow_origin_url'); | ||
| 31 | if (is_scalar($access_control_allow_origin_url)) | ||
| 32 | { | ||
| 33 | $access_control_allow_origin_url = array($access_control_allow_origin_url); | ||
| 34 | } | ||
| 35 | if (!is_array($access_control_allow_origin_url)) | ||
| 36 | { | ||
| 37 | $access_control_allow_origin_url = array(NULL); | ||
| 38 | } | ||
| 39 | ?> | ||
| 40 | <table> | ||
| 41 | <tr> | ||
| 42 | <td> | ||
| 43 | <select name="hh_access_control_allow_origin_value" class="http-header-value"<?php echo $access_control_allow_origin == 1 ? NULL : ' readonly'; ?>> | ||
| 44 | <?php | ||
| 45 | $items = array('*', 'origin', 'null'); | ||
| 46 | $access_control_allow_origin_value = get_option('hh_access_control_allow_origin_value'); | ||
| 47 | foreach ($items as $item) { | ||
| 48 | ?><option value="<?php echo $item; ?>"<?php selected($access_control_allow_origin_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 49 | } | ||
| 50 | ?> | ||
| 51 | </select> | ||
| 52 | </td> | ||
| 53 | <td class="hh-acao<?php echo $access_control_allow_origin_value != 'origin' ? ' hh-hidden' : NULL; ?>"><input type="text" name="hh_access_control_allow_origin_url[]" class="http-header-value" placeholder="http://domain.com" size="35" value="<?php echo esc_attr(@$access_control_allow_origin_url[0]); ?>"<?php echo $access_control_allow_origin == 1 && $access_control_allow_origin_value == 'origin' ? NULL : ' readonly'; ?> /></td> | ||
| 54 | <td class="hh-acao<?php echo $access_control_allow_origin_value != 'origin' ? ' hh-hidden' : NULL; ?>"> </td> | ||
| 55 | </tr> | ||
| 56 | <?php | ||
| 57 | foreach ($access_control_allow_origin_url as $i => $url) | ||
| 58 | { | ||
| 59 | if ($i == 0) | ||
| 60 | { | ||
| 61 | continue; | ||
| 62 | } | ||
| 63 | ?> | ||
| 64 | <tr class="hh-acao<?php echo $access_control_allow_origin_value != 'origin' ? ' hh-hidden' : NULL; ?>"> | ||
| 65 | <td> </td> | ||
| 66 | <td><input type="text" name="hh_access_control_allow_origin_url[]" class="http-header-value" placeholder="http://domain.com" size="35" value="<?php echo esc_attr($url); ?>"<?php echo $access_control_allow_origin == 1 && $access_control_allow_origin_value == 'origin' ? NULL : ' readonly'; ?> /></td> | ||
| 67 | <td><button type="button" class="button button-small hh-btn-delete-origin" title="<?php esc_attr_e('Delete', 'http-headers'); ?>">x</button></td> | ||
| 68 | </tr> | ||
| 69 | <?php | ||
| 70 | } | ||
| 71 | ?> | ||
| 72 | <tr class="hh-acao<?php echo $access_control_allow_origin_value != 'origin' ? ' hh-hidden' : NULL; ?>"> | ||
| 73 | <td> </td> | ||
| 74 | <td><button type="button" class="button hh-btn-add-origin">+ <?php _e('Add origin', 'http-headers'); ?></button></td> | ||
| 75 | <td> </td> | ||
| 76 | </tr> | ||
| 77 | </table> | ||
| 78 | </td> | ||
| 79 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Access-Control-Expose-Headers | ||
| 8 | <p class="description"><?php _e('The Access-Control-Expose-Headers response header brings information about headers that browsers could allow accessing.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Access-Control-Expose-Headers</legend> | ||
| 17 | <?php | ||
| 18 | $access_control_expose_headers = get_option('hh_access_control_expose_headers', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_access_control_expose_headers" value="<?php echo $k; ?>"<?php checked($access_control_expose_headers, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-aceh' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-aceh' ); ?> | ||
| 29 | |||
| 30 | <?php | ||
| 31 | $access_control_expose_headers_value = get_option('hh_access_control_expose_headers_value'); | ||
| 32 | if (!$access_control_expose_headers_value) | ||
| 33 | { | ||
| 34 | $access_control_expose_headers_value = array(); | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | <table><tbody><tr> | ||
| 38 | <?php | ||
| 39 | $i = 0; | ||
| 40 | array_unshift($headers_list, '*'); | ||
| 41 | foreach ($headers_list as $item) { | ||
| 42 | if (in_array($item, $cors_safe_response_headers) || in_array($item, $cors_safe_request_headers)) | ||
| 43 | { | ||
| 44 | continue; | ||
| 45 | } | ||
| 46 | if ($i % 3 === 0) { | ||
| 47 | ?></tr><tr><?php | ||
| 48 | } | ||
| 49 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_access_control_expose_headers_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $access_control_expose_headers_value) ? NULL : ' checked'; ?><?php echo $access_control_expose_headers == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 50 | $i += 1; | ||
| 51 | } | ||
| 52 | ?> | ||
| 53 | </tr> | ||
| 54 | </tbody></table> | ||
| 55 | <table><tbody> | ||
| 56 | <?php | ||
| 57 | $access_control_expose_headers_custom = get_option('hh_access_control_expose_headers_custom'); | ||
| 58 | if (is_array($access_control_expose_headers_custom)) | ||
| 59 | { | ||
| 60 | foreach ($access_control_expose_headers_custom as $header) | ||
| 61 | { | ||
| 62 | ?> | ||
| 63 | <tr> | ||
| 64 | <td><input type="text" name="hh_access_control_expose_headers_custom[]" class="http-header-value" size="35" value="<?php echo esc_attr($header); ?>"<?php echo $access_control_expose_headers == 1 ? NULL : ' readonly'; ?> /></td> | ||
| 65 | <td><button type="button" class="button button-small hh-btn-delete-ac" title="<?php esc_attr_e('Delete', 'http-headers'); ?>">x</button></td> | ||
| 66 | </tr> | ||
| 67 | <?php | ||
| 68 | } | ||
| 69 | } | ||
| 70 | ?> | ||
| 71 | <tr> | ||
| 72 | <td colspan="2"> | ||
| 73 | <button type="button" class="button hh-btn-add-ac" data-name="hh_access_control_expose_headers_custom[]">+ <?php _e('Add header', 'http-headers'); ?></button> | ||
| 74 | </td> | ||
| 75 | </tr> | ||
| 76 | </tbody></table> | ||
| 77 | </td> | ||
| 78 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Access-Control-Max-Age | ||
| 8 | <p class="description"><?php _e('The Access-Control-Max-Age header indicates how much time, the result of a preflight request, can be cached.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Access-Control-Max-Age</legend> | ||
| 17 | <?php | ||
| 18 | $access_control_max_age = get_option('hh_access_control_max_age', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_access_control_max_age" value="<?php echo $k; ?>"<?php checked($access_control_max_age, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-acma' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-acma' ); ?> | ||
| 29 | <input type="text" name="hh_access_control_max_age_value" class="http-header-value" value="<?php echo esc_attr(get_option('hh_access_control_max_age_value')); ?>"<?php echo $access_control_max_age == 1 ? NULL : ' checked'; ?>> | ||
| 30 | <?php _e('seconds', 'http-headers'); ?> | ||
| 31 | </td> | ||
| 32 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | include dirname(__FILE__) . '/includes/config.inc.php'; | ||
| 6 | include dirname(__FILE__) . '/includes/breadcrumbs.inc.php'; | ||
| 7 | ?> | ||
| 8 | <form method="post" action="options.php" accept-charset="utf-8"> | ||
| 9 | <?php settings_fields( 'http-headers-mtd' ); ?> | ||
| 10 | <?php do_settings_sections( 'http-headers-mtd' ); ?> | ||
| 11 | <div style="overflow: hidden"> | ||
| 12 | <div style="float: left; width: 49%"> | ||
| 13 | <table class="hh-index-table"> | ||
| 14 | <thead> | ||
| 15 | <tr> | ||
| 16 | <th>Directive</th> | ||
| 17 | <th>Value</th> | ||
| 18 | </tr> | ||
| 19 | </thead> | ||
| 20 | <tbody> | ||
| 21 | <tr class="active"> | ||
| 22 | <td>PHP version</td> | ||
| 23 | <td><?php echo PHP_VERSION; ?></td> | ||
| 24 | </tr> | ||
| 25 | <tr class="active"> | ||
| 26 | <td>Server Software</td> | ||
| 27 | <td><?php echo getenv('SERVER_SOFTWARE'); ?></td> | ||
| 28 | </tr> | ||
| 29 | <tr class="active"> | ||
| 30 | <td>Server API</td> | ||
| 31 | <td><?php echo PHP_SAPI; ?></td> | ||
| 32 | </tr> | ||
| 33 | <tr class="active"> | ||
| 34 | <td>user_ini.filename</td> | ||
| 35 | <td><?php echo ini_get('user_ini.filename'); ?></td> | ||
| 36 | </tr> | ||
| 37 | </tbody> | ||
| 38 | </table> | ||
| 39 | </div> | ||
| 40 | <section class="hh-panel" style="float: right; width: 49%; box-sizing: border-box; margin: 0"> | ||
| 41 | <table style="width: 100%"> | ||
| 42 | <thead> | ||
| 43 | <tr> | ||
| 44 | <th colspan="2" style="text-align: left"><?php _e('Setup Location', 'http-headers'); ?></th> | ||
| 45 | </tr> | ||
| 46 | </thead> | ||
| 47 | <tbody> | ||
| 48 | <tr> | ||
| 49 | <td>Location of <code>.htaccess</code></td> | ||
| 50 | <td><input type="text" name="hh_htaccess_path" placeholder="<?php echo get_home_path(); ?>.htaccess" style="width: 100%" value="<?php echo get_option('hh_htaccess_path'); ?>"></td> | ||
| 51 | </tr> | ||
| 52 | <tr> | ||
| 53 | <td>Location of <code>.user.ini</code></td> | ||
| 54 | <td><input type="text" name="hh_user_ini_path" placeholder="<?php echo get_home_path(); ?>.user.ini" style="width: 100%" value="<?php echo get_option('hh_user_ini_path'); ?>"></td> | ||
| 55 | </tr> | ||
| 56 | <tr> | ||
| 57 | <td>Location of <code>.hh-htpasswd</code></td> | ||
| 58 | <td><input type="text" name="hh_htpasswd_path" placeholder="<?php echo get_home_path(); ?>.hh-htpasswd" style="width: 100%" value="<?php echo get_option('hh_htpasswd_path'); ?>"></td> | ||
| 59 | </tr> | ||
| 60 | <tr> | ||
| 61 | <td>Location of <code>.hh-htdigest</code></td> | ||
| 62 | <td><input type="text" name="hh_htdigest_path" placeholder="<?php echo get_home_path(); ?>.hh-htdigest" style="width: 100%" value="<?php echo get_option('hh_htdigest_path'); ?>"></td> | ||
| 63 | </tr> | ||
| 64 | <tr> | ||
| 65 | <td></td> | ||
| 66 | <td><?php submit_button(null, 'primary', null, false); ?></td> | ||
| 67 | </tr> | ||
| 68 | </tbody> | ||
| 69 | </table> | ||
| 70 | </section> | ||
| 71 | </div> | ||
| 72 | |||
| 73 | <section class="hh-panel"> | ||
| 74 | <table class="form-table hh-table"> | ||
| 75 | <tbody> | ||
| 76 | <tr valign="top"> | ||
| 77 | <th scope="row"><?php _e('Default mode', 'http-headers'); ?> | ||
| 78 | <p class="description"><?php _e('Choose a method for sending of headers. Usually, the PHP method works perfectly. However, some third-party plugins like WP Super Cache may require switching to Apache method.', 'http-headers'); ?></p> | ||
| 79 | </th> | ||
| 80 | <td> </td> | ||
| 81 | <td> | ||
| 82 | <fieldset> | ||
| 83 | <?php | ||
| 84 | $items = array( | ||
| 85 | 'php' => __('Use PHP to send headers (deprecated)', 'http-headers'), | ||
| 86 | 'htaccess' => __('Use Apache (mod_headers) to send headers', 'http-headers'), | ||
| 87 | ); | ||
| 88 | $method = get_option('hh_method'); | ||
| 89 | foreach ($items as $key => $val) { | ||
| 90 | ?><p><label><input type="radio" name="hh_method" value="<?php echo $key; ?>"<?php checked($method, $key, true); ?>><?php echo $val; ?></label></p><?php | ||
| 91 | } | ||
| 92 | ?> | ||
| 93 | </fieldset> | ||
| 94 | </td> | ||
| 95 | </tr> | ||
| 96 | </tbody> | ||
| 97 | </table> | ||
| 98 | <?php submit_button(); ?> | ||
| 99 | </section> | ||
| 100 | </form> | ||
| 101 | |||
| 102 | <section class="hh-panel"> | ||
| 103 | <table class="form-table hh-table"> | ||
| 104 | <tbody> | ||
| 105 | <tr valign="top"> | ||
| 106 | <th scope="row"><?php _e('Export', 'http-headers'); ?> | ||
| 107 | <p class="description"><?php _e('Export the plugin current state of settings for later use if recovery needs.', 'http-headers'); ?></p> | ||
| 108 | </th> | ||
| 109 | <td> </td> | ||
| 110 | <td> | ||
| 111 | <fieldset> | ||
| 112 | <form method="post" action="<?php echo admin_url('admin-post.php'); ?>" target="_blank"> | ||
| 113 | <?php wp_nonce_field('export'); ?> | ||
| 114 | <input type="hidden" name="action" value="export"> | ||
| 115 | <button type="submit" class="button button-primary"><?php _e('Export settings', 'http-headers'); ?></button> | ||
| 116 | </form> | ||
| 117 | </fieldset> | ||
| 118 | </td> | ||
| 119 | </tr> | ||
| 120 | <tr valign="top"> | ||
| 121 | <th scope="row"><?php _e('Import', 'http-headers'); ?> | ||
| 122 | <p class="description"><?php _e('Import a previously saved state of settings.', 'http-headers'); ?></p> | ||
| 123 | </th> | ||
| 124 | <td> </td> | ||
| 125 | <td> | ||
| 126 | <fieldset> | ||
| 127 | <form method="post" action="<?php echo admin_url('admin-post.php'); ?>" enctype="multipart/form-data"> | ||
| 128 | <?php wp_nonce_field('import'); ?> | ||
| 129 | <input type="hidden" name="action" value="import"> | ||
| 130 | <input type="file" name="file" id="hh-import-file" class="hh-hidden"> | ||
| 131 | <div class="button-group"> | ||
| 132 | <button type="button" class="button hh-btn-import-choose"><?php _e('Choose file...', 'http-headers'); ?></button> | ||
| 133 | <button type="submit" class="button button-primary"><?php _e('Import settings', 'http-headers'); ?></button> | ||
| 134 | </div> | ||
| 135 | <p id="hh-import-name"></p> | ||
| 136 | </form> | ||
| 137 | </fieldset> | ||
| 138 | </td> | ||
| 139 | </tr> | ||
| 140 | </tbody> | ||
| 141 | </table> | ||
| 142 | </section> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Age | ||
| 8 | <p class="description"><?php _e('The Age header contains the time in seconds the object has been in a proxy cache.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Age"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Age</legend> | ||
| 17 | <?php | ||
| 18 | $age = get_option('hh_age', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_age" value="<?php echo $k; ?>"<?php checked($age, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-age' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-age' ); ?> | ||
| 29 | <input type="text" name="hh_age_value" class="http-header-value" size="5" value="<?php echo esc_attr(get_option('hh_age_value')); ?>"<?php echo $age == 1 ? NULL : ' checked'; ?>> | ||
| 30 | <?php _e('seconds', 'http-headers'); ?> | ||
| 31 | </td> | ||
| 32 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!(isset($_POST['url']) && preg_match('|^https?://|', $_POST['url']))) | ||
| 3 | { | ||
| 4 | ?> | ||
| 5 | <section class="hh-panel"> | ||
| 6 | <h3><span class="hh-highlight"><?php _e('URL malformed', 'http-headers'); ?></span></h3> | ||
| 7 | </section> | ||
| 8 | <?php | ||
| 9 | exit; | ||
| 10 | } | ||
| 11 | |||
| 12 | include 'includes/config.inc.php'; | ||
| 13 | |||
| 14 | $args = array(); | ||
| 15 | |||
| 16 | if (isset($_POST['authentication'], $_POST['username'], $_POST['password']) | ||
| 17 | && !empty($_POST['username']) | ||
| 18 | && !empty($_POST['password']) | ||
| 19 | ) | ||
| 20 | { | ||
| 21 | $args['headers'] = array( | ||
| 22 | 'Authorization' => sprintf('Basic %s', base64_encode($_POST['username'] .':'. $_POST['password'])) | ||
| 23 | ); | ||
| 24 | } | ||
| 25 | |||
| 26 | $response = wp_remote_head($_POST['url'], $args); | ||
| 27 | $status = wp_remote_retrieve_response_code($response); | ||
| 28 | $dictionary = wp_remote_retrieve_headers($response); | ||
| 29 | $responseHeaders = $dictionary ? $dictionary->getAll() : array(); | ||
| 30 | |||
| 31 | if ($status !== 200) | ||
| 32 | { | ||
| 33 | ?> | ||
| 34 | <section class="hh-panel"> | ||
| 35 | <h3><span class="hh-highlight"><?php _e('HTTP Status', 'http-headers'); ?>: <?php echo $status; ?></span></h3> | ||
| 36 | <p><?php | ||
| 37 | switch ($status) | ||
| 38 | { | ||
| 39 | case 400: | ||
| 40 | echo 'Bad Request'; | ||
| 41 | break; | ||
| 42 | case 401: | ||
| 43 | echo 'Unauthorized'; | ||
| 44 | break; | ||
| 45 | case 403: | ||
| 46 | echo 'Forbidden'; | ||
| 47 | break; | ||
| 48 | case 404: | ||
| 49 | echo 'Not Found'; | ||
| 50 | break; | ||
| 51 | case 405: | ||
| 52 | echo 'Method Not Allowed'; | ||
| 53 | break; | ||
| 54 | default: | ||
| 55 | } | ||
| 56 | ?></p> | ||
| 57 | </section> | ||
| 58 | <?php | ||
| 59 | exit; | ||
| 60 | } | ||
| 61 | ?> | ||
| 62 | <section class="hh-panel"> | ||
| 63 | <h3><span class="hh-highlight"><?php _e('Response headers', 'http-headers'); ?></span></h3> | ||
| 64 | <table class="hh-results"> | ||
| 65 | <thead> | ||
| 66 | <tr> | ||
| 67 | <th style="width: 30%"><?php _e('Header', 'http-headers'); ?></th> | ||
| 68 | <th><?php _e('Value', 'http-headers'); ?></th> | ||
| 69 | </tr> | ||
| 70 | </thead> | ||
| 71 | <tbody> | ||
| 72 | <?php | ||
| 73 | $reportOnly = array('content-security-policy-report-only'); | ||
| 74 | foreach ($responseHeaders as $k => $v) | ||
| 75 | { | ||
| 76 | $k = strtolower($k); | ||
| 77 | $found = in_array($k, $reportOnly); | ||
| 78 | $v = is_array($v) ? join(", ", $v) : $v; | ||
| 79 | ?> | ||
| 80 | <tr<?php echo array_key_exists($k, $headers) || $found ? ' class="hh-found"' : NULL; ?>> | ||
| 81 | <td><?php echo htmlspecialchars($k); ?></td> | ||
| 82 | <td><?php echo htmlspecialchars($v); ?></td> | ||
| 83 | </tr> | ||
| 84 | <?php | ||
| 85 | } | ||
| 86 | ?> | ||
| 87 | </tbody> | ||
| 88 | </table> | ||
| 89 | </section> | ||
| 90 | <?php | ||
| 91 | $special = array('content-security-policy'); | ||
| 92 | $exclude = array('custom-headers', 'cookie-security', 'x-powered-by'); | ||
| 93 | $missing = array(); | ||
| 94 | foreach ($headers as $k => $v) | ||
| 95 | { | ||
| 96 | if (!array_key_exists($k, $responseHeaders) | ||
| 97 | && !in_array($k, $exclude) | ||
| 98 | && !(in_array($k, $special) && array_key_exists($k . '-report-only', $responseHeaders) )) | ||
| 99 | { | ||
| 100 | $missing[$k] = @$categories[$v[2]]; | ||
| 101 | } | ||
| 102 | } | ||
| 103 | |||
| 104 | if (!empty($missing)) | ||
| 105 | { | ||
| 106 | asort($missing); | ||
| 107 | ?> | ||
| 108 | <section class="hh-panel"> | ||
| 109 | <h3><span class="hh-highlight"><?php _e('Missing headers', 'http-headers'); ?></span></h3> | ||
| 110 | <table class="hh-results"> | ||
| 111 | <thead> | ||
| 112 | <tr> | ||
| 113 | <th style="width: 30%"><?php _e('Header', 'http-headers'); ?></th> | ||
| 114 | <th><?php _e('Category', 'http-headers'); ?></th> | ||
| 115 | </tr> | ||
| 116 | </thead> | ||
| 117 | <tbody> | ||
| 118 | <?php | ||
| 119 | foreach ($missing as $k => $v) | ||
| 120 | { | ||
| 121 | ?> | ||
| 122 | <tr> | ||
| 123 | <td><a href="<?php echo get_admin_url(); ?>options-general.php?page=http-headers&header=<?php echo htmlspecialchars($k); ?>"><?php echo $k; ?></a></td> | ||
| 124 | <td><?php echo $v; ?></td> | ||
| 125 | </tr> | ||
| 126 | <?php | ||
| 127 | } | ||
| 128 | ?> | ||
| 129 | </tbody> | ||
| 130 | </table> | ||
| 131 | </section> | ||
| 132 | <?php | ||
| 133 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
File mode changed
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Cache-Control | ||
| 8 | <p class="description"><?php _e('The Cache-Control general-header field is used to specify directives for caching mechanisms in both, requests and responses. Caching directives are unidirectional, meaning that a given directive in a request is not implying that the same directive is to be given in the response.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Cache-Control</legend> | ||
| 17 | <?php | ||
| 18 | $cache_control = get_option('hh_cache_control', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_cache_control" value="<?php echo $k; ?>"<?php checked($cache_control, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-cc' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-cc' ); ?> | ||
| 29 | <?php | ||
| 30 | $items = array( | ||
| 31 | 'must-revalidate' => 'bool', | ||
| 32 | 'no-cache' => 'bool', | ||
| 33 | 'no-store' => 'bool', | ||
| 34 | 'no-transform' => 'bool', | ||
| 35 | 'public' => 'bool', | ||
| 36 | 'private' => 'bool', | ||
| 37 | 'proxy-revalidate' => 'bool', | ||
| 38 | 'max-age' => 'int', | ||
| 39 | 's-maxage' => 'int', | ||
| 40 | 'immutable' => 'bool', | ||
| 41 | 'stale-while-revalidate' => 'int', | ||
| 42 | 'stale-if-error' => 'int', | ||
| 43 | ); | ||
| 44 | ?> | ||
| 45 | <table> | ||
| 46 | <?php | ||
| 47 | $cache_control_value = get_option('hh_cache_control_value'); | ||
| 48 | if (!$cache_control_value) | ||
| 49 | { | ||
| 50 | $cache_control_value = array(); | ||
| 51 | } | ||
| 52 | foreach ($items as $item => $type) | ||
| 53 | { | ||
| 54 | ?> | ||
| 55 | <tr> | ||
| 56 | <td><label for="hh_cache_control_value_<?php echo $item; ?>"><?php echo $item; ?></label></td> | ||
| 57 | <td><?php | ||
| 58 | switch ($type) { | ||
| 59 | case 'bool': | ||
| 60 | ?><input type="checkbox" class="http-header-value" name="hh_cache_control_value[<?php echo $item; ?>]" id="hh_cache_control_value_<?php echo $item; ?>" value="1"<?php checked(array_key_exists($item, $cache_control_value), 1, true); ?>><?php | ||
| 61 | break; | ||
| 62 | case 'int': | ||
| 63 | ?><input type="text" class="http-header-value" name="hh_cache_control_value[<?php echo $item; ?>]" id="hh_cache_control_value_<?php echo $item; ?>" size="6" value="<?php echo array_key_exists($item, $cache_control_value) && strlen($cache_control_value[$item]) > 0 ? (int) $cache_control_value[$item] : NULL; ?>"> <?php _e('seconds', 'http-headers'); | ||
| 64 | break; | ||
| 65 | } | ||
| 66 | ?> | ||
| 67 | </td> | ||
| 68 | </tr> | ||
| 69 | <?php | ||
| 70 | } | ||
| 71 | ?> | ||
| 72 | </table> | ||
| 73 | </td> | ||
| 74 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | include dirname(__FILE__) . '/includes/config.inc.php'; | ||
| 6 | include dirname(__FILE__) . '/includes/breadcrumbs.inc.php'; | ||
| 7 | ?> | ||
| 8 | <table class="hh-index-table"> | ||
| 9 | <thead> | ||
| 10 | <tr> | ||
| 11 | <th><?php _e('Header', 'http-headers'); ?></th> | ||
| 12 | <th style="width: 45%"><?php _e('Value', 'http-headers'); ?></th> | ||
| 13 | <th class="hh-status"><?php _e('Status', 'http-headers'); ?></th> | ||
| 14 | <th></th> | ||
| 15 | </tr> | ||
| 16 | </thead> | ||
| 17 | <tbody> | ||
| 18 | <?php | ||
| 19 | foreach ($headers as $index => $item) | ||
| 20 | { | ||
| 21 | if (@$_GET['category'] != $item[2]) | ||
| 22 | { | ||
| 23 | continue; | ||
| 24 | } | ||
| 25 | |||
| 26 | $key = $item[1]; | ||
| 27 | |||
| 28 | $option = get_option($key, 0); | ||
| 29 | $isOn = (int) $option === 1; | ||
| 30 | $value = NULL; | ||
| 31 | if ($isOn) | ||
| 32 | { | ||
| 33 | $value = get_option($key .'_value'); | ||
| 34 | switch ($key) | ||
| 35 | { | ||
| 36 | case 'hh_age': | ||
| 37 | $value = (int) $value; | ||
| 38 | break; | ||
| 39 | case 'hh_p3p': | ||
| 40 | if (!empty($value)) | ||
| 41 | { | ||
| 42 | $value = sprintf('CP="%s"', join(' ', array_keys($value))); | ||
| 43 | } | ||
| 44 | break; | ||
| 45 | case 'hh_x_xxs_protection': | ||
| 46 | if ($value == '1; report=') { | ||
| 47 | $value .= get_option('hh_x_xxs_protection_uri'); | ||
| 48 | } | ||
| 49 | break; | ||
| 50 | case 'hh_x_powered_by': | ||
| 51 | if (get_option('hh_x_powered_by_option') == 'unset') { | ||
| 52 | $value = '[Unset]'; | ||
| 53 | } | ||
| 54 | break; | ||
| 55 | case 'hh_x_frame_options': | ||
| 56 | $value = strtoupper($value); | ||
| 57 | if ($value == 'ALLOW-FROM') | ||
| 58 | { | ||
| 59 | $value .= ' ' . get_option('hh_x_frame_options_domain'); | ||
| 60 | } | ||
| 61 | break; | ||
| 62 | case 'hh_strict_transport_security': | ||
| 63 | $tmp = array(); | ||
| 64 | $hh_strict_transport_security_max_age = get_option('hh_strict_transport_security_max_age'); | ||
| 65 | if ($hh_strict_transport_security_max_age !== false) | ||
| 66 | { | ||
| 67 | $tmp[] = sprintf('max-age=%u', $hh_strict_transport_security_max_age); | ||
| 68 | if (get_option('hh_strict_transport_security_sub_domains')) | ||
| 69 | { | ||
| 70 | $tmp[] = 'includeSubDomains'; | ||
| 71 | } | ||
| 72 | if (get_option('hh_strict_transport_security_preload')) | ||
| 73 | { | ||
| 74 | $tmp[] = 'preload'; | ||
| 75 | } | ||
| 76 | } else { | ||
| 77 | $tmp = array(get_option('hh_strict_transport_security_value')); | ||
| 78 | } | ||
| 79 | if (!empty($tmp)) | ||
| 80 | { | ||
| 81 | $value = join('; ', $tmp); | ||
| 82 | } | ||
| 83 | break; | ||
| 84 | case 'hh_timing_allow_origin': | ||
| 85 | if ($value == 'origin') | ||
| 86 | { | ||
| 87 | $value = get_option('hh_timing_allow_origin_url'); | ||
| 88 | } | ||
| 89 | break; | ||
| 90 | case 'hh_access_control_allow_origin': | ||
| 91 | if ($value == 'origin') | ||
| 92 | { | ||
| 93 | $value = join('<br>', get_option('hh_access_control_allow_origin_url', array())); | ||
| 94 | } | ||
| 95 | break; | ||
| 96 | case 'hh_access_control_expose_headers': | ||
| 97 | case 'hh_access_control_allow_headers': | ||
| 98 | case 'hh_access_control_allow_methods': | ||
| 99 | $value = join(', ', array_keys($value)); | ||
| 100 | break; | ||
| 101 | case 'hh_content_security_policy': | ||
| 102 | $value = build_csp_value($value); | ||
| 103 | if (get_option('hh_content_security_policy_report_only')) { | ||
| 104 | $item[0] .= '-Report-Only'; | ||
| 105 | } | ||
| 106 | break; | ||
| 107 | case 'hh_content_encoding': | ||
| 108 | $value = !$value ? null : join(', ', array_keys($value)); | ||
| 109 | |||
| 110 | $ext = get_option('hh_content_encoding_ext'); | ||
| 111 | if (!empty($ext)) { | ||
| 112 | $ext = join(', ', array_keys($ext)); | ||
| 113 | $value .= (!empty($value) ? '<br>' : null) . $ext; | ||
| 114 | } | ||
| 115 | $module = get_option('hh_content_encoding_module'); | ||
| 116 | switch ($module) { | ||
| 117 | case 'brotli_deflate': | ||
| 118 | $enc = 'br, gzip'; | ||
| 119 | break; | ||
| 120 | case 'brotli': | ||
| 121 | $enc = 'br'; | ||
| 122 | break; | ||
| 123 | case 'deflate': | ||
| 124 | default: | ||
| 125 | $enc = 'gzip'; | ||
| 126 | break; | ||
| 127 | } | ||
| 128 | |||
| 129 | $value = !empty($value) ? sprintf('%s (%s)', $enc, $value) : $enc; | ||
| 130 | break; | ||
| 131 | case 'hh_vary': | ||
| 132 | $value = !$value ? null : join(', ', array_keys($value)); | ||
| 133 | break; | ||
| 134 | case 'hh_www_authenticate': | ||
| 135 | $value = get_option('hh_www_authenticate_type'); | ||
| 136 | break; | ||
| 137 | case 'hh_cache_control': | ||
| 138 | $tmp = array(); | ||
| 139 | foreach ($value as $k => $v) { | ||
| 140 | if (in_array($k, array('max-age', 's-maxage', 'stale-while-revalidate', 'stale-if-error'))) { | ||
| 141 | if (strlen($v) > 0) { | ||
| 142 | $tmp[] = sprintf("%s=%u", $k, $v); | ||
| 143 | } | ||
| 144 | } else { | ||
| 145 | $tmp[] = $k; | ||
| 146 | } | ||
| 147 | } | ||
| 148 | $value = join(', ', $tmp); | ||
| 149 | break; | ||
| 150 | case 'hh_expires': | ||
| 151 | $tmp = array(); | ||
| 152 | $types = get_option('hh_expires_type', array()); | ||
| 153 | foreach ($types as $type => $whatever) { | ||
| 154 | list($base, $period, $suffix) = explode('_', $value[$type]); | ||
| 155 | if (in_array($base, array('access', 'modification'))) { | ||
| 156 | $tmp[] = $type != 'default' | ||
| 157 | ? sprintf('%s = "%s plus %u %s"', $type, $base, $period, $suffix) | ||
| 158 | : sprintf('default = "%s plus %u %s"', $base, $period, $suffix); | ||
| 159 | } elseif ($base == 'invalid') { | ||
| 160 | $tmp[] = $type != 'default' | ||
| 161 | ? sprintf('%s = A0', $type) | ||
| 162 | : sprintf('default = A0'); | ||
| 163 | } | ||
| 164 | } | ||
| 165 | $value = join('<br>', $tmp); | ||
| 166 | break; | ||
| 167 | case 'hh_cookie_security': | ||
| 168 | if (is_array($value)) { | ||
| 169 | if (isset($value['SameSite']) && !is_samesite_supported()) { | ||
| 170 | unset($value['SameSite']); | ||
| 171 | } | ||
| 172 | } | ||
| 173 | $value = is_array($value) && !empty($value) | ||
| 174 | ? '✔ ' . join(' ✔ ', array_keys($value)) | ||
| 175 | : NULL; | ||
| 176 | break; | ||
| 177 | case 'hh_expect_ct': | ||
| 178 | $tmp = array(); | ||
| 179 | $tmp[] = sprintf('max-age=%u', get_option('hh_expect_ct_max_age')); | ||
| 180 | if (get_option('hh_expect_ct_enforce') == 1) { | ||
| 181 | $tmp[] = 'enforce'; | ||
| 182 | } | ||
| 183 | $tmp[] = sprintf('report-uri="%s"', get_option('hh_expect_ct_report_uri')); | ||
| 184 | $value = join(', ', $tmp); | ||
| 185 | break; | ||
| 186 | case 'hh_custom_headers': | ||
| 187 | $_names = array($item[0]); | ||
| 188 | $_values = array(' '); | ||
| 189 | foreach ($value['name'] as $key => $name) | ||
| 190 | { | ||
| 191 | if (!empty($name) && !empty($value['value'][$key])) | ||
| 192 | { | ||
| 193 | $_names[] = '<p class="hh-p"> '.$name.'</p>'; | ||
| 194 | $_values[] = '<p class="hh-p">'.$value['value'][$key].'</p>'; | ||
| 195 | } | ||
| 196 | } | ||
| 197 | $item[0] = join('', $_names); | ||
| 198 | $value = join('', $_values); | ||
| 199 | break; | ||
| 200 | case 'hh_report_to': | ||
| 201 | $value = get_http_header('report_to'); | ||
| 202 | break; | ||
| 203 | case 'hh_nel': | ||
| 204 | $value = get_http_header('nel'); | ||
| 205 | break; | ||
| 206 | case 'hh_feature_policy': | ||
| 207 | $value = get_http_header('feature_policy'); | ||
| 208 | break; | ||
| 209 | case 'hh_permissions_policy': | ||
| 210 | $value = get_http_header('permissions_policy'); | ||
| 211 | break; | ||
| 212 | case 'hh_x_robots_tag': | ||
| 213 | $value = get_http_header('x_robots_tag'); | ||
| 214 | break; | ||
| 215 | case 'hh_clear_site_data': | ||
| 216 | $value = '"' . join('", "', array_keys($value)) . '"'; | ||
| 217 | break; | ||
| 218 | case 'hh_content_type': | ||
| 219 | $tmp = array(); | ||
| 220 | foreach ($value as $key => $val) { | ||
| 221 | $tmp[] = sprintf(".%s => %s", $key, $val); | ||
| 222 | } | ||
| 223 | $value = join("<br>", $tmp); | ||
| 224 | break; | ||
| 225 | default: | ||
| 226 | $value = !is_array($value) ? $value : join(', ', $value); | ||
| 227 | } | ||
| 228 | } | ||
| 229 | $status = $isOn ? __('On', 'http-headers') : __('Off', 'http-headers'); | ||
| 230 | ?> | ||
| 231 | <tr<?php echo $isOn ? ' class="active"' : NULL; ?>> | ||
| 232 | <td><?php echo $item[0]; ?></td> | ||
| 233 | <td><?php echo $value; ?></td> | ||
| 234 | <td class="hh-status hh-status-<?php echo $isOn ? 'on' : 'off'; ?>"><span><?php echo $status; ?></span></td> | ||
| 235 | <td><a href="<?php echo get_admin_url(); ?>options-general.php?page=http-headers&header=<?php | ||
| 236 | echo $index; ?>"><?php _e('Edit', 'http-headers'); ?></a></td> | ||
| 237 | </tr> | ||
| 238 | <?php | ||
| 239 | } | ||
| 240 | ?> | ||
| 241 | </tbody> | ||
| 242 | </table> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Clear-Site-Data | ||
| 8 | <p class="description"><?php _e('The Clear-Site-Data header clears browsing data (cookies, storage, cache) associated with the requesting website. It allows web developers to have more control over the data stored locally by a browser for their origins.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Clear-Site-Data</legend> | ||
| 17 | <?php | ||
| 18 | $clear_site_data = get_option('hh_clear_site_data', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_clear_site_data" value="<?php echo $k; ?>"<?php checked($clear_site_data, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-csd' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-csd' ); ?> | ||
| 29 | <?php | ||
| 30 | $items = array( | ||
| 31 | 'cache' => 'bool', | ||
| 32 | 'cookies' => 'bool', | ||
| 33 | 'storage' => 'bool', | ||
| 34 | 'executionContexts' => 'bool', | ||
| 35 | '*' => 'bool', | ||
| 36 | ); | ||
| 37 | ?> | ||
| 38 | <table> | ||
| 39 | <?php | ||
| 40 | $clear_site_data_value = get_option('hh_clear_site_data_value'); | ||
| 41 | if (!$clear_site_data_value) | ||
| 42 | { | ||
| 43 | $clear_site_data_value = array(); | ||
| 44 | } | ||
| 45 | foreach ($items as $item => $type) | ||
| 46 | { | ||
| 47 | ?> | ||
| 48 | <tr> | ||
| 49 | <td><label for="hh_clear_site_data_value_<?php echo $item; ?>">"<?php echo $item; ?>"</label></td> | ||
| 50 | <td><?php | ||
| 51 | switch ($type) { | ||
| 52 | case 'bool': | ||
| 53 | ?><input type="checkbox" class="http-header-value" name="hh_clear_site_data_value[<?php echo $item; ?>]" id="hh_clear_site_data_value_<?php echo $item; ?>" value="1"<?php checked(array_key_exists($item, $clear_site_data_value), 1, true); ?>><?php | ||
| 54 | break; | ||
| 55 | } | ||
| 56 | ?> | ||
| 57 | </td> | ||
| 58 | </tr> | ||
| 59 | <?php | ||
| 60 | } | ||
| 61 | ?> | ||
| 62 | </table> | ||
| 63 | </td> | ||
| 64 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">Connection | ||
| 8 | <p class="description"><?php _e('The Connection general header controls whether or not the network connection stays open after the current transaction finishes. If the value sent is keep-alive, the connection is persistent and not closed, allowing for subsequent requests to the same server to be done.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Connection</legend> | ||
| 17 | <?php | ||
| 18 | $connection = get_option('hh_connection', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_connection" value="<?php echo $k; ?>"<?php checked($connection, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-con' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-con' ); ?> | ||
| 29 | <select name="hh_connection_value" class="http-header-value"<?php echo $connection == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('keep-alive', 'close'); | ||
| 32 | $connection_value = get_option('hh_connection_value'); | ||
| 33 | foreach ($items as $item) { | ||
| 34 | ?><option value="<?php echo $item; ?>"<?php selected($connection_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | </td> | ||
| 39 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Content-Encoding | ||
| 8 | <p class="description"><?php _e('Compression is an important way to increase the performance of a Web site. For some documents, size reduction of up to 70% lowers the bandwidth capacity needs.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Content-Encoding</legend> | ||
| 17 | <?php | ||
| 18 | $content_encoding = get_option('hh_content_encoding', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_content_encoding" value="<?php echo $k; ?>"<?php checked($content_encoding, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-ce' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-ce' ); ?> | ||
| 29 | <table> | ||
| 30 | <tbody> | ||
| 31 | <tr> | ||
| 32 | <th colspan="2"><?php _e('Module', 'http-headers'); ?></th> | ||
| 33 | </tr> | ||
| 34 | <?php | ||
| 35 | $content_encoding_module = get_option('hh_content_encoding_module'); | ||
| 36 | ?> | ||
| 37 | <tr> | ||
| 38 | <td colspan="2" class="hh-td-inner"> | ||
| 39 | <table style="width: 100%"> | ||
| 40 | <tbody> | ||
| 41 | <tr> | ||
| 42 | <td> | ||
| 43 | <label><input type="radio" name="hh_content_encoding_module" value="deflate"<?php echo $content_encoding_module == 'deflate' || !$content_encoding_module ? ' checked' : NULL; ?>> <?php _e('DEFLATE', 'http-headers'); ?></label> | ||
| 44 | </td> | ||
| 45 | <td> | ||
| 46 | <label><input type="radio" name="hh_content_encoding_module" value="brotli"<?php checked($content_encoding_module, 'brotli'); ?>> <?php _e('BROTLI', 'http-headers'); ?></label> | ||
| 47 | </td> | ||
| 48 | <td> | ||
| 49 | <label><input type="radio" name="hh_content_encoding_module" value="brotli_deflate"<?php checked($content_encoding_module, 'brotli_deflate'); ?>> <?php _e('BROTLI; DEFLATE', 'http-headers'); ?></label> | ||
| 50 | </td> | ||
| 51 | </tr> | ||
| 52 | </tbody> | ||
| 53 | </table> | ||
| 54 | </td> | ||
| 55 | </tr> | ||
| 56 | <tr> | ||
| 57 | <th colspan="2"><?php _e('By content type', 'http-headers'); ?></th> | ||
| 58 | </tr><tr> | ||
| 59 | <?php | ||
| 60 | $items = array( | ||
| 61 | 'application/javascript', | ||
| 62 | 'application/x-javascript', | ||
| 63 | 'application/json', | ||
| 64 | 'application/ld+json', | ||
| 65 | 'application/manifest+json', | ||
| 66 | 'application/rdf+xml', | ||
| 67 | 'application/rss+xml', | ||
| 68 | 'application/schema+json', | ||
| 69 | 'application/vnd.geo+json', | ||
| 70 | 'application/x-web-app-manifest+json', | ||
| 71 | 'application/vnd.ms-fontobject', | ||
| 72 | 'application/x-font-ttf', | ||
| 73 | 'application/xhtml+xml', | ||
| 74 | 'application/xml', | ||
| 75 | 'font/opentype', | ||
| 76 | 'font/eot', | ||
| 77 | 'image/bmp', | ||
| 78 | 'image/svg+xml', | ||
| 79 | 'image/x-icon', | ||
| 80 | 'image/vnd.microsoft.icon', | ||
| 81 | 'text/javascript', | ||
| 82 | 'text/css', | ||
| 83 | 'text/html', | ||
| 84 | 'text/plain', | ||
| 85 | 'text/x-component', | ||
| 86 | 'text/xml', | ||
| 87 | ); | ||
| 88 | $content_encoding_value = get_option('hh_content_encoding_value'); | ||
| 89 | if (!$content_encoding_value) { | ||
| 90 | $content_encoding_value = array(); | ||
| 91 | } | ||
| 92 | foreach ($items as $i => $item) { | ||
| 93 | if ($i > 0 && $i % 2 === 0) { | ||
| 94 | ?></tr><tr><?php | ||
| 95 | } | ||
| 96 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_content_encoding_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $content_encoding_value) ? NULL : ' checked'; ?><?php echo $content_encoding == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 97 | } | ||
| 98 | ?> | ||
| 99 | </tr> | ||
| 100 | |||
| 101 | <tr> | ||
| 102 | <th colspan="2"><?php _e('By extension', 'http-headers'); ?></th> | ||
| 103 | </tr> | ||
| 104 | <tr> | ||
| 105 | <?php | ||
| 106 | $content_encoding_ext = get_option('hh_content_encoding_ext'); | ||
| 107 | if (!$content_encoding_ext) { | ||
| 108 | $content_encoding_ext = array(); | ||
| 109 | } | ||
| 110 | $items = array('php', 'html', 'js', 'css', 'json', 'xml', 'svg', 'txt', 'bmp', 'ico', 'ttf', 'otf', 'eot'); | ||
| 111 | foreach ($items as $i => $item) { | ||
| 112 | if ($i > 0 && $i % 2 === 0) { | ||
| 113 | ?></tr><tr><?php | ||
| 114 | } | ||
| 115 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_content_encoding_ext[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $content_encoding_ext) ? NULL : ' checked'; ?><?php echo $content_encoding == 1 ? NULL : ' readonly'; ?> /> *.<?php echo $item; ?></label></td><?php | ||
| 116 | } | ||
| 117 | ?> | ||
| 118 | </tr> | ||
| 119 | |||
| 120 | </tbody></table> | ||
| 121 | </td> | ||
| 122 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | $content_security_policy = get_option('hh_content_security_policy', 0); | ||
| 6 | ?> | ||
| 7 | <tr valign="top"> | ||
| 8 | <th scope="row">Content Security Policy | ||
| 9 | <p class="description"><?php _e('Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement or distribution of malware.', 'http-headers'); ?></p> | ||
| 10 | |||
| 11 | <p> | ||
| 12 | <label><input type="checkbox" class="http-header-value" | ||
| 13 | name="hh_content_security_policy_report_only" value="1" | ||
| 14 | <?php checked(get_option('hh_content_security_policy_report_only'), 1, true); ?> | ||
| 15 | <?php echo $content_security_policy == 1 ? NULL : ' readonly'; ?> /> "Report-Only" (<?php _e('for reporting-only purposes', 'http-headers'); ?>)</label> | ||
| 16 | </p> | ||
| 17 | <hr> | ||
| 18 | <p class="description">Useful tools:</p> | ||
| 19 | <p class="description"> | ||
| 20 | <a target="_blank" href="https://zinoui.com/tools/sri-generator">SRI Hash Generator</a> | ||
| 21 | - generates subresource integrity hashes using a cryptographic algorithm. | ||
| 22 | </p> | ||
| 23 | <p class="description"> | ||
| 24 | <a target="_blank" href="https://zinoui.com/tools/csp-hash">CSP Hash Generator</a> | ||
| 25 | - generates CSP hashes to use in script-src and style-src directives. | ||
| 26 | </p> | ||
| 27 | <hr> | ||
| 28 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 29 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 30 | </p> | ||
| 31 | </th> | ||
| 32 | <td> | ||
| 33 | <fieldset> | ||
| 34 | <legend class="screen-reader-text">Content-Security-Policy</legend> | ||
| 35 | <?php | ||
| 36 | foreach ($bools as $k => $v) | ||
| 37 | { | ||
| 38 | ?><p><label><input type="radio" class="http-header" name="hh_content_security_policy" value="<?php echo $k; ?>"<?php checked($content_security_policy, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 39 | } | ||
| 40 | ?> | ||
| 41 | </fieldset> | ||
| 42 | </td> | ||
| 43 | <td> | ||
| 44 | <?php settings_fields( 'http-headers-csp' ); ?> | ||
| 45 | <?php do_settings_sections( 'http-headers-csp' ); ?> | ||
| 46 | <table> | ||
| 47 | <tbody> | ||
| 48 | <tr> | ||
| 49 | <td><strong><?php _e('Directive', 'http-headers'); ?></strong></td> | ||
| 50 | <td><strong><?php _e('Value', 'http-headers'); ?></strong></td> | ||
| 51 | </tr> | ||
| 52 | <?php | ||
| 53 | $directives = array( | ||
| 54 | 'default-src', | ||
| 55 | 'script-src', | ||
| 56 | 'style-src', | ||
| 57 | 'img-src', | ||
| 58 | 'connect-src', | ||
| 59 | 'font-src', | ||
| 60 | 'media-src', | ||
| 61 | 'report-uri', | ||
| 62 | 'child-src', | ||
| 63 | 'form-action', | ||
| 64 | 'frame-ancestors', | ||
| 65 | 'object-src', | ||
| 66 | 'frame-src', | ||
| 67 | 'worker-src', | ||
| 68 | 'manifest-src', | ||
| 69 | 'navigate-to', | ||
| 70 | 'prefetch-src', | ||
| 71 | 'base-uri', | ||
| 72 | 'plugin-types', | ||
| 73 | 'report-to', | ||
| 74 | 'sandbox', | ||
| 75 | 'require-sri-for', | ||
| 76 | 'block-all-mixed-content', | ||
| 77 | 'upgrade-insecure-requests', | ||
| 78 | ); | ||
| 79 | $csp_value = get_option('hh_content_security_policy_value'); | ||
| 80 | foreach ($directives as $item) | ||
| 81 | { | ||
| 82 | ?> | ||
| 83 | <tr> | ||
| 84 | <td><?php echo $item; ?></td> | ||
| 85 | <td> | ||
| 86 | <?php | ||
| 87 | |||
| 88 | if ($item == 'sandbox') | ||
| 89 | { | ||
| 90 | include 'includes/csp-sandbox.inc.php'; | ||
| 91 | |||
| 92 | } elseif (in_array($item, array('block-all-mixed-content', 'upgrade-insecure-requests'))) { | ||
| 93 | |||
| 94 | include 'includes/csp-inc.inc.php'; | ||
| 95 | |||
| 96 | } elseif (in_array($item, array('report-to', 'plugin-types'))) { | ||
| 97 | |||
| 98 | include 'includes/csp-text.inc.php'; | ||
| 99 | |||
| 100 | } elseif ($item == 'require-sri-for') { | ||
| 101 | |||
| 102 | include 'includes/csp-sri.inc.php'; | ||
| 103 | |||
| 104 | } else { | ||
| 105 | |||
| 106 | include 'includes/csp-src.inc.php'; | ||
| 107 | |||
| 108 | } | ||
| 109 | ?> | ||
| 110 | </td> | ||
| 111 | </tr> | ||
| 112 | <?php | ||
| 113 | } | ||
| 114 | ?> | ||
| 115 | </tbody> | ||
| 116 | </table> | ||
| 117 | </td> | ||
| 118 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Content-Type | ||
| 8 | <p class="description"><?php _e('The Content-Type entity header is used to indicate the media type of the resource. In responses, a Content-Type header tells the client what the content type of the returned content actually is. Browsers will do MIME sniffing in some cases and will not necessarily follow the value of this header; to prevent this behavior, the header X-Content-Type-Options can be set to nosniff.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Content-Type</legend> | ||
| 17 | <?php | ||
| 18 | $content_type = get_option('hh_content_type', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_content_type" value="<?php echo $k; ?>"<?php checked($content_type, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields('http-headers-cty'); ?> | ||
| 28 | <?php do_settings_sections('http-headers-cty'); ?> | ||
| 29 | <?php | ||
| 30 | $content_type_value = get_option('hh_content_type_value'); | ||
| 31 | if (!$content_type_value) { | ||
| 32 | $content_type_value = array(); | ||
| 33 | } | ||
| 34 | |||
| 35 | $map = array( | ||
| 36 | 'eot' => 'application/vnd.ms-fontobject', | ||
| 37 | 'otf' => 'application/x-font-opentype', | ||
| 38 | 'svg' => 'image/svg+xml', | ||
| 39 | 'ttf' => 'application/x-font-ttf', | ||
| 40 | 'woff' => 'application/font-woff', | ||
| 41 | 'woff2' => 'application/font-woff2', | ||
| 42 | 'jsonp' => 'application/javascript', | ||
| 43 | ); | ||
| 44 | ?> | ||
| 45 | <table> | ||
| 46 | <tbody> | ||
| 47 | <tr> | ||
| 48 | <td></td> | ||
| 49 | <td><strong><?php _e('Extension', 'http-headers'); ?></strong></td> | ||
| 50 | <td><strong><?php _e('Media type', 'http-headers'); ?></strong></td> | ||
| 51 | </tr> | ||
| 52 | <?php | ||
| 53 | foreach ($map as $ext => $media_type) | ||
| 54 | { | ||
| 55 | ?> | ||
| 56 | <tr> | ||
| 57 | <td> | ||
| 58 | <input type="checkbox" class="http-header-value" | ||
| 59 | name="hh_content_type_value[<?php echo $ext; ?>]" | ||
| 60 | value="<?php echo $media_type; ?>"<?php | ||
| 61 | echo !(array_key_exists($ext, $content_type_value) && $content_type_value[$ext] == $media_type) ? NULL : ' checked'; | ||
| 62 | echo $content_type == 1 ? NULL : ' readonly'; ?>></td> | ||
| 63 | <td>.<?php echo $ext; ?></td> | ||
| 64 | <td><?php echo $media_type; ?></td> | ||
| 65 | </tr> | ||
| 66 | <?php | ||
| 67 | } | ||
| 68 | ?> | ||
| 69 | </tbody> | ||
| 70 | </table> | ||
| 71 | </td> | ||
| 72 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Cookie security | ||
| 8 | <p class="description"><?php _e('A secure cookie is only sent to the server with a encrypted request over the HTTPS protocol.', 'http-headers'); ?></p> | ||
| 9 | <p class="description"><?php _e("To prevent cross-site scripting (XSS) attacks, HttpOnly cookies are inaccessible to JavaScript's Document.cookie API; they are only sent to the server.", 'http-headers'); ?></p> | ||
| 10 | <p class="description"><?php _e('SameSite prevents the browser from sending this cookie along with cross-site requests. The main goal is mitigate the risk of cross-origin information leakage. It also provides some protection against cross-site request forgery attacks.', 'http-headers'); ?></p> | ||
| 11 | <hr> | ||
| 12 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 13 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Secure_and_HttpOnly_cookies"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 14 | </p> | ||
| 15 | </th> | ||
| 16 | <td> | ||
| 17 | <fieldset> | ||
| 18 | <legend class="screen-reader-text">Cookie security</legend> | ||
| 19 | <?php | ||
| 20 | $cookie_security = get_option('hh_cookie_security', 0); | ||
| 21 | foreach ($bools as $k => $v) | ||
| 22 | { | ||
| 23 | ?><p><label><input type="radio" class="http-header" name="hh_cookie_security" value="<?php echo $k; ?>"<?php checked($cookie_security, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 24 | } | ||
| 25 | ?> | ||
| 26 | </fieldset> | ||
| 27 | </td> | ||
| 28 | <td> | ||
| 29 | <?php settings_fields( 'http-headers-cose' ); ?> | ||
| 30 | <?php do_settings_sections( 'http-headers-cose' ); ?> | ||
| 31 | <?php | ||
| 32 | $items = array('Secure', 'HttpOnly', 'SameSite'); | ||
| 33 | $cookie_security_value = get_option('hh_cookie_security_value'); | ||
| 34 | foreach ($items as $item) | ||
| 35 | { | ||
| 36 | $is_checked = is_array($cookie_security_value) && array_key_exists($item, $cookie_security_value); | ||
| 37 | ?> | ||
| 38 | <p> | ||
| 39 | <label><input type="checkbox" | ||
| 40 | class="http-header-value" | ||
| 41 | name="hh_cookie_security_value[<?php echo $item; ?>]" | ||
| 42 | value="1"<?php echo !$is_checked ? NULL : ' checked'; ?><?php echo $cookie_security == 1 ? NULL : ' readonly'; ?>> <?php echo $item; ?><?php | ||
| 43 | ?></label> | ||
| 44 | </p> | ||
| 45 | <?php | ||
| 46 | if ($item == 'SameSite') | ||
| 47 | { | ||
| 48 | foreach (array('None', 'Lax', 'Strict') as $s_val) | ||
| 49 | { | ||
| 50 | ?> | ||
| 51 | <p class="hh-csv-value<?php echo !$is_checked ? ' hh-hidden' : NULL; ?>"> | ||
| 52 | <label><input type="radio" | ||
| 53 | class="http-header-value" | ||
| 54 | name="hh_cookie_security_value[SameSite]" | ||
| 55 | value="<?php echo $s_val; ?>"<?php echo !is_array($cookie_security_value) || !array_key_exists($item, $cookie_security_value) || $cookie_security_value[$item] != $s_val ? NULL : ' checked'; ?><?php echo $cookie_security == 1 ? NULL : ' readonly'; ?>> <?php echo $s_val; ?></label> | ||
| 56 | </p> | ||
| 57 | <?php | ||
| 58 | } | ||
| 59 | } | ||
| 60 | } | ||
| 61 | ?> | ||
| 62 | </td> | ||
| 63 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Cross-Origin-Embedder-Policy | ||
| 8 | <p class="description"><?php _e("The HTTP Cross-Origin-Embedder-Policy (COEP) response header prevents a document from loading any cross-origin resources that don't explicitly grant the document permission (using CORP or CORS).", 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Cross-Origin-Embedder-Policy</legend> | ||
| 17 | <?php | ||
| 18 | $cross_origin_embedder_policy = get_option('hh_cross_origin_embedder_policy', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_cross_origin_embedder_policy" value="<?php echo $k; ?>"<?php checked($cross_origin_embedder_policy, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-coep' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-coep' ); ?> | ||
| 29 | <select name="hh_cross_origin_embedder_policy_value" class="http-header-value"<?php echo $cross_origin_embedder_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('unsafe-none', 'require-corp'); | ||
| 32 | $cross_origin_embedder_policy_value = get_option('hh_cross_origin_embedder_policy_value'); | ||
| 33 | foreach ($items as $item) { | ||
| 34 | ?><option value="<?php echo $item; ?>"<?php selected($cross_origin_embedder_policy_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | </td> | ||
| 39 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Cross-Origin-Opener-Policy | ||
| 8 | <p class="description"><?php _e('The HTTP Cross-Origin-Opener-Policy (COOP) response header allows you to ensure a top-level document does not share a browsing context group with cross-origin documents.', 'http-headers'); ?></p> | ||
| 9 | <p class="description"><?php _e("COOP will process-isolate your document and potential attackers can't access to your global object if they were opening it in a popup, preventing a set of cross-origin attacks dubbed XS-Leaks.", 'http-headers'); ?></p> | ||
| 10 | <p class="description"><?php _e('If a cross-origin document with COOP is opened in a new window, the opening document will not have a reference to it, and the window.opener property of the new window will be null. This allows you to have more control over references to a window than rel=noopener, which only affects outgoing navigations.', 'http-headers'); ?></p> | ||
| 11 | <hr> | ||
| 12 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 13 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 14 | </p> | ||
| 15 | </th> | ||
| 16 | <td> | ||
| 17 | <fieldset> | ||
| 18 | <legend class="screen-reader-text">Cross-Origin-Opener-Policy</legend> | ||
| 19 | <?php | ||
| 20 | $cross_origin_opener_policy = get_option('hh_cross_origin_opener_policy', 0); | ||
| 21 | foreach ($bools as $k => $v) | ||
| 22 | { | ||
| 23 | ?><p><label><input type="radio" class="http-header" name="hh_cross_origin_opener_policy" value="<?php echo $k; ?>"<?php checked($cross_origin_opener_policy, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 24 | } | ||
| 25 | ?> | ||
| 26 | </fieldset> | ||
| 27 | </td> | ||
| 28 | <td> | ||
| 29 | <?php settings_fields( 'http-headers-coop' ); ?> | ||
| 30 | <?php do_settings_sections( 'http-headers-coop' ); ?> | ||
| 31 | <select name="hh_cross_origin_opener_policy_value" class="http-header-value"<?php echo $cross_origin_opener_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 32 | <?php | ||
| 33 | $items = array('unsafe-none', 'same-origin-allow-popups', 'same-origin'); | ||
| 34 | $cross_origin_opener_policy_value = get_option('hh_cross_origin_opener_policy_value'); | ||
| 35 | foreach ($items as $item) { | ||
| 36 | ?><option value="<?php echo $item; ?>"<?php selected($cross_origin_opener_policy_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 37 | } | ||
| 38 | ?> | ||
| 39 | </select> | ||
| 40 | </td> | ||
| 41 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Cross-Origin-Resource-Policy | ||
| 8 | <p class="description"><?php _e('The HTTP Cross-Origin-Resource-Policy response header conveys a desire that the browser blocks no-cors cross-origin/cross-site requests to the given resource.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Resource-Policy"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Cross-Origin-Resource-Policy</legend> | ||
| 17 | <?php | ||
| 18 | $cross_origin_resource_policy = get_option('hh_cross_origin_resource_policy', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_cross_origin_resource_policy" value="<?php echo $k; ?>"<?php checked($cross_origin_resource_policy, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-corp' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-corp' ); ?> | ||
| 29 | <select name="hh_cross_origin_resource_policy_value" class="http-header-value"<?php echo $cross_origin_resource_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('same-site', 'same-origin', 'cross-origin'); | ||
| 32 | $cross_origin_resource_policy_value = get_option('hh_cross_origin_resource_policy_value'); | ||
| 33 | foreach ($items as $item) { | ||
| 34 | ?><option value="<?php echo $item; ?>"<?php selected($cross_origin_resource_policy_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | </td> | ||
| 39 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Custom headers | ||
| 8 | <p class="description"><?php _e('Common non-standard response fields:', 'http-headers'); ?> | ||
| 9 | <br>X-Pingback | ||
| 10 | <br>X-Cache | ||
| 11 | <br>X-Edge-Location | ||
| 12 | <br>X-HTTP-Method-Override | ||
| 13 | <br>X-Csrf-Token | ||
| 14 | <br>X-Request-ID | ||
| 15 | <br>X-Correlation-ID | ||
| 16 | <br>X-Content-Duration | ||
| 17 | </p> | ||
| 18 | </th> | ||
| 19 | <td> | ||
| 20 | <fieldset> | ||
| 21 | <legend class="screen-reader-text">Custom headers</legend> | ||
| 22 | <?php | ||
| 23 | $custom_headers = get_option('hh_custom_headers', 0); | ||
| 24 | foreach ($bools as $k => $v) | ||
| 25 | { | ||
| 26 | ?><p><label><input type="radio" class="http-header" name="hh_custom_headers" value="<?php echo $k; ?>"<?php checked($custom_headers, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 27 | } | ||
| 28 | ?> | ||
| 29 | </fieldset> | ||
| 30 | </td> | ||
| 31 | <td> | ||
| 32 | <?php settings_fields( 'http-headers-che' ); ?> | ||
| 33 | <?php do_settings_sections( 'http-headers-che' ); ?> | ||
| 34 | <?php | ||
| 35 | $custom_headers_value = get_option('hh_custom_headers_value'); | ||
| 36 | if (!$custom_headers_value) { | ||
| 37 | $custom_headers_value = array(); | ||
| 38 | } | ||
| 39 | ?> | ||
| 40 | <table> | ||
| 41 | <thead> | ||
| 42 | <tr> | ||
| 43 | <th><?php _e('Header', 'http-headers'); ?></th> | ||
| 44 | <th><?php _e('Value', 'http-headers'); ?></th> | ||
| 45 | <th></th> | ||
| 46 | </tr> | ||
| 47 | </thead> | ||
| 48 | <tbody> | ||
| 49 | <?php | ||
| 50 | if (empty($custom_headers_value)) | ||
| 51 | { | ||
| 52 | ?> | ||
| 53 | <tr> | ||
| 54 | <td><input type="text" name="hh_custom_headers_value[name][]" class="http-header-value" placeholder="X-Custom-Name"></td> | ||
| 55 | <td><input type="text" name="hh_custom_headers_value[value][]" class="http-header-value" placeholder="<?php esc_attr_e('Value', 'http-headers'); ?>"></td> | ||
| 56 | <td></td> | ||
| 57 | </tr> | ||
| 58 | <?php | ||
| 59 | } else { | ||
| 60 | foreach ($custom_headers_value['name'] as $key => $name) | ||
| 61 | { | ||
| 62 | if (empty($name) || empty($custom_headers_value['value'][$key])) | ||
| 63 | { | ||
| 64 | continue; | ||
| 65 | } | ||
| 66 | ?> | ||
| 67 | <tr> | ||
| 68 | <td><input type="text" name="hh_custom_headers_value[name][]" class="http-header-value" placeholder="X-Custom-Name" value="<?php echo esc_attr($name); ?>"<?php echo $custom_headers == 1 ? NULL : ' readonly'; ?>></td> | ||
| 69 | <td><input type="text" name="hh_custom_headers_value[value][]" class="http-header-value" placeholder="<?php esc_attr_e('Value', 'http-headers'); ?>" value="<?php echo esc_attr($custom_headers_value['value'][$key]); ?>"<?php echo $custom_headers == 1 ? NULL : ' readonly'; ?>></td> | ||
| 70 | <td><button type="button" class="button button-small hh-btn-delete-header" title="<?php esc_attr_e('Delete', 'http-headers'); ?>">x</button></td> | ||
| 71 | </tr> | ||
| 72 | <?php | ||
| 73 | } | ||
| 74 | } | ||
| 75 | ?> | ||
| 76 | <tr> | ||
| 77 | <td colspan="3"><button type="button" class="button" id="hh-btn-add-header">+ <?php _e('Add header', 'http-headers'); ?></button></td> | ||
| 78 | </tr> | ||
| 79 | </tbody> | ||
| 80 | </table> | ||
| 81 | </td> | ||
| 82 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | include dirname(__FILE__) . '/includes/config.inc.php'; | ||
| 6 | ?> | ||
| 7 | <div class="hh-wrapper"> | ||
| 8 | <div class="hh-categories"> | ||
| 9 | <?php | ||
| 10 | $tmp = array(); | ||
| 11 | foreach ($headers as $item) | ||
| 12 | { | ||
| 13 | if (!isset($tmp[$item[2]])) | ||
| 14 | { | ||
| 15 | $tmp[$item[2]] = array('total' => 0, 'on' => 0); | ||
| 16 | } | ||
| 17 | $tmp[$item[2]]['total'] += 1; | ||
| 18 | if (get_option($item[1]) == 1) | ||
| 19 | { | ||
| 20 | $tmp[$item[2]]['on'] += 1; | ||
| 21 | } | ||
| 22 | } | ||
| 23 | foreach ($categories as $key => $val) | ||
| 24 | { | ||
| 25 | ?> | ||
| 26 | <a href="<?php echo get_admin_url(); ?>options-general.php?page=http-headers&category=<?php echo $key; ?>" class="hh-category"> | ||
| 27 | <i></i> | ||
| 28 | <span><?php echo $key[0]; ?></span> | ||
| 29 | <strong><?php echo $val; ?></strong>(<?php printf('%u/%u', @$tmp[$key]['on'], @$tmp[$key]['total']); ?>)</a> | ||
| 30 | <?php | ||
| 31 | } | ||
| 32 | ?> | ||
| 33 | </div> | ||
| 34 | |||
| 35 | <div class="hh-sidebar"> | ||
| 36 | <div class="hh-sidebar-inner"> | ||
| 37 | <h3><?php _e('Rate us', 'http-headers'); ?></h3> | ||
| 38 | <p><?php _e('Tell us what you think about this plugin', 'http-headers'); ?> <a href="https://wordpress.org/support/plugin/http-headers/reviews/?rate=5#new-post"><?php _e('writing a review', 'http-headers'); ?></a>.</p> | ||
| 39 | <h3><?php _e('Contribution', 'http-headers'); ?></h3> | ||
| 40 | <p><?php _e('Help us to continue developing this plugin with a small donation.', 'http-headers'); ?></p> | ||
| 41 | <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank"> | ||
| 42 | <input type="hidden" name="cmd" value="_xclick"> | ||
| 43 | <input type="hidden" name="business" value="biggie@abv.bg"> | ||
| 44 | <input type="hidden" name="item_name" value="HTTP Headers Donation"> | ||
| 45 | <input type="hidden" name="no_shipping" value="1"> | ||
| 46 | <input type="hidden" name="lc" value="US"> | ||
| 47 | <input type="hidden" name="currency_code" value="USD"> | ||
| 48 | <input type="hidden" name="item_number" value=""> | ||
| 49 | $ <input type="text" name="amount" value="5" size="3"> | ||
| 50 | <button type="submit" class="button"><?php _e('Donate', 'http-headers'); ?></button> | ||
| 51 | </form> | ||
| 52 | </div> | ||
| 53 | </div> | ||
| 54 | </div> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">Expect-CT | ||
| 8 | <p class="description"><?php _e('Expect-CT is an HTTP header that allows sites to opt in to reporting and/or enforcement of Certificate Transparency requirements, which prevents the use of misissued certificates for that site from going unnoticed. When a site enables the Expect-CT header, they are requesting that Chrome check that any certificate for that site appears in public CT logs.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expect-CT"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Expect-CT</legend> | ||
| 17 | <?php | ||
| 18 | $expect_ct = get_option('hh_expect_ct', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_expect_ct" value="<?php echo $k; ?>"<?php checked($expect_ct, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-ect' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-ect' ); ?> | ||
| 29 | <table> | ||
| 30 | <tr> | ||
| 31 | <td>max-age:</td> | ||
| 32 | <td><select name="hh_expect_ct_max_age" class="http-header-value"<?php echo $expect_ct == 1 ? NULL : ' readonly'; ?>> | ||
| 33 | <?php | ||
| 34 | $items = array('3600' => '1 hour', '86400' => '1 day', '604800' => '7 days', '2592000' => '30 days', '5184000' => '60 days', '7776000' => '90 days', '31536000' => '1 year'); | ||
| 35 | $expect_ct_max_age = get_option('hh_expect_ct_max_age'); | ||
| 36 | foreach ($items as $key => $item) { | ||
| 37 | ?><option value="<?php echo $key; ?>"<?php selected($expect_ct_max_age, $key); ?>><?php echo $item; ?></option><?php | ||
| 38 | } | ||
| 39 | ?> | ||
| 40 | </select></td> | ||
| 41 | </tr> | ||
| 42 | <tr> | ||
| 43 | <td>report-uri:</td> | ||
| 44 | <td><input type="text" class="http-header-value" name="hh_expect_ct_report_uri" value="<?php echo esc_attr(get_option('hh_expect_ct_report_uri')); ?>" placeholder="https://example.com/ct-report"<?php echo $expect_ct == 1 ? NULL : ' readonly'; ?> /></td> | ||
| 45 | </tr> | ||
| 46 | <tr> | ||
| 47 | <td>enforce:</td> | ||
| 48 | <td><input type="checkbox" class="http-header-value" name="hh_expect_ct_enforce" value="1"<?php checked(get_option('hh_expect_ct_enforce'), 1, true); ?><?php echo $expect_ct == 1 ? NULL : ' readonly'; ?> /></td> | ||
| 49 | </tr> | ||
| 50 | </table> | ||
| 51 | </td> | ||
| 52 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Expires | ||
| 8 | <p class="description"><?php _e('The Expires header contains the date/time after which the response is considered stale.', 'http-headers'); ?></p> | ||
| 9 | <p class="description"><?php _e('Invalid dates, like the value 0, represent a date in the past and mean that the resource is already expired.', 'http-headers'); ?></p> | ||
| 10 | <p class="description"><?php _e("If there is a Cache-Control header with the 'max-age' or 's-max-age' directive in the response, the Expires header is ignored.", 'http-headers'); ?></p> | ||
| 11 | <p class="description"><?php _e('* Works only in Apache mode', 'http-headers'); ?></p> | ||
| 12 | |||
| 13 | <hr> | ||
| 14 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 15 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 16 | </p> | ||
| 17 | </th> | ||
| 18 | <td> | ||
| 19 | <fieldset> | ||
| 20 | <legend class="screen-reader-text">Expires</legend> | ||
| 21 | <?php | ||
| 22 | $expires = get_option('hh_expires', 0); | ||
| 23 | foreach ($bools as $k => $v) | ||
| 24 | { | ||
| 25 | ?><p><label><input type="radio" class="http-header" name="hh_expires" value="<?php echo $k; ?>"<?php checked($expires, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 26 | } | ||
| 27 | ?> | ||
| 28 | </fieldset> | ||
| 29 | </td> | ||
| 30 | <td> | ||
| 31 | <?php settings_fields( 'http-headers-exp' ); ?> | ||
| 32 | <?php do_settings_sections( 'http-headers-exp' ); ?> | ||
| 33 | <table> | ||
| 34 | <?php | ||
| 35 | $types = array( | ||
| 36 | 'default', | ||
| 37 | 'text/css', | ||
| 38 | 'text/javascript', | ||
| 39 | 'text/plain', | ||
| 40 | 'image/gif', | ||
| 41 | 'image/png', | ||
| 42 | 'image/jpeg', | ||
| 43 | 'image/x-icon', | ||
| 44 | 'application/x-javascript', | ||
| 45 | 'application/javascript', | ||
| 46 | 'application/x-icon', | ||
| 47 | ); | ||
| 48 | $items = array( | ||
| 49 | 'invalid_0_date' => '0 (invalid date)', | ||
| 50 | 'access_1_hour' => 'Access +1 hour', | ||
| 51 | 'access_6_hours' => 'Access +6 hours', | ||
| 52 | 'access_12_hours' => 'Access +12 hours', | ||
| 53 | 'access_1_day' => 'Access +1 day', | ||
| 54 | 'access_3_days' => 'Access +3 days', | ||
| 55 | 'access_1_week' => 'Access +1 week', | ||
| 56 | 'access_2_weeks' => 'Access +2 weeks', | ||
| 57 | 'access_1_month' => 'Access +1 month', | ||
| 58 | 'access_3_months' => 'Access +3 months', | ||
| 59 | 'access_6_months' => 'Access +6 months', | ||
| 60 | 'access_1_year' => 'Access +1 year', | ||
| 61 | 'modification_1_hour' => 'Modification +1 hour', | ||
| 62 | 'modification_6_hours' => 'Modification +6 hours', | ||
| 63 | 'modification_12_hours' => 'Modification +12 hours', | ||
| 64 | 'modification_1_day' => 'Modification +1 day', | ||
| 65 | 'modification_3_days' => 'Modification +3 days', | ||
| 66 | 'modification_1_week' => 'Modification +1 week', | ||
| 67 | 'modification_2_weeks' => 'Modification +2 weeks', | ||
| 68 | 'modification_1_month' => 'Modification +1 month', | ||
| 69 | 'modification_3_months' => 'Modification +3 months', | ||
| 70 | 'modification_6_months' => 'Modification +6 months', | ||
| 71 | 'modification_1_year' => 'Modification +1 year', | ||
| 72 | ); | ||
| 73 | $expires_value = get_option('hh_expires_value'); | ||
| 74 | $expires_type = get_option('hh_expires_type'); | ||
| 75 | if (!$expires_value) | ||
| 76 | { | ||
| 77 | $expires_value = array(); | ||
| 78 | } | ||
| 79 | if (!$expires_type) | ||
| 80 | { | ||
| 81 | $expires_type = array(); | ||
| 82 | } | ||
| 83 | foreach ($types as $type) { | ||
| 84 | ?> | ||
| 85 | <tr> | ||
| 86 | <td><input type="checkbox" class="http-header-value" name="hh_expires_type[<?php echo $type; ?>]" value="1"<?php echo !is_array($expires_type) || !array_key_exists($type, $expires_type) ? NULL : ' checked'; ?><?php echo $expires == 1 ? NULL : ' readonly'; ?>></td> | ||
| 87 | <td><?php echo $type; ?></td> | ||
| 88 | <td> | ||
| 89 | <select class="http-header-value" name="hh_expires_value[<?php echo $type; ?>]"<?php echo $expires == 1 ? NULL : ' readonly'; ?>> | ||
| 90 | <?php | ||
| 91 | foreach ($items as $k => $v) { | ||
| 92 | $val_type = !empty($expires_value[$type]) ? $expires_value[$type] : ''; | ||
| 93 | ?><option value="<?php echo $k; ?>"<?php selected($val_type, $k); ?>><?php echo $v; ?></option><?php | ||
| 94 | } | ||
| 95 | ?> | ||
| 96 | </select> | ||
| 97 | </td> | ||
| 98 | </tr> | ||
| 99 | <?php | ||
| 100 | } | ||
| 101 | ?> | ||
| 102 | </table> | ||
| 103 | </td> | ||
| 104 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">Feature-Policy | ||
| 8 | <p class="description"><?php _e('With Feature Policy, you opt-in to a set of policies for the browser to enforce on specific features used throughout your site. These policies restrict what APIs the site can access or modify the browser\'s default behavior for certain features.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Feature-Policy</legend> | ||
| 17 | <?php | ||
| 18 | $feature_policy = get_option('hh_feature_policy', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_feature_policy" value="<?php echo $k; ?>"<?php checked($feature_policy, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-fp' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-fp' ); ?> | ||
| 29 | <table> | ||
| 30 | <tbody> | ||
| 31 | <?php | ||
| 32 | $features = array( | ||
| 33 | 'accelerometer', | ||
| 34 | 'ambient-light-sensor', | ||
| 35 | 'autoplay', | ||
| 36 | 'camera', | ||
| 37 | 'cookie', | ||
| 38 | 'docwrite', | ||
| 39 | 'domain', | ||
| 40 | 'encrypted-media', | ||
| 41 | 'fullscreen', | ||
| 42 | 'geolocation', | ||
| 43 | 'gyroscope', | ||
| 44 | 'magnetometer', | ||
| 45 | 'microphone', | ||
| 46 | 'midi', | ||
| 47 | 'payment', | ||
| 48 | 'picture-in-picture', | ||
| 49 | 'speaker', | ||
| 50 | 'sync-script', | ||
| 51 | 'sync-xhr', | ||
| 52 | 'unsized-media', | ||
| 53 | 'usb', | ||
| 54 | 'vertical-scroll', | ||
| 55 | 'vibrate', | ||
| 56 | 'vr', | ||
| 57 | ); | ||
| 58 | $origins = array("'self'", "'none'", '*', 'origin(s)'); | ||
| 59 | |||
| 60 | $feature_policy_value = get_option('hh_feature_policy_value'); | ||
| 61 | $feature_policy_feature = get_option('hh_feature_policy_feature'); | ||
| 62 | $feature_policy_origin = get_option('hh_feature_policy_origin'); | ||
| 63 | if (!$feature_policy_value) | ||
| 64 | { | ||
| 65 | $feature_policy_value = array(); | ||
| 66 | } | ||
| 67 | if (!$feature_policy_feature) | ||
| 68 | { | ||
| 69 | $feature_policy_feature = array(); | ||
| 70 | } | ||
| 71 | if (!$feature_policy_origin) | ||
| 72 | { | ||
| 73 | $feature_policy_origin = array(); | ||
| 74 | } | ||
| 75 | |||
| 76 | foreach ($features as $feature) | ||
| 77 | { | ||
| 78 | ?> | ||
| 79 | <tr> | ||
| 80 | <td><input type="checkbox" name="hh_feature_policy_feature[<?php echo $feature; ?>]" class="http-header-value" | ||
| 81 | value="1"<?php echo !is_array($feature_policy_feature) || !array_key_exists($feature, $feature_policy_feature) ? NULL : ' checked'; ?><?php echo $feature_policy == 1 ? NULL : ' readonly'; ?>></td> | ||
| 82 | <td><?php echo $feature; ?></td> | ||
| 83 | <td> | ||
| 84 | <select name="hh_feature_policy_value[<?php echo $feature; ?>]" | ||
| 85 | class="http-header-value"<?php echo $feature_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 86 | <?php | ||
| 87 | foreach ($origins as $origin) | ||
| 88 | { | ||
| 89 | ?><option value="<?php echo $origin; ?>"<?php selected(@$feature_policy_value[$feature], $origin); ?>><?php echo $origin; ?></option><?php | ||
| 90 | } | ||
| 91 | ?> | ||
| 92 | </select> | ||
| 93 | <input type="text" name="hh_feature_policy_origin[<?php echo $feature; ?>]" | ||
| 94 | value="<?php echo @$feature_policy_origin[$feature]; ?>" size="30"<?php echo isset($feature_policy_value[$feature]) && in_array($feature_policy_value[$feature], array('origin(s)', "'self'")) ? NULL : ' style="display: none"'; ?> | ||
| 95 | class="http-header-value"<?php echo $feature_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 96 | </td> | ||
| 97 | </tr> | ||
| 98 | <?php | ||
| 99 | } | ||
| 100 | ?> | ||
| 101 | </tbody> | ||
| 102 | </table> | ||
| 103 | </td> | ||
| 104 | </td> | ||
| 105 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | include dirname(__FILE__) . '/includes/config.inc.php'; | ||
| 6 | include dirname(__FILE__) . '/includes/breadcrumbs.inc.php'; | ||
| 7 | ?> | ||
| 8 | |||
| 9 | <section class="hh-panel"> | ||
| 10 | <form method="post" action="options.php"> | ||
| 11 | <table class="form-table hh-table"> | ||
| 12 | <tbody> | ||
| 13 | <?php | ||
| 14 | $header_file = sprintf('%s/%s.php', dirname(__FILE__), basename($_GET['header'])); | ||
| 15 | if (is_file($header_file)) | ||
| 16 | { | ||
| 17 | include $header_file; | ||
| 18 | } | ||
| 19 | ?> | ||
| 20 | </tbody> | ||
| 21 | </table> | ||
| 22 | <?php submit_button(); ?> | ||
| 23 | </form> | ||
| 24 | </section> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <ul class="hh-breadcrumbs"> | ||
| 7 | <li><a href="<?php echo get_admin_url(); ?>options-general.php?page=http-headers"><?php _e('Dashboard', 'http-headers'); ?></a></li> | ||
| 8 | <?php | ||
| 9 | if (isset($_GET['category'])) | ||
| 10 | { | ||
| 11 | ?><li><?php echo @$categories[$_GET['category']]; ?></li><?php | ||
| 12 | } elseif (isset($_GET['header'])) { | ||
| 13 | ?><li><a href="<?php echo get_admin_url(); ?>options-general.php?page=http-headers&category=<?php echo htmlspecialchars($headers[$_GET['header']][2]); ?>"><?php echo @$categories[$headers[$_GET['header']][2]]; ?></a></li><?php | ||
| 14 | ?><li><?php echo @$headers[$_GET['header']][0]; ?></li><?php | ||
| 15 | } elseif (isset($_GET['tab']) && $_GET['tab'] == 'advanced') { | ||
| 16 | ?><li><?php _e('Advanced settings', 'http-headers'); ?></li><?php | ||
| 17 | } elseif (isset($_GET['tab']) && $_GET['tab'] == 'manual') { | ||
| 18 | ?><li><?php _e('Manual setup', 'http-headers'); ?></li><?php | ||
| 19 | } elseif (isset($_GET['tab']) && $_GET['tab'] == 'inspect') { | ||
| 20 | ?><li><?php _e('Inspect headers', 'http-headers'); ?></li><?php | ||
| 21 | } | ||
| 22 | ?> | ||
| 23 | </ul> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | $bools = array( | ||
| 6 | 0 => __('Off', 'http-headers'), | ||
| 7 | 1 => __('On', 'http-headers'), | ||
| 8 | ); | ||
| 9 | |||
| 10 | $categories = array( | ||
| 11 | 'security' => __('Security', 'http-headers'), | ||
| 12 | 'access-control' => __('Access control', 'http-headers'), | ||
| 13 | 'authentication' => __('Authentication', 'http-headers'), | ||
| 14 | 'compression' => __('Compression', 'http-headers'), | ||
| 15 | 'caching' => __('Caching', 'http-headers'), | ||
| 16 | 'misc' => __('Miscellaneous', 'http-headers'), | ||
| 17 | ); | ||
| 18 | |||
| 19 | $headers = array( | ||
| 20 | 'x-frame-options' => array('X-Frame-Options', 'hh_x_frame_options', 'security'), | ||
| 21 | 'x-xss-protection' => array('X-XSS-Protection', 'hh_x_xxs_protection', 'security'), | ||
| 22 | 'x-content-type-options' => array('X-Content-Type-Options', 'hh_x_content_type_options', 'security'), | ||
| 23 | 'x-ua-compatible' => array('X-UA-Compatible', 'hh_x_ua_compatible', 'misc'), | ||
| 24 | 'strict-transport-security' => array('Strict-Transport-Security', 'hh_strict_transport_security', 'security'), | ||
| 25 | 'p3p' => array('P3P', 'hh_p3p', 'access-control'), | ||
| 26 | 'referrer-policy' => array('Referrer-Policy', 'hh_referrer_policy', 'security'), | ||
| 27 | 'content-security-policy' => array('Content-Security-Policy', 'hh_content_security_policy', 'security'), | ||
| 28 | 'access-control-allow-origin' => array('Access-Control-Allow-Origin', 'hh_access_control_allow_origin', 'access-control'), | ||
| 29 | 'access-control-allow-credentials' => array('Access-Control-Allow-Credentials', 'hh_access_control_allow_credentials', 'access-control'), | ||
| 30 | 'access-control-max-age' => array('Access-Control-Max-Age', 'hh_access_control_max_age', 'access-control'), | ||
| 31 | 'access-control-allow-methods' => array('Access-Control-Allow-Methods', 'hh_access_control_allow_methods', 'access-control'), | ||
| 32 | 'access-control-allow-headers' => array('Access-Control-Allow-Headers', 'hh_access_control_allow_headers', 'access-control'), | ||
| 33 | 'access-control-expose-headers' => array('Access-Control-Expose-Headers', 'hh_access_control_expose_headers', 'access-control'), | ||
| 34 | 'content-encoding' => array('Content-Encoding', 'hh_content_encoding', 'compression'), | ||
| 35 | 'vary' => array('Vary', 'hh_vary', 'compression'), | ||
| 36 | 'x-powered-by' => array('X-Powered-By', 'hh_x_powered_by', 'misc'), | ||
| 37 | 'www-authenticate' => array('WWW-Authenticate', 'hh_www_authenticate', 'authentication'), | ||
| 38 | 'cache-control' => array('Cache-Control', 'hh_cache_control', 'caching'), | ||
| 39 | 'expires' => array('Expires', 'hh_expires', 'caching'), | ||
| 40 | 'pragma' => array('Pragma', 'hh_pragma', 'caching'), | ||
| 41 | 'age' => array('Age', 'hh_age', 'caching'), | ||
| 42 | 'connection' => array('Connection', 'hh_connection', 'misc'), | ||
| 43 | 'cookie-security' => array('Cookie security', 'hh_cookie_security', 'security'), | ||
| 44 | 'expect-ct' => array('Expect-CT', 'hh_expect_ct', 'security'), | ||
| 45 | 'timing-allow-origin' => array('Timing-Allow-Origin', 'hh_timing_allow_origin', 'access-control'), | ||
| 46 | 'custom-headers' => array('Custom headers', 'hh_custom_headers', 'misc'), | ||
| 47 | 'x-dns-prefetch-control' => array('X-DNS-Prefetch-Control', 'hh_x_dns_prefetch_control', 'security'), | ||
| 48 | 'x-download-options' => array('X-Download-Options', 'hh_x_download_options', 'security'), | ||
| 49 | 'x-permitted-cross-domain-policies' => array('X-Permitted-Cross-Domain-Policies', 'hh_x_permitted_cross_domain_policies', 'security'), | ||
| 50 | 'report-to' => array('Report-To', 'hh_report_to', 'security'), | ||
| 51 | 'feature-policy' => array('Feature-Policy', 'hh_feature_policy', 'security'), | ||
| 52 | 'permissions-policy' => array('Permissions-Policy', 'hh_permissions_policy', 'security'), | ||
| 53 | 'clear-site-data' => array('Clear-Site-Data', 'hh_clear_site_data', 'security'), | ||
| 54 | 'content-type' => array('Content-Type', 'hh_content_type', 'misc'), | ||
| 55 | 'cross-origin-resource-policy' => array('Cross-Origin-Resource-Policy', 'hh_cross_origin_resource_policy', 'security'), | ||
| 56 | 'nel' => array('NEL', 'hh_nel', 'misc'), | ||
| 57 | 'cross-origin-embedder-policy' => array('Cross-Origin-Embedder-Policy', 'hh_cross_origin_embedder_policy', 'security'), | ||
| 58 | 'cross-origin-opener-policy' => array('Cross-Origin-Opener-Policy', 'hh_cross_origin_opener_policy', 'security'), | ||
| 59 | 'x-robots-tag' => array('X-Robots-Tag', 'hh_x_robots_tag', 'misc'), | ||
| 60 | ); | ||
| 61 | |||
| 62 | $headers_list = array( | ||
| 63 | 'Accept', | ||
| 64 | 'Accept-Charset', | ||
| 65 | 'Accept-Encoding', | ||
| 66 | 'Accept-Language', | ||
| 67 | 'Accept-Datetime', | ||
| 68 | 'Authorization', | ||
| 69 | 'Cache-Control', | ||
| 70 | 'Connection', | ||
| 71 | 'Permanent', | ||
| 72 | 'Cookie', | ||
| 73 | 'Content-Length', | ||
| 74 | 'Content-MD5', | ||
| 75 | 'Content-Type', | ||
| 76 | 'Date', | ||
| 77 | 'Expect', | ||
| 78 | 'Forwarded', | ||
| 79 | 'From', | ||
| 80 | 'Host', | ||
| 81 | 'Permanent', | ||
| 82 | 'If-Match', | ||
| 83 | 'If-Modified-Since', | ||
| 84 | 'If-None-Match', | ||
| 85 | 'If-Range', | ||
| 86 | 'If-Unmodified-Since', | ||
| 87 | 'Max-Forwards', | ||
| 88 | 'Origin', | ||
| 89 | 'Pragma', | ||
| 90 | 'Proxy-Authorization', | ||
| 91 | 'Range', | ||
| 92 | 'Referer', | ||
| 93 | 'TE', | ||
| 94 | 'User-Agent', | ||
| 95 | 'Upgrade', | ||
| 96 | 'Via', | ||
| 97 | 'Warning', | ||
| 98 | 'X-Requested-With', | ||
| 99 | 'DNT', | ||
| 100 | 'X-Forwarded-For', | ||
| 101 | 'X-Forwarded-Host', | ||
| 102 | 'X-Forwarded-Proto', | ||
| 103 | 'Front-End-Https', | ||
| 104 | 'X-Http-Method-Override', | ||
| 105 | 'X-ATT-DeviceId', | ||
| 106 | 'X-Wap-Profile', | ||
| 107 | 'Proxy-Connection', | ||
| 108 | 'X-UIDH', | ||
| 109 | 'X-Csrf-Token', | ||
| 110 | 'X-PINGOTHER', | ||
| 111 | 'X-WP-Nonce', | ||
| 112 | ); | ||
| 113 | |||
| 114 | $cors_safe_request_headers = array( | ||
| 115 | 'Accept', | ||
| 116 | 'Accept-Language', | ||
| 117 | 'Content-Language', | ||
| 118 | 'Content-Type', | ||
| 119 | ); | ||
| 120 | |||
| 121 | $cors_safe_response_headers = array( | ||
| 122 | 'Cache-Control', | ||
| 123 | 'Content-Language', | ||
| 124 | 'Content-Type', | ||
| 125 | 'Expires', | ||
| 126 | 'Last-Modified', | ||
| 127 | 'Pragma', | ||
| 128 | ); | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <input type="checkbox" | ||
| 2 | name="hh_content_security_policy_value[<?php echo $item; ?>]" | ||
| 3 | value="1"<?php echo isset($csp_value[$item]) ? ' checked' : NULL; ?> | ||
| 4 | class="http-header-value"<?php echo $content_security_policy == 1 ? NULL : ' readonly'; ?>> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | $sandbox = array( | ||
| 3 | 'allow-forms', | ||
| 4 | 'allow-same-origin', | ||
| 5 | 'allow-scripts', | ||
| 6 | 'allow-popups', | ||
| 7 | 'allow-modals', | ||
| 8 | 'allow-downloads', | ||
| 9 | 'allow-orientation-lock', | ||
| 10 | 'allow-pointer-lock', | ||
| 11 | 'allow-presentation', | ||
| 12 | 'allow-popups-to-escape-sandbox', | ||
| 13 | 'allow-top-navigation', | ||
| 14 | 'allow-top-navigation-by-user-activation', | ||
| 15 | ); | ||
| 16 | foreach ($sandbox as $origin) | ||
| 17 | { | ||
| 18 | ?> | ||
| 19 | <p> | ||
| 20 | <input type="checkbox" | ||
| 21 | name="hh_content_security_policy_value[<?php echo $item; ?>][<?php echo $origin; ?>]" | ||
| 22 | id="csp-<?php echo $item; ?>-<?php echo $origin; ?>" | ||
| 23 | value="1"<?php echo isset($csp_value[$item][$origin]) ? ' checked' : NULL; ?> | ||
| 24 | class="http-header-value"<?php echo $content_security_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 25 | <label for="csp-<?php echo $item; ?>-<?php echo $origin; ?>"><?php echo $origin; ?></label> | ||
| 26 | </p> | ||
| 27 | <?php | ||
| 28 | } | ||
| 29 | ?> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | $origins = array( | ||
| 3 | 'wildcard' => '*', | ||
| 4 | 'self' => "'self'", | ||
| 5 | 'none' => "'none'", | ||
| 6 | 'unsafe-inline' => "'unsafe-inline'", | ||
| 7 | 'unsafe-eval' => "'unsafe-eval'", | ||
| 8 | 'strict-dynamic' => "'strict-dynamic'", | ||
| 9 | 'report-sample' => "'report-sample'", | ||
| 10 | 'http' => 'http:', | ||
| 11 | 'https' => 'https:', | ||
| 12 | 'data' => 'data:', | ||
| 13 | 'mediastream' => 'mediastream:', | ||
| 14 | 'blob' => 'blob:', | ||
| 15 | 'filesystem' => 'filesystem:', | ||
| 16 | ); | ||
| 17 | |||
| 18 | foreach ($origins as $k => $origin) | ||
| 19 | { | ||
| 20 | ?> | ||
| 21 | <p<?php echo $origin == '*' || !isset($csp_value[$item]['*']) ? NULL : ' style="display: none"'; ?>> | ||
| 22 | <input type="checkbox" | ||
| 23 | name="hh_content_security_policy_value[<?php echo $item; ?>][<?php echo $origin; ?>]" | ||
| 24 | id="csp-<?php echo $item; ?>-<?php echo $k; ?>" | ||
| 25 | value="1"<?php echo isset($csp_value[$item][$origin]) ? ' checked' : NULL; ?> | ||
| 26 | class="http-header-value"<?php echo $content_security_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 27 | <label for="csp-<?php echo $item; ?>-<?php echo $k; ?>"><?php echo $origin; ?></label> | ||
| 28 | </p> | ||
| 29 | <?php | ||
| 30 | } | ||
| 31 | |||
| 32 | switch ($item) { | ||
| 33 | case 'script-src': | ||
| 34 | $host_sources = array( | ||
| 35 | 'js.example.com', | ||
| 36 | 'http://js.example.com', | ||
| 37 | 'https://js.example.com', | ||
| 38 | ); | ||
| 39 | break; | ||
| 40 | case 'style-src': | ||
| 41 | $host_sources = array( | ||
| 42 | 'css.example.com', | ||
| 43 | 'http://css.example.com', | ||
| 44 | 'https://css.example.com', | ||
| 45 | ); | ||
| 46 | break; | ||
| 47 | case 'img-src': | ||
| 48 | $host_sources = array( | ||
| 49 | 'img.example.com', | ||
| 50 | 'http://img.example.com', | ||
| 51 | 'https://img.example.com', | ||
| 52 | ); | ||
| 53 | break; | ||
| 54 | case 'font-src': | ||
| 55 | $host_sources = array( | ||
| 56 | 'font.example.com', | ||
| 57 | 'http://font.example.com', | ||
| 58 | 'https://font.example.com', | ||
| 59 | ); | ||
| 60 | break; | ||
| 61 | case 'default-src': | ||
| 62 | $host_sources = array( | ||
| 63 | 'http://*.example.com', | ||
| 64 | 'mail.example.com:443', | ||
| 65 | 'https://assets.example.com', | ||
| 66 | 'cdn.example.com', | ||
| 67 | ); | ||
| 68 | break; | ||
| 69 | default: | ||
| 70 | $host_sources = array( | ||
| 71 | 'https://store.example.com', | ||
| 72 | 'store.example.com', | ||
| 73 | '*.example.com', | ||
| 74 | ); | ||
| 75 | } | ||
| 76 | shuffle($host_sources); | ||
| 77 | ?> | ||
| 78 | <p<?php echo !isset($csp_value[$item]['*']) ? NULL : ' style="display: none"'; ?>> | ||
| 79 | <input type="text" | ||
| 80 | name="hh_content_security_policy_value[<?php echo $item; ?>][source]" | ||
| 81 | class="http-header-value" | ||
| 82 | size="40" | ||
| 83 | placeholder="<?php echo $host_sources[0]; ?>" | ||
| 84 | value="<?php echo esc_attr(@$csp_value[$item]['source']); ?>"<?php echo $content_security_policy == 1 ? NULL : ' readonly'; ?> | ||
| 85 | </p> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | $origins = array( | ||
| 3 | 'script', | ||
| 4 | 'style', | ||
| 5 | ); | ||
| 6 | |||
| 7 | foreach ($origins as $origin) | ||
| 8 | { | ||
| 9 | ?> | ||
| 10 | <p> | ||
| 11 | <input type="checkbox" | ||
| 12 | name="hh_content_security_policy_value[<?php echo $item; ?>][<?php echo $origin; ?>]" | ||
| 13 | id="csp-<?php echo $item; ?>-<?php echo $origin; ?>" | ||
| 14 | value="1"<?php echo isset($csp_value[$item][$origin]) ? ' checked' : NULL; ?> | ||
| 15 | class="http-header-value"<?php echo $content_security_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 16 | <label for="csp-<?php echo $item; ?>-<?php echo $origin; ?>"><?php echo $origin; ?></label> | ||
| 17 | </p> | ||
| 18 | <?php | ||
| 19 | } | ||
| 20 | ?> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <input type="text" name="hh_content_security_policy_value[<?php echo $item; ?>]" class="http-header-value" size="40" | ||
| 2 | value="<?php echo esc_attr(@$csp_value[$item]); ?>"<?php echo $content_security_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 3 | <?php | ||
| 4 | if ($item == 'plugin-types') | ||
| 5 | { | ||
| 6 | ?> | ||
| 7 | <br> | ||
| 8 | <em>Example: application/x-shockwave-flash application/x-java-applet</em> | ||
| 9 | <?php | ||
| 10 | } | ||
| 11 | ?> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | return array( | ||
| 3 | array('hh_method', 'htaccess'), | ||
| 4 | array('hh_htaccess_path', str_replace('\\', '/', ABSPATH) . '.htaccess'), | ||
| 5 | array('hh_user_ini_path', str_replace('\\', '/', ABSPATH) . '.user.ini'), | ||
| 6 | array('hh_htpasswd_path', str_replace('\\', '/', ABSPATH) . '.hh-htpasswd'), | ||
| 7 | array('hh_htdigest_path', str_replace('\\', '/', ABSPATH) . '.hh-htdigest'), | ||
| 8 | array('hh_x_frame_options', 0), | ||
| 9 | array('hh_x_frame_options_value', ''), | ||
| 10 | array('hh_x_frame_options_domain', ''), | ||
| 11 | array('hh_x_xxs_protection', 0), | ||
| 12 | array('hh_x_xxs_protection_value', ''), | ||
| 13 | array('hh_x_xxs_protection_uri', ''), | ||
| 14 | array('hh_x_content_type_options', 0), | ||
| 15 | array('hh_x_content_type_options_value', ''), | ||
| 16 | array('hh_strict_transport_security', 0), | ||
| 17 | array('hh_strict_transport_security_value', ''), //obsolete | ||
| 18 | array('hh_strict_transport_security_max_age', ''), | ||
| 19 | array('hh_strict_transport_security_sub_domains', ''), | ||
| 20 | array('hh_strict_transport_security_preload', ''), | ||
| 21 | array('hh_public_key_pins', 0), | ||
| 22 | array('hh_public_key_pins_sha256_1', ''), | ||
| 23 | array('hh_public_key_pins_sha256_2', ''), | ||
| 24 | array('hh_public_key_pins_max_age', ''), | ||
| 25 | array('hh_public_key_pins_sub_domains', ''), | ||
| 26 | array('hh_public_key_pins_report_uri', ''), | ||
| 27 | array('hh_public_key_pins_report_only', ''), | ||
| 28 | array('hh_x_ua_compatible', 0), | ||
| 29 | array('hh_x_ua_compatible_value', ''), | ||
| 30 | array('hh_p3p', 0), | ||
| 31 | array('hh_p3p_value', ''), | ||
| 32 | array('hh_referrer_policy', 0), | ||
| 33 | array('hh_referrer_policy_value', ''), | ||
| 34 | array('hh_content_security_policy', 0), | ||
| 35 | array('hh_content_security_policy_value', ''), | ||
| 36 | array('hh_content_security_policy_report_only', ''), | ||
| 37 | array('hh_access_control_allow_origin', 0), | ||
| 38 | array('hh_access_control_allow_origin_value', ''), | ||
| 39 | array('hh_access_control_allow_origin_url', ''), | ||
| 40 | array('hh_access_control_allow_credentials', 0), | ||
| 41 | array('hh_access_control_allow_credentials_value', ''), | ||
| 42 | array('hh_access_control_allow_methods', 0), | ||
| 43 | array('hh_access_control_allow_methods_value', ''), | ||
| 44 | array('hh_access_control_allow_headers', 0), | ||
| 45 | array('hh_access_control_allow_headers_value', ''), | ||
| 46 | array('hh_access_control_allow_headers_custom', ''), | ||
| 47 | array('hh_access_control_expose_headers', 0), | ||
| 48 | array('hh_access_control_expose_headers_value', ''), | ||
| 49 | array('hh_access_control_expose_headers_custom', ''), | ||
| 50 | array('hh_access_control_max_age', 0), | ||
| 51 | array('hh_access_control_max_age_value', ''), | ||
| 52 | array('hh_content_encoding', 0), | ||
| 53 | array('hh_content_encoding_module', ''), | ||
| 54 | array('hh_content_encoding_value', ''), | ||
| 55 | array('hh_content_encoding_ext', ''), | ||
| 56 | array('hh_vary', 0), | ||
| 57 | array('hh_vary_value', ''), | ||
| 58 | array('hh_x_powered_by', 0), | ||
| 59 | array('hh_x_powered_by_option', ''), | ||
| 60 | array('hh_x_powered_by_value', ''), | ||
| 61 | array('hh_www_authenticate', 0), | ||
| 62 | array('hh_www_authenticate_type', ''), | ||
| 63 | array('hh_www_authenticate_realm', ''), | ||
| 64 | array('hh_www_authenticate_user', ''), | ||
| 65 | array('hh_www_authenticate_pswd', ''), | ||
| 66 | array('hh_cache_control', 0), | ||
| 67 | array('hh_cache_control_value', ''), | ||
| 68 | array('hh_age', 0), | ||
| 69 | array('hh_age_value', ''), | ||
| 70 | array('hh_pragma', 0), | ||
| 71 | array('hh_pragma_value', ''), | ||
| 72 | array('hh_expires', 0), | ||
| 73 | array('hh_expires_value', ''), | ||
| 74 | array('hh_expires_type', ''), | ||
| 75 | array('hh_connection', 0), | ||
| 76 | array('hh_connection_value', ''), | ||
| 77 | array('hh_cookie_security', 0), | ||
| 78 | array('hh_cookie_security_value', ''), | ||
| 79 | array('hh_expect_ct', 0), | ||
| 80 | array('hh_expect_ct_max_age', ''), | ||
| 81 | array('hh_expect_ct_report_uri', ''), | ||
| 82 | array('hh_expect_ct_enforce', ''), | ||
| 83 | array('hh_timing_allow_origin', 0), | ||
| 84 | array('hh_timing_allow_origin_value', ''), | ||
| 85 | array('hh_timing_allow_origin_url', ''), | ||
| 86 | array('hh_x_permitted_cross_domain_policies', 0), | ||
| 87 | array('hh_x_permitted_cross_domain_policies_value', ''), | ||
| 88 | array('hh_x_download_options', 0), | ||
| 89 | array('hh_x_download_options_value', ''), | ||
| 90 | array('hh_x_dns_prefetch_control', 0), | ||
| 91 | array('hh_x_dns_prefetch_control_value', ''), | ||
| 92 | array('hh_custom_headers', 0), | ||
| 93 | array('hh_custom_headers_value', ''), | ||
| 94 | array('hh_report_to', 0), | ||
| 95 | array('hh_report_to_value', ''), | ||
| 96 | array('hh_feature_policy', 0), | ||
| 97 | array('hh_feature_policy_feature', ''), | ||
| 98 | array('hh_feature_policy_origin', ''), | ||
| 99 | array('hh_feature_policy_value', ''), | ||
| 100 | array('hh_permissions_policy', 0), | ||
| 101 | array('hh_permissions_policy_feature', ''), | ||
| 102 | array('hh_permissions_policy_origin', ''), | ||
| 103 | array('hh_permissions_policy_value', ''), | ||
| 104 | array('hh_clear_site_data', 0), | ||
| 105 | array('hh_clear_site_data_value', ''), | ||
| 106 | array('hh_content_type', 0), | ||
| 107 | array('hh_content_type_value', ''), | ||
| 108 | array('hh_content_nel', 0), | ||
| 109 | array('hh_content_nel_value', ''), | ||
| 110 | array('hh_x_robots_tag', 0), | ||
| 111 | array('hh_x_robots_tag_value', ''), | ||
| 112 | ); | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <div class="wrap"> | ||
| 7 | <h1>HTTP Headers</h1> | ||
| 8 | <?php | ||
| 9 | $check = check_web_server_requirements(); | ||
| 10 | if ($check !== true) { | ||
| 11 | ?> | ||
| 12 | <div class="notice notice-error"> | ||
| 13 | <h2><?php _e('Error!', 'http-headers'); ?></h2> | ||
| 14 | <?php | ||
| 15 | if ($check == -1) { | ||
| 16 | ?><p><?php _e('The following file was not found. Please make sure the file exists and has write permissions:', 'http-headers'); ?> <code><?php echo get_web_server_filename(); ?></code></p><?php | ||
| 17 | } elseif ($check == -2) { | ||
| 18 | ?><p><?php _e('Please make sure the following file has write permissions:', 'http-headers'); ?> <code><?php echo get_web_server_filename(); ?></code></p><?php | ||
| 19 | } | ||
| 20 | ?> | ||
| 21 | </div> | ||
| 22 | <?php | ||
| 23 | } | ||
| 24 | $check = check_php_requirements(); | ||
| 25 | if ($check !== true) { | ||
| 26 | ?> | ||
| 27 | <div class="notice notice-warning"> | ||
| 28 | <h2><?php _e('Warning!', 'http-headers'); ?></h2> | ||
| 29 | <?php | ||
| 30 | if ($check == -1) { | ||
| 31 | ?><p><?php _e('The following file was not found. Please make sure the file exists and has write permissions:', 'http-headers'); ?> <code><?php echo get_user_ini_filename(); ?></code></p><?php | ||
| 32 | } elseif ($check == -2) { | ||
| 33 | ?><p><?php _e('Please make sure the following file has write permissions:', 'http-headers'); ?> <code><?php echo get_user_ini_filename(); ?></code></p><?php | ||
| 34 | } | ||
| 35 | ?> | ||
| 36 | </div> | ||
| 37 | <?php | ||
| 38 | } | ||
| 39 | ?> | ||
| 40 | <p><?php _e('Quick links', 'http-headers'); ?>: | ||
| 41 | <a href="https://zinoui.com/blog/http-headers-for-wordpress" target="_blank" title="HTTP Headers"><?php _e('Getting started', 'http-headers'); ?></a>, | ||
| 42 | <a href="<?php echo get_admin_url(); ?>options-general.php?page=http-headers&tab=advanced"><?php _e('Advanced settings', 'http-headers'); ?></a>, | ||
| 43 | <a href="<?php echo get_admin_url(); ?>options-general.php?page=http-headers&tab=manual"><?php _e('Manual setup', 'http-headers'); ?></a>, | ||
| 44 | <a href="<?php echo get_admin_url(); ?>options-general.php?page=http-headers&tab=inspect"><?php _e('Inspect headers', 'http-headers'); ?></a> | ||
| 45 | </p> | ||
| 46 | <?php | ||
| 47 | if (isset($_GET['header']) && !empty($_GET['header'])) | ||
| 48 | { | ||
| 49 | include dirname(__FILE__) . '/header.php'; | ||
| 50 | } elseif (isset($_GET['tab']) && $_GET['tab'] == 'advanced') { | ||
| 51 | include dirname(__FILE__) . '/advanced.php'; | ||
| 52 | } elseif (isset($_GET['tab']) && $_GET['tab'] == 'manual') { | ||
| 53 | include dirname(__FILE__) . '/manual.php'; | ||
| 54 | } elseif (isset($_GET['tab']) && $_GET['tab'] == 'inspect') { | ||
| 55 | include dirname(__FILE__) . '/inspect.php'; | ||
| 56 | } elseif (isset($_GET['category'])) { | ||
| 57 | include dirname(__FILE__) . '/category.php'; | ||
| 58 | } else { | ||
| 59 | include dirname(__FILE__) . '/dashboard.php'; | ||
| 60 | } | ||
| 61 | ?> | ||
| 62 | </div> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | include dirname(__FILE__) . '/includes/config.inc.php'; | ||
| 6 | include dirname(__FILE__) . '/includes/breadcrumbs.inc.php'; | ||
| 7 | ?> | ||
| 8 | <section class="hh-panel"> | ||
| 9 | <h3><span class="hh-highlight"><?php _e('Inspect headers', 'http-headers'); ?></span></h3> | ||
| 10 | <p><?php _e("Use this tool to inspect the HTTP headers of your website or your competitor's website.", 'http-headers'); ?></p> | ||
| 11 | <div class="form-wrap"> | ||
| 12 | <form action="<?php echo admin_url('admin-ajax.php'); ?>" method="get" id="frmIspect"> | ||
| 13 | <?php wp_nonce_field('inspect'); ?> | ||
| 14 | <input type="hidden" name="action" value="inspect"> | ||
| 15 | <div class="form-row"> | ||
| 16 | <div class="form-field form-col-6"> | ||
| 17 | <label class="form-label">URL:</label> | ||
| 18 | <input type="text" name="url" size="40" placeholder="<?php echo home_url('/'); ?>" value="<?php echo home_url('/'); ?>"> | ||
| 19 | </div> | ||
| 20 | <div class="form-field form-col-6"> | ||
| 21 | <label class="form-label"> </label> | ||
| 22 | <label><input type="checkbox" name="authentication" id="authentication"><?php _e('Authentication', 'http-headers'); ?></label> | ||
| 23 | </div> | ||
| 24 | </div> | ||
| 25 | <div id="box-authentication" style="display: none"> | ||
| 26 | <div class="form-row"> | ||
| 27 | <div class="form-field form-col-6"> | ||
| 28 | <label class="form-label" for="username"><?php _e('Username', 'http-headers'); ?>:</label> | ||
| 29 | <input type="text" name="username"> | ||
| 30 | </div> | ||
| 31 | <div class="form-field form-col-6"> | ||
| 32 | <label class="form-label" for="password"><?php _e('Password', 'http-headers'); ?>:</label> | ||
| 33 | <input type="text" name="password"> | ||
| 34 | </div> | ||
| 35 | </div> | ||
| 36 | </div> | ||
| 37 | <?php submit_button(__('Inspect', 'http-headers')); ?> | ||
| 38 | </form> | ||
| 39 | </div> | ||
| 40 | </section> | ||
| 41 | |||
| 42 | <div id="hh-result"></div> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | include dirname(__FILE__) . '/includes/breadcrumbs.inc.php'; | ||
| 6 | ?> | ||
| 7 | <div class="hh-tabs"> | ||
| 8 | <ul> | ||
| 9 | <li class="hh-active"><a href="#hh-tab-1">Apache</a></li> | ||
| 10 | <li><a href="#hh-tab-2">Nginx</a></li> | ||
| 11 | </ul> | ||
| 12 | <div id="hh-tab-1" class="hh-tab-active"> | ||
| 13 | <h3><span class="hh-highlight"><?php echo get_htaccess_filename(); ?></span></h3> | ||
| 14 | <textarea class="hh-textarea-manual" rows="20" readonly><?php | ||
| 15 | $lines = apache_headers_directives(); | ||
| 16 | if ($lines) | ||
| 17 | { | ||
| 18 | echo join("\n", $lines); | ||
| 19 | echo "\n\n"; | ||
| 20 | } | ||
| 21 | |||
| 22 | $lines = apache_auth_directives(); | ||
| 23 | if ($lines) | ||
| 24 | { | ||
| 25 | echo join("\n", $lines); | ||
| 26 | echo "\n\n"; | ||
| 27 | } | ||
| 28 | |||
| 29 | $lines = apache_content_encoding_directives(); | ||
| 30 | if ($lines) | ||
| 31 | { | ||
| 32 | echo join("\n", $lines); | ||
| 33 | echo "\n\n"; | ||
| 34 | } | ||
| 35 | |||
| 36 | $lines = apache_expires_directives(); | ||
| 37 | if ($lines) | ||
| 38 | { | ||
| 39 | echo join("\n", $lines); | ||
| 40 | echo "\n\n"; | ||
| 41 | } | ||
| 42 | |||
| 43 | $lines = apache_cookie_security_directives(); | ||
| 44 | if ($lines) | ||
| 45 | { | ||
| 46 | echo join("\n", $lines); | ||
| 47 | echo "\n\n"; | ||
| 48 | } | ||
| 49 | |||
| 50 | $lines = apache_timing_directives(); | ||
| 51 | echo join("\n", $lines); | ||
| 52 | ?></textarea> | ||
| 53 | <?php | ||
| 54 | $credentials = apache_auth_credentials(); | ||
| 55 | if ($credentials) | ||
| 56 | { | ||
| 57 | ?> | ||
| 58 | <h3><span class="hh-highlight"><?php echo $credentials['ht_file']; ?></span></h3> | ||
| 59 | <textarea class="hh-textarea-manual" rows="5" readonly><?php | ||
| 60 | echo $credentials['auth']; | ||
| 61 | ?></textarea><?php | ||
| 62 | } | ||
| 63 | ?> | ||
| 64 | </div> | ||
| 65 | <div id="hh-tab-2" class="hh-hidden"> | ||
| 66 | <textarea class="hh-textarea-manual" rows="20" readonly><?php | ||
| 67 | $lines = nginx_headers_directives(); | ||
| 68 | if ($lines) | ||
| 69 | { | ||
| 70 | echo join("\n", $lines); | ||
| 71 | echo "\n\n"; | ||
| 72 | } | ||
| 73 | |||
| 74 | $lines = nginx_auth_directives(); | ||
| 75 | if ($lines) | ||
| 76 | { | ||
| 77 | echo join("\n", $lines); | ||
| 78 | echo "\n\n"; | ||
| 79 | } | ||
| 80 | |||
| 81 | $lines = nginx_content_encoding_directives(); | ||
| 82 | if ($lines) | ||
| 83 | { | ||
| 84 | echo join("\n", $lines); | ||
| 85 | echo "\n\n"; | ||
| 86 | } | ||
| 87 | |||
| 88 | $lines = nginx_expires_directives(); | ||
| 89 | if ($lines) | ||
| 90 | { | ||
| 91 | echo join("\n", $lines); | ||
| 92 | echo "\n\n"; | ||
| 93 | } | ||
| 94 | |||
| 95 | $lines = nginx_cookie_security_directives(); | ||
| 96 | if ($lines) | ||
| 97 | { | ||
| 98 | echo join("\n", $lines); | ||
| 99 | echo "\n\n"; | ||
| 100 | } | ||
| 101 | |||
| 102 | $lines = nginx_timing_directives(); | ||
| 103 | if ($lines) | ||
| 104 | { | ||
| 105 | echo join("\n", $lines); | ||
| 106 | echo "\n\n"; | ||
| 107 | } | ||
| 108 | ?></textarea> | ||
| 109 | <?php | ||
| 110 | $credentials = nginx_auth_credentials(); | ||
| 111 | if ($credentials) | ||
| 112 | { | ||
| 113 | ?> | ||
| 114 | <h3><span class="hh-highlight"><?php echo $credentials['ht_file']; ?></span></h3> | ||
| 115 | <textarea class="hh-textarea-manual" rows="5" readonly><?php | ||
| 116 | echo $credentials['auth']; | ||
| 117 | ?></textarea><?php | ||
| 118 | } | ||
| 119 | ?> | ||
| 120 | </div> | ||
| 121 | </div> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">NEL | ||
| 8 | <p class="description"><?php _e('Network Error Logging is a mechanism that can be configured via the NEL HTTP response header. This experimental header allows web sites and applications to opt-in to receive reports about failed (and, if desired, successful) network fetches from supporting browsers.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Network_Error_Logging"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">NEL</legend> | ||
| 17 | <?php | ||
| 18 | $nel = get_option('hh_nel', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_nel" value="<?php echo $k; ?>"<?php checked($nel, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-nel' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-nel' ); ?> | ||
| 29 | <?php | ||
| 30 | $nel_value = get_option('hh_nel_value', array()); | ||
| 31 | |||
| 32 | $report_to = isset($nel_value['report_to']) ? $nel_value['report_to'] : NULL; | ||
| 33 | $max_age = isset($nel_value['max_age']) ? $nel_value['max_age'] : NULL; | ||
| 34 | $include_subdomains = isset($nel_value['include_subdomains']) ? $nel_value['include_subdomains'] : NULL; | ||
| 35 | $success_fraction = isset($nel_value['success_fraction']) ? $nel_value['success_fraction'] : NULL; | ||
| 36 | $failure_fraction = isset($nel_value['failure_fraction']) ? $nel_value['failure_fraction'] : NULL; | ||
| 37 | $request_headers = isset($nel_value['request_headers']) ? $nel_value['request_headers'] : NULL; | ||
| 38 | $response_headers = isset($nel_value['response_headers']) ? $nel_value['response_headers'] : NULL; | ||
| 39 | ?> | ||
| 40 | <table> | ||
| 41 | <tr> | ||
| 42 | <td>report_to:</td> | ||
| 43 | <td><input type="text" class="http-header-value" name="hh_nel_value[report_to]" value="<?php echo esc_attr($report_to); ?>"<?php echo $nel == 1 ? NULL : ' readonly'; ?>></td> | ||
| 44 | </tr> | ||
| 45 | <tr> | ||
| 46 | <td>max_age:</td> | ||
| 47 | <td><select name="hh_nel_value[max_age]" class="http-header-value"<?php echo $nel == 1 ? NULL : ' readonly'; ?>> | ||
| 48 | <?php | ||
| 49 | $items = array('3600' => '1 hour', '86400' => '1 day', '604800' => '7 days', '2592000' => '30 days', '5184000' => '60 days', '7776000' => '90 days', '31536000' => '1 year'); | ||
| 50 | foreach ($items as $key => $item) { | ||
| 51 | ?><option value="<?php echo $key; ?>"<?php selected($max_age, $key); ?>><?php echo $item; ?></option><?php | ||
| 52 | } | ||
| 53 | ?> | ||
| 54 | </select></td> | ||
| 55 | </tr> | ||
| 56 | <tr> | ||
| 57 | <td>include_subdomains:</td> | ||
| 58 | <td><input type="checkbox" class="http-header-value" name="hh_nel_value[include_subdomains]" value="1"<?php checked($include_subdomains, 1, true); ?><?php echo $nel == 1 ? NULL : ' readonly'; ?>></td> | ||
| 59 | </tr> | ||
| 60 | <tr> | ||
| 61 | <td>success_fraction:</td> | ||
| 62 | <td><input type="number" class="http-header-value" name="hh_nel_value[success_fraction]" value="<?php echo esc_attr($success_fraction); ?>"<?php echo $nel == 1 ? NULL : ' readonly'; ?> min="0.0" max="1.0" step="0.1"></td> | ||
| 63 | </tr> | ||
| 64 | <tr> | ||
| 65 | <td>failure_fraction:</td> | ||
| 66 | <td><input type="number" class="http-header-value" name="hh_nel_value[failure_fraction]" value="<?php echo esc_attr($failure_fraction); ?>"<?php echo $nel == 1 ? NULL : ' readonly'; ?> min="0.0" max="1.0" step="0.1"></td> | ||
| 67 | </tr> | ||
| 68 | <tr> | ||
| 69 | <td>request_headers:</td> | ||
| 70 | <td><input type="text" class="http-header-value" name="hh_nel_value[request_headers]" value="<?php echo esc_attr($request_headers); ?>"<?php echo $nel == 1 ? NULL : ' readonly'; ?>></td> | ||
| 71 | </tr> | ||
| 72 | <tr> | ||
| 73 | <td>response_headers:</td> | ||
| 74 | <td><input type="text" class="http-header-value" name="hh_nel_value[response_headers]" value="<?php echo esc_attr($response_headers); ?>"<?php echo $nel == 1 ? NULL : ' readonly'; ?>></td> | ||
| 75 | </tr> | ||
| 76 | </table> | ||
| 77 | </td> | ||
| 78 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">P3P | ||
| 8 | <p class="description"><?php _e('The Platform for Privacy Preferences Project (P3P) is a protocol allowing websites to declare their intended use of information they collect about web browser users.', 'http-headers'); ?></p> | ||
| 9 | </th> | ||
| 10 | <td> | ||
| 11 | <fieldset> | ||
| 12 | <legend class="screen-reader-text">P3P</legend> | ||
| 13 | <?php | ||
| 14 | $p3p = get_option('hh_p3p', 0); | ||
| 15 | foreach ($bools as $k => $v) | ||
| 16 | { | ||
| 17 | ?><p><label><input type="radio" class="http-header" name="hh_p3p" value="<?php echo $k; ?>"<?php checked($p3p, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 18 | } | ||
| 19 | ?> | ||
| 20 | </fieldset> | ||
| 21 | </td> | ||
| 22 | <td> | ||
| 23 | <?php settings_fields( 'http-headers-p3p' ); ?> | ||
| 24 | <?php do_settings_sections( 'http-headers-p3p' ); ?> | ||
| 25 | <?php | ||
| 26 | $p3p_value = get_option('hh_p3p_value'); | ||
| 27 | if (!$p3p_value) | ||
| 28 | { | ||
| 29 | $p3p_value = array(); | ||
| 30 | } | ||
| 31 | $in_creq = array('ADM', 'DEV', 'TAI', 'PSA', 'PSD', 'IVA', 'IVD', 'CON', 'HIS', 'TEL', 'OTP', 'DEL', 'SAM', 'UNR', 'PUB', 'OTR',); | ||
| 32 | $creq = array('a', 'i', 'o'); | ||
| 33 | ?> | ||
| 34 | <table> | ||
| 35 | <tbody> | ||
| 36 | <tr> | ||
| 37 | <td>Compact ACCESS</td> | ||
| 38 | <td class="hh-td-inner"> | ||
| 39 | <table><tbody><tr><?php | ||
| 40 | $items = array('NOI', 'ALL', 'CAO', 'IDC', 'OTI', 'NON'); | ||
| 41 | foreach ($items as $i => $item) { | ||
| 42 | if ($i > 0 && $i % 4 === 0) { | ||
| 43 | ?></tr><tr><?php | ||
| 44 | } | ||
| 45 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 46 | } | ||
| 47 | ?></tr></tbody></table> | ||
| 48 | </td> | ||
| 49 | </tr> | ||
| 50 | <tr> | ||
| 51 | <td>Compact DISPUTES</td> | ||
| 52 | <td class="hh-td-inner"> | ||
| 53 | <table><tbody><tr><?php | ||
| 54 | $items = array('DSP'); | ||
| 55 | foreach ($items as $i => $item) { | ||
| 56 | if ($i > 0 && $i % 4 === 0) { | ||
| 57 | ?></tr><tr><?php | ||
| 58 | } | ||
| 59 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 60 | } | ||
| 61 | ?></tr></tbody></table> | ||
| 62 | </td> | ||
| 63 | </tr> | ||
| 64 | <tr> | ||
| 65 | <td>Compact REMEDIES</td> | ||
| 66 | <td class="hh-td-inner"> | ||
| 67 | <table><tbody><tr><?php | ||
| 68 | $items = array('COR', 'MON', 'LAW'); | ||
| 69 | foreach ($items as $i => $item) { | ||
| 70 | if ($i > 0 && $i % 4 === 0) { | ||
| 71 | ?></tr><tr><?php | ||
| 72 | } | ||
| 73 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 74 | } | ||
| 75 | ?></tr></tbody></table> | ||
| 76 | </td> | ||
| 77 | </tr> | ||
| 78 | <tr> | ||
| 79 | <td>Compact NON-IDENTIFIABLE</td> | ||
| 80 | <td class="hh-td-inner"> | ||
| 81 | <table><tbody><tr><?php | ||
| 82 | $items = array('NID'); | ||
| 83 | foreach ($items as $i => $item) { | ||
| 84 | if ($i > 0 && $i % 4 === 0) { | ||
| 85 | ?></tr><tr><?php | ||
| 86 | } | ||
| 87 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 88 | } | ||
| 89 | ?></tr></tbody></table> | ||
| 90 | </td> | ||
| 91 | </tr> | ||
| 92 | <tr> | ||
| 93 | <td>Compact PURPOSE</td> | ||
| 94 | <td class="hh-td-inner"> | ||
| 95 | <table><tbody><tr><?php | ||
| 96 | $items = array('CUR', 'ADM', 'DEV', 'TAI', 'PSA', 'PSD', 'IVA', 'IVD', 'CON', 'HIS', 'TEL', 'OTP'); | ||
| 97 | foreach ($items as $i => $item) { | ||
| 98 | if ($i > 0 && $i % 4 === 0) { | ||
| 99 | ?></tr><tr><?php | ||
| 100 | } | ||
| 101 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 102 | } | ||
| 103 | ?></tr></tbody></table> | ||
| 104 | </td> | ||
| 105 | </tr> | ||
| 106 | <tr> | ||
| 107 | <td>Compact RECIPIENT</td> | ||
| 108 | <td class="hh-td-inner"> | ||
| 109 | <table><tbody><tr><?php | ||
| 110 | $items = array('OUR', 'DEL', 'SAM', 'UNR', 'PUB', 'OTR'); | ||
| 111 | foreach ($items as $i => $item) { | ||
| 112 | if ($i > 0 && $i % 4 === 0) { | ||
| 113 | ?></tr><tr><?php | ||
| 114 | } | ||
| 115 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 116 | } | ||
| 117 | ?></tr></tbody></table> | ||
| 118 | </td> | ||
| 119 | </tr> | ||
| 120 | <tr> | ||
| 121 | <td>Compact RETENTION</td> | ||
| 122 | <td class="hh-td-inner"> | ||
| 123 | <table><tbody><tr><?php | ||
| 124 | $items = array('NOR', 'STP', 'LEG', 'BUS', 'IND'); | ||
| 125 | foreach ($items as $i => $item) { | ||
| 126 | if ($i > 0 && $i % 4 === 0) { | ||
| 127 | ?></tr><tr><?php | ||
| 128 | } | ||
| 129 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 130 | } | ||
| 131 | ?></tr></tbody></table> | ||
| 132 | </td> | ||
| 133 | </tr> | ||
| 134 | <tr> | ||
| 135 | <td>Compact CATEGORIES</td> | ||
| 136 | <td class="hh-td-inner"> | ||
| 137 | <table><tbody><tr><?php | ||
| 138 | $items = array('PHY', 'ONL', 'UNI', 'PUR', 'FIN', 'COM', 'NAV', 'INT', 'DEM', 'CNT', 'STA', 'POL', 'HEA', 'PRE', 'LOC', 'GOV', 'OTC'); | ||
| 139 | foreach ($items as $i => $item) { | ||
| 140 | if ($i > 0 && $i % 4 === 0) { | ||
| 141 | ?></tr><tr><?php | ||
| 142 | } | ||
| 143 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 144 | } | ||
| 145 | ?></tr></tbody></table> | ||
| 146 | </td> | ||
| 147 | </tr> | ||
| 148 | <tr> | ||
| 149 | <td>Compact TEST</td> | ||
| 150 | <td class="hh-td-inner"> | ||
| 151 | <table><tbody><tr><?php | ||
| 152 | $items = array('TST'); | ||
| 153 | foreach ($items as $i => $item) { | ||
| 154 | if ($i > 0 && $i % 4 === 0) { | ||
| 155 | ?></tr><tr><?php | ||
| 156 | } | ||
| 157 | ?><td><label><input type="checkbox" class="http-header-value" name="hh_p3p_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $p3p_value) ? NULL : ' checked'; ?><?php echo $p3p == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></td><?php | ||
| 158 | } | ||
| 159 | ?></tr></tbody></table> | ||
| 160 | </td> | ||
| 161 | </tr> | ||
| 162 | </tbody> | ||
| 163 | </table> | ||
| 164 | |||
| 165 | </td> | ||
| 166 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">Permissions-Policy | ||
| 8 | <p class="description"><?php _e('Permissions Policy is a web platform API which gives a website the ability to allow or block the use of browser features in its own frame or in iframes that it embeds.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://www.w3.org/TR/permissions-policy-1/"><?php _e('W3C Working Draft', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Permissions-Policy</legend> | ||
| 17 | <?php | ||
| 18 | $permissions_policy = get_option('hh_permissions_policy', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_permissions_policy" value="<?php echo $k; ?>"<?php checked($permissions_policy, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-pp' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-pp' ); ?> | ||
| 29 | <table> | ||
| 30 | <tbody> | ||
| 31 | <?php | ||
| 32 | # https://github.com/w3c/webappsec-permissions-policy/blob/master/features.md | ||
| 33 | $features = array( | ||
| 34 | 'accelerometer', | ||
| 35 | 'ambient-light-sensor', | ||
| 36 | 'autoplay', | ||
| 37 | 'battery', | ||
| 38 | 'camera', | ||
| 39 | 'cross-origin-isolated', | ||
| 40 | 'display-capture', | ||
| 41 | 'document-domain', | ||
| 42 | 'encrypted-media', | ||
| 43 | 'execution-while-not-rendered', | ||
| 44 | 'execution-while-out-of-viewport', | ||
| 45 | 'fullscreen', | ||
| 46 | 'geolocation', | ||
| 47 | 'gyroscope', | ||
| 48 | 'interest-cohort', | ||
| 49 | 'layout-animations', | ||
| 50 | 'legacy-image-formats', | ||
| 51 | 'magnetometer', | ||
| 52 | 'microphone', | ||
| 53 | 'midi', | ||
| 54 | 'navigation-override', | ||
| 55 | 'oversized-images', | ||
| 56 | 'payment', | ||
| 57 | 'picture-in-picture', | ||
| 58 | 'publickey-credentials-get', | ||
| 59 | 'screen-wake-lock', | ||
| 60 | 'sync-script', | ||
| 61 | 'sync-xhr', | ||
| 62 | 'usb', | ||
| 63 | 'vertical-scroll', | ||
| 64 | 'web-share', | ||
| 65 | 'wake-lock', | ||
| 66 | 'xr-spatial-tracking', | ||
| 67 | ); | ||
| 68 | $origins = array('none', 'self', '*', 'origin(s)'); | ||
| 69 | |||
| 70 | $permissions_policy_value = get_option('hh_permissions_policy_value'); | ||
| 71 | $permissions_policy_feature = get_option('hh_permissions_policy_feature'); | ||
| 72 | $permissions_policy_origin = get_option('hh_permissions_policy_origin'); | ||
| 73 | if (!$permissions_policy_value) | ||
| 74 | { | ||
| 75 | $permissions_policy_value = array(); | ||
| 76 | } | ||
| 77 | if (!$permissions_policy_feature) | ||
| 78 | { | ||
| 79 | $permissions_policy_feature = array(); | ||
| 80 | } | ||
| 81 | if (!$permissions_policy_origin) | ||
| 82 | { | ||
| 83 | $permissions_policy_origin = array(); | ||
| 84 | } | ||
| 85 | |||
| 86 | foreach ($features as $feature) | ||
| 87 | { | ||
| 88 | ?> | ||
| 89 | <tr> | ||
| 90 | <td><input type="checkbox" name="hh_permissions_policy_feature[<?php echo $feature; ?>]" class="http-header-value" | ||
| 91 | value="1"<?php echo !is_array($permissions_policy_feature) || !array_key_exists($feature, $permissions_policy_feature) ? NULL : ' checked'; ?><?php echo $permissions_policy == 1 ? NULL : ' readonly'; ?>></td> | ||
| 92 | <td><?php echo $feature; ?></td> | ||
| 93 | <td> | ||
| 94 | <select name="hh_permissions_policy_value[<?php echo $feature; ?>]" | ||
| 95 | class="http-header-value"<?php echo $permissions_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 96 | <?php | ||
| 97 | foreach ($origins as $origin) | ||
| 98 | { | ||
| 99 | ?><option value="<?php echo $origin; ?>"<?php selected(@$permissions_policy_value[$feature], $origin); ?>><?php echo $origin; ?></option><?php | ||
| 100 | } | ||
| 101 | ?> | ||
| 102 | </select> | ||
| 103 | <input type="text" name="hh_permissions_policy_origin[<?php echo $feature; ?>]" | ||
| 104 | value="<?php echo htmlspecialchars( @$permissions_policy_origin[$feature] ); ?>" size="30"<?php echo isset($permissions_policy_value[$feature]) && in_array($permissions_policy_value[$feature], array('origin(s)', 'self')) ? NULL : ' style="display: none"'; ?> | ||
| 105 | class="http-header-value"<?php echo $permissions_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 106 | </td> | ||
| 107 | </tr> | ||
| 108 | <?php | ||
| 109 | } | ||
| 110 | ?> | ||
| 111 | </tbody> | ||
| 112 | </table> | ||
| 113 | </td> | ||
| 114 | </td> | ||
| 115 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">Pragma | ||
| 8 | <p class="description"><?php _e('The Pragma HTTP/1.0 general header is an implementation-specific header that may have various effects along the request-response chain. It is used for backwards compatibility with HTTP/1.0 caches where the Cache-Control HTTP/1.1 header is not yet present.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Pragma"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Pragma</legend> | ||
| 17 | <?php | ||
| 18 | $pragma = get_option('hh_pragma', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_pragma" value="<?php echo $k; ?>"<?php checked($pragma, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-pra' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-pra' ); ?> | ||
| 29 | <select name="hh_pragma_value" class="http-header-value"<?php echo $pragma == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('no-cache'); | ||
| 32 | $pragma_value = get_option('hh_pragma_value'); | ||
| 33 | foreach ($items as $item) { | ||
| 34 | ?><option value="<?php echo $item; ?>"<?php selected($pragma_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | </td> | ||
| 39 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">Referrer-Policy | ||
| 8 | <p class="description"><?php _e('The Referrer-Policy HTTP header governs which referrer information, sent in the Referer header, should be included with requests made.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Referrer-Policy</legend> | ||
| 17 | <?php | ||
| 18 | $referrer_policy = get_option('hh_referrer_policy', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_referrer_policy" value="<?php echo $k; ?>"<?php checked($referrer_policy, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-rp' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-rp' ); ?> | ||
| 29 | <select name="hh_referrer_policy_value" class="http-header-value"<?php echo $referrer_policy == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array("", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url"); | ||
| 32 | $referrer_policy_value = get_option('hh_referrer_policy_value'); | ||
| 33 | foreach ($items as $item) { | ||
| 34 | ?><option value="<?php echo $item; ?>"<?php selected($referrer_policy_value, $item); ?>><?php echo !empty($item) ? $item : '(empty string)'; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | </td> | ||
| 39 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">Report-To | ||
| 8 | <p class="description"><?php _e('The Report-To HTTP response header field instructs the user agent to store reporting endpoints for an origin.', 'http-headers'); ?></p> | ||
| 9 | </th> | ||
| 10 | <td> | ||
| 11 | <fieldset> | ||
| 12 | <legend class="screen-reader-text">Report-To</legend> | ||
| 13 | <?php | ||
| 14 | $report_to = get_option('hh_report_to', 0); | ||
| 15 | foreach ($bools as $k => $v) | ||
| 16 | { | ||
| 17 | ?><p><label><input type="radio" class="http-header" name="hh_report_to" value="<?php echo $k; ?>"<?php checked($report_to, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 18 | } | ||
| 19 | ?> | ||
| 20 | </fieldset> | ||
| 21 | <?php settings_fields( 'http-headers-rt' ); ?> | ||
| 22 | <?php do_settings_sections( 'http-headers-rt' ); ?> | ||
| 23 | </td> | ||
| 24 | </tr> | ||
| 25 | <?php | ||
| 26 | $default_value = array( | ||
| 27 | array( | ||
| 28 | 'endpoints' => array(), | ||
| 29 | 'group' => '', | ||
| 30 | 'max_age' => '', | ||
| 31 | ) | ||
| 32 | ); | ||
| 33 | $report_to_value = get_option('hh_report_to_value'); | ||
| 34 | if (!is_array($report_to_value) || empty($report_to_value)) | ||
| 35 | { | ||
| 36 | $report_to_value = $default_value; | ||
| 37 | } | ||
| 38 | ?> | ||
| 39 | <tr> | ||
| 40 | <td colspan="2"> | ||
| 41 | <div style="max-width: 1024px; overflow-x: auto"> | ||
| 42 | <table class="hh-bordered hh-p-sm"> | ||
| 43 | <tr> | ||
| 44 | <th rowspan="2" class="hh-center hh-middle">group</th> | ||
| 45 | <th rowspan="2" class="hh-center hh-middle">max_age</th> | ||
| 46 | <th rowspan="2" class="hh-center hh-middle">include_subdomains</th> | ||
| 47 | <th colspan="3" class="hh-center">endpoints</th> | ||
| 48 | <th> </th> | ||
| 49 | <th> </th> | ||
| 50 | </tr> | ||
| 51 | <tr> | ||
| 52 | <th class="hh-center">url</th> | ||
| 53 | <th class="hh-center">priority</th> | ||
| 54 | <th class="hh-center">weight</th> | ||
| 55 | <th> </th> | ||
| 56 | <th> </th> | ||
| 57 | </tr> | ||
| 58 | <?php | ||
| 59 | $items = array('0' => '0 (Delete entire reporting cache)', '3600' => '1 hour', '86400' => '1 day', '604800' => '7 days', '2592000' => '30 days', '5184000' => '60 days', '7776000' => '90 days', '31536000' => '1 year', '63072000' => '2 years'); | ||
| 60 | $i = 0; | ||
| 61 | foreach ($report_to_value as $item) | ||
| 62 | { | ||
| 63 | if (isset($item['endpoints']) && !empty($item['endpoints'])) | ||
| 64 | { | ||
| 65 | $cnt = count($item['endpoints']); | ||
| 66 | $c = 0; | ||
| 67 | foreach ($item['endpoints'] as $k => $v) | ||
| 68 | { | ||
| 69 | $classes = array(); | ||
| 70 | if ($c == 0) | ||
| 71 | { | ||
| 72 | if ($i == 0) | ||
| 73 | { | ||
| 74 | $classes[] = 'hh-tr-first'; | ||
| 75 | } | ||
| 76 | $classes[] = 'hh-tr-group-start'; | ||
| 77 | } | ||
| 78 | |||
| 79 | if ($c == $cnt - 1) | ||
| 80 | { | ||
| 81 | $classes[] = 'hh-tr-group-end'; | ||
| 82 | } | ||
| 83 | ?> | ||
| 84 | <tr class="<?php echo join(' ', $classes); ?>"> | ||
| 85 | <?php | ||
| 86 | if ($c == 0) | ||
| 87 | { | ||
| 88 | ?> | ||
| 89 | <td rowspan="<?php echo $cnt; ?>" class="hh-middle"><input type="text" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][group]" value="<?php echo esc_attr($item['group']); ?>" placeholder="csp-endpoint"<?php echo $report_to == 1 ? NULL : ' readonly'; ?>></td> | ||
| 90 | <td rowspan="<?php echo $cnt; ?>" class="hh-middle"><select class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][max_age]"<?php echo $report_to == 1 ? NULL : ' readonly'; ?>> | ||
| 91 | <?php | ||
| 92 | foreach ($items as $key => $val) { | ||
| 93 | ?><option value="<?php echo $key; ?>"<?php selected($item['max_age'], $key); ?>><?php echo $val; ?></option><?php | ||
| 94 | } | ||
| 95 | ?> | ||
| 96 | </select></td> | ||
| 97 | <td rowspan="<?php echo $cnt; ?>" class="hh-middle hh-center"><input type="checkbox" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][include_subdomains]" value="1"<?php checked(@$item['include_subdomains'], 1, true); ?><?php echo $report_to == 1 ? NULL : ' readonly'; ?> /></td> | ||
| 98 | <?php | ||
| 99 | } | ||
| 100 | ?> | ||
| 101 | |||
| 102 | <td><input type="text" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][endpoints][<?php echo $k; ?>][url]" value="<?php echo esc_attr($v['url']); ?>" placeholder="https://example.com/report/csp"<?php echo $report_to == 1 ? NULL : ' readonly'; ?> size="40"></td> | ||
| 103 | <td><input type="number" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][endpoints][<?php echo $k; ?>][priority]" value="<?php echo esc_attr($v['priority']); ?>" min="0" step="1"></td> | ||
| 104 | <td><input type="number" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][endpoints][<?php echo $k; ?>][weight]" value="<?php echo esc_attr($v['weight']); ?>" min="0" step="1"></td> | ||
| 105 | |||
| 106 | <td><?php | ||
| 107 | if ($c == 0) | ||
| 108 | { | ||
| 109 | ?> | ||
| 110 | <button type="button" class="button hh-btn-add-endpoint"><?php _e('Add endpoint', 'http-headers'); ?></button> | ||
| 111 | <?php | ||
| 112 | } else { | ||
| 113 | ?> | ||
| 114 | <button type="button" class="button hh-btn-delete-endpoint"><?php _e('Remove endpoint', 'http-headers'); ?></button> | ||
| 115 | <?php | ||
| 116 | } | ||
| 117 | ?></td> | ||
| 118 | <?php | ||
| 119 | if ($c == 0) | ||
| 120 | { | ||
| 121 | ?> | ||
| 122 | <td rowspan="<?php echo $cnt; ?>" class="hh-middle hh-center"><?php | ||
| 123 | if ($i > 0) | ||
| 124 | { | ||
| 125 | ?> | ||
| 126 | <button type="button" class="button hh-btn-delete-endpoint-group" title="<?php esc_attr_e('Delete', 'http-headers'); ?>"><?php _e('Remove group', 'http-headers'); ?></button> | ||
| 127 | <?php | ||
| 128 | } | ||
| 129 | ?></td> | ||
| 130 | <?php | ||
| 131 | } | ||
| 132 | ?> | ||
| 133 | </tr> | ||
| 134 | <?php | ||
| 135 | $c += 1; | ||
| 136 | } | ||
| 137 | } else { | ||
| 138 | ?> | ||
| 139 | <tr class="hh-tr-first hh-tr-group-start hh-tr-group-end"> | ||
| 140 | <td><input type="text" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][group]" value="<?php echo esc_attr($item['group']); ?>" placeholder="csp-endpoint"<?php echo $report_to == 1 ? NULL : ' readonly'; ?>></td> | ||
| 141 | <td><select class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][max_age]"<?php echo $report_to == 1 ? NULL : ' readonly'; ?>> | ||
| 142 | <?php | ||
| 143 | foreach ($items as $key => $val) { | ||
| 144 | ?><option value="<?php echo $key; ?>"<?php selected($item['max_age'], $key); ?>><?php echo $val; ?></option><?php | ||
| 145 | } | ||
| 146 | ?> | ||
| 147 | </select></td> | ||
| 148 | <td class="hh-center"><input type="checkbox" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][include_subdomains]" value="1"<?php checked(@$item['include_subdomains'], 1, true); ?><?php echo $report_to == 1 ? NULL : ' readonly'; ?> /></td> | ||
| 149 | |||
| 150 | <td><input type="text" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][endpoints][0][url]" placeholder="https://example.com/report/csp"<?php echo $report_to == 1 ? NULL : ' readonly'; ?> size="40"></td> | ||
| 151 | <td><input type="number" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][endpoints][0][priority]" min="0" step="1"></td> | ||
| 152 | <td><input type="number" class="http-header-value" name="hh_report_to_value[<?php echo $i; ?>][endpoints][0][weight]" min="0" step="1"></td> | ||
| 153 | |||
| 154 | <td> | ||
| 155 | <button type="button" class="button hh-btn-add-endpoint"><?php _e('Add endpoint', 'http-headers'); ?></button> | ||
| 156 | </td> | ||
| 157 | <td rowspan="1"><?php | ||
| 158 | if ($i > 0) | ||
| 159 | { | ||
| 160 | ?><button type="button" class="button hh-btn-delete-endpoint-group" title="<?php esc_attr_e('Delete', 'http-headers'); ?>"><?php _e('Remove group', 'http-headers'); ?></button><?php | ||
| 161 | } | ||
| 162 | ?></td> | ||
| 163 | </tr> | ||
| 164 | <?php | ||
| 165 | } | ||
| 166 | $i += 1; | ||
| 167 | } | ||
| 168 | ?> | ||
| 169 | <tr> | ||
| 170 | <td colspan="8"> | ||
| 171 | <button type="button" class="button" id="hh-btn-add-endpoint-group">+ <?php _e('Add endpoint group', 'http-headers'); ?></button> | ||
| 172 | </td> | ||
| 173 | </tr> | ||
| 174 | </table> | ||
| 175 | </div> | ||
| 176 | </td> | ||
| 177 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">Strict-Transport-Security | ||
| 8 | <p class="description"><?php _e("HTTP Strict-Transport-Security (HSTS) enforces secure (HTTP over SSL/TLS) connections to the server. This reduces impact of bugs in web applications leaking session data through cookies and external links and defends against Man-in-the-middle attacks. HSTS also disables the ability for user's to ignore SSL negotiation warnings.", 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Strict-Transport-Security</legend> | ||
| 17 | <?php | ||
| 18 | $strict_transport_security = get_option('hh_strict_transport_security', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_strict_transport_security" value="<?php echo $k; ?>"<?php checked($strict_transport_security, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-sts' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-sts' ); ?> | ||
| 29 | <table> | ||
| 30 | <tr> | ||
| 31 | <td>max-age:</td> | ||
| 32 | <td><select name="hh_strict_transport_security_max_age" class="http-header-value"<?php echo $strict_transport_security == 1 ? NULL : ' readonly'; ?>> | ||
| 33 | <?php | ||
| 34 | $items = array('0' => '0 (Delete entire HSTS Policy)', '3600' => '1 hour', '86400' => '1 day', '604800' => '7 days', '2592000' => '30 days', '5184000' => '60 days', '7776000' => '90 days', '31536000' => '1 year', '63072000' => '2 years'); | ||
| 35 | $strict_transport_security_max_age = get_option('hh_strict_transport_security_max_age'); | ||
| 36 | foreach ($items as $key => $item) { | ||
| 37 | ?><option value="<?php echo $key; ?>"<?php selected($strict_transport_security_max_age, $key); ?>><?php echo $item; ?></option><?php | ||
| 38 | } | ||
| 39 | ?> | ||
| 40 | </select></td> | ||
| 41 | </tr> | ||
| 42 | <tr> | ||
| 43 | <td>includeSubDomains:</td> | ||
| 44 | <td><input type="checkbox" class="http-header-value" name="hh_strict_transport_security_sub_domains" value="1"<?php checked(get_option('hh_strict_transport_security_sub_domains'), 1, true); ?><?php echo $strict_transport_security == 1 ? NULL : ' readonly'; ?> /></td> | ||
| 45 | </tr> | ||
| 46 | <tr> | ||
| 47 | <td>preload:</td> | ||
| 48 | <td><input type="checkbox" class="http-header-value" name="hh_strict_transport_security_preload" value="1"<?php checked(get_option('hh_strict_transport_security_preload'), 1, true); ?><?php echo $strict_transport_security == 1 ? NULL : ' readonly'; ?> /></td> | ||
| 49 | </tr> | ||
| 50 | </table> | ||
| 51 | </td> | ||
| 52 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Timing-Allow-Origin | ||
| 8 | <p class="description"><?php _e('The Timing-Allow-Origin header indicates whether a resource provides the complete timing information. SEO tools use the Resource Timing API to analyze the speed and weight of your web page resources.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Timing-Allow-Origin"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Timing-Allow-Origin</legend> | ||
| 17 | <?php | ||
| 18 | $timing_allow_origin = get_option('hh_timing_allow_origin', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_timing_allow_origin" value="<?php echo $k; ?>"<?php checked($timing_allow_origin, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-tao' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-tao' ); ?> | ||
| 29 | <select name="hh_timing_allow_origin_value" class="http-header-value"<?php echo $timing_allow_origin == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('*', 'origin'); | ||
| 32 | $timing_allow_origin_value = get_option('hh_timing_allow_origin_value'); | ||
| 33 | foreach ($items as $item) { | ||
| 34 | ?><option value="<?php echo $item; ?>"<?php selected($timing_allow_origin_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | <input type="text" name="hh_timing_allow_origin_url" class="http-header-value" placeholder="http://domain.com" value="<?php echo esc_attr(get_option('hh_timing_allow_origin_url')); ?>" size="35"<?php echo $timing_allow_origin == 1 && $timing_allow_origin_value == 'origin' ? NULL : ' style="display: none" readonly'; ?> /> | ||
| 39 | </td> | ||
| 40 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr> | ||
| 7 | <th scope="row">Vary | ||
| 8 | <p class="description"><?php _e('The Vary HTTP response header determines how to match future request headers to decide whether a cached response can be used rather than requesting a fresh one from the origin server. It is used by the server to indicate which headers it used when selecting a representation of a resource in a content negotiation algorithm.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">Vary</legend> | ||
| 17 | <?php | ||
| 18 | $vary = get_option('hh_vary', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_vary" value="<?php echo $k; ?>"<?php checked($vary, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-vary' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-vary' ); ?> | ||
| 29 | <table> | ||
| 30 | <tbody> | ||
| 31 | <tr> | ||
| 32 | <td> | ||
| 33 | <?php | ||
| 34 | $items = array( | ||
| 35 | '*', 'Accept-Encoding', 'User-Agent', 'Referer', 'Cookie', | ||
| 36 | ); | ||
| 37 | $vary_value = get_option('hh_vary_value'); | ||
| 38 | if (!$vary_value) { | ||
| 39 | $vary_value = array(); | ||
| 40 | } | ||
| 41 | foreach ($items as $item) | ||
| 42 | { | ||
| 43 | ?><p><label><input type="checkbox" class="http-header-value" name="hh_vary_value[<?php echo $item; ?>]" value="1"<?php echo !array_key_exists($item, $vary_value) ? NULL : ' checked'; ?><?php echo $vary == 1 ? NULL : ' readonly'; ?> /> <?php echo $item; ?></label></p><?php | ||
| 44 | } | ||
| 45 | ?> | ||
| 46 | </td> | ||
| 47 | </tr> | ||
| 48 | </tbody> | ||
| 49 | </table> | ||
| 50 | </td> | ||
| 51 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">WWW-Authenticate | ||
| 8 | <p class="description"><?php _e('HTTP supports the use of several authentication mechanisms to control access to pages and other resources. These mechanisms are all based around the use of the 401 status code and the WWW-Authenticate response header.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/WWW-Authenticate"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">WWW-Authenticate</legend> | ||
| 17 | <?php | ||
| 18 | $www_authenticate = get_option ( 'hh_www_authenticate', 0 ); | ||
| 19 | foreach ( $bools as $k => $v ) { | ||
| 20 | ?><p> | ||
| 21 | <label><input type="radio" class="http-header" name="hh_www_authenticate" value="<?php echo $k; ?>" <?php checked($www_authenticate, $k, true); ?> /> <?php echo $v; ?></label> | ||
| 22 | </p><?php | ||
| 23 | } | ||
| 24 | ?> | ||
| 25 | </fieldset> | ||
| 26 | </td> | ||
| 27 | <td> | ||
| 28 | <?php settings_fields( 'http-headers-wwa' ); ?> | ||
| 29 | <?php do_settings_sections( 'http-headers-wwa' ); ?> | ||
| 30 | <table> | ||
| 31 | <tbody> | ||
| 32 | <tr> | ||
| 33 | <td>Type</td> | ||
| 34 | <td colspan="3"> | ||
| 35 | <select name="hh_www_authenticate_type" class="http-header-value"<?php echo $www_authenticate == 1 ? NULL : ' readonly'; ?>> | ||
| 36 | <?php | ||
| 37 | $items = array ('Basic', 'Digest'); | ||
| 38 | $www_authenticate_type = get_option ( 'hh_www_authenticate_type' ); | ||
| 39 | foreach ( $items as $item ) { | ||
| 40 | ?><option value="<?php echo $item; ?>" <?php selected($www_authenticate_type, $item); ?>><?php echo $item; ?></option><?php | ||
| 41 | } | ||
| 42 | ?> | ||
| 43 | </select> | ||
| 44 | </td> | ||
| 45 | </tr> | ||
| 46 | <tr> | ||
| 47 | <td>Realm</td> | ||
| 48 | <td colspan="3"><input type="text" name="hh_www_authenticate_realm" class="http-header-value" size="30" value="<?php echo esc_attr(get_option('hh_www_authenticate_realm')); ?>"<?php echo $www_authenticate == 1 ? NULL : ' readonly'; ?> placeholder="Restricted area"></td> | ||
| 49 | </tr> | ||
| 50 | <tr> | ||
| 51 | <td> </td> | ||
| 52 | <td><strong><?php _e('Username', 'http-headers'); ?></strong></td> | ||
| 53 | <td><strong><?php _e('Password', 'http-headers'); ?></strong></td> | ||
| 54 | <td> </td> | ||
| 55 | </tr> | ||
| 56 | <?php | ||
| 57 | $usernames = get_option('hh_www_authenticate_user', array()); | ||
| 58 | $passwords = get_option('hh_www_authenticate_pswd', array()); | ||
| 59 | if (!is_array($usernames)) { | ||
| 60 | $usernames = array($usernames); | ||
| 61 | } | ||
| 62 | if (!is_array($passwords)) { | ||
| 63 | $passwords = array($passwords); | ||
| 64 | } | ||
| 65 | $i = 0; | ||
| 66 | foreach ($usernames as $k => $user) { | ||
| 67 | ?> | ||
| 68 | <tr> | ||
| 69 | <td> </td> | ||
| 70 | <td><input type="text" name="hh_www_authenticate_user[]" class="http-header-value" value="<?php echo esc_attr($user); ?>"<?php echo $www_authenticate == 1 ? NULL : ' readonly'; ?>></td> | ||
| 71 | <td><input type="text" name="hh_www_authenticate_pswd[]" class="http-header-value" value="<?php echo esc_attr($passwords[$k]); ?>"<?php echo $www_authenticate == 1 ? NULL : ' readonly'; ?>></td> | ||
| 72 | <td><?php | ||
| 73 | if ($i > 0) | ||
| 74 | { | ||
| 75 | ?><button type="button" class="button button-small hh-btn-delete-user" title="<?php esc_attr_e('Delete', 'http-headers'); ?>">x</button><?php | ||
| 76 | } else { | ||
| 77 | echo " "; | ||
| 78 | } | ||
| 79 | ?></td> | ||
| 80 | </tr> | ||
| 81 | <?php | ||
| 82 | $i += 1; | ||
| 83 | } | ||
| 84 | ?> | ||
| 85 | <tr> | ||
| 86 | <td> </td> | ||
| 87 | <td colspan="3"> | ||
| 88 | <button type="button" class="button hh-btn-add-user">+ <?php _e('Add user', 'http-headers'); ?></button> | ||
| 89 | </td> | ||
| 90 | </tr> | ||
| 91 | </tbody> | ||
| 92 | </table> | ||
| 93 | </td> | ||
| 94 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-Content-Type-Options | ||
| 8 | <p class="description"><?php _e('Prevents Internet Explorer and Google Chrome from MIME-sniffing a response away from the declared content-type. This also applies to Google Chrome, when downloading extensions. This reduces exposure to drive-by download attacks and sites serving user uploaded content that, by clever naming, could be treated by MSIE as executable or dynamic HTML files.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">X-Content-Type-Options</legend> | ||
| 17 | <?php | ||
| 18 | $x_content_type_options = get_option('hh_x_content_type_options', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_x_content_type_options" value="<?php echo $k; ?>"<?php checked($x_content_type_options, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-cto' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-cto' ); ?> | ||
| 29 | <select name="hh_x_content_type_options_value" class="http-header-value"<?php echo $x_content_type_options == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('nosniff'); | ||
| 32 | $x_content_type_options_value = get_option('hh_x_content_type_options_value'); | ||
| 33 | foreach ($items as $item) { | ||
| 34 | ?><option value="<?php echo $item; ?>"<?php selected($x_content_type_options_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | </td> | ||
| 39 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-DNS-Prefetch-Control | ||
| 8 | <p class="description"><?php _e('The X-DNS-Prefetch-Control HTTP response header controls DNS prefetching, a feature by which browsers proactively perform domain name resolution on both links that the user may choose to follow as well as URLs for items referenced by the document, including images, CSS, JavaScript, and so forth.', 'http-headers'); ?></p> | ||
| 9 | <p class="description"><?php _e('This prefetching is performed in the background, so that the DNS is likely to have been resolved by the time the referenced items are needed. This reduces latency when the user clicks a link.', 'http-headers'); ?></p> | ||
| 10 | <hr> | ||
| 11 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 12 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-DNS-Prefetch-Control"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 13 | </p> | ||
| 14 | </th> | ||
| 15 | <td> | ||
| 16 | <fieldset> | ||
| 17 | <legend class="screen-reader-text">X-DNS-Prefetch-Control</legend> | ||
| 18 | <?php | ||
| 19 | $x_dns_prefetch_control = get_option('hh_x_dns_prefetch_control', 0); | ||
| 20 | foreach ($bools as $k => $v) | ||
| 21 | { | ||
| 22 | ?><p><label><input type="radio" class="http-header" name="hh_x_dns_prefetch_control" value="<?php echo $k; ?>"<?php checked($x_dns_prefetch_control, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 23 | } | ||
| 24 | ?> | ||
| 25 | </fieldset> | ||
| 26 | </td> | ||
| 27 | <td> | ||
| 28 | <?php settings_fields( 'http-headers-xdpc' ); ?> | ||
| 29 | <?php do_settings_sections( 'http-headers-xdpc' ); ?> | ||
| 30 | <select name="hh_x_dns_prefetch_control_value" class="http-header-value"<?php echo $x_dns_prefetch_control == 1 ? NULL : ' readonly'; ?>> | ||
| 31 | <?php | ||
| 32 | $items = array('on', 'off'); | ||
| 33 | $x_dns_prefetch_control_value = get_option('hh_x_dns_prefetch_control_value'); | ||
| 34 | foreach ($items as $item) { | ||
| 35 | ?><option value="<?php echo $item; ?>"<?php selected($x_dns_prefetch_control_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 36 | } | ||
| 37 | ?> | ||
| 38 | </select> | ||
| 39 | </td> | ||
| 40 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-Download-Options | ||
| 8 | <p class="description"><?php _e("For web applications that need to serve untrusted HTML files, Microsoft IE introduced a mechanism to help prevent the untrusted content from compromising your site's security. When the X-Download-Options header is present with the value noopen, the user is prevented from opening a file download directly; instead, they must first save the file locally. When the locally saved file is later opened, it no longer executes in the security context of your site, helping to prevent script injection.", 'http-headers'); ?></p> | ||
| 9 | </th> | ||
| 10 | <td> | ||
| 11 | <fieldset> | ||
| 12 | <legend class="screen-reader-text">X-Download-Options</legend> | ||
| 13 | <?php | ||
| 14 | $x_download_options = get_option('hh_x_download_options', 0); | ||
| 15 | foreach ($bools as $k => $v) | ||
| 16 | { | ||
| 17 | ?><p><label><input type="radio" class="http-header" name="hh_x_download_options" value="<?php echo $k; ?>"<?php checked($x_download_options, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 18 | } | ||
| 19 | ?> | ||
| 20 | </fieldset> | ||
| 21 | </td> | ||
| 22 | <td> | ||
| 23 | <?php settings_fields( 'http-headers-xdo' ); ?> | ||
| 24 | <?php do_settings_sections( 'http-headers-xdo' ); ?> | ||
| 25 | <select name="hh_x_download_options_value" class="http-header-value"<?php echo $x_download_options == 1 ? NULL : ' readonly'; ?>> | ||
| 26 | <?php | ||
| 27 | $items = array('noopen'); | ||
| 28 | $x_download_options_value = get_option('hh_x_download_options_value'); | ||
| 29 | foreach ($items as $item) { | ||
| 30 | ?><option value="<?php echo $item; ?>"<?php selected($x_download_options_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 31 | } | ||
| 32 | ?> | ||
| 33 | </select> | ||
| 34 | </td> | ||
| 35 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-Frame-Options | ||
| 8 | <p class="description"><?php _e('This header can be used to indicate whether or not a browser should be allowed to render a page in a <frame>, <iframe> or <object>. Use this to avoid clickjacking attacks.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">X-Frame-Options</legend> | ||
| 17 | <?php | ||
| 18 | $x_frame_options = get_option('hh_x_frame_options', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_x_frame_options" value="<?php echo $k; ?>"<?php checked($x_frame_options, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-xfo' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-xfo' ); ?> | ||
| 29 | <select name="hh_x_frame_options_value" class="http-header-value"<?php echo $x_frame_options == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('deny', 'sameorigin', 'allow-from'); | ||
| 32 | $x_frame_options_value = get_option('hh_x_frame_options_value'); | ||
| 33 | foreach ($items as $item) | ||
| 34 | { | ||
| 35 | ?><option value="<?php echo $item; ?>"<?php selected($x_frame_options_value, $item); ?>><?php echo strtoupper($item); ?></option><?php | ||
| 36 | } | ||
| 37 | ?> | ||
| 38 | </select> | ||
| 39 | <input type="text" name="hh_x_frame_options_domain" class="http-header-value" placeholder="Domain" value="<?php echo esc_attr(get_option('hh_x_frame_options_domain')); ?>"<?php echo $x_frame_options == 1 && $x_frame_options_value == 'allow-from' ? NULL : ' style="display: none" readonly'; ?> /> | ||
| 40 | </td> | ||
| 41 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-Permitted-Cross-Domain-Policies | ||
| 8 | <p class="description"><?php _e('A cross-domain policy file is an XML document that grants a web client, such as Adobe Flash Player or Adobe Acrobat (though not necessarily limited to these), permission to handle data across domains.', 'http-headers'); ?></p> | ||
| 9 | </th> | ||
| 10 | <td> | ||
| 11 | <fieldset> | ||
| 12 | <legend class="screen-reader-text">X-Permitted-Cross-Domain-Policies</legend> | ||
| 13 | <?php | ||
| 14 | $x_permitted_cross_domain_policies = get_option('hh_x_permitted_cross_domain_policies', 0); | ||
| 15 | foreach ($bools as $k => $v) | ||
| 16 | { | ||
| 17 | ?><p><label><input type="radio" class="http-header" name="hh_x_permitted_cross_domain_policies" value="<?php echo $k; ?>"<?php checked($x_permitted_cross_domain_policies, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 18 | } | ||
| 19 | ?> | ||
| 20 | </fieldset> | ||
| 21 | </td> | ||
| 22 | <td> | ||
| 23 | <?php settings_fields( 'http-headers-xpcd' ); ?> | ||
| 24 | <?php do_settings_sections( 'http-headers-xpcd' ); ?> | ||
| 25 | <select name="hh_x_permitted_cross_domain_policies_value" class="http-header-value"<?php echo $x_permitted_cross_domain_policies == 1 ? NULL : ' readonly'; ?>> | ||
| 26 | <?php | ||
| 27 | $items = array('none', 'master-only', 'by-content-type', 'by-ftp-filename', 'all'); | ||
| 28 | $x_permitted_cross_domain_policies_value = get_option('hh_x_permitted_cross_domain_policies_value'); | ||
| 29 | foreach ($items as $item) { | ||
| 30 | ?><option value="<?php echo $item; ?>"<?php selected($x_permitted_cross_domain_policies_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 31 | } | ||
| 32 | ?> | ||
| 33 | </select> | ||
| 34 | </td> | ||
| 35 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-Powered-By | ||
| 8 | <p class="description"><?php _e('Specifies the technology (e.g. ASP.NET, PHP, JBoss, Express) supporting the web application, i.e. the scripting language. It is recommended to remove it or provide misleading information to throw off hackers that might target a particular technology/version.', 'http-headers'); ?></p> | ||
| 9 | </th> | ||
| 10 | <td> | ||
| 11 | <fieldset> | ||
| 12 | <legend class="screen-reader-text">X-Powered-By</legend> | ||
| 13 | <?php | ||
| 14 | $x_powered_by = get_option ( 'hh_x_powered_by', 0 ); | ||
| 15 | foreach ( $bools as $k => $v ) { | ||
| 16 | ?><p> | ||
| 17 | <label><input type="radio" class="http-header" name="hh_x_powered_by" value="<?php echo $k; ?>" <?php checked($x_powered_by, $k, true); ?> /> <?php echo $v; ?></label> | ||
| 18 | </p><?php | ||
| 19 | } | ||
| 20 | ?> | ||
| 21 | </fieldset> | ||
| 22 | </td> | ||
| 23 | <td> | ||
| 24 | <?php settings_fields( 'http-headers-xpb' ); ?> | ||
| 25 | <?php do_settings_sections( 'http-headers-xpb' ); ?> | ||
| 26 | <select name="hh_x_powered_by_option" class="http-header-value"<?php echo $x_powered_by == 1 ? NULL : ' readonly'; ?>> | ||
| 27 | <?php | ||
| 28 | $items = array ( | ||
| 29 | 'unset' => 'Unset', | ||
| 30 | 'set' => 'Set', | ||
| 31 | ); | ||
| 32 | $x_powered_by_option = get_option ( 'hh_x_powered_by_option' ); | ||
| 33 | foreach ( $items as $k => $v ) { | ||
| 34 | ?><option value="<?php echo $k; ?>" <?php selected($x_powered_by_option, $k); ?>><?php echo $v; ?></option><?php | ||
| 35 | } | ||
| 36 | ?> | ||
| 37 | </select> | ||
| 38 | <input type="text" name="hh_x_powered_by_value" class="http-header-value" placeholder="PHP/<?php echo PHP_VERSION; ?>" value="<?php echo esc_attr(get_option('hh_x_powered_by_value')); ?>" | ||
| 39 | <?php echo $x_powered_by == 1 && $x_powered_by_option == 'set' ? NULL : ' style="display: none" readonly'; ?> /> | ||
| 40 | </td> | ||
| 41 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-Robots-Tag | ||
| 8 | <p class="description"><?php _e('The X-Robots-Tag HTTP header is used to indicate how a web page is to be indexed within public search engine results. The header is effectively equivalent to <code><meta name="robots" content="..."></code>.', 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developers.google.com/search/docs/advanced/robots/robots_meta_tag"><?php _e('Google Search Central', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">X-Robots-Tag</legend> | ||
| 17 | <?php | ||
| 18 | $x_robots_tag = get_option('hh_x_robots_tag', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_x_robots_tag" value="<?php echo $k; ?>"<?php checked($x_robots_tag, $k); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-rob' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-rob' ); ?> | ||
| 29 | <?php | ||
| 30 | $items = array( | ||
| 31 | 'all' => 'bool', | ||
| 32 | 'noindex' => 'bool', | ||
| 33 | 'nofollow' => 'bool', | ||
| 34 | 'none' => 'bool', | ||
| 35 | 'noarchive' => 'bool', | ||
| 36 | 'nosnippet' => 'bool', | ||
| 37 | 'max-snippet' => 'number', | ||
| 38 | 'max-image-preview' => 'setting', | ||
| 39 | 'max-video-preview' => 'number', | ||
| 40 | 'notranslate' => 'bool', | ||
| 41 | 'noimageindex' => 'bool', | ||
| 42 | 'unavailable_after' => 'datetime', | ||
| 43 | ); | ||
| 44 | ?> | ||
| 45 | <table> | ||
| 46 | <?php | ||
| 47 | $x_robots_tag_value = get_option('hh_x_robots_tag_value'); | ||
| 48 | if (!$x_robots_tag_value) | ||
| 49 | { | ||
| 50 | $x_robots_tag_value = array(); | ||
| 51 | } | ||
| 52 | foreach ($items as $item => $type) | ||
| 53 | { | ||
| 54 | ?> | ||
| 55 | <tr> | ||
| 56 | <td><label for="hh_x_robots_tag_value_<?php echo $item; ?>"><?php echo $item; ?></label></td> | ||
| 57 | <td><?php | ||
| 58 | switch ($type) { | ||
| 59 | case 'bool': | ||
| 60 | ?><input type="checkbox" class="http-header-value" name="hh_x_robots_tag_value[<?php echo $item; ?>]" | ||
| 61 | id="hh_x_robots_tag_value_<?php echo $item; ?>"<?php echo $x_robots_tag == 1 ? NULL : ' readonly'; ?> | ||
| 62 | value="1"<?php checked(array_key_exists($item, $x_robots_tag_value), 1, true); ?>><?php | ||
| 63 | break; | ||
| 64 | case 'number': | ||
| 65 | ?><input type="number" class="http-header-value" name="hh_x_robots_tag_value[<?php echo $item; ?>]" | ||
| 66 | id="hh_x_robots_tag_value_<?php echo $item; ?>" | ||
| 67 | size="6" min="-1" step="1"<?php echo $x_robots_tag == 1 ? NULL : ' readonly'; ?> | ||
| 68 | value="<?php echo array_key_exists($item, $x_robots_tag_value) && strlen($x_robots_tag_value[$item]) > 0 ? (int) $x_robots_tag_value[$item] : NULL; ?>"><?php | ||
| 69 | break; | ||
| 70 | case 'setting': | ||
| 71 | ?><select class="http-header-value" name="hh_x_robots_tag_value[<?php echo $item; ?>]" | ||
| 72 | id="hh_x_robots_tag_value_<?php echo $item; ?>"<?php echo $x_robots_tag == 1 ? NULL : ' readonly'; ?>> | ||
| 73 | <option value="">---</option> | ||
| 74 | <?php | ||
| 75 | foreach (array('none', 'standard', 'large') as $k) | ||
| 76 | { | ||
| 77 | ?><option value="<?php echo $k; ?>"<?php echo array_key_exists($item, $x_robots_tag_value) && $k == $x_robots_tag_value[$item] ? ' selected="selected"' : NULL; ?>><?php echo $k; ?></option><?php | ||
| 78 | } | ||
| 79 | ?> | ||
| 80 | </select><?php | ||
| 81 | break; | ||
| 82 | case 'datetime': | ||
| 83 | ?><input type="date" class="http-header-value" name="hh_x_robots_tag_value[<?php echo $item; ?>]" | ||
| 84 | id="hh_x_robots_tag_value_<?php echo $item; ?>"<?php echo $x_robots_tag == 1 ? NULL : ' readonly'; ?> | ||
| 85 | value="<?php echo array_key_exists($item, $x_robots_tag_value) && strlen($x_robots_tag_value[$item]) > 0 ? $x_robots_tag_value[$item] : NULL; ?>"><?php | ||
| 86 | break; | ||
| 87 | } | ||
| 88 | ?> | ||
| 89 | </td> | ||
| 90 | </tr> | ||
| 91 | <?php | ||
| 92 | } | ||
| 93 | ?> | ||
| 94 | </table> | ||
| 95 | </td> | ||
| 96 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-UA-Compatible | ||
| 8 | <p class="description"><?php _e('In some cases, it might be necessary to restrict a webpage to a document mode supported by an older version of Windows Internet Explorer. Here we look at the x-ua-compatible header, which allows a webpage to be displayed as if it were viewed by an earlier version of the browser.', 'http-headers'); ?></p> | ||
| 9 | </th> | ||
| 10 | <td> | ||
| 11 | <fieldset> | ||
| 12 | <legend class="screen-reader-text">X-UA-Compatible</legend> | ||
| 13 | <?php | ||
| 14 | $x_ua_compatible = get_option('hh_x_ua_compatible', 0); | ||
| 15 | foreach ($bools as $k => $v) | ||
| 16 | { | ||
| 17 | ?><p><label><input type="radio" class="http-header" name="hh_x_ua_compatible" value="<?php echo $k; ?>"<?php checked($x_ua_compatible, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 18 | } | ||
| 19 | ?> | ||
| 20 | </fieldset> | ||
| 21 | </td> | ||
| 22 | <td> | ||
| 23 | <?php settings_fields( 'http-headers-uac' ); ?> | ||
| 24 | <?php do_settings_sections( 'http-headers-uac' ); ?> | ||
| 25 | <select name="hh_x_ua_compatible_value" class="http-header-value"<?php echo $x_ua_compatible == 1 ? NULL : ' readonly'; ?>> | ||
| 26 | <?php | ||
| 27 | $items = array('IE=7', 'IE=8', 'IE=9', 'IE=10', 'IE=edge', 'IE=edge,chrome=1'); | ||
| 28 | $x_ua_compatible_value = get_option('hh_x_ua_compatible_value'); | ||
| 29 | foreach ($items as $item) { | ||
| 30 | ?><option value="<?php echo $item; ?>"<?php selected($x_ua_compatible_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 31 | } | ||
| 32 | ?> | ||
| 33 | </select> | ||
| 34 | </td> | ||
| 35 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | <?php | ||
| 2 | if (!defined('ABSPATH')) { | ||
| 3 | exit; | ||
| 4 | } | ||
| 5 | ?> | ||
| 6 | <tr valign="top"> | ||
| 7 | <th scope="row">X-XSS-Protection | ||
| 8 | <p class="description"><?php _e("This header enables the Cross-site scripting (XSS) filter built into most recent web browsers. It's usually enabled by default anyway, so the role of this header is to re-enable the filter for this particular website if it was disabled by the user.", 'http-headers'); ?></p> | ||
| 9 | <hr> | ||
| 10 | <p class="description"><?php _e('Read more at', 'http-headers'); ?> | ||
| 11 | <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection"><?php _e('MDN Web Docs', 'http-headers'); ?></a> | ||
| 12 | </p> | ||
| 13 | </th> | ||
| 14 | <td> | ||
| 15 | <fieldset> | ||
| 16 | <legend class="screen-reader-text">X-XSS-Protection</legend> | ||
| 17 | <?php | ||
| 18 | $x_xxs_protection = get_option('hh_x_xxs_protection', 0); | ||
| 19 | foreach ($bools as $k => $v) | ||
| 20 | { | ||
| 21 | ?><p><label><input type="radio" class="http-header" name="hh_x_xxs_protection" value="<?php echo $k; ?>"<?php checked($x_xxs_protection, $k, true); ?> /> <?php echo $v; ?></label></p><?php | ||
| 22 | } | ||
| 23 | ?> | ||
| 24 | </fieldset> | ||
| 25 | </td> | ||
| 26 | <td> | ||
| 27 | <?php settings_fields( 'http-headers-xss' ); ?> | ||
| 28 | <?php do_settings_sections( 'http-headers-xss' ); ?> | ||
| 29 | <select name="hh_x_xxs_protection_value" class="http-header-value"<?php echo $x_xxs_protection == 1 ? NULL : ' readonly'; ?>> | ||
| 30 | <?php | ||
| 31 | $items = array('0', '1', '1; mode=block', '1; report='); | ||
| 32 | $x_xxs_protection_value = get_option('hh_x_xxs_protection_value'); | ||
| 33 | foreach ($items as $item) | ||
| 34 | { | ||
| 35 | ?><option value="<?php echo $item; ?>"<?php selected($x_xxs_protection_value, $item); ?>><?php echo $item; ?></option><?php | ||
| 36 | } | ||
| 37 | ?> | ||
| 38 | </select> | ||
| 39 | <input type="text" name="hh_x_xxs_protection_uri" class="http-header-value" placeholder="Reporting URI" value="<?php echo esc_attr(get_option('hh_x_xxs_protection_uri')); ?>"<?php echo $x_xxs_protection == 1 && $x_xxs_protection_value == '1; report=' ? NULL : ' style="display: none" readonly'; ?> /> | ||
| 40 | </td> | ||
| 41 | </tr> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or sign in to post a comment