PluginProbe
Redirection / 5.2
Redirection v5.2
5.10.0 5.9.0 5.8.1 5.8.0 3.7.2 3.7.3 4.0 4.0.1 4.1 4.1.1 4.2 4.2.1 4.2.2 4.2.3 4.3 4.3.1 4.3.2 4.3.3 4.4 4.4.1 4.4.2 4.5 4.5.1 4.6.2 4.7.1 All 130 releases
redirection / models / url / url-flags.php

url-flags.php in Redirection 5.2, at models/url/url-flags.php

230 lines 4.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Represent URL source flags.
5 */
6 class Red_Source_Flags {
7 const QUERY_IGNORE = 'ignore';
8 const QUERY_EXACT = 'exact';
9 const QUERY_PASS = 'pass';
10 const QUERY_EXACT_ORDER = 'exactorder';
11
12 const FLAG_QUERY = 'flag_query';
13 const FLAG_CASE = 'flag_case';
14 const FLAG_TRAILING = 'flag_trailing';
15 const FLAG_REGEX = 'flag_regex';
16
17 /**
18 * Case insensitive matching
19 *
20 * @var boolean
21 */
22 private $flag_case = false;
23
24 /**
25 * Ignored trailing slashes
26 *
27 * @var boolean
28 */
29 private $flag_trailing = false;
30
31 /**
32 * Regular expression
33 *
34 * @var boolean
35 */
36 private $flag_regex = false;
37
38 /**
39 * Query parameter matching
40 *
41 * @var self::QUERY_EXACT|self::QUERY_IGNORE|self::QUERY_PASS|self::QUERY_EXACT_ORDER
42 */
43 private $flag_query = self::QUERY_EXACT;
44
45 /**
46 * Values that have been set
47 *
48 * @var array
49 */
50 private $values_set = [];
51
52 /**
53 * Constructor
54 *
55 * @param array|null $json JSON object.
56 */
57 public function __construct( $json = null ) {
58 if ( $json !== null ) {
59 $this->set_flags( $json );
60 }
61 }
62
63 /**
64 * Get list of valid query types as an array
65 *
66 * @return string[]
67 */
68 private function get_allowed_query() {
69 return [
70 self::QUERY_IGNORE,
71 self::QUERY_EXACT,
72 self::QUERY_PASS,
73 self::QUERY_EXACT_ORDER,
74 ];
75 }
76
77 /**
78 * Parse flag data.
79 *
80 * @param array $json Flag data.
81 * @return void
82 */
83 public function set_flags( array $json ) {
84 if ( isset( $json[ self::FLAG_QUERY ] ) && in_array( $json[ self::FLAG_QUERY ], $this->get_allowed_query(), true ) ) {
85 $this->flag_query = $json[ self::FLAG_QUERY ];
86 }
87
88 if ( isset( $json[ self::FLAG_CASE ] ) && is_bool( $json[ self::FLAG_CASE ] ) ) {
89 $this->flag_case = $json[ self::FLAG_CASE ] ? true : false;
90 }
91
92 if ( isset( $json[ self::FLAG_TRAILING ] ) && is_bool( $json[ self::FLAG_TRAILING ] ) ) {
93 $this->flag_trailing = $json[ self::FLAG_TRAILING ] ? true : false;
94 }
95
96 if ( isset( $json[ self::FLAG_REGEX ] ) && is_bool( $json[ self::FLAG_REGEX ] ) ) {
97 $this->flag_regex = $json[ self::FLAG_REGEX ] ? true : false;
98
99 if ( $this->flag_regex ) {
100 // Regex auto-disables other things
101 $this->flag_query = self::QUERY_EXACT;
102 }
103 }
104
105 // Keep track of what values have been set, so we know what to override with defaults later
106 $this->values_set = array_intersect( array_keys( $json ), array_keys( $this->get_json() ) );
107 }
108
109 /**
110 * Return `true` if ignore trailing slash, `false` otherwise
111 *
112 * @return boolean
113 */
114 public function is_ignore_trailing() {
115 return $this->flag_trailing;
116 }
117
118 /**
119 * Return `true` if ignore case, `false` otherwise
120 *
121 * @return boolean
122 */
123 public function is_ignore_case() {
124 return $this->flag_case;
125 }
126
127 /**
128 * Return `true` if ignore trailing slash, `false` otherwise
129 *
130 * @return boolean
131 */
132 public function is_regex() {
133 return $this->flag_regex;
134 }
135
136 /**
137 * Return `true` if exact query match, `false` otherwise
138 *
139 * @return boolean
140 */
141 public function is_query_exact() {
142 return $this->flag_query === self::QUERY_EXACT;
143 }
144
145 /**
146 * Return `true` if exact query match in set order, `false` otherwise
147 *
148 * @return boolean
149 */
150 public function is_query_exact_order() {
151 return $this->flag_query === self::QUERY_EXACT_ORDER;
152 }
153
154 /**
155 * Return `true` if ignore query params, `false` otherwise
156 *
157 * @return boolean
158 */
159 public function is_query_ignore() {
160 return $this->flag_query === self::QUERY_IGNORE;
161 }
162
163 /**
164 * Return `true` if ignore and pass query params, `false` otherwise
165 *
166 * @return boolean
167 */
168 public function is_query_pass() {
169 return $this->flag_query === self::QUERY_PASS;
170 }
171
172 /**
173 * Return the flags as a JSON object
174 *
175 * @return array
176 */
177 public function get_json() {
178 return [
179 self::FLAG_QUERY => $this->flag_query,
180 self::FLAG_CASE => $this->is_ignore_case(),
181 self::FLAG_TRAILING => $this->is_ignore_trailing(),
182 self::FLAG_REGEX => $this->is_regex(),
183 ];
184 }
185
186 /**
187 * Return flag data, with defaults removed from the data.
188 *
189 * @param array $defaults Defaults to remove.
190 * @return array
191 */
192 public function get_json_without_defaults( $defaults ) {
193 $json = $this->get_json();
194
195 if ( count( $defaults ) > 0 ) {
196 foreach ( $json as $key => $value ) {
197 if ( isset( $defaults[ $key ] ) && $value === $defaults[ $key ] ) {
198 unset( $json[ $key ] );
199 }
200 }
201 }
202
203 return $json;
204 }
205
206 /**
207 * Return flag data, with defaults filling in any gaps not set.
208 *
209 * @return array
210 */
211 public function get_json_with_defaults() {
212 $settings = red_get_options();
213 $json = $this->get_json();
214 $defaults = [
215 self::FLAG_QUERY => $settings[ self::FLAG_QUERY ],
216 self::FLAG_CASE => $settings[ self::FLAG_CASE ],
217 self::FLAG_TRAILING => $settings[ self::FLAG_TRAILING ],
218 self::FLAG_REGEX => $settings[ self::FLAG_REGEX ],
219 ];
220
221 foreach ( $this->values_set as $key ) {
222 if ( ! isset( $json[ $key ] ) ) {
223 $json[ $key ] = $defaults[ $key ];
224 }
225 }
226
227 return $json;
228 }
229 }
230