Version Description
- 2022-10-31 =
- Added: Support for IPv6 addresses (props @jeffpaul, @Sidsector9, @cadic).
- Added: Support for subnet range and pattern formats for IPv4 and IPv6 addresses (props @jeffpaul, @Sidsector9, @cadic).
- Added: WP VIP Coding Standards (props @peterwilsoncc, @faisal-alvi, @eflorea).
- Changed: Improved adding IP user experience via settings (props @ankitguptaindia, @dhanendran, @Sidsector9, @dinhtungdu).
- Changed: Replace Grunt with Webpack (props @cadic, @Sidsector9).
- Fixed: Missing textdomains to translatable strings (props @pedro-mendonca, @Sidsector9).
Download this release
Release Info
Developer | 10up |
Plugin | Restricted Site Access |
Version | 7.3.3 |
Comparing to | |
See all releases |
Code changes from version 7.3.2 to 7.3.3
- assets/js/admin.min.js +0 -1
- assets/js/settings.min.js +1 -1
- assets/js/src/admin.js +113 -110
- assets/js/src/settings.js +28 -25
- phpcs.xml +42 -0
- phpcs.xml.dist +24 -0
- readme.txt +12 -2
- restricted_site_access.php +74 -100
assets/js/admin.min.js
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
!function(e,s){"use strict";s(".notice").on("click",".notice-dismiss",function(e){e.delegateTarget.getAttribute("data-rsa-notice")&&s.ajax({method:"post",data:{nonce:rsaAdmin.nonce,action:"rsa_notice_dismiss"},url:ajaxurl})})}(window,jQuery),function(e,s){"use strict";({els:{dialog:document.getElementById("rsa-disable-dialog"),userMessage:document.getElementById("rsa-user-message")},variables:{expectedAnswer:rsaAdmin.strings.message.toLowerCase(),disablingURL:null},openDialog(e){e.preventDefault(),s(this.els.dialog).dialog("open")},isExpectedAnswer(){return this.els.userMessage.value.toLowerCase()===this.variables.expectedAnswer},dialogSettings(){const t=this;t.close=function(){s(t.els.dialog).dialog("close"),t.els.userMessage.style.border="1px solid #ddd",t.els.userMessage.value=""},s(this.els.dialog).dialog({dialogClass:"wp-dialog",autoOpen:!1,draggable:!1,width:"auto",modal:!0,resizable:!1,buttons:[{text:rsaAdmin.strings.confirm,click(){t.isExpectedAnswer()?e.location.href=t.variables.disablingURL:t.els.userMessage.style.border="1px solid red"}},{text:rsaAdmin.strings.cancel,click(){t.close()},class:"button-primary"}],open(){s(".ui-widget-overlay").bind("click",function(){t.close()})},create(){s(".ui-dialog-titlebar-close").addClass("ui-button"),s(this).siblings(".ui-dialog-titlebar").hide()}}),this.els.buttons=s(this.els.dialog).dialog("option","buttons")},maybeSubmit(e){switch(e.key){case"Enter":this.els.buttons[0].click()}},bindEvents(){s('[data-slug="restricted-site-access"]').on("click",".deactivate a",this.openDialog.bind(this)),this.els.userMessage&&this.els.userMessage.addEventListener("keyup",this.maybeSubmit.bind(this))},init(){const e=document.getElementById("the-list");e&&(this.variables.disablingURL=e.querySelector('[data-slug="restricted-site-access"] .deactivate a').href),this.bindEvents(),this.dialogSettings()}}).init()}(window,jQuery);
|
|
assets/js/settings.min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
!function(e,
|
1 |
+
!function(e,i){"use strict";const t=e.document,c={add_btn:"",new_ip:"",ip_list_wrap:"",empty_ip:"",restrict_radio:"",table:"",redirect_choice:"",message_choice:"",page_choice:"",redirect_fields:"",message_field:"",page_field:"",error_field:""};!function(){c.add_btn=i(t.getElementById("addip")),c.new_ip=t.getElementById("newip"),c.new_ip_comment=t.getElementById("newipcomment"),c.ip_list_wrap=t.getElementById("ip_list"),c.empty_ip=i(t.getElementById("ip_list_empty")),c.restrict_radio=t.getElementById("blog-restricted"),c.error_field=t.getElementById("rsa-error-container"),c.table=i(t.getElementById("rsa-send-to-login")).closest("table"),c.redirect_choice=t.getElementById("rsa-redirect-visitor"),c.message_choice=t.getElementById("rsa-display-message"),c.page_choice=t.getElementById("rsa-unblocked-page"),c.redirect_fields=i(t.querySelectorAll(".rsa_redirect_field")).closest("tr"),c.message_field=i(t.getElementById("rsa_message")).closest("tr"),c.page_field=i(t.getElementById("rsa_page")).closest("tr"),c.restrict_radio&&!c.restrict_radio.checked&&c.table.hide(),c.redirect_choice&&!c.redirect_choice.checked&&c.redirect_fields.hide(),c.message_choice&&!c.message_choice.checked&&c.message_field.hide(),c.page_choice&&!c.page_choice.checked&&c.page_field.hide(),i(t.querySelectorAll("#rsa_handle_fields input")).on("change",function(){c.redirect_choice.checked?c.redirect_fields.show():c.redirect_fields.hide(),c.message_choice.checked?c.message_field.show():c.message_field.hide(),c.page_choice.checked?c.page_field.show():c.page_field.hide()}),i(t.querySelectorAll(".option-site-visibility input")).on("change",function(){c.restrict_radio.checked?c.table.show():c.table.hide()}),c.add_btn.on("click",function(){c.empty_ip.clone().appendTo(c.ip_list_wrap).removeAttr("id").slideDown(250)}),i(c.ip_list_wrap).on("blur",".ip.code",function(){!function(e,r,s){if(i("#submit").prop("disabled",!0),""===i.trim(e))return void i("#submit").prop("disabled",!1);const d=i(t.querySelectorAll("#ip_list input"));for(let t=0;t<d.length;t++)if(!s.is(d[t])&&d[t].value===e)return i(d[t]).parent().effect("shake",600),void i(s).focus();jQuery.post(ajaxurl,{action:"rsa_ip_check",ip_address:e,ip_address_comment:r,nonce:rsaSettings.nonce},function(e){return e.success?(i(c.error_field).text(""),i("#submit").prop("disabled",!1),!0):(i(s).effect("shake",600).focus(),i(c.error_field).text(e.data),!1)})}(i(this).val(),i(this).next().val(),i(this))});const e=t.getElementById("rsa_myip");null!==e&&i(e).on("click",function(){i(".ip.code:last").val(i(this).data("myip")).blur()}),i(c.ip_list_wrap).on("click",".remove_btn",function(){i(this.parentNode).slideUp(250,function(){i(this).remove()})})}()}(window,jQuery);
|
assets/js/src/admin.js
CHANGED
@@ -1,3 +1,5 @@
|
|
|
|
|
|
1 |
/**
|
2 |
* 10up
|
3 |
* http://10up.com
|
@@ -31,119 +33,120 @@
|
|
31 |
|
32 |
( function( window, $ ) {
|
33 |
'use strict';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
draggable: false,
|
73 |
-
width: 'auto',
|
74 |
-
modal: true,
|
75 |
-
resizable: false,
|
76 |
-
buttons: [
|
77 |
-
{
|
78 |
-
text: rsaAdmin.strings.confirm,
|
79 |
-
click() {
|
80 |
-
if ( self.isExpectedAnswer() ) {
|
81 |
-
window.location.href =
|
82 |
-
self.variables.disablingURL;
|
83 |
-
} else {
|
84 |
-
self.els.userMessage.style.border =
|
85 |
-
'1px solid red';
|
86 |
-
}
|
87 |
},
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
|
|
93 |
},
|
94 |
-
|
|
|
|
|
|
|
|
|
95 |
},
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
}
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
bindEvents() {
|
123 |
-
$( '[data-slug="restricted-site-access"]' ).on(
|
124 |
-
'click',
|
125 |
-
'.deactivate a',
|
126 |
-
this.openDialog.bind( this )
|
127 |
-
);
|
128 |
-
if ( this.els.userMessage ) {
|
129 |
-
this.els.userMessage.addEventListener(
|
130 |
-
'keyup',
|
131 |
-
this.maybeSubmit.bind( this )
|
132 |
);
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
}( window, jQuery ) );
|
1 |
+
import 'jquery-ui-dialog';
|
2 |
+
|
3 |
/**
|
4 |
* 10up
|
5 |
* http://10up.com
|
33 |
|
34 |
( function( window, $ ) {
|
35 |
'use strict';
|
36 |
+
$( () => {
|
37 |
+
const RSADisablePlugin = {
|
38 |
+
els: {
|
39 |
+
dialog: document.getElementById( 'rsa-disable-dialog' ),
|
40 |
+
userMessage: document.getElementById( 'rsa-user-message' ),
|
41 |
+
},
|
42 |
+
|
43 |
+
variables: {
|
44 |
+
expectedAnswer: rsaAdmin.strings.message.toLowerCase(),
|
45 |
+
disablingURL: null,
|
46 |
+
},
|
47 |
+
|
48 |
+
openDialog( event ) {
|
49 |
+
event.preventDefault();
|
50 |
+
$( this.els.dialog ).dialog( 'open' );
|
51 |
+
},
|
52 |
|
53 |
+
isExpectedAnswer() {
|
54 |
+
const userMessage = this.els.userMessage.value.toLowerCase();
|
55 |
+
|
56 |
+
if ( userMessage === this.variables.expectedAnswer ) {
|
57 |
+
return true;
|
58 |
+
}
|
59 |
+
|
60 |
+
return false;
|
61 |
+
},
|
62 |
+
dialogSettings() {
|
63 |
+
const self = this;
|
64 |
+
|
65 |
+
self.close = function() {
|
66 |
+
$( self.els.dialog ).dialog( 'close' );
|
67 |
+
self.els.userMessage.style.border = '1px solid #ddd';
|
68 |
+
self.els.userMessage.value = '';
|
69 |
+
};
|
70 |
+
|
71 |
+
$( this.els.dialog ).dialog( {
|
72 |
+
dialogClass: 'wp-dialog',
|
73 |
+
autoOpen: false,
|
74 |
+
draggable: false,
|
75 |
+
width: 'auto',
|
76 |
+
modal: true,
|
77 |
+
resizable: false,
|
78 |
+
buttons: [
|
79 |
+
{
|
80 |
+
text: rsaAdmin.strings.confirm,
|
81 |
+
click() {
|
82 |
+
if ( self.isExpectedAnswer() ) {
|
83 |
+
window.location.href =
|
84 |
+
self.variables.disablingURL;
|
85 |
+
} else {
|
86 |
+
self.els.userMessage.style.border =
|
87 |
+
'1px solid red';
|
88 |
+
}
|
89 |
+
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
},
|
91 |
+
{
|
92 |
+
text: rsaAdmin.strings.cancel,
|
93 |
+
click() {
|
94 |
+
self.close();
|
95 |
+
},
|
96 |
+
class: 'button-primary',
|
97 |
},
|
98 |
+
],
|
99 |
+
open() {
|
100 |
+
$( '.ui-widget-overlay' ).bind( 'click', function() {
|
101 |
+
self.close();
|
102 |
+
} );
|
103 |
},
|
104 |
+
create() {
|
105 |
+
$( '.ui-dialog-titlebar-close' ).addClass( 'ui-button' );
|
106 |
+
$( this ).siblings( '.ui-dialog-titlebar' ).hide();
|
107 |
+
},
|
108 |
+
} );
|
109 |
+
|
110 |
+
this.els.buttons = $( this.els.dialog ).dialog(
|
111 |
+
'option',
|
112 |
+
'buttons'
|
113 |
+
);
|
114 |
+
},
|
115 |
+
|
116 |
+
maybeSubmit( event ) {
|
117 |
+
switch ( event.key ) {
|
118 |
+
case 'Enter':
|
119 |
+
this.els.buttons[ 0 ].click();
|
120 |
+
break;
|
121 |
+
}
|
122 |
+
},
|
123 |
+
|
124 |
+
bindEvents() {
|
125 |
+
$( '[data-slug="restricted-site-access"]' ).on(
|
126 |
+
'click',
|
127 |
+
'.deactivate a',
|
128 |
+
this.openDialog.bind( this )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
);
|
130 |
+
if ( this.els.userMessage ) {
|
131 |
+
this.els.userMessage.addEventListener(
|
132 |
+
'keyup',
|
133 |
+
this.maybeSubmit.bind( this )
|
134 |
+
);
|
135 |
+
}
|
136 |
+
},
|
137 |
+
|
138 |
+
init() {
|
139 |
+
const list = document.getElementById( 'the-list' );
|
140 |
+
if ( list ) {
|
141 |
+
this.variables.disablingURL = list.querySelector(
|
142 |
+
'[data-slug="restricted-site-access"] .deactivate a'
|
143 |
+
).href;
|
144 |
+
}
|
145 |
+
this.bindEvents();
|
146 |
+
this.dialogSettings();
|
147 |
+
},
|
148 |
+
};
|
149 |
+
|
150 |
+
RSADisablePlugin.init();
|
151 |
+
} );
|
152 |
}( window, jQuery ) );
|
assets/js/src/settings.js
CHANGED
@@ -1,3 +1,5 @@
|
|
|
|
|
|
1 |
/**
|
2 |
* 10up
|
3 |
* http://10up.com
|
@@ -26,6 +28,7 @@
|
|
26 |
message_field: '',
|
27 |
page_field: '',
|
28 |
error_field: '',
|
|
|
29 |
};
|
30 |
|
31 |
function init() {
|
@@ -53,6 +56,7 @@
|
|
53 |
Cache.page_field = $( document.getElementById( 'rsa_page' ) ).closest(
|
54 |
'tr'
|
55 |
);
|
|
|
56 |
|
57 |
if ( Cache.restrict_radio && ! Cache.restrict_radio.checked ) {
|
58 |
Cache.table.hide();
|
@@ -105,13 +109,20 @@
|
|
105 |
);
|
106 |
|
107 |
Cache.add_btn.on( 'click', function() {
|
108 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
} );
|
110 |
|
111 |
const myipBtn = document.getElementById( 'rsa_myip' );
|
112 |
if ( null !== myipBtn ) {
|
113 |
$( myipBtn ).on( 'click', function() {
|
114 |
-
$(
|
115 |
} );
|
116 |
}
|
117 |
|
@@ -122,21 +133,22 @@
|
|
122 |
} );
|
123 |
}
|
124 |
|
125 |
-
function addIp( ip, comment ) {
|
|
|
|
|
|
|
126 |
if ( $.trim( ip ) === '' ) {
|
127 |
-
|
|
|
128 |
}
|
129 |
|
130 |
-
const shakeSpeed = 600;
|
131 |
-
|
132 |
-
Cache.add_btn.attr( 'disabled', 'disabled' );
|
133 |
const ipList = $( document.querySelectorAll( '#ip_list input' ) );
|
134 |
|
135 |
for ( let i = 0; i < ipList.length; i++ ) {
|
136 |
-
if ( ipList[ i ].value === ip ) {
|
137 |
$( ipList[ i ] ).parent().effect( 'shake', shakeSpeed );
|
138 |
-
|
139 |
-
return
|
140 |
}
|
141 |
}
|
142 |
|
@@ -150,30 +162,21 @@
|
|
150 |
},
|
151 |
function( response ) {
|
152 |
if ( ! response.success ) {
|
153 |
-
$(
|
154 |
-
Cache.add_btn.removeAttr( 'disabled' );
|
155 |
$( Cache.error_field ).text( response.data );
|
156 |
return false;
|
157 |
}
|
158 |
|
159 |
$( Cache.error_field ).text( '' );
|
160 |
-
|
161 |
-
|
162 |
-
.appendTo( Cache.ip_list_wrap );
|
163 |
-
newIp.children( 'input.ip' ).val( ip );
|
164 |
-
newIp.children( 'input.comment' ).val( comment );
|
165 |
-
newIp.removeAttr( 'id' ).slideDown( 250 );
|
166 |
-
|
167 |
-
if ( ip === Cache.new_ip.value ) {
|
168 |
-
$( Cache.new_ip ).val( '' );
|
169 |
-
$( Cache.new_ip_comment ).val( '' );
|
170 |
-
}
|
171 |
-
Cache.add_btn.removeAttr( 'disabled' );
|
172 |
|
173 |
return true;
|
174 |
}
|
175 |
);
|
176 |
}
|
177 |
|
178 |
-
|
|
|
|
|
179 |
}( window, jQuery ) );
|
1 |
+
import 'jquery-effects-shake';
|
2 |
+
|
3 |
/**
|
4 |
* 10up
|
5 |
* http://10up.com
|
28 |
message_field: '',
|
29 |
page_field: '',
|
30 |
error_field: '',
|
31 |
+
submit_btn: '',
|
32 |
};
|
33 |
|
34 |
function init() {
|
56 |
Cache.page_field = $( document.getElementById( 'rsa_page' ) ).closest(
|
57 |
'tr'
|
58 |
);
|
59 |
+
Cache.submit_btn = $( '#submit' );
|
60 |
|
61 |
if ( Cache.restrict_radio && ! Cache.restrict_radio.checked ) {
|
62 |
Cache.table.hide();
|
109 |
);
|
110 |
|
111 |
Cache.add_btn.on( 'click', function() {
|
112 |
+
const newIp = Cache.empty_ip
|
113 |
+
.clone()
|
114 |
+
.appendTo( Cache.ip_list_wrap );
|
115 |
+
newIp.removeAttr( 'id' ).slideDown( 250 );
|
116 |
+
} );
|
117 |
+
|
118 |
+
$( Cache.ip_list_wrap ).on( 'blur', '.ip.code', function() {
|
119 |
+
addIp( $( this ).val(), $( this ).next().val(), $( this ) );
|
120 |
} );
|
121 |
|
122 |
const myipBtn = document.getElementById( 'rsa_myip' );
|
123 |
if ( null !== myipBtn ) {
|
124 |
$( myipBtn ).on( 'click', function() {
|
125 |
+
$( '.ip.code:last' ).val( $( this ).data( 'myip' ) ).blur();
|
126 |
} );
|
127 |
}
|
128 |
|
133 |
} );
|
134 |
}
|
135 |
|
136 |
+
function addIp( ip, comment, obj ) {
|
137 |
+
const shakeSpeed = 600;
|
138 |
+
Cache.submit_btn.prop( 'disabled', true );
|
139 |
+
|
140 |
if ( $.trim( ip ) === '' ) {
|
141 |
+
Cache.submit_btn.prop( 'disabled', false );
|
142 |
+
return;
|
143 |
}
|
144 |
|
|
|
|
|
|
|
145 |
const ipList = $( document.querySelectorAll( '#ip_list input' ) );
|
146 |
|
147 |
for ( let i = 0; i < ipList.length; i++ ) {
|
148 |
+
if ( ! obj.is( ipList[ i ] ) && ipList[ i ].value === ip ) {
|
149 |
$( ipList[ i ] ).parent().effect( 'shake', shakeSpeed );
|
150 |
+
$( obj ).focus();
|
151 |
+
return;
|
152 |
}
|
153 |
}
|
154 |
|
162 |
},
|
163 |
function( response ) {
|
164 |
if ( ! response.success ) {
|
165 |
+
$( obj ).effect( 'shake', shakeSpeed ).focus();
|
|
|
166 |
$( Cache.error_field ).text( response.data );
|
167 |
return false;
|
168 |
}
|
169 |
|
170 |
$( Cache.error_field ).text( '' );
|
171 |
+
|
172 |
+
Cache.submit_btn.prop( 'disabled', false );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
173 |
|
174 |
return true;
|
175 |
}
|
176 |
);
|
177 |
}
|
178 |
|
179 |
+
$( function() {
|
180 |
+
init();
|
181 |
+
} );
|
182 |
}( window, jQuery ) );
|
phpcs.xml
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Example Project" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">
|
3 |
+
|
4 |
+
<description>A custom set of rules to check for the Restricted Site Access project.</description>
|
5 |
+
|
6 |
+
<arg name="extensions" value="php"/>
|
7 |
+
|
8 |
+
<!-- Exclude the Composer Vendor directory. -->
|
9 |
+
<exclude-pattern>/vendor/*</exclude-pattern>
|
10 |
+
|
11 |
+
<!-- Exclude the Node Modules directory. -->
|
12 |
+
<exclude-pattern>/node_modules/*</exclude-pattern>
|
13 |
+
|
14 |
+
<!-- Exclude minified Javascript files. -->
|
15 |
+
<exclude-pattern>*.min.js</exclude-pattern>
|
16 |
+
|
17 |
+
<!-- Exclude the assets directory. -->
|
18 |
+
<exclude-pattern>assets</exclude-pattern>
|
19 |
+
|
20 |
+
<exclude-pattern>tests/php/bootstrap.php</exclude-pattern>
|
21 |
+
|
22 |
+
<!-- Let's also check that everything is properly documented. -->
|
23 |
+
<rule ref="WordPress">
|
24 |
+
<exclude name="WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase" />
|
25 |
+
</rule>
|
26 |
+
|
27 |
+
<rule ref="Squiz.Commenting.FileComment.Missing">
|
28 |
+
<exclude-pattern>tests</exclude-pattern>
|
29 |
+
</rule>
|
30 |
+
|
31 |
+
<rule ref="Squiz.Commenting.ClassComment.Missing">
|
32 |
+
<exclude-pattern>tests</exclude-pattern>
|
33 |
+
</rule>
|
34 |
+
|
35 |
+
<rule ref="Squiz.Commenting.FunctionComment.Missing">
|
36 |
+
<exclude-pattern>tests</exclude-pattern>
|
37 |
+
</rule>
|
38 |
+
|
39 |
+
<!-- Add in some extra rules from other standards. -->
|
40 |
+
<config name="minimum_supported_wp_version" value="5.7"/>
|
41 |
+
|
42 |
+
</ruleset>
|
phpcs.xml.dist
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<ruleset name="Project Rules">
|
3 |
+
|
4 |
+
<!-- Only scan PHP files. -->
|
5 |
+
<arg name="extensions" value="php"/>
|
6 |
+
|
7 |
+
<!-- Show sniff codes in all reports. -->
|
8 |
+
<arg value="ps"/>
|
9 |
+
|
10 |
+
<file>.</file>
|
11 |
+
|
12 |
+
<exclude-pattern type="relative">^tests/*</exclude-pattern>
|
13 |
+
<exclude-pattern type="relative">^vendor/*</exclude-pattern>
|
14 |
+
|
15 |
+
<rule ref="10up-Default" />
|
16 |
+
<rule ref="WordPress-VIP-Go">
|
17 |
+
<!--
|
18 |
+
This plugin is designed to run on both standard WordPress installs
|
19 |
+
and on WordPress VIP installs. As such the WP-CLI command included
|
20 |
+
needs to be able to run without the WordPress VIP mu-plugins.
|
21 |
+
-->
|
22 |
+
<exclude name="WordPressVIPMinimum.Classes.RestrictedExtendClasses.wp_cli" />
|
23 |
+
</rule>
|
24 |
+
</ruleset>
|
readme.txt
CHANGED
@@ -3,8 +3,8 @@ Contributors: 10up, jakemgold, rcbth, thinkoomph, tlovett1, jeffpaul, nomno
|
|
3 |
Donate link: https://10up.com/plugins/restricted-site-access-wordpress/
|
4 |
Tags: privacy, restricted, restrict, privacy, limited, permissions, security, block
|
5 |
Requires at least: 5.7
|
6 |
-
Tested up to: 6.
|
7 |
-
Stable tag: 7.3.
|
8 |
Requires PHP: 7.4
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
@@ -198,7 +198,17 @@ Please note that setting `RSA_FORCE_RESTRICTION` will override `RSA_FORBID_RESTR
|
|
198 |
|
199 |
== Changelog ==
|
200 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
201 |
= 7.3.2 - 2022-08-29 =
|
|
|
|
|
202 |
* **Added:** New filter - `rsa_get_client_ip_address_filter_flags` to modify the range of accepted IP addresses.
|
203 |
* **Changed:** Avoid disjointed plugin settings (props [@helen](https://github.com/helen), [@peterwilsoncc](https://github.com/peterwilsoncc), [@Sidsector9](https://github.com/Sidsector9)).
|
204 |
* **Changed:** Bump minimum WordPress version from 5.0 to 5.7 (props [@vikrampm1](https://github.com/vikrampm1), [@Sidsector9](https://github.com/Sidsector9), [@faisal-alvi](https://github.com/faisal-alvi)).
|
3 |
Donate link: https://10up.com/plugins/restricted-site-access-wordpress/
|
4 |
Tags: privacy, restricted, restrict, privacy, limited, permissions, security, block
|
5 |
Requires at least: 5.7
|
6 |
+
Tested up to: 6.1
|
7 |
+
Stable tag: 7.3.3
|
8 |
Requires PHP: 7.4
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
198 |
|
199 |
== Changelog ==
|
200 |
|
201 |
+
= 7.3.3 - 2022-10-31 =
|
202 |
+
* **Added:** Support for IPv6 addresses (props [@jeffpaul](https://github.com/jeffpaul), [@Sidsector9](https://github.com/Sidsector9), [@cadic](https://github.com/cadic)).
|
203 |
+
* **Added:** Support for subnet range and pattern formats for IPv4 and IPv6 addresses (props [@jeffpaul](https://github.com/jeffpaul), [@Sidsector9](https://github.com/Sidsector9), [@cadic](https://github.com/cadic)).
|
204 |
+
* **Added:** WP VIP Coding Standards (props [@peterwilsoncc](https://github.com/peterwilsoncc), [@faisal-alvi](https://github.com/faisal-alvi), [@eflorea](https://github.com/eflorea)).
|
205 |
+
* **Changed:** Improved adding IP user experience via settings (props [@ankitguptaindia](https://github.com/ankitguptaindia), [@dhanendran](https://github.com/dhanendran), [@Sidsector9](https://github.com/Sidsector9), [@dinhtungdu](https://github.com/dinhtungdu)).
|
206 |
+
* **Changed:** Replace Grunt with Webpack (props [@cadic](https://github.com/cadic), [@Sidsector9](https://github.com/Sidsector9)).
|
207 |
+
* **Fixed:** Missing textdomains to translatable strings (props [@pedro-mendonca](https://github.com/pedro-mendonca), [@Sidsector9](https://github.com/Sidsector9)).
|
208 |
+
|
209 |
= 7.3.2 - 2022-08-29 =
|
210 |
+
**Note:** this release contains two new filters that we recommend using to further secure your site. See the [readme](https://wordpress.org/plugins/restricted-site-access/#how%20secure%20is%20this%20plug-in%3F) for full details.
|
211 |
+
|
212 |
* **Added:** New filter - `rsa_get_client_ip_address_filter_flags` to modify the range of accepted IP addresses.
|
213 |
* **Changed:** Avoid disjointed plugin settings (props [@helen](https://github.com/helen), [@peterwilsoncc](https://github.com/peterwilsoncc), [@Sidsector9](https://github.com/Sidsector9)).
|
214 |
* **Changed:** Bump minimum WordPress version from 5.0 to 5.7 (props [@vikrampm1](https://github.com/vikrampm1), [@Sidsector9](https://github.com/Sidsector9), [@faisal-alvi](https://github.com/faisal-alvi)).
|
restricted_site_access.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: Restricted Site Access
|
4 |
* Plugin URI: https://10up.com/plugins/restricted-site-access-wordpress/
|
5 |
* Description: <strong>Limit access your site</strong> to visitors who are logged in or accessing the site from a set of specific IP addresses. Send restricted visitors to the log in page, redirect them, or display a message or page. <strong>Powerful control over redirection</strong>, including <strong>SEO friendly redirect headers</strong>. Great solution for Extranets, publicly hosted Intranets, or parallel development sites.
|
6 |
-
* Version: 7.3.
|
7 |
* Requires at least: 5.7
|
8 |
* Requires PHP: 7.4
|
9 |
* Author: Jake Goldman, 10up, Oomph
|
@@ -13,6 +13,8 @@
|
|
13 |
* Text Domain: restricted-site-access
|
14 |
*/
|
15 |
|
|
|
|
|
16 |
define( 'RSA_VERSION', '7.3.2' );
|
17 |
|
18 |
/**
|
@@ -303,7 +305,7 @@ class Restricted_Site_Access {
|
|
303 |
/**
|
304 |
* Redirects restricted requests.
|
305 |
*
|
306 |
-
* @param
|
307 |
* @codeCoverageIgnore
|
308 |
*/
|
309 |
public static function restrict_access( $wp ) {
|
@@ -341,7 +343,7 @@ class Restricted_Site_Access {
|
|
341 |
/**
|
342 |
* Determine whether page should be restricted at point of request.
|
343 |
*
|
344 |
-
* @param
|
345 |
* @return array List of URL and code, otherwise empty.
|
346 |
*/
|
347 |
public static function restrict_access_check( $wp ) {
|
@@ -371,8 +373,8 @@ class Restricted_Site_Access {
|
|
371 |
$remote_ip = self::get_client_ip_address();
|
372 |
|
373 |
// iterate through the allow list.
|
374 |
-
foreach ( $allowed_ips as $
|
375 |
-
if ( $remote_ip && self::ip_in_range( $remote_ip, $
|
376 |
|
377 |
/**
|
378 |
* Fires when an ip address match occurs.
|
@@ -383,10 +385,10 @@ class Restricted_Site_Access {
|
|
383 |
*
|
384 |
* @since 6.0.2
|
385 |
*
|
386 |
-
* @param string $remote_ip
|
387 |
-
* @param string $
|
388 |
*/
|
389 |
-
do_action( 'restrict_site_access_ip_match', $remote_ip, $
|
390 |
return;
|
391 |
}
|
392 |
}
|
@@ -748,16 +750,17 @@ class Restricted_Site_Access {
|
|
748 |
return;
|
749 |
}
|
750 |
|
751 |
-
$
|
752 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
753 |
|
754 |
-
wp_enqueue_script(
|
755 |
-
'rsa-settings',
|
756 |
-
plugin_dir_url( __FILE__ ) . 'assets/js/' . $folder . 'settings' . $min . '.js',
|
757 |
-
array( 'jquery-effects-shake' ),
|
758 |
-
RSA_VERSION,
|
759 |
-
true
|
760 |
-
);
|
761 |
|
762 |
wp_localize_script(
|
763 |
'rsa-settings',
|
@@ -778,16 +781,17 @@ class Restricted_Site_Access {
|
|
778 |
return;
|
779 |
}
|
780 |
|
781 |
-
$
|
782 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
783 |
|
784 |
-
wp_enqueue_script(
|
785 |
-
'rsa-admin',
|
786 |
-
plugin_dir_url( __FILE__ ) . 'assets/js/' . $folder . 'admin' . $min . '.js',
|
787 |
-
array( 'jquery', 'jquery-ui-dialog' ),
|
788 |
-
RSA_VERSION,
|
789 |
-
true
|
790 |
-
);
|
791 |
|
792 |
wp_localize_script(
|
793 |
'rsa-admin',
|
@@ -1109,8 +1113,12 @@ class Restricted_Site_Access {
|
|
1109 |
public static function settings_field_allowed() {
|
1110 |
?>
|
1111 |
<div class="hide-if-no-js rsa-ip-addresses-field-wrapper">
|
|
|
|
|
|
|
|
|
|
|
1112 |
<div id="ip_list">
|
1113 |
-
<div id="ip_list_empty" style="display: none;"><input type="text" name="rsa_options[allowed][]" class="ip code" value="" readonly="true" size="20" /> <input type="text" name="rsa_options[comment][]" value="" class="comment" size="20" /> <a href="#remove" class="remove_btn"><?php echo esc_html( _x( 'Remove', 'remove IP address action', 'restricted-site-access' ) ); ?></a></div>
|
1114 |
<?php
|
1115 |
$ips = (array) self::$rsa_options['allowed'];
|
1116 |
$comments = isset( self::$rsa_options['comment'] ) ? (array) self::$rsa_options['comment'] : array();
|
@@ -1124,15 +1132,23 @@ class Restricted_Site_Access {
|
|
1124 |
|
1125 |
foreach ( $ips as $key => $ip ) {
|
1126 |
if ( ! empty( $ip ) ) {
|
1127 |
-
echo '<div class="rsa_unrestricted_ip_row"
|
|
|
|
|
|
|
|
|
1128 |
}
|
1129 |
}
|
1130 |
?>
|
|
|
|
|
|
|
|
|
|
|
1131 |
</div>
|
1132 |
<div id="rsa_add_new_ip_fields">
|
1133 |
-
<
|
1134 |
-
<input
|
1135 |
-
<p class="description"><label for="newip"><?php esc_html_e( 'Enter a single IP address or a range using a subnet prefix', 'restricted-site-access' ); ?></label></p>
|
1136 |
<?php if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) : ?>
|
1137 |
<input class="button" type="button" id="rsa_myip" value="<?php esc_attr_e( 'Add My Current IP Address', 'restricted-site-access' ); ?>" style="margin-top: 5px;" data-myip="<?php echo esc_attr( self::get_client_ip_address() ); ?>" /><br />
|
1138 |
<?php endif; ?>
|
@@ -1150,7 +1166,7 @@ class Restricted_Site_Access {
|
|
1150 |
<ul class="ul-disc">
|
1151 |
<?php
|
1152 |
foreach ( $config_ips as $ip ) {
|
1153 |
-
echo '<li><code>' .
|
1154 |
}
|
1155 |
?>
|
1156 |
</ul>
|
@@ -1293,7 +1309,13 @@ class Restricted_Site_Access {
|
|
1293 |
exit;
|
1294 |
}
|
1295 |
|
1296 |
-
if (
|
|
|
|
|
|
|
|
|
|
|
|
|
1297 |
wp_send_json_error( __( 'The IP entered is invalid.', 'restricted-site-access' ) );
|
1298 |
}
|
1299 |
|
@@ -1308,34 +1330,9 @@ class Restricted_Site_Access {
|
|
1308 |
* @return bool True if its a valid IP address.
|
1309 |
*/
|
1310 |
public static function is_ip( $ip_address ) {
|
1311 |
-
|
1312 |
-
if ( strpos( $ip_address, '/' ) ) {
|
1313 |
-
$ip_parts = explode( '/', $ip_address );
|
1314 |
-
if ( empty( $ip_parts[1] ) || ! is_numeric( $ip_parts[1] ) || strlen( $ip_parts[1] ) > 3 ) {
|
1315 |
-
return false;
|
1316 |
-
}
|
1317 |
-
|
1318 |
-
$ip_address = $ip_parts[0];
|
1319 |
-
|
1320 |
-
$protocol = self::get_ip_protocol( $ip_address );
|
1321 |
-
|
1322 |
-
if ( 'IPv4' === $protocol && (int)$ip_parts[1] > 32 ) {
|
1323 |
-
/**
|
1324 |
-
* Return if the prefix length is greater than 32.
|
1325 |
-
* IPv4 can use maximum of 32 bits for address space.
|
1326 |
-
*/
|
1327 |
-
return false;
|
1328 |
-
} else if ( 'IPv6' === $protocol && (int)$ip_parts[1] > 128 ) {
|
1329 |
-
/**
|
1330 |
-
* Return if the prefix length is greater than 128.
|
1331 |
-
* IPv6 can use maximum of 128 bits for address space.
|
1332 |
-
*/
|
1333 |
-
return false;
|
1334 |
-
}
|
1335 |
-
}
|
1336 |
|
1337 |
-
|
1338 |
-
if ( empty( $ip_address ) || ! inet_pton( stripslashes( $ip_address ) ) ) {
|
1339 |
return false;
|
1340 |
}
|
1341 |
|
@@ -1511,16 +1508,21 @@ class Restricted_Site_Access {
|
|
1511 |
* @return boolean true if the ip is in this range / false if not.
|
1512 |
*/
|
1513 |
public static function ip_in_range( $ip, $range ) {
|
1514 |
-
|
1515 |
-
|
1516 |
-
|
1517 |
-
|
1518 |
-
|
1519 |
-
|
1520 |
-
|
1521 |
-
|
1522 |
-
$
|
1523 |
-
|
|
|
|
|
|
|
|
|
|
|
1524 |
}
|
1525 |
|
1526 |
/**
|
@@ -1530,6 +1532,7 @@ class Restricted_Site_Access {
|
|
1530 |
*/
|
1531 |
public static function get_client_ip_address() {
|
1532 |
// REMOTE_ADDR IP address.
|
|
|
1533 |
$remote_addr_header_ip = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : false;
|
1534 |
|
1535 |
// Return if REMOTE_ADDR is not set.
|
@@ -1638,7 +1641,7 @@ class Restricted_Site_Access {
|
|
1638 |
}
|
1639 |
|
1640 |
/**
|
1641 |
-
* Get IPs programmatically
|
1642 |
*
|
1643 |
* @param bool $include_config Whether to include the config file IPs. Default true.
|
1644 |
* @param bool $include_labels Whether to include the comments. Default false.
|
@@ -1913,32 +1916,3 @@ function restricted_site_access_uninstall() {
|
|
1913 |
}
|
1914 |
|
1915 |
register_uninstall_hook( __FILE__, 'restricted_site_access_uninstall' );
|
1916 |
-
|
1917 |
-
if ( ! function_exists( 'inet_pton' ) ) :
|
1918 |
-
|
1919 |
-
/**
|
1920 |
-
* Inet_pton is not included in PHP < 5.3 on Windows (WP requires PHP 5.2).
|
1921 |
-
*
|
1922 |
-
* @param string $ip IP Address.
|
1923 |
-
*
|
1924 |
-
* @return array|string
|
1925 |
-
*
|
1926 |
-
* @codeCoverageIgnore
|
1927 |
-
*/
|
1928 |
-
function inet_pton( $ip ) {
|
1929 |
-
if ( strpos( $ip, '.' ) !== false ) {
|
1930 |
-
// ipv4.
|
1931 |
-
$ip = pack( 'N', ip2long( $ip ) );
|
1932 |
-
} elseif ( strpos( $ip, ':' ) !== false ) {
|
1933 |
-
// ipv6.
|
1934 |
-
$ip = explode( ':', $ip );
|
1935 |
-
$res = str_pad( '', ( 4 * ( 8 - count( $ip ) ) ), '0000', STR_PAD_LEFT );
|
1936 |
-
foreach ( $ip as $seg ) {
|
1937 |
-
$res .= str_pad( $seg, 4, '0', STR_PAD_LEFT );
|
1938 |
-
}
|
1939 |
-
$ip = pack( 'H' . strlen( $res ), $res );
|
1940 |
-
}
|
1941 |
-
return $ip;
|
1942 |
-
}
|
1943 |
-
|
1944 |
-
endif;
|
3 |
* Plugin Name: Restricted Site Access
|
4 |
* Plugin URI: https://10up.com/plugins/restricted-site-access-wordpress/
|
5 |
* Description: <strong>Limit access your site</strong> to visitors who are logged in or accessing the site from a set of specific IP addresses. Send restricted visitors to the log in page, redirect them, or display a message or page. <strong>Powerful control over redirection</strong>, including <strong>SEO friendly redirect headers</strong>. Great solution for Extranets, publicly hosted Intranets, or parallel development sites.
|
6 |
+
* Version: 7.3.3
|
7 |
* Requires at least: 5.7
|
8 |
* Requires PHP: 7.4
|
9 |
* Author: Jake Goldman, 10up, Oomph
|
13 |
* Text Domain: restricted-site-access
|
14 |
*/
|
15 |
|
16 |
+
require_once 'vendor/autoload.php';
|
17 |
+
|
18 |
define( 'RSA_VERSION', '7.3.2' );
|
19 |
|
20 |
/**
|
305 |
/**
|
306 |
* Redirects restricted requests.
|
307 |
*
|
308 |
+
* @param \WP $wp WordPress request.
|
309 |
* @codeCoverageIgnore
|
310 |
*/
|
311 |
public static function restrict_access( $wp ) {
|
343 |
/**
|
344 |
* Determine whether page should be restricted at point of request.
|
345 |
*
|
346 |
+
* @param \WP $wp WordPress The main WP request.
|
347 |
* @return array List of URL and code, otherwise empty.
|
348 |
*/
|
349 |
public static function restrict_access_check( $wp ) {
|
373 |
$remote_ip = self::get_client_ip_address();
|
374 |
|
375 |
// iterate through the allow list.
|
376 |
+
foreach ( $allowed_ips as $allowed_ip ) {
|
377 |
+
if ( $remote_ip && self::ip_in_range( $remote_ip, $allowed_ip ) ) {
|
378 |
|
379 |
/**
|
380 |
* Fires when an ip address match occurs.
|
385 |
*
|
386 |
* @since 6.0.2
|
387 |
*
|
388 |
+
* @param string $remote_ip The remote IP address being checked.
|
389 |
+
* @param string $allowed_ip The matched masked IP address.
|
390 |
*/
|
391 |
+
do_action( 'restrict_site_access_ip_match', $remote_ip, $allowed_ip );
|
392 |
return;
|
393 |
}
|
394 |
}
|
750 |
return;
|
751 |
}
|
752 |
|
753 |
+
$script_path = 'assets/js/build/settings.min.js';
|
754 |
+
$script_asset_path = plugin_dir_path( __FILE__ ) . 'assets/js/build/settings.min.asset.php';
|
755 |
+
$script_asset = file_exists( $script_asset_path )
|
756 |
+
? require $script_asset_path
|
757 |
+
: array(
|
758 |
+
'dependencies' => array(),
|
759 |
+
'version' => filemtime( $script_path ),
|
760 |
+
);
|
761 |
+
$script_url = plugins_url( $script_path, __FILE__ );
|
762 |
|
763 |
+
wp_enqueue_script( 'rsa-settings', $script_url, $script_asset['dependencies'], $script_asset['version'], true );
|
|
|
|
|
|
|
|
|
|
|
|
|
764 |
|
765 |
wp_localize_script(
|
766 |
'rsa-settings',
|
781 |
return;
|
782 |
}
|
783 |
|
784 |
+
$script_path = 'assets/js/build/admin.min.js';
|
785 |
+
$script_asset_path = plugin_dir_path( __FILE__ ) . 'assets/js/build/admin.min.asset.php';
|
786 |
+
$script_asset = file_exists( $script_asset_path )
|
787 |
+
? require $script_asset_path
|
788 |
+
: array(
|
789 |
+
'dependencies' => array(),
|
790 |
+
'version' => filemtime( $script_path ),
|
791 |
+
);
|
792 |
+
$script_url = plugins_url( $script_path, __FILE__ );
|
793 |
|
794 |
+
wp_enqueue_script( 'rsa-admin', $script_url, $script_asset['dependencies'], $script_asset['version'], true );
|
|
|
|
|
|
|
|
|
|
|
|
|
795 |
|
796 |
wp_localize_script(
|
797 |
'rsa-admin',
|
1113 |
public static function settings_field_allowed() {
|
1114 |
?>
|
1115 |
<div class="hide-if-no-js rsa-ip-addresses-field-wrapper">
|
1116 |
+
<div id="ip_list_empty" style="display: none;" class="rsa_unrestricted_ip_row">
|
1117 |
+
<input type="text" name="rsa_options[allowed][]" class="ip code" value="" size="20" placeholder="<?php esc_attr_e( 'IP Address or Range' ); ?>" />
|
1118 |
+
<input type="text" name="rsa_options[comment][]" value="" class="newipcomment" size="20" placeholder="<?php esc_attr_e( 'Identify this entry' ); ?>" />
|
1119 |
+
<a href="#remove" class="remove_btn"><?php echo esc_html( _x( 'Remove', 'remove IP address action', 'restricted-site-access' ) ); ?></a>
|
1120 |
+
</div>
|
1121 |
<div id="ip_list">
|
|
|
1122 |
<?php
|
1123 |
$ips = (array) self::$rsa_options['allowed'];
|
1124 |
$comments = isset( self::$rsa_options['comment'] ) ? (array) self::$rsa_options['comment'] : array();
|
1132 |
|
1133 |
foreach ( $ips as $key => $ip ) {
|
1134 |
if ( ! empty( $ip ) ) {
|
1135 |
+
echo '<div class="rsa_unrestricted_ip_row">
|
1136 |
+
<input type="text" name="rsa_options[allowed][]" value="' . esc_attr( $ip ) . '" class="ip code" size="20" placeholder="' . esc_attr__( 'IP Address or Range' ) . '" />
|
1137 |
+
<input type="text" name="rsa_options[comment][]" value="' . ( isset( $comments[ $key ] ) ? esc_attr( wp_unslash( $comments[ $key ] ) ) : '' ) . '" class="newipcomment" size="20" placeholder="' . esc_attr__( 'Identify this entry' ) . '" />
|
1138 |
+
<a href="#remove" class="remove_btn">' . esc_html_x( 'Remove', 'remove IP address action', 'restricted-site-access' ) . '</a>
|
1139 |
+
</div>';
|
1140 |
}
|
1141 |
}
|
1142 |
?>
|
1143 |
+
<div class="rsa_unrestricted_ip_row">
|
1144 |
+
<input type="text" name="rsa_options[allowed][]" class="ip code" placeholder="<?php esc_attr_e( 'IP Address or Range' ); ?>" size="20" />
|
1145 |
+
<input type="text" name="rsa_options[comment][]" class="newipcomment" placeholder="<?php esc_attr_e( 'Identify this entry' ); ?>" size="20" />
|
1146 |
+
<a href="#remove" class="remove_btn"><?php echo esc_html( _x( 'Remove', 'remove IP address action', 'restricted-site-access' ) ); ?></a>
|
1147 |
+
</div>
|
1148 |
</div>
|
1149 |
<div id="rsa_add_new_ip_fields">
|
1150 |
+
<p class="description"><label><?php esc_html_e( 'Enter a single IP address or a range using a subnet prefix', 'restricted-site-access' ); ?></label></p>
|
1151 |
+
<input class="button" type="button" id="addip" value="<?php esc_attr_e( 'Add new IP' ); ?>" style="margin-top: 5px;" />
|
|
|
1152 |
<?php if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) : ?>
|
1153 |
<input class="button" type="button" id="rsa_myip" value="<?php esc_attr_e( 'Add My Current IP Address', 'restricted-site-access' ); ?>" style="margin-top: 5px;" data-myip="<?php echo esc_attr( self::get_client_ip_address() ); ?>" /><br />
|
1154 |
<?php endif; ?>
|
1166 |
<ul class="ul-disc">
|
1167 |
<?php
|
1168 |
foreach ( $config_ips as $ip ) {
|
1169 |
+
echo '<li><code>' . esc_html( $ip ) . '</code></li>';
|
1170 |
}
|
1171 |
?>
|
1172 |
</ul>
|
1309 |
exit;
|
1310 |
}
|
1311 |
|
1312 |
+
if ( ! isset( $_POST['ip_address'] ) ) {
|
1313 |
+
wp_send_json_error( __( 'IP cannot be blank.', 'restricted-site-access' ) );
|
1314 |
+
}
|
1315 |
+
|
1316 |
+
$input_ip = stripslashes( sanitize_text_field( wp_unslash( $_POST['ip_address'] ) ) );
|
1317 |
+
|
1318 |
+
if ( empty( $_POST['ip_address'] ) || ! self::is_ip( $input_ip ) ) {
|
1319 |
wp_send_json_error( __( 'The IP entered is invalid.', 'restricted-site-access' ) );
|
1320 |
}
|
1321 |
|
1330 |
* @return bool True if its a valid IP address.
|
1331 |
*/
|
1332 |
public static function is_ip( $ip_address ) {
|
1333 |
+
$address = \IPLib\Factory::parseRangeString( $ip_address );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1334 |
|
1335 |
+
if ( is_null( $address ) ) {
|
|
|
1336 |
return false;
|
1337 |
}
|
1338 |
|
1508 |
* @return boolean true if the ip is in this range / false if not.
|
1509 |
*/
|
1510 |
public static function ip_in_range( $ip, $range ) {
|
1511 |
+
$in_range = false;
|
1512 |
+
$parsed_range = \IPLib\Factory::parseRangeString( $range );
|
1513 |
+
$user_address = \IPLib\Factory::parseAddressString( $ip );
|
1514 |
+
|
1515 |
+
if ( empty( $user_address ) ) {
|
1516 |
+
return false;
|
1517 |
+
}
|
1518 |
+
|
1519 |
+
if ( $parsed_range instanceof \IPLib\Range\Single ) {
|
1520 |
+
$in_range = $user_address->matches( $parsed_range );
|
1521 |
+
} elseif ( $parsed_range instanceof \IPLib\Range\Subnet || $parsed_range instanceof \IPLib\Range\Pattern ) {
|
1522 |
+
$in_range = $parsed_range->contains( $user_address );
|
1523 |
+
}
|
1524 |
+
|
1525 |
+
return $in_range;
|
1526 |
}
|
1527 |
|
1528 |
/**
|
1532 |
*/
|
1533 |
public static function get_client_ip_address() {
|
1534 |
// REMOTE_ADDR IP address.
|
1535 |
+
// phpcs:ignore WordPressVIPMinimum.Variables.ServerVariables.UserControlledHeaders, WordPressVIPMinimum.Variables.RestrictedVariables.cache_constraints___SERVER__REMOTE_ADDR__
|
1536 |
$remote_addr_header_ip = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : false;
|
1537 |
|
1538 |
// Return if REMOTE_ADDR is not set.
|
1641 |
}
|
1642 |
|
1643 |
/**
|
1644 |
+
* Get whitelisted IPs programmatically from the database.
|
1645 |
*
|
1646 |
* @param bool $include_config Whether to include the config file IPs. Default true.
|
1647 |
* @param bool $include_labels Whether to include the comments. Default false.
|
1916 |
}
|
1917 |
|
1918 |
register_uninstall_hook( __FILE__, 'restricted_site_access_uninstall' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|