GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — develop ( a766f8...368a03 )
by Lonnie
19:17 queued 12:52
created
myth/Auth/Flat/FlatGroupsModel.php 1 patch
Indentation   +22 added lines, -22 removed lines patch added patch discarded remove patch
@@ -85,10 +85,10 @@  discard block
 block discarded – undo
85 85
 	 */
86 86
 	public function addUserToGroup($user_id, $group_id)
87 87
 	{
88
-	    $data = [
89
-		    'user_id'   => (int)$user_id,
90
-		    'group_id'  => (int)$group_id
91
-	    ];
88
+		$data = [
89
+			'user_id'   => (int)$user_id,
90
+			'group_id'  => (int)$group_id
91
+		];
92 92
 
93 93
 		return $this->db->insert('auth_groups_users', $data);
94 94
 	}
@@ -105,10 +105,10 @@  discard block
 block discarded – undo
105 105
 	 */
106 106
 	public function removeUserFromGroup($user_id, $group_id)
107 107
 	{
108
-	    return $this->where([
109
-		    'user_id' => (int)$user_id,
110
-		    'group_id' => (int)$group_id
111
-	    ])->delete('auth_groups_users');
108
+		return $this->where([
109
+			'user_id' => (int)$user_id,
110
+			'group_id' => (int)$group_id
111
+		])->delete('auth_groups_users');
112 112
 	}
113 113
 
114 114
 	//--------------------------------------------------------------------
@@ -122,8 +122,8 @@  discard block
 block discarded – undo
122 122
 	 */
123 123
 	public function removeUserFromAllGroups($user_id)
124 124
 	{
125
-	    return $this->db->where('user_id', (int)$user_id)
126
-		                ->delete('auth_groups_users');
125
+		return $this->db->where('user_id', (int)$user_id)
126
+						->delete('auth_groups_users');
127 127
 	}
128 128
 
129 129
 	//--------------------------------------------------------------------
@@ -137,11 +137,11 @@  discard block
 block discarded – undo
137 137
 	 */
138 138
 	public function getGroupsForUser($user_id)
139 139
 	{
140
-	    return $this->select('auth_groups_users.*, auth_groups.name, auth_groups.description')
141
-		            ->join('auth_groups_users', 'auth_groups_users.group_id = auth_groups.id', 'left')
142
-		            ->where('user_id', $user_id)
143
-		            ->as_array()
144
-		            ->find_all();
140
+		return $this->select('auth_groups_users.*, auth_groups.name, auth_groups.description')
141
+					->join('auth_groups_users', 'auth_groups_users.group_id = auth_groups.id', 'left')
142
+					->where('user_id', $user_id)
143
+					->as_array()
144
+					->find_all();
145 145
 	}
146 146
 
147 147
 	//--------------------------------------------------------------------
@@ -160,7 +160,7 @@  discard block
 block discarded – undo
160 160
 			'group_id'      => (int)$group_id
161 161
 		];
162 162
 
163
-	    return $this->db->insert('auth_groups_permissions', $data);
163
+		return $this->db->insert('auth_groups_permissions', $data);
164 164
 	}
165 165
 
166 166
 	//--------------------------------------------------------------------
@@ -176,10 +176,10 @@  discard block
 block discarded – undo
176 176
 	 */
177 177
 	public function removePermissionFromGroup($permission_id, $group_id)
178 178
 	{
179
-	    return $this->db->where([
180
-		    'permission_id' => $permission_id,
181
-		    'group_id'      => $group_id
182
-	    ])->delete('auth_groups_permissions');
179
+		return $this->db->where([
180
+			'permission_id' => $permission_id,
181
+			'group_id'      => $group_id
182
+		])->delete('auth_groups_permissions');
183 183
 	}
184 184
 
185 185
 	//--------------------------------------------------------------------
@@ -193,8 +193,8 @@  discard block
 block discarded – undo
193 193
 	 */
194 194
 	public function removePermissionFromAllGroups($permission_id)
195 195
 	{
196
-	    return $this->db->where('permission_id', $permission_id)
197
-		                ->delete('auth_groups_permissions');
196
+		return $this->db->where('permission_id', $permission_id)
197
+						->delete('auth_groups_permissions');
198 198
 	}
199 199
 
200 200
 	//--------------------------------------------------------------------
Please login to merge, or discard this patch.
myth/Auth/Password.php 1 patch
Indentation   +321 added lines, -321 removed lines patch added patch discarded remove patch
@@ -51,325 +51,325 @@
 block discarded – undo
51 51
  */
52 52
 class Password {
53 53
 
54
-    /**
55
-     * A standardized method for hasing a password before storing
56
-     * in the database.
57
-     *
58
-     * @param $password
59
-     * @return bool|mixed|string
60
-     */
61
-    public static function hashPassword($password)
62
-    {
63
-        if (! config_item('auth.hash_cost'))
64
-        {
65
-            get_instance()->load->config('auth');
66
-        }
67
-
68
-        return password_hash($password, PASSWORD_DEFAULT, ['cost' => config_item('auth.hash_cost')]);
69
-    }
70
-
71
-    //--------------------------------------------------------------------
72
-
73
-    /**
74
-     * Determines the number of entropy bits a password has based on
75
-     *
76
-     *
77
-     * @param $password
78
-     * @param bool $repeatcalc
79
-     * @return int
80
-     */
81
-    public static function getNISTNumBits($password, $repeatcalc = false)
82
-    {
83
-        $y = strlen($password);
84
-        if ($repeatcalc)
85
-        {
86
-            // Variant on NIST rules to reduce long sequences of repeated characters.
87
-            $result = 0;
88
-            $charmult = array_fill(0, 256, 1);
89
-            for ($x = 0; $x < $y; $x++)
90
-            {
91
-                $tempchr = ord(substr($password, $x, 1));
92
-                if ($x > 19)  $result += $charmult[$tempchr];
93
-                else if ($x > 7)  $result += $charmult[$tempchr] * 1.5;
94
-                else if ($x > 0)  $result += $charmult[$tempchr] * 2;
95
-                else  $result += 4;
96
-
97
-                $charmult[$tempchr] *= 0.75;
98
-            }
99
-
100
-            return $result;
101
-        }
102
-        else
103
-        {
104
-            if ($y > 20)  return 4 + (7 * 2) + (12 * 1.5) + $y - 20;
105
-            if ($y > 8)  return 4 + (7 * 2) + (($y - 8) * 1.5);
106
-            if ($y > 1)  return 4 + (($y - 1) * 2);
107
-
108
-            return ($y == 1 ? 4 : 0);
109
-        }
110
-    }
111
-
112
-    //--------------------------------------------------------------------
113
-
114
-    /**
115
-     * Determines whether a password is strong enough to use. You should check
116
-     * the password against this method and reject it if the password is not
117
-     * strong enough.
118
-     *
119
-     * The following guidelines come from the author's tests against 10.4 million actual passwords
120
-     * ( see post: http://cubicspot.blogspot.com/2012/01/how-to-calculate-password-strength-part.html )
121
-     * and represents the suggested minimum entropy bits for different types of sites:
122
-     *
123
-     *      - 18 bits of entropy = minimum for ANY website.
124
-     *      - 25 bits of entropy = minimum for a general purpose web service used relatively widely (e.g. Hotmail).
125
-     *      - 30 bits of entropy = minimum for a web service with business critical applications (e.g. SAAS).
126
-     *      - 40 bits of entropy = minimum for a bank or other financial service.
127
-     *
128
-     * The algorithm is based upon a modified version of the NIST rules which suggest the following:
129
-     *
130
-     *      - The first byte counts as 4 bits.
131
-     *      - The next 7 bytes count as 2 bits each.
132
-     *      - The next 12 bytes count as 1.5 bits each.
133
-     *      - Anything beyond that counts as 1 bit each.
134
-     *      - Mixed case + non-alphanumeric = up to 6 extra bits.
135
-     *
136
-     * @param string    $password   - The password to check
137
-     * @param int       $minbits    - Minimum "entropy bits" that is allowed
138
-     * @param bool      $usedict    - Should we check the password against a 300,000 word English dictionary?
139
-     * @param int       $minwordlen -
140
-     * @return bool
141
-     */
142
-    public static function isStrongPassword($password, $minbits = 18, $usedict = false, $minwordlen = 4)
143
-    {
144
-        // NIST password strength rules allow up to 6 extra bits for mixed case and non-alphabetic.
145
-        $upper = false;
146
-        $lower = false;
147
-        $numeric = false;
148
-        $other = false;
149
-        $space = false;
150
-        $y = strlen($password);
151
-        for ($x = 0; $x < $y; $x++)
152
-        {
153
-            $tempchr = ord(substr($password, $x, 1));
154
-            if ($tempchr >= ord("A") && $tempchr <= ord("Z"))  $upper = true;
155
-            else if ($tempchr >= ord("a") && $tempchr <= ord("z"))  $lower = true;
156
-            else if ($tempchr >= ord("0") && $tempchr <= ord("9"))  $numeric = true;
157
-            else if ($tempchr == ord(" "))  $space = true;
158
-            else  $other = true;
159
-        }
160
-        $extrabits = ($upper && $lower && $other ? ($numeric ? 6 : 5) : ($numeric && !$upper && !$lower ? ($other ? -2 : -6) : 0));
161
-        if (!$space)  $extrabits -= 2;
162
-        else if (count(explode(" ", preg_replace('/\s+/', " ", $password))) > 3)  $extrabits++;
163
-        $result = self::getNISTNumBits($password, true) + $extrabits;
164
-
165
-        $password = strtolower($password);
166
-        $revpassword = strrev($password);
167
-        $numbits = self::getNISTNumBits($password) + $extrabits;
168
-        if ($result > $numbits)  $result = $numbits;
169
-
170
-        // Remove QWERTY strings.
171
-        $qwertystrs = array(
172
-            "1234567890-qwertyuiopasdfghjkl;zxcvbnm,./",
173
-            "1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik,9ol.0p;/-['=]:?_{\"+}",
174
-            "1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik9ol0p",
175
-            "qazwsxedcrfvtgbyhnujmik,ol.p;/-['=]:?_{\"+}",
176
-            "qazwsxedcrfvtgbyhnujmikolp",
177
-            "]\"/=[;.-pl,0okm9ijn8uhb7ygv6tfc5rdx4esz3wa2q1",
178
-            "pl0okm9ijn8uhb7ygv6tfc5rdx4esz3wa2q1",
179
-            "]\"/[;.pl,okmijnuhbygvtfcrdxeszwaq",
180
-            "plokmijnuhbygvtfcrdxeszwaq",
181
-            "014725836914702583697894561230258/369*+-*/",
182
-            "abcdefghijklmnopqrstuvwxyz"
183
-        );
184
-        foreach ($qwertystrs as $qwertystr)
185
-        {
186
-            $qpassword = $password;
187
-            $qrevpassword = $revpassword;
188
-            $z = 6;
189
-            do
190
-            {
191
-                $y = strlen($qwertystr) - $z;
192
-                for ($x = 0; $x < $y; $x++)
193
-                {
194
-                    $str = substr($qwertystr, $x, $z);
195
-                    $qpassword = str_replace($str, "*", $qpassword);
196
-                    $qrevpassword = str_replace($str, "*", $qrevpassword);
197
-                }
198
-
199
-                $z--;
200
-            } while ($z > 2);
201
-
202
-            $numbits = self::getNISTNumBits($qpassword) + $extrabits;
203
-            if ($result > $numbits)  $result = $numbits;
204
-            $numbits = self::getNISTNumBits($qrevpassword) + $extrabits;
205
-            if ($result > $numbits)  $result = $numbits;
206
-
207
-            if ($result < $minbits)  return false;
208
-        }
209
-
210
-        if ($usedict && $result >= $minbits)
211
-        {
212
-            $passwords = array();
213
-
214
-            // Add keyboard shifting password variants.
215
-            $keyboardmap_down_noshift = array(
216
-                "z" => "", "x" => "", "c" => "", "v" => "", "b" => "", "n" => "", "m" => "", "," => "", "." => "", "/" => "", "<" => "", ">" => "", "?" => ""
217
-            );
218
-            if ($password == str_replace(array_keys($keyboardmap_down_noshift), array_values($keyboardmap_down_noshift), $password))
219
-            {
220
-                $keyboardmap_downright = array(
221
-                    "a" => "z",
222
-                    "q" => "a",
223
-                    "1" => "q",
224
-                    "s" => "x",
225
-                    "w" => "s",
226
-                    "2" => "w",
227
-                    "d" => "c",
228
-                    "e" => "d",
229
-                    "3" => "e",
230
-                    "f" => "v",
231
-                    "r" => "f",
232
-                    "4" => "r",
233
-                    "g" => "b",
234
-                    "t" => "g",
235
-                    "5" => "t",
236
-                    "h" => "n",
237
-                    "y" => "h",
238
-                    "6" => "y",
239
-                    "j" => "m",
240
-                    "u" => "j",
241
-                    "7" => "u",
242
-                    "i" => "k",
243
-                    "8" => "i",
244
-                    "o" => "l",
245
-                    "9" => "o",
246
-                    "0" => "p",
247
-                );
248
-
249
-                $keyboardmap_downleft = array(
250
-                    "2" => "q",
251
-                    "w" => "a",
252
-                    "3" => "w",
253
-                    "s" => "z",
254
-                    "e" => "s",
255
-                    "4" => "e",
256
-                    "d" => "x",
257
-                    "r" => "d",
258
-                    "5" => "r",
259
-                    "f" => "c",
260
-                    "t" => "f",
261
-                    "6" => "t",
262
-                    "g" => "v",
263
-                    "y" => "g",
264
-                    "7" => "y",
265
-                    "h" => "b",
266
-                    "u" => "h",
267
-                    "8" => "u",
268
-                    "j" => "n",
269
-                    "i" => "j",
270
-                    "9" => "i",
271
-                    "k" => "m",
272
-                    "o" => "k",
273
-                    "0" => "o",
274
-                    "p" => "l",
275
-                    "-" => "p",
276
-                );
277
-
278
-                $password2 = str_replace(array_keys($keyboardmap_downright), array_values($keyboardmap_downright), $password);
279
-                $passwords[] = $password2;
280
-                $passwords[] = strrev($password2);
281
-
282
-                $password2 = str_replace(array_keys($keyboardmap_downleft), array_values($keyboardmap_downleft), $password);
283
-                $passwords[] = $password2;
284
-                $passwords[] = strrev($password2);
285
-            }
286
-
287
-            // Deal with LEET-Speak substitutions.
288
-            $leetspeakmap = array(
289
-                "@" => "a",
290
-                "!" => "i",
291
-                "$" => "s",
292
-                "1" => "i",
293
-                "2" => "z",
294
-                "3" => "e",
295
-                "4" => "a",
296
-                "5" => "s",
297
-                "6" => "g",
298
-                "7" => "t",
299
-                "8" => "b",
300
-                "9" => "g",
301
-                "0" => "o"
302
-            );
303
-
304
-            $password2 = str_replace(array_keys($leetspeakmap), array_values($leetspeakmap), $password);
305
-            $passwords[] = $password2;
306
-            $passwords[] = strrev($password2);
307
-
308
-            $leetspeakmap["1"] = "l";
309
-            $password3 = str_replace(array_keys($leetspeakmap), array_values($leetspeakmap), $password);
310
-            if ($password3 != $password2)
311
-            {
312
-                $passwords[] = $password3;
313
-                $passwords[] = strrev($password3);
314
-            }
315
-
316
-            // Process the password, while looking for words in the dictionary.
317
-            $a = ord("a");
318
-            $z = ord("z");
319
-            $data = file_get_contents(DICTIONARY_PATH);
320
-            foreach ($passwords as $num => $password)
321
-            {
322
-                $y = strlen($password);
323
-                for ($x = 0; $x < $y; $x++)
324
-                {
325
-                    $tempchr = ord(substr($password, $x, 1));
326
-                    if ($tempchr >= $a && $tempchr <= $z)
327
-                    {
328
-                        for ($x2 = $x + 1; $x2 < $y; $x2++)
329
-                        {
330
-                            $tempchr = ord(substr($password, $x2, 1));
331
-                            if ($tempchr < $a || $tempchr > $z)  break;
332
-                        }
333
-
334
-                        $found = false;
335
-                        while (!$found && $x2 - $x >= $minwordlen)
336
-                        {
337
-                            $word = "/\\n" . substr($password, $x, $minwordlen);
338
-                            for ($x3 = $x + $minwordlen; $x3 < $x2; $x3++)  $word .= "(" . $password{$x3};
339
-                            for ($x3 = $x + $minwordlen; $x3 < $x2; $x3++)  $word .= ")?";
340
-                            $word .= "\\n/";
341
-
342
-                            preg_match_all($word, $data, $matches);
343
-                            if (!count($matches[0]))
344
-                            {
345
-                                $password{$x} = "*";
346
-                                $x++;
347
-                                $numbits = self::getNISTNumBits(substr($password, 0, $x)) + $extrabits;
348
-                                if ($numbits >= $minbits)  $found = true;
349
-                            }
350
-                            else
351
-                            {
352
-                                foreach ($matches[0] as $match)
353
-                                {
354
-                                    $password2 = str_replace(trim($match), "*", $password);
355
-                                    $numbits = self::getNISTNumBits($password2) + $extrabits;
356
-                                    if ($result > $numbits)  $result = $numbits;
357
-
358
-                                    if ($result < $minbits)  return false;
359
-                                }
360
-
361
-                                $found = true;
362
-                            }
363
-                        }
364
-
365
-                        if ($found)  break;
366
-
367
-                        $x = $x2 - 1;
368
-                    }
369
-                }
370
-            }
371
-        }
372
-
373
-        return $result >= $minbits;
374
-    }
54
+	/**
55
+	 * A standardized method for hasing a password before storing
56
+	 * in the database.
57
+	 *
58
+	 * @param $password
59
+	 * @return bool|mixed|string
60
+	 */
61
+	public static function hashPassword($password)
62
+	{
63
+		if (! config_item('auth.hash_cost'))
64
+		{
65
+			get_instance()->load->config('auth');
66
+		}
67
+
68
+		return password_hash($password, PASSWORD_DEFAULT, ['cost' => config_item('auth.hash_cost')]);
69
+	}
70
+
71
+	//--------------------------------------------------------------------
72
+
73
+	/**
74
+	 * Determines the number of entropy bits a password has based on
75
+	 *
76
+	 *
77
+	 * @param $password
78
+	 * @param bool $repeatcalc
79
+	 * @return int
80
+	 */
81
+	public static function getNISTNumBits($password, $repeatcalc = false)
82
+	{
83
+		$y = strlen($password);
84
+		if ($repeatcalc)
85
+		{
86
+			// Variant on NIST rules to reduce long sequences of repeated characters.
87
+			$result = 0;
88
+			$charmult = array_fill(0, 256, 1);
89
+			for ($x = 0; $x < $y; $x++)
90
+			{
91
+				$tempchr = ord(substr($password, $x, 1));
92
+				if ($x > 19)  $result += $charmult[$tempchr];
93
+				else if ($x > 7)  $result += $charmult[$tempchr] * 1.5;
94
+				else if ($x > 0)  $result += $charmult[$tempchr] * 2;
95
+				else  $result += 4;
96
+
97
+				$charmult[$tempchr] *= 0.75;
98
+			}
99
+
100
+			return $result;
101
+		}
102
+		else
103
+		{
104
+			if ($y > 20)  return 4 + (7 * 2) + (12 * 1.5) + $y - 20;
105
+			if ($y > 8)  return 4 + (7 * 2) + (($y - 8) * 1.5);
106
+			if ($y > 1)  return 4 + (($y - 1) * 2);
107
+
108
+			return ($y == 1 ? 4 : 0);
109
+		}
110
+	}
111
+
112
+	//--------------------------------------------------------------------
113
+
114
+	/**
115
+	 * Determines whether a password is strong enough to use. You should check
116
+	 * the password against this method and reject it if the password is not
117
+	 * strong enough.
118
+	 *
119
+	 * The following guidelines come from the author's tests against 10.4 million actual passwords
120
+	 * ( see post: http://cubicspot.blogspot.com/2012/01/how-to-calculate-password-strength-part.html )
121
+	 * and represents the suggested minimum entropy bits for different types of sites:
122
+	 *
123
+	 *      - 18 bits of entropy = minimum for ANY website.
124
+	 *      - 25 bits of entropy = minimum for a general purpose web service used relatively widely (e.g. Hotmail).
125
+	 *      - 30 bits of entropy = minimum for a web service with business critical applications (e.g. SAAS).
126
+	 *      - 40 bits of entropy = minimum for a bank or other financial service.
127
+	 *
128
+	 * The algorithm is based upon a modified version of the NIST rules which suggest the following:
129
+	 *
130
+	 *      - The first byte counts as 4 bits.
131
+	 *      - The next 7 bytes count as 2 bits each.
132
+	 *      - The next 12 bytes count as 1.5 bits each.
133
+	 *      - Anything beyond that counts as 1 bit each.
134
+	 *      - Mixed case + non-alphanumeric = up to 6 extra bits.
135
+	 *
136
+	 * @param string    $password   - The password to check
137
+	 * @param int       $minbits    - Minimum "entropy bits" that is allowed
138
+	 * @param bool      $usedict    - Should we check the password against a 300,000 word English dictionary?
139
+	 * @param int       $minwordlen -
140
+	 * @return bool
141
+	 */
142
+	public static function isStrongPassword($password, $minbits = 18, $usedict = false, $minwordlen = 4)
143
+	{
144
+		// NIST password strength rules allow up to 6 extra bits for mixed case and non-alphabetic.
145
+		$upper = false;
146
+		$lower = false;
147
+		$numeric = false;
148
+		$other = false;
149
+		$space = false;
150
+		$y = strlen($password);
151
+		for ($x = 0; $x < $y; $x++)
152
+		{
153
+			$tempchr = ord(substr($password, $x, 1));
154
+			if ($tempchr >= ord("A") && $tempchr <= ord("Z"))  $upper = true;
155
+			else if ($tempchr >= ord("a") && $tempchr <= ord("z"))  $lower = true;
156
+			else if ($tempchr >= ord("0") && $tempchr <= ord("9"))  $numeric = true;
157
+			else if ($tempchr == ord(" "))  $space = true;
158
+			else  $other = true;
159
+		}
160
+		$extrabits = ($upper && $lower && $other ? ($numeric ? 6 : 5) : ($numeric && !$upper && !$lower ? ($other ? -2 : -6) : 0));
161
+		if (!$space)  $extrabits -= 2;
162
+		else if (count(explode(" ", preg_replace('/\s+/', " ", $password))) > 3)  $extrabits++;
163
+		$result = self::getNISTNumBits($password, true) + $extrabits;
164
+
165
+		$password = strtolower($password);
166
+		$revpassword = strrev($password);
167
+		$numbits = self::getNISTNumBits($password) + $extrabits;
168
+		if ($result > $numbits)  $result = $numbits;
169
+
170
+		// Remove QWERTY strings.
171
+		$qwertystrs = array(
172
+			"1234567890-qwertyuiopasdfghjkl;zxcvbnm,./",
173
+			"1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik,9ol.0p;/-['=]:?_{\"+}",
174
+			"1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik9ol0p",
175
+			"qazwsxedcrfvtgbyhnujmik,ol.p;/-['=]:?_{\"+}",
176
+			"qazwsxedcrfvtgbyhnujmikolp",
177
+			"]\"/=[;.-pl,0okm9ijn8uhb7ygv6tfc5rdx4esz3wa2q1",
178
+			"pl0okm9ijn8uhb7ygv6tfc5rdx4esz3wa2q1",
179
+			"]\"/[;.pl,okmijnuhbygvtfcrdxeszwaq",
180
+			"plokmijnuhbygvtfcrdxeszwaq",
181
+			"014725836914702583697894561230258/369*+-*/",
182
+			"abcdefghijklmnopqrstuvwxyz"
183
+		);
184
+		foreach ($qwertystrs as $qwertystr)
185
+		{
186
+			$qpassword = $password;
187
+			$qrevpassword = $revpassword;
188
+			$z = 6;
189
+			do
190
+			{
191
+				$y = strlen($qwertystr) - $z;
192
+				for ($x = 0; $x < $y; $x++)
193
+				{
194
+					$str = substr($qwertystr, $x, $z);
195
+					$qpassword = str_replace($str, "*", $qpassword);
196
+					$qrevpassword = str_replace($str, "*", $qrevpassword);
197
+				}
198
+
199
+				$z--;
200
+			} while ($z > 2);
201
+
202
+			$numbits = self::getNISTNumBits($qpassword) + $extrabits;
203
+			if ($result > $numbits)  $result = $numbits;
204
+			$numbits = self::getNISTNumBits($qrevpassword) + $extrabits;
205
+			if ($result > $numbits)  $result = $numbits;
206
+
207
+			if ($result < $minbits)  return false;
208
+		}
209
+
210
+		if ($usedict && $result >= $minbits)
211
+		{
212
+			$passwords = array();
213
+
214
+			// Add keyboard shifting password variants.
215
+			$keyboardmap_down_noshift = array(
216
+				"z" => "", "x" => "", "c" => "", "v" => "", "b" => "", "n" => "", "m" => "", "," => "", "." => "", "/" => "", "<" => "", ">" => "", "?" => ""
217
+			);
218
+			if ($password == str_replace(array_keys($keyboardmap_down_noshift), array_values($keyboardmap_down_noshift), $password))
219
+			{
220
+				$keyboardmap_downright = array(
221
+					"a" => "z",
222
+					"q" => "a",
223
+					"1" => "q",
224
+					"s" => "x",
225
+					"w" => "s",
226
+					"2" => "w",
227
+					"d" => "c",
228
+					"e" => "d",
229
+					"3" => "e",
230
+					"f" => "v",
231
+					"r" => "f",
232
+					"4" => "r",
233
+					"g" => "b",
234
+					"t" => "g",
235
+					"5" => "t",
236
+					"h" => "n",
237
+					"y" => "h",
238
+					"6" => "y",
239
+					"j" => "m",
240
+					"u" => "j",
241
+					"7" => "u",
242
+					"i" => "k",
243
+					"8" => "i",
244
+					"o" => "l",
245
+					"9" => "o",
246
+					"0" => "p",
247
+				);
248
+
249
+				$keyboardmap_downleft = array(
250
+					"2" => "q",
251
+					"w" => "a",
252
+					"3" => "w",
253
+					"s" => "z",
254
+					"e" => "s",
255
+					"4" => "e",
256
+					"d" => "x",
257
+					"r" => "d",
258
+					"5" => "r",
259
+					"f" => "c",
260
+					"t" => "f",
261
+					"6" => "t",
262
+					"g" => "v",
263
+					"y" => "g",
264
+					"7" => "y",
265
+					"h" => "b",
266
+					"u" => "h",
267
+					"8" => "u",
268
+					"j" => "n",
269
+					"i" => "j",
270
+					"9" => "i",
271
+					"k" => "m",
272
+					"o" => "k",
273
+					"0" => "o",
274
+					"p" => "l",
275
+					"-" => "p",
276
+				);
277
+
278
+				$password2 = str_replace(array_keys($keyboardmap_downright), array_values($keyboardmap_downright), $password);
279
+				$passwords[] = $password2;
280
+				$passwords[] = strrev($password2);
281
+
282
+				$password2 = str_replace(array_keys($keyboardmap_downleft), array_values($keyboardmap_downleft), $password);
283
+				$passwords[] = $password2;
284
+				$passwords[] = strrev($password2);
285
+			}
286
+
287
+			// Deal with LEET-Speak substitutions.
288
+			$leetspeakmap = array(
289
+				"@" => "a",
290
+				"!" => "i",
291
+				"$" => "s",
292
+				"1" => "i",
293
+				"2" => "z",
294
+				"3" => "e",
295
+				"4" => "a",
296
+				"5" => "s",
297
+				"6" => "g",
298
+				"7" => "t",
299
+				"8" => "b",
300
+				"9" => "g",
301
+				"0" => "o"
302
+			);
303
+
304
+			$password2 = str_replace(array_keys($leetspeakmap), array_values($leetspeakmap), $password);
305
+			$passwords[] = $password2;
306
+			$passwords[] = strrev($password2);
307
+
308
+			$leetspeakmap["1"] = "l";
309
+			$password3 = str_replace(array_keys($leetspeakmap), array_values($leetspeakmap), $password);
310
+			if ($password3 != $password2)
311
+			{
312
+				$passwords[] = $password3;
313
+				$passwords[] = strrev($password3);
314
+			}
315
+
316
+			// Process the password, while looking for words in the dictionary.
317
+			$a = ord("a");
318
+			$z = ord("z");
319
+			$data = file_get_contents(DICTIONARY_PATH);
320
+			foreach ($passwords as $num => $password)
321
+			{
322
+				$y = strlen($password);
323
+				for ($x = 0; $x < $y; $x++)
324
+				{
325
+					$tempchr = ord(substr($password, $x, 1));
326
+					if ($tempchr >= $a && $tempchr <= $z)
327
+					{
328
+						for ($x2 = $x + 1; $x2 < $y; $x2++)
329
+						{
330
+							$tempchr = ord(substr($password, $x2, 1));
331
+							if ($tempchr < $a || $tempchr > $z)  break;
332
+						}
333
+
334
+						$found = false;
335
+						while (!$found && $x2 - $x >= $minwordlen)
336
+						{
337
+							$word = "/\\n" . substr($password, $x, $minwordlen);
338
+							for ($x3 = $x + $minwordlen; $x3 < $x2; $x3++)  $word .= "(" . $password{$x3};
339
+							for ($x3 = $x + $minwordlen; $x3 < $x2; $x3++)  $word .= ")?";
340
+							$word .= "\\n/";
341
+
342
+							preg_match_all($word, $data, $matches);
343
+							if (!count($matches[0]))
344
+							{
345
+								$password{$x} = "*";
346
+								$x++;
347
+								$numbits = self::getNISTNumBits(substr($password, 0, $x)) + $extrabits;
348
+								if ($numbits >= $minbits)  $found = true;
349
+							}
350
+							else
351
+							{
352
+								foreach ($matches[0] as $match)
353
+								{
354
+									$password2 = str_replace(trim($match), "*", $password);
355
+									$numbits = self::getNISTNumBits($password2) + $extrabits;
356
+									if ($result > $numbits)  $result = $numbits;
357
+
358
+									if ($result < $minbits)  return false;
359
+								}
360
+
361
+								$found = true;
362
+							}
363
+						}
364
+
365
+						if ($found)  break;
366
+
367
+						$x = $x2 - 1;
368
+					}
369
+				}
370
+			}
371
+		}
372
+
373
+		return $result >= $minbits;
374
+	}
375 375
 }
Please login to merge, or discard this patch.
myth/CIModules/auth/controllers/Test.php 1 patch
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -46,7 +46,7 @@
 block discarded – undo
46 46
 	public function index($target_time = 50)
47 47
 	{
48 48
 		// Convert the milliseconds to seconds.
49
-	    $target_time = $target_time / 1000;
49
+		$target_time = $target_time / 1000;
50 50
 
51 51
 		CLI::write('Testing for password hash value with a target time of '. $target_time .' seconds...');
52 52
 
Please login to merge, or discard this patch.
myth/CIModules/auth/helpers/password_helper.php 1 patch
Indentation   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -32,28 +32,28 @@
 block discarded – undo
32 32
 
33 33
 if (! function_exists('isStrongPassword'))
34 34
 {
35
-    /**
36
-     * Works with Myth\Auth\Password to enforce a strong password.
37
-     * Uses settings from the auth config file.
38
-     *
39
-     * @param $password
40
-     */
41
-    function isStrongPassword($password)
42
-    {
43
-        $min_strength = config_item('auth.min_password_strength');
44
-        $use_dict = config_item('auth.use_dictionary');
35
+	/**
36
+	 * Works with Myth\Auth\Password to enforce a strong password.
37
+	 * Uses settings from the auth config file.
38
+	 *
39
+	 * @param $password
40
+	 */
41
+	function isStrongPassword($password)
42
+	{
43
+		$min_strength = config_item('auth.min_password_strength');
44
+		$use_dict = config_item('auth.use_dictionary');
45 45
 
46
-        $strong = \Myth\Auth\Password::isStrongPassword($password, $min_strength, $use_dict);
46
+		$strong = \Myth\Auth\Password::isStrongPassword($password, $min_strength, $use_dict);
47 47
 
48
-        if (! $strong)
49
-        {
50
-            if (isset(get_instance()->form_validation))
51
-            {
52
-                get_instance()->form_validation->set_message('isStrongPassword', lang('auth.pass_not_strong'));
53
-            }
54
-            return false;
55
-        }
48
+		if (! $strong)
49
+		{
50
+			if (isset(get_instance()->form_validation))
51
+			{
52
+				get_instance()->form_validation->set_message('isStrongPassword', lang('auth.pass_not_strong'));
53
+			}
54
+			return false;
55
+		}
56 56
 
57
-        return true;
58
-    }
57
+		return true;
58
+	}
59 59
 }
Please login to merge, or discard this patch.
myth/CIModules/cron/controllers/Cron.php 1 patch
Indentation   +304 added lines, -304 removed lines patch added patch discarded remove patch
@@ -37,325 +37,325 @@
 block discarded – undo
37 37
 // todo Add ability to log actual cron jobs to database to verify when they ran for sure.
38 38
 class Cron extends \Myth\Controllers\CLIController {
39 39
 
40
-    protected $descriptions = [
41
-        'show'  => ['show [all/<task>]', 'Lists the names one or more tasks, with run times.'],
42
-        'run'   => ['run [<task>]', 'Runs all scheduled tasks. If <task> is present only runs that task.'],
43
-        'disable'   => ['disable', 'Disables the cron system and will not run any tasks.'],
44
-        'enable'    => ['enable', 'Enables the cron system and will run tasks again.'],
45
-        'suspend'   => ['suspend <task>', 'Stops a single task from running until resumed.'],
46
-        'resume'    => ['resume <task>', 'Resumes execution of a single suspended task.']
47
-    ];
48
-
49
-    protected $long_descriptions = [
50
-        'show'  => '',
51
-        'run'   => '',
52
-        'disable'   => '',
53
-        'enable'    => '',
54
-        'suspend'   => '',
55
-        'resume'    => ''
56
-    ];
57
-
58
-    //--------------------------------------------------------------------
59
-
60
-    public function __construct()
61
-    {
62
-        parent::__construct();
63
-
64
-        // Load our tasks into the sytem.
65
-        require APPPATH .'config/cron.php';
66
-    }
67
-
68
-    //--------------------------------------------------------------------
69
-
70
-    /**
71
-     * Runs all of the tasks (after checking their time, of course...)
72
-     *
73
-     * @param string $alias
74
-     * @return mixed
75
-     */
76
-    public function run($alias=null)
77
-    {
78
-        // Has the system been disabled?
79
-        if (Settings::get('is_disabled', 'cron') == 'y')
80
-        {
81
-            return CLI::error('The cron system has been disabled. No tasks were run.');
82
-        }
83
-
84
-        $force_run = false;
85
-
86
-        // Run one task or all?
87
-        if (! empty($alias))
88
-        {
89
-            $tasks = \Myth\Cron\CronManager::task($alias);
90
-
91
-            if (is_null($tasks))
92
-            {
93
-                return CLI::error("Unable to find the task: '{$alias}'.");
94
-            }
95
-
96
-            $tasks = [ $alias => $tasks];
97
-            $force_run = true;
98
-        }
99
-        else
100
-        {
101
-            $tasks = \Myth\Cron\CronManager::tasks();
102
-        }
103
-
104
-        if (empty($tasks))
105
-        {
106
-            return CLI::write("There are no tasks to run at this time.");
107
-        }
108
-
109
-        // We need to be able to check against suspended tasks.
110
-        $suspended = Settings::get('suspended_tasks', 'cron');
111
-
112
-        if (! is_array($suspended))
113
-        {
114
-            $suspended = array($suspended);
115
-        }
116
-
117
-        // Loop over all of our tasks, checking them against the
118
-        // suspended tasks to see if they're okay to run.
119
-
120
-        // Collect the output of the actions so that we can make
121
-        // it available to the event (for sending emails and the like)
122
-        $output = '';
123
-
124
-        echo CLI::write('Starting Tasks...');
125
-
126
-        foreach ($tasks as $alias => $task)
127
-        {
128
-            if (in_array($alias, $suspended))
129
-            {
130
-                echo CLI::write("\t[Suspended] {$alias} will not run until resumed.", 'yellow');
131
-                $output .= "[Suspended] {$alias} will not run until resumed.";
132
-                continue;
133
-            }
134
-
135
-            echo CLI::write("\tRunning task: {$alias}...");
136
-            $output .= \Myth\Cron\CronManager::run($alias, $force_run);
137
-        }
138
-
139
-        // Give other people a chance to respond.
140
-        echo CLI::write('Done. Firing the event so others can play too...');
141
-
142
-        Events::trigger('afterCron', [$output]);
143
-
144
-        // And we're out of here boys and girls!
145
-        echo CLI::write('Done');
146
-    }
147
-
148
-    //--------------------------------------------------------------------
149
-
150
-
151
-    /**
152
-     * Lists one or more tasks with their scheduled run times.
153
-     *
154
-     * @param null $task
155
-     * @return mixed
156
-     */
157
-    public function show($task=null)
158
-    {
159
-        if (empty($task))
160
-        {
161
-            return $this->listTaskNames();
162
-        }
163
-
164
-        if (trim(strtolower($task)) == 'all')
165
-        {
166
-            $tasks = \Myth\Cron\CronManager::listAll();
167
-        }
168
-        else
169
-        {
170
-            $tasks = \Myth\Cron\CronManager::task($task);
171
-        }
172
-
173
-        if (! is_array($tasks))
174
-        {
175
-            $tasks = [ $task => [
176
-                'next_run'  => $tasks->nextRunDate(),
177
-                'prev_run'  => $tasks->previousRunDate()
178
-            ]];
179
-        }
180
-
181
-        if (! count($tasks))
182
-        {
183
-            return CLI::found('No tasks found.', 'red');
184
-        }
185
-
186
-        $suspended = Settings::get('suspended_tasks', 'cron');
187
-
188
-        if (empty($suspended))
189
-        {
190
-            $suspended = [];
191
-        }
192
-        /*
40
+	protected $descriptions = [
41
+		'show'  => ['show [all/<task>]', 'Lists the names one or more tasks, with run times.'],
42
+		'run'   => ['run [<task>]', 'Runs all scheduled tasks. If <task> is present only runs that task.'],
43
+		'disable'   => ['disable', 'Disables the cron system and will not run any tasks.'],
44
+		'enable'    => ['enable', 'Enables the cron system and will run tasks again.'],
45
+		'suspend'   => ['suspend <task>', 'Stops a single task from running until resumed.'],
46
+		'resume'    => ['resume <task>', 'Resumes execution of a single suspended task.']
47
+	];
48
+
49
+	protected $long_descriptions = [
50
+		'show'  => '',
51
+		'run'   => '',
52
+		'disable'   => '',
53
+		'enable'    => '',
54
+		'suspend'   => '',
55
+		'resume'    => ''
56
+	];
57
+
58
+	//--------------------------------------------------------------------
59
+
60
+	public function __construct()
61
+	{
62
+		parent::__construct();
63
+
64
+		// Load our tasks into the sytem.
65
+		require APPPATH .'config/cron.php';
66
+	}
67
+
68
+	//--------------------------------------------------------------------
69
+
70
+	/**
71
+	 * Runs all of the tasks (after checking their time, of course...)
72
+	 *
73
+	 * @param string $alias
74
+	 * @return mixed
75
+	 */
76
+	public function run($alias=null)
77
+	{
78
+		// Has the system been disabled?
79
+		if (Settings::get('is_disabled', 'cron') == 'y')
80
+		{
81
+			return CLI::error('The cron system has been disabled. No tasks were run.');
82
+		}
83
+
84
+		$force_run = false;
85
+
86
+		// Run one task or all?
87
+		if (! empty($alias))
88
+		{
89
+			$tasks = \Myth\Cron\CronManager::task($alias);
90
+
91
+			if (is_null($tasks))
92
+			{
93
+				return CLI::error("Unable to find the task: '{$alias}'.");
94
+			}
95
+
96
+			$tasks = [ $alias => $tasks];
97
+			$force_run = true;
98
+		}
99
+		else
100
+		{
101
+			$tasks = \Myth\Cron\CronManager::tasks();
102
+		}
103
+
104
+		if (empty($tasks))
105
+		{
106
+			return CLI::write("There are no tasks to run at this time.");
107
+		}
108
+
109
+		// We need to be able to check against suspended tasks.
110
+		$suspended = Settings::get('suspended_tasks', 'cron');
111
+
112
+		if (! is_array($suspended))
113
+		{
114
+			$suspended = array($suspended);
115
+		}
116
+
117
+		// Loop over all of our tasks, checking them against the
118
+		// suspended tasks to see if they're okay to run.
119
+
120
+		// Collect the output of the actions so that we can make
121
+		// it available to the event (for sending emails and the like)
122
+		$output = '';
123
+
124
+		echo CLI::write('Starting Tasks...');
125
+
126
+		foreach ($tasks as $alias => $task)
127
+		{
128
+			if (in_array($alias, $suspended))
129
+			{
130
+				echo CLI::write("\t[Suspended] {$alias} will not run until resumed.", 'yellow');
131
+				$output .= "[Suspended] {$alias} will not run until resumed.";
132
+				continue;
133
+			}
134
+
135
+			echo CLI::write("\tRunning task: {$alias}...");
136
+			$output .= \Myth\Cron\CronManager::run($alias, $force_run);
137
+		}
138
+
139
+		// Give other people a chance to respond.
140
+		echo CLI::write('Done. Firing the event so others can play too...');
141
+
142
+		Events::trigger('afterCron', [$output]);
143
+
144
+		// And we're out of here boys and girls!
145
+		echo CLI::write('Done');
146
+	}
147
+
148
+	//--------------------------------------------------------------------
149
+
150
+
151
+	/**
152
+	 * Lists one or more tasks with their scheduled run times.
153
+	 *
154
+	 * @param null $task
155
+	 * @return mixed
156
+	 */
157
+	public function show($task=null)
158
+	{
159
+		if (empty($task))
160
+		{
161
+			return $this->listTaskNames();
162
+		}
163
+
164
+		if (trim(strtolower($task)) == 'all')
165
+		{
166
+			$tasks = \Myth\Cron\CronManager::listAll();
167
+		}
168
+		else
169
+		{
170
+			$tasks = \Myth\Cron\CronManager::task($task);
171
+		}
172
+
173
+		if (! is_array($tasks))
174
+		{
175
+			$tasks = [ $task => [
176
+				'next_run'  => $tasks->nextRunDate(),
177
+				'prev_run'  => $tasks->previousRunDate()
178
+			]];
179
+		}
180
+
181
+		if (! count($tasks))
182
+		{
183
+			return CLI::found('No tasks found.', 'red');
184
+		}
185
+
186
+		$suspended = Settings::get('suspended_tasks', 'cron');
187
+
188
+		if (empty($suspended))
189
+		{
190
+			$suspended = [];
191
+		}
192
+		/*
193 193
          * Headers
194 194
          */
195
-        echo CLI::write("Task\t\t\t\tNext Run\t\tPrevious Run");
196
-        echo CLI::write( str_repeat('-', 80) );
197
-
198
-        foreach ($tasks as $alias => $task)
199
-        {
200
-            // Suspended?
201
-            $color = 'yellow';
202
-            $extra = '';
203
-
204
-            if (in_array($alias, $suspended) )
205
-            {
206
-                $color = 'blue';
207
-                $extra = "\t[Suspended]";
208
-            }
209
-
210
-            // Alias can only be 24 chars long.
211
-            $alias = strlen($alias) >= 32 ? substr($alias, 0, 28) .'... ' : $alias . str_repeat(" ", 32 - strlen($alias));
212
-
213
-            $next = date('D Y-m-d H:i', $task['next_run']);
214
-            $prev = date('D Y-m-d H:i', $task['prev_run']);
215
-
216
-            echo CLI::write("{$alias}{$next}\t{$prev}{$extra}", $color);
217
-        }
218
-    }
219
-
220
-    //--------------------------------------------------------------------
221
-
222
-    /**
223
-     * Stops a task from being executed during the normal cron runs.
224
-     *
225
-     * @param $alias
226
-     */
227
-    public function suspend($alias)
228
-    {
229
-        // Verify the task actually exists.
230
-        $task = \Myth\Cron\CronManager::task($alias);
231
-
232
-        if (is_null($task))
233
-        {
234
-            return CLI::error("Unable to find the task: {$alias}.");
235
-        }
236
-
237
-        // Update the existing setting.
238
-        $suspended = Settings::get('suspended_tasks', 'cron');
239
-
240
-        if (empty($suspended))
241
-        {
242
-            $suspended = [];
243
-        }
244
-
245
-        $suspended[] = $alias;
246
-
247
-        if (Settings::save('suspended_tasks', $suspended, 'cron') )
248
-        {
249
-            return CLI::write('Done');
250
-        }
251
-
252
-        echo CLI::error('Unkown problem saving the settings.');
253
-    }
254
-
255
-    //--------------------------------------------------------------------
256
-
257
-    /**
258
-     * Allows the execution of a suspended task to continue again
259
-     * during normal cron execution.
260
-     *
261
-     * @param $alias
262
-     */
263
-    public function resume($alias)
264
-    {
265
-        // Verify the task actually exists.
266
-        $task = \Myth\Cron\CronManager::task($alias);
267
-
268
-        if (is_null($task))
269
-        {
270
-            return CLI::error("Unable to find the task: {$alias}.");
271
-        }
272
-
273
-        // Update the existing setting.
274
-        $suspended = Settings::get('suspended_tasks', 'cron');
275
-
276
-        if (! empty($suspended))
277
-        {
278
-            unset($suspended[ array_search($alias, $suspended) ]);
279
-
280
-            if (! Settings::save('suspended_tasks', $suspended, 'cron') )
281
-            {
282
-                return CLI::error('Unkown problem saving the settings.');
283
-            }
284
-        }
285
-
286
-        return CLI::write('Done');
287
-    }
288
-
289
-    //--------------------------------------------------------------------
290
-
291
-    /**
292
-     * Disables the cron tasks and stops the system from running any tasks.
293
-     * To start the system allowing it to run again, use the `enable` command.
294
-     */
295
-    public function disable()
296
-    {
297
-        if (! Settings::save('is_disabled', 'y', 'cron'))
298
-        {
299
-            return CLI::error('Unknown problem saving the setting. '. CLI::color('Cron jobs will still run!', 'yellow'));
300
-        }
301
-
302
-        CLI::write('Done');
303
-    }
195
+		echo CLI::write("Task\t\t\t\tNext Run\t\tPrevious Run");
196
+		echo CLI::write( str_repeat('-', 80) );
197
+
198
+		foreach ($tasks as $alias => $task)
199
+		{
200
+			// Suspended?
201
+			$color = 'yellow';
202
+			$extra = '';
203
+
204
+			if (in_array($alias, $suspended) )
205
+			{
206
+				$color = 'blue';
207
+				$extra = "\t[Suspended]";
208
+			}
209
+
210
+			// Alias can only be 24 chars long.
211
+			$alias = strlen($alias) >= 32 ? substr($alias, 0, 28) .'... ' : $alias . str_repeat(" ", 32 - strlen($alias));
212
+
213
+			$next = date('D Y-m-d H:i', $task['next_run']);
214
+			$prev = date('D Y-m-d H:i', $task['prev_run']);
215
+
216
+			echo CLI::write("{$alias}{$next}\t{$prev}{$extra}", $color);
217
+		}
218
+	}
219
+
220
+	//--------------------------------------------------------------------
221
+
222
+	/**
223
+	 * Stops a task from being executed during the normal cron runs.
224
+	 *
225
+	 * @param $alias
226
+	 */
227
+	public function suspend($alias)
228
+	{
229
+		// Verify the task actually exists.
230
+		$task = \Myth\Cron\CronManager::task($alias);
231
+
232
+		if (is_null($task))
233
+		{
234
+			return CLI::error("Unable to find the task: {$alias}.");
235
+		}
236
+
237
+		// Update the existing setting.
238
+		$suspended = Settings::get('suspended_tasks', 'cron');
239
+
240
+		if (empty($suspended))
241
+		{
242
+			$suspended = [];
243
+		}
244
+
245
+		$suspended[] = $alias;
246
+
247
+		if (Settings::save('suspended_tasks', $suspended, 'cron') )
248
+		{
249
+			return CLI::write('Done');
250
+		}
251
+
252
+		echo CLI::error('Unkown problem saving the settings.');
253
+	}
254
+
255
+	//--------------------------------------------------------------------
256
+
257
+	/**
258
+	 * Allows the execution of a suspended task to continue again
259
+	 * during normal cron execution.
260
+	 *
261
+	 * @param $alias
262
+	 */
263
+	public function resume($alias)
264
+	{
265
+		// Verify the task actually exists.
266
+		$task = \Myth\Cron\CronManager::task($alias);
267
+
268
+		if (is_null($task))
269
+		{
270
+			return CLI::error("Unable to find the task: {$alias}.");
271
+		}
272
+
273
+		// Update the existing setting.
274
+		$suspended = Settings::get('suspended_tasks', 'cron');
275
+
276
+		if (! empty($suspended))
277
+		{
278
+			unset($suspended[ array_search($alias, $suspended) ]);
279
+
280
+			if (! Settings::save('suspended_tasks', $suspended, 'cron') )
281
+			{
282
+				return CLI::error('Unkown problem saving the settings.');
283
+			}
284
+		}
285
+
286
+		return CLI::write('Done');
287
+	}
288
+
289
+	//--------------------------------------------------------------------
290
+
291
+	/**
292
+	 * Disables the cron tasks and stops the system from running any tasks.
293
+	 * To start the system allowing it to run again, use the `enable` command.
294
+	 */
295
+	public function disable()
296
+	{
297
+		if (! Settings::save('is_disabled', 'y', 'cron'))
298
+		{
299
+			return CLI::error('Unknown problem saving the setting. '. CLI::color('Cron jobs will still run!', 'yellow'));
300
+		}
301
+
302
+		CLI::write('Done');
303
+	}
304 304
     
305
-    //--------------------------------------------------------------------
305
+	//--------------------------------------------------------------------
306 306
 
307
-    /**
308
-     * Resumes the running of tasks after the system has been disabled
309
-     * with the `disable` command.
310
-     */
311
-    public function enable()
312
-    {
313
-        if (! Settings::save('is_disabled', 'n', 'cron'))
314
-        {
315
-            return CLI::error('Unknown problem saving the setting. '. CLI::color('Cron jobs will NOT run!', 'yellow'));
316
-        }
307
+	/**
308
+	 * Resumes the running of tasks after the system has been disabled
309
+	 * with the `disable` command.
310
+	 */
311
+	public function enable()
312
+	{
313
+		if (! Settings::save('is_disabled', 'n', 'cron'))
314
+		{
315
+			return CLI::error('Unknown problem saving the setting. '. CLI::color('Cron jobs will NOT run!', 'yellow'));
316
+		}
317 317
 
318
-        CLI::write('Done');
319
-    }
318
+		CLI::write('Done');
319
+	}
320 320
 
321
-    //--------------------------------------------------------------------
321
+	//--------------------------------------------------------------------
322 322
 
323 323
 
324
-    //--------------------------------------------------------------------
325
-    // Private Methods
326
-    //--------------------------------------------------------------------
324
+	//--------------------------------------------------------------------
325
+	// Private Methods
326
+	//--------------------------------------------------------------------
327 327
 
328
-    /**
329
-     * Lists out all available tasks, names only.
330
-     */
331
-    private function listTaskNames()
332
-    {
333
-        $suspended = Settings::get('suspended_tasks', 'cron');
328
+	/**
329
+	 * Lists out all available tasks, names only.
330
+	 */
331
+	private function listTaskNames()
332
+	{
333
+		$suspended = Settings::get('suspended_tasks', 'cron');
334 334
 
335
-        if (empty($suspended))
336
-        {
337
-            $suspended = [];
338
-        }
335
+		if (empty($suspended))
336
+		{
337
+			$suspended = [];
338
+		}
339 339
 
340
-        $tasks = \Myth\Cron\CronManager::listAll();
340
+		$tasks = \Myth\Cron\CronManager::listAll();
341 341
 
342
-        echo CLI::write("\nAvailable Tasks:");
342
+		echo CLI::write("\nAvailable Tasks:");
343 343
 
344
-        foreach ($tasks as $alias => $task)
345
-        {
346
-            $color = 'yellow';
347
-            $extra = '';
344
+		foreach ($tasks as $alias => $task)
345
+		{
346
+			$color = 'yellow';
347
+			$extra = '';
348 348
 
349
-            if (in_array($alias, $suspended) )
350
-            {
351
-                $color = 'blue';
352
-                $extra = "[Suspended]";
353
-            }
349
+			if (in_array($alias, $suspended) )
350
+			{
351
+				$color = 'blue';
352
+				$extra = "[Suspended]";
353
+			}
354 354
 
355
-            echo CLI::write("\t{$extra} {$alias}", $color);
356
-        }
357
-    }
355
+			echo CLI::write("\t{$extra} {$alias}", $color);
356
+		}
357
+	}
358 358
 
359
-    //--------------------------------------------------------------------
359
+	//--------------------------------------------------------------------
360 360
 
361 361
 }
Please login to merge, or discard this patch.
myth/CIModules/database/controllers/Database.php 1 patch
Indentation   +224 added lines, -224 removed lines patch added patch discarded remove patch
@@ -35,207 +35,207 @@  discard block
 block discarded – undo
35 35
 class Database extends \Myth\Controllers\CLIController
36 36
 {
37 37
 
38
-    protected $descriptions = [
39
-        'migrate'       => ['migrate [$to]',        'Runs the migrations up or down until schema at version \$to'],
40
-        'quietMigrate'  => ['quiteMigrate [$to]',   'Same as migrate but without any feedback.'],
41
-        'refresh'       => ['refresh',              'Runs migrations back to version 0 (uninstall) and then back to the most recent migration.'],
42
-        'newMigration'  => ['newMigration [$name]', 'Creates a new migration file.'],
43
-        'seed'          => ['seed [$name]',         'Runs the named database seeder.']
44
-    ];
45
-
46
-    protected $long_descriptions = [
47
-        'migrate'       => '',
48
-        'quietMigrate'  => '',
49
-        'refresh'       => '',
50
-        'newMigration'  => '',
51
-        'seed'          => ''
52
-    ];
53
-
54
-    //-------------------------------------------------------------------
55
-
56
-    //--------------------------------------------------------------------
57
-    // Migration Methods
58
-    //--------------------------------------------------------------------
59
-
60
-    /**
61
-     * Provides a command-line interface to the migration scripts.
62
-     * If no $to is provided, will migrate to the latest version.
63
-     *
64
-     * Example:
65
-     *      > php index.php database migrate
66
-     *
67
-     * @param string $type 'app', 'myth', 'all' or {module_name}
68
-     * @param null $to
69
-     * @param bool $silent If TRUE, will NOT display any prompts for verification.
70
-     * @return bool|void
71
-     */
72
-    public function migrate($type=null, $to = null, $silent = false)
73
-    {
74
-        $this->load->library('migration');
75
-
76
-        if (empty($type))
77
-        {
78
-            $type = CLI::prompt("Migration group to refresh?", $this->migration->default_migration_path());
79
-
80
-            if (empty($type))
81
-            {
82
-                return $silent ? false : CLI::error("\tYou must supply a group to refresh.");
83
-            }
84
-        }
85
-
86
-        // We need to append 'mod:' to properly handle modules, if
87
-        // the $type is not one of the recognized migration groups.
88
-        $this->config->load('migration');
89
-        $groups = config_item('migration_paths');
90
-        $groups = array_keys($groups);
91
-
92
-        // If it's not in the groups list, then assume it's a module.
93
-        if (! in_array($type, $groups))
94
-        {
95
-            if (strpos($type, 'mod:') !== 0)
96
-            {
97
-                $type = 'mod:'. $type;
98
-            }
99
-        }
100
-
101
-        unset($groups);
102
-
103
-        // Get our stats on the migrations
104
-        $latest = $this->migration->get_latest($type);
105
-        $latest = empty($latest) ? 0 : substr($latest, 0, strpos($latest, '_'));
106
-
107
-        if (empty($latest)) {
108
-            return CLI::write("\tNo migrations found.", 'yellow');
109
-        }
110
-
111
-        $current = $this->migration->get_version($type);
112
-
113
-        // Already at the desired version?
114
-        if ((! is_null($to) && $current == $to) OR (is_null($to) && $current == $latest))
115
-        {
116
-            return $silent ? true : CLI::write("\tDatabase is already at the desired version ({$current})", 'yellow');
117
-        }
118
-
119
-        $target = is_null($to) ? $latest : $to;
120
-
121
-        // Just to be safe, verify with the user they want to migrate
122
-        // to the latest version.
123
-        if (is_null($to)) {
124
-            // If we're in silent mode, don't prompt, just go to the latest...
125
-            if (! $silent) {
126
-                $go_ahead = CLI::prompt('Migrate to the latest available version?', array('y', 'n'));
127
-
128
-                if ($go_ahead == 'n') {
129
-                    return CLI::write('Bailing...', 'yellow');
130
-                }
131
-            }
132
-
133
-            if (! $this->migration->latest($type)) {
134
-                return CLI::error("\n\tERROR: " . $this->migration->error_string() . "\n");
135
-            }
136
-        } else {
137
-            if ($this->migration->version($type, $to) === false) {
138
-                return CLI::error("\n\tERROR: " . $this->migration->error_string() . "\n");
139
-            }
140
-        }
141
-
142
-        return $silent ? true :
143
-            CLI::write("\n\tSuccessfully migrated database from version {$current} to {$target}.\n", 'green');
144
-    }
145
-
146
-    //--------------------------------------------------------------------
147
-
148
-    /**
149
-     * Performs a migration that does not prompt for any information.
150
-     * Suitable for use within automated scripts that can't be
151
-     * bothered with answering questions.
152
-     *
153
-     * @param string $type 'app', 'myth', 'all' or {module_name}
154
-     * @param null $to
155
-     * @return bool|void
156
-     */
157
-    public function quietMigrate($type='app', $to = null)
158
-    {
159
-        return $this->migrate($type, $to, true);
160
-    }
161
-
162
-    //--------------------------------------------------------------------
163
-
164
-
165
-    /**
166
-     * Migrates the database back to 0, then back up to the latest version.
167
-     *
168
-     * @param string $type  The group or module to refresh.
169
-     * @return mixed
170
-     */
171
-    public function refresh($type=null)
172
-    {
173
-        $this->load->library('migration');
174
-
175
-        if (empty($type))
176
-        {
177
-            $type = CLI::prompt("Migration group to refresh?", $this->migration->default_migration_path());
178
-
179
-            if (empty($type))
180
-            {
181
-                return CLI::error("\tYou must supply a group to refresh.");
182
-            }
183
-        }
184
-
185
-        if ($this->migration->version($type, 0) === false) {
186
-            return CLI::error("\tERROR: " . $this->migration->error_string());
187
-        }
188
-
189
-        CLI::write(CLI::color("\tCleared the database.", 'green'));
190
-
191
-        if ($this->migration->latest($type) === false) {
192
-            return CLI::error("\tERROR: " . $this->migration->error_string());
193
-        }
194
-
195
-        CLI::write("\tRe-installed the database to the latest migration.", 'green');
196
-    }
197
-
198
-    //--------------------------------------------------------------------
199
-
200
-    /**
201
-     * Creates a new migration file ready to be used.
202
-     *
203
-     * @param $name
204
-     */
205
-    public function newMigration($name = null, $type = 'app')
206
-    {
207
-        if (empty($name)) {
208
-            $name = CLI::prompt('Migration name? ');
209
-
210
-            if (empty($name)) {
211
-                return CLI::error("\tYou must provide a migration name.", 'red');
212
-            }
213
-        }
214
-
215
-        $this->load->library('migration');
216
-
217
-        $path = $this->migration->determine_migration_path($type);
218
-
219
-        // Does the alias path exist in our config?
220
-        if (! $path) {
221
-            return CLI::error("\tThe migration path for '{$type}' does not exist.'");
222
-        }
223
-
224
-        // Does the path really exist?
225
-        if (! is_dir($path)) {
226
-            return CLI::error("\tThe path for '{$type}' is not a directory.");
227
-        }
228
-
229
-        // Is the folder writeable?
230
-        if (! is_writeable($path)) {
231
-            return CLI::error("\tThe folder for '{$type}' migrations is not writeable.");
232
-        }
233
-
234
-        $file = $this->migration->make_name($name);
235
-
236
-        $path = rtrim($path, '/') .'/'. $file;
237
-
238
-        $contents = <<<EOT
38
+	protected $descriptions = [
39
+		'migrate'       => ['migrate [$to]',        'Runs the migrations up or down until schema at version \$to'],
40
+		'quietMigrate'  => ['quiteMigrate [$to]',   'Same as migrate but without any feedback.'],
41
+		'refresh'       => ['refresh',              'Runs migrations back to version 0 (uninstall) and then back to the most recent migration.'],
42
+		'newMigration'  => ['newMigration [$name]', 'Creates a new migration file.'],
43
+		'seed'          => ['seed [$name]',         'Runs the named database seeder.']
44
+	];
45
+
46
+	protected $long_descriptions = [
47
+		'migrate'       => '',
48
+		'quietMigrate'  => '',
49
+		'refresh'       => '',
50
+		'newMigration'  => '',
51
+		'seed'          => ''
52
+	];
53
+
54
+	//-------------------------------------------------------------------
55
+
56
+	//--------------------------------------------------------------------
57
+	// Migration Methods
58
+	//--------------------------------------------------------------------
59
+
60
+	/**
61
+	 * Provides a command-line interface to the migration scripts.
62
+	 * If no $to is provided, will migrate to the latest version.
63
+	 *
64
+	 * Example:
65
+	 *      > php index.php database migrate
66
+	 *
67
+	 * @param string $type 'app', 'myth', 'all' or {module_name}
68
+	 * @param null $to
69
+	 * @param bool $silent If TRUE, will NOT display any prompts for verification.
70
+	 * @return bool|void
71
+	 */
72
+	public function migrate($type=null, $to = null, $silent = false)
73
+	{
74
+		$this->load->library('migration');
75
+
76
+		if (empty($type))
77
+		{
78
+			$type = CLI::prompt("Migration group to refresh?", $this->migration->default_migration_path());
79
+
80
+			if (empty($type))
81
+			{
82
+				return $silent ? false : CLI::error("\tYou must supply a group to refresh.");
83
+			}
84
+		}
85
+
86
+		// We need to append 'mod:' to properly handle modules, if
87
+		// the $type is not one of the recognized migration groups.
88
+		$this->config->load('migration');
89
+		$groups = config_item('migration_paths');
90
+		$groups = array_keys($groups);
91
+
92
+		// If it's not in the groups list, then assume it's a module.
93
+		if (! in_array($type, $groups))
94
+		{
95
+			if (strpos($type, 'mod:') !== 0)
96
+			{
97
+				$type = 'mod:'. $type;
98
+			}
99
+		}
100
+
101
+		unset($groups);
102
+
103
+		// Get our stats on the migrations
104
+		$latest = $this->migration->get_latest($type);
105
+		$latest = empty($latest) ? 0 : substr($latest, 0, strpos($latest, '_'));
106
+
107
+		if (empty($latest)) {
108
+			return CLI::write("\tNo migrations found.", 'yellow');
109
+		}
110
+
111
+		$current = $this->migration->get_version($type);
112
+
113
+		// Already at the desired version?
114
+		if ((! is_null($to) && $current == $to) OR (is_null($to) && $current == $latest))
115
+		{
116
+			return $silent ? true : CLI::write("\tDatabase is already at the desired version ({$current})", 'yellow');
117
+		}
118
+
119
+		$target = is_null($to) ? $latest : $to;
120
+
121
+		// Just to be safe, verify with the user they want to migrate
122
+		// to the latest version.
123
+		if (is_null($to)) {
124
+			// If we're in silent mode, don't prompt, just go to the latest...
125
+			if (! $silent) {
126
+				$go_ahead = CLI::prompt('Migrate to the latest available version?', array('y', 'n'));
127
+
128
+				if ($go_ahead == 'n') {
129
+					return CLI::write('Bailing...', 'yellow');
130
+				}
131
+			}
132
+
133
+			if (! $this->migration->latest($type)) {
134
+				return CLI::error("\n\tERROR: " . $this->migration->error_string() . "\n");
135
+			}
136
+		} else {
137
+			if ($this->migration->version($type, $to) === false) {
138
+				return CLI::error("\n\tERROR: " . $this->migration->error_string() . "\n");
139
+			}
140
+		}
141
+
142
+		return $silent ? true :
143
+			CLI::write("\n\tSuccessfully migrated database from version {$current} to {$target}.\n", 'green');
144
+	}
145
+
146
+	//--------------------------------------------------------------------
147
+
148
+	/**
149
+	 * Performs a migration that does not prompt for any information.
150
+	 * Suitable for use within automated scripts that can't be
151
+	 * bothered with answering questions.
152
+	 *
153
+	 * @param string $type 'app', 'myth', 'all' or {module_name}
154
+	 * @param null $to
155
+	 * @return bool|void
156
+	 */
157
+	public function quietMigrate($type='app', $to = null)
158
+	{
159
+		return $this->migrate($type, $to, true);
160
+	}
161
+
162
+	//--------------------------------------------------------------------
163
+
164
+
165
+	/**
166
+	 * Migrates the database back to 0, then back up to the latest version.
167
+	 *
168
+	 * @param string $type  The group or module to refresh.
169
+	 * @return mixed
170
+	 */
171
+	public function refresh($type=null)
172
+	{
173
+		$this->load->library('migration');
174
+
175
+		if (empty($type))
176
+		{
177
+			$type = CLI::prompt("Migration group to refresh?", $this->migration->default_migration_path());
178
+
179
+			if (empty($type))
180
+			{
181
+				return CLI::error("\tYou must supply a group to refresh.");
182
+			}
183
+		}
184
+
185
+		if ($this->migration->version($type, 0) === false) {
186
+			return CLI::error("\tERROR: " . $this->migration->error_string());
187
+		}
188
+
189
+		CLI::write(CLI::color("\tCleared the database.", 'green'));
190
+
191
+		if ($this->migration->latest($type) === false) {
192
+			return CLI::error("\tERROR: " . $this->migration->error_string());
193
+		}
194
+
195
+		CLI::write("\tRe-installed the database to the latest migration.", 'green');
196
+	}
197
+
198
+	//--------------------------------------------------------------------
199
+
200
+	/**
201
+	 * Creates a new migration file ready to be used.
202
+	 *
203
+	 * @param $name
204
+	 */
205
+	public function newMigration($name = null, $type = 'app')
206
+	{
207
+		if (empty($name)) {
208
+			$name = CLI::prompt('Migration name? ');
209
+
210
+			if (empty($name)) {
211
+				return CLI::error("\tYou must provide a migration name.", 'red');
212
+			}
213
+		}
214
+
215
+		$this->load->library('migration');
216
+
217
+		$path = $this->migration->determine_migration_path($type);
218
+
219
+		// Does the alias path exist in our config?
220
+		if (! $path) {
221
+			return CLI::error("\tThe migration path for '{$type}' does not exist.'");
222
+		}
223
+
224
+		// Does the path really exist?
225
+		if (! is_dir($path)) {
226
+			return CLI::error("\tThe path for '{$type}' is not a directory.");
227
+		}
228
+
229
+		// Is the folder writeable?
230
+		if (! is_writeable($path)) {
231
+			return CLI::error("\tThe folder for '{$type}' migrations is not writeable.");
232
+		}
233
+
234
+		$file = $this->migration->make_name($name);
235
+
236
+		$path = rtrim($path, '/') .'/'. $file;
237
+
238
+		$contents = <<<EOT
239 239
 <?php
240 240
 
241 241
 /**
@@ -262,36 +262,36 @@  discard block
 block discarded – undo
262 262
 
263 263
 }
264 264
 EOT;
265
-        $contents = str_replace('{name}', $name, $contents);
266
-        $contents = str_replace('{date}', date('Y-m-d H:i:s a'), $contents);
267
-        $contents = str_replace('{clean_name}', ucwords(str_replace('_', ' ', $name)), $contents);
265
+		$contents = str_replace('{name}', $name, $contents);
266
+		$contents = str_replace('{date}', date('Y-m-d H:i:s a'), $contents);
267
+		$contents = str_replace('{clean_name}', ucwords(str_replace('_', ' ', $name)), $contents);
268 268
 
269
-        $this->load->helper('file');
269
+		$this->load->helper('file');
270 270
 
271
-        if (write_file($path, $contents)) {
272
-            return CLI::write("\tNew migration created: " . CLI::color($file, 'yellow'), 'green');
273
-        }
271
+		if (write_file($path, $contents)) {
272
+			return CLI::write("\tNew migration created: " . CLI::color($file, 'yellow'), 'green');
273
+		}
274 274
 
275
-        return CLI::error("\tUnkown error trying to create migration: {$file}", 'red');
276
-    }
275
+		return CLI::error("\tUnkown error trying to create migration: {$file}", 'red');
276
+	}
277 277
 
278
-    //--------------------------------------------------------------------
278
+	//--------------------------------------------------------------------
279 279
 
280
-    //--------------------------------------------------------------------
281
-    // Seeding Methods
282
-    //--------------------------------------------------------------------
280
+	//--------------------------------------------------------------------
281
+	// Seeding Methods
282
+	//--------------------------------------------------------------------
283 283
 
284
-    /**
285
-     * Installs any database seeds stored in database/seeds. Seeds just need to
286
-     * extend the Seeder class and have a method named run.
287
-     */
288
-    public function seed($name = null)
289
-    {
290
-        $this->load->library('seeder');
284
+	/**
285
+	 * Installs any database seeds stored in database/seeds. Seeds just need to
286
+	 * extend the Seeder class and have a method named run.
287
+	 */
288
+	public function seed($name = null)
289
+	{
290
+		$this->load->library('seeder');
291 291
 
292
-        $this->seeder->call($name);
293
-    }
292
+		$this->seeder->call($name);
293
+	}
294 294
 
295
-    //--------------------------------------------------------------------
295
+	//--------------------------------------------------------------------
296 296
 
297 297
 }
Please login to merge, or discard this patch.
myth/CIModules/docs/config/docs.php 1 patch
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -57,8 +57,8 @@
 block discarded – undo
57 57
 | if realpath cannot find/read the folder.
58 58
 */
59 59
 $config['docs.folders'] = [
60
-    'application'   => APPPATH .'docs',
61
-    'developer'     => APPPATH .'../myth/_docs_src'
60
+	'application'   => APPPATH .'docs',
61
+	'developer'     => APPPATH .'../myth/_docs_src'
62 62
 ];
63 63
 
64 64
 /*
Please login to merge, or discard this patch.
myth/CIModules/forge/controllers/Forge.php 1 patch
Indentation   +168 added lines, -168 removed lines patch added patch discarded remove patch
@@ -34,133 +34,133 @@  discard block
 block discarded – undo
34 34
 
35 35
 class Forge extends \Myth\Controllers\CLIController {
36 36
 
37
-    public function __construct()
38
-    {
39
-        parent::__construct();
37
+	public function __construct()
38
+	{
39
+		parent::__construct();
40 40
 
41
-        $this->load->config('forge');
42
-    }
41
+		$this->load->config('forge');
42
+	}
43 43
 
44
-    //--------------------------------------------------------------------
44
+	//--------------------------------------------------------------------
45 45
 
46 46
 
47
-    public function _remap($method, $params)
48
-    {
49
-        if (method_exists($this, $method))
50
-        {
51
-            call_user_func_array( [$this, $method], $params);
52
-        }
53
-        else
54
-        {
55
-	        $params = array_merge([CLI::cli_string()], $params);
47
+	public function _remap($method, $params)
48
+	{
49
+		if (method_exists($this, $method))
50
+		{
51
+			call_user_func_array( [$this, $method], $params);
52
+		}
53
+		else
54
+		{
55
+			$params = array_merge([CLI::cli_string()], $params);
56 56
 
57
-            call_user_func_array( [$this, 'run'], $params);
58
-        }
59
-    }
57
+			call_user_func_array( [$this, 'run'], $params);
58
+		}
59
+	}
60 60
     
61
-    //--------------------------------------------------------------------
62
-
63
-    /**
64
-     * Overrides to implement dynamic description building based on
65
-     * scanning the collections and grabbing the information from
66
-     * 'forge.php' files.
67
-     */
68
-    public function index()
69
-    {
70
-        $collections = config_item('forge.collections');
71
-
72
-        if (! is_array($collections) || ! count($collections) )
73
-        {
74
-            return CLI::error('No generator collections found.');
75
-        }
76
-
77
-        // We loop through each collection scanning
78
-        // for any generator folders that have a
79
-        // 'forge.php' file. For each one found
80
-        // we build out another section in our help commands
81
-        foreach ($collections as $alias => $path)
82
-        {
83
-            $path = rtrim($path, '/ ') .'/';
84
-            $folders = scandir($path);
85
-
86
-            $_descriptions = [];
87
-
88
-            foreach ($folders as $dir)
89
-            {
90
-                if ($dir == '.' || $dir == '..' || ! is_file($path . $dir .'/forge.php'))
91
-                {
92
-                    continue;
93
-                }
94
-
95
-                include $path . $dir .'/forge.php';
96
-
97
-                // Don't have valid arrays to work with? Move along...
98
-                if (! isset($descriptions))
99
-                {
100
-                    log_message('debug', '[Forge] Invalid forge.php file at: '. $path . $dir .'/forge.php');
101
-                    continue;
102
-                }
103
-
104
-                $_descriptions = array_merge($descriptions, $_descriptions);
105
-            }
106
-
107
-	        ksort($_descriptions);
108
-
109
-            CLI::new_line();
110
-            CLI::write(ucwords( str_replace('_', ' ', $alias)) .' Collection');
111
-            $this->sayDescriptions($_descriptions);
112
-        }
113
-    }
114
-
115
-    //--------------------------------------------------------------------
116
-
117
-    /**
118
-     * The primary method that calls the correct generator and
119
-     * makes it run.
120
-     */
121
-    public function run($command)
122
-    {
123
-	    $quiet = false;
124
-
125
-	    $segments = explode(" ", $command);
126
-
127
-	    // Get rid of the 'forge' command
128
-	    if ($segments[0] == 'forge') {
129
-		    array_shift( $segments );
130
-	    }
131
-
132
-	    $command = trim(str_ireplace("forge", '', array_shift($segments)));
61
+	//--------------------------------------------------------------------
62
+
63
+	/**
64
+	 * Overrides to implement dynamic description building based on
65
+	 * scanning the collections and grabbing the information from
66
+	 * 'forge.php' files.
67
+	 */
68
+	public function index()
69
+	{
70
+		$collections = config_item('forge.collections');
71
+
72
+		if (! is_array($collections) || ! count($collections) )
73
+		{
74
+			return CLI::error('No generator collections found.');
75
+		}
76
+
77
+		// We loop through each collection scanning
78
+		// for any generator folders that have a
79
+		// 'forge.php' file. For each one found
80
+		// we build out another section in our help commands
81
+		foreach ($collections as $alias => $path)
82
+		{
83
+			$path = rtrim($path, '/ ') .'/';
84
+			$folders = scandir($path);
85
+
86
+			$_descriptions = [];
87
+
88
+			foreach ($folders as $dir)
89
+			{
90
+				if ($dir == '.' || $dir == '..' || ! is_file($path . $dir .'/forge.php'))
91
+				{
92
+					continue;
93
+				}
94
+
95
+				include $path . $dir .'/forge.php';
96
+
97
+				// Don't have valid arrays to work with? Move along...
98
+				if (! isset($descriptions))
99
+				{
100
+					log_message('debug', '[Forge] Invalid forge.php file at: '. $path . $dir .'/forge.php');
101
+					continue;
102
+				}
103
+
104
+				$_descriptions = array_merge($descriptions, $_descriptions);
105
+			}
106
+
107
+			ksort($_descriptions);
108
+
109
+			CLI::new_line();
110
+			CLI::write(ucwords( str_replace('_', ' ', $alias)) .' Collection');
111
+			$this->sayDescriptions($_descriptions);
112
+		}
113
+	}
114
+
115
+	//--------------------------------------------------------------------
116
+
117
+	/**
118
+	 * The primary method that calls the correct generator and
119
+	 * makes it run.
120
+	 */
121
+	public function run($command)
122
+	{
123
+		$quiet = false;
124
+
125
+		$segments = explode(" ", $command);
126
+
127
+		// Get rid of the 'forge' command
128
+		if ($segments[0] == 'forge') {
129
+			array_shift( $segments );
130
+		}
131
+
132
+		$command = trim(str_ireplace("forge", '', array_shift($segments)));
133 133
 
134 134
 		$dir = $this->locateGenerator($command);
135 135
 
136 136
 		$class_name = ucfirst($command) .'Generator';
137 137
 
138
-	    if (! file_exists($dir . $class_name .'.php'))
139
-	    {
140
-		    return CLI::error("Generator file not found for: {$class_name}");
141
-	    }
138
+		if (! file_exists($dir . $class_name .'.php'))
139
+		{
140
+			return CLI::error("Generator file not found for: {$class_name}");
141
+		}
142 142
 
143 143
 		require_once $dir . $class_name .'.php';
144 144
 
145
-	    if (! class_exists($class_name, false))
146
-	    {
147
-		    return CLI::error("No class `{$class_name}` found in generator file.");
148
-	    }
145
+		if (! class_exists($class_name, false))
146
+		{
147
+			return CLI::error("No class `{$class_name}` found in generator file.");
148
+		}
149 149
 
150
-	    // Should we run the process quietly?
151
-	    if ( (CLI::option('q') || CLI::option('quiet')))
152
-	    {
153
-		    $quiet = true;
154
-	    }
150
+		// Should we run the process quietly?
151
+		if ( (CLI::option('q') || CLI::option('quiet')))
152
+		{
153
+			$quiet = true;
154
+		}
155 155
 
156
-	    CLI::write('Invoked '. CLI::color($class_name, 'yellow'));
156
+		CLI::write('Invoked '. CLI::color($class_name, 'yellow'));
157 157
 
158 158
 		$class = new $class_name();
159 159
 
160
-	    $class->run( $segments, $quiet );
161
-    }
160
+		$class->run( $segments, $quiet );
161
+	}
162 162
 
163
-    //--------------------------------------------------------------------
163
+	//--------------------------------------------------------------------
164 164
 
165 165
 	/**
166 166
 	 * Displays the readme file for a generator if it exists.
@@ -205,67 +205,67 @@  discard block
 block discarded – undo
205 205
 	//--------------------------------------------------------------------
206 206
 
207 207
 
208
-    /**
209
-     * Overrides CLIController's version to support searching our
210
-     * collections for the help description.
211
-     *
212
-     * @param null $method
213
-     */
214
-    public function longDescribeMethod($method=null)
215
-    {
216
-	    $collections = config_item('forge.collections');
217
-
218
-	    if (! is_array($collections) || ! count($collections) )
219
-	    {
220
-		    return CLI::error('No generator collections found.');
221
-	    }
222
-
223
-	    // We loop through each collection scanning
224
-	    // for any generator folders that have a
225
-	    // 'forge.php' file. For each one found
226
-	    // we build out another section in our help commands
227
-	    foreach ($collections as $alias => $path)
228
-	    {
229
-
230
-		    $path = rtrim($path, '/ ') .'/';
231
-		    $folders = scandir($path);
232
-
233
-		    if (! $i = array_search(ucfirst($method), $folders))
234
-		    {
235
-			    continue;
236
-		    }
237
-
238
-		    $dir = $path . $folders[$i] .'/';
239
-
240
-		    if (! is_file($dir .'/forge.php'))
241
-		    {
242
-			    CLI::error("The {$method} command does not have any cli help available.");
243
-		    }
244
-
245
-		    include $dir .'/forge.php';
246
-
247
-		    // Don't have valid arrays to work with? Move along...
248
-		    if (! isset($long_description))
249
-		    {
250
-			    log_message('debug', '[Forge] Invalid forge.php file at: '. $dir .'/forge.php');
251
-			    continue;
252
-		    }
253
-
254
-		    if (empty($long_description))
255
-		    {
256
-			    return CLI::error("The {$method} command does not have an cli help available.");
257
-		    }
258
-
259
-		    CLI::new_line();
260
-		    CLI::write( CLI::color(ucfirst($method) .' Help', 'yellow') );
261
-		    return CLI::write( CLI::wrap($long_description, CLI::getWidth()) );
262
-	    }
263
-
264
-	    // Still here?
265
-	    CLI::error("No help found for command: {$method}");
266
-    }
267
-
268
-    //--------------------------------------------------------------------
208
+	/**
209
+	 * Overrides CLIController's version to support searching our
210
+	 * collections for the help description.
211
+	 *
212
+	 * @param null $method
213
+	 */
214
+	public function longDescribeMethod($method=null)
215
+	{
216
+		$collections = config_item('forge.collections');
217
+
218
+		if (! is_array($collections) || ! count($collections) )
219
+		{
220
+			return CLI::error('No generator collections found.');
221
+		}
222
+
223
+		// We loop through each collection scanning
224
+		// for any generator folders that have a
225
+		// 'forge.php' file. For each one found
226
+		// we build out another section in our help commands
227
+		foreach ($collections as $alias => $path)
228
+		{
229
+
230
+			$path = rtrim($path, '/ ') .'/';
231
+			$folders = scandir($path);
232
+
233
+			if (! $i = array_search(ucfirst($method), $folders))
234
+			{
235
+				continue;
236
+			}
237
+
238
+			$dir = $path . $folders[$i] .'/';
239
+
240
+			if (! is_file($dir .'/forge.php'))
241
+			{
242
+				CLI::error("The {$method} command does not have any cli help available.");
243
+			}
244
+
245
+			include $dir .'/forge.php';
246
+
247
+			// Don't have valid arrays to work with? Move along...
248
+			if (! isset($long_description))
249
+			{
250
+				log_message('debug', '[Forge] Invalid forge.php file at: '. $dir .'/forge.php');
251
+				continue;
252
+			}
253
+
254
+			if (empty($long_description))
255
+			{
256
+				return CLI::error("The {$method} command does not have an cli help available.");
257
+			}
258
+
259
+			CLI::new_line();
260
+			CLI::write( CLI::color(ucfirst($method) .' Help', 'yellow') );
261
+			return CLI::write( CLI::wrap($long_description, CLI::getWidth()) );
262
+		}
263
+
264
+		// Still here?
265
+		CLI::error("No help found for command: {$method}");
266
+	}
267
+
268
+	//--------------------------------------------------------------------
269 269
 
270 270
 	/**
271 271
 	 * Scans through the collections for the folder for this generator.
Please login to merge, or discard this patch.
myth/CLI.php 1 patch
Indentation   +511 added lines, -511 removed lines patch added patch discarded remove patch
@@ -1,14 +1,14 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 /**
3
- * Part of the Fuel framework.
4
- *
5
- * @package    Fuel
6
- * @version    1.7
7
- * @author     Fuel Development Team
8
- * @license    MIT License
9
- * @copyright  2010 - 2013 Fuel Development Team
10
- * @link       http://fuelphp.com
11
- */
3
+	 * Part of the Fuel framework.
4
+	 *
5
+	 * @package    Fuel
6
+	 * @version    1.7
7
+	 * @author     Fuel Development Team
8
+	 * @license    MIT License
9
+	 * @copyright  2010 - 2013 Fuel Development Team
10
+	 * @link       http://fuelphp.com
11
+	 */
12 12
 
13 13
 /**
14 14
  * Modified to work with CodeIgniter by Lonnie Ezell.
@@ -30,506 +30,506 @@  discard block
 block discarded – undo
30 30
  */
31 31
 class CLI {
32 32
 
33
-    public static $readline_support = false;
33
+	public static $readline_support = false;
34 34
 
35
-    public static $wait_msg = 'Press any key to continue...';
35
+	public static $wait_msg = 'Press any key to continue...';
36 36
 
37
-    public static $segments = [];
37
+	public static $segments = [];
38 38
 
39 39
 	protected static $options = [];
40 40
 
41 41
 	protected static $initialized = false;
42 42
 
43
-    // Used by progress bar
44
-    protected static $inProgress = false;
45
-
46
-    protected static $foreground_colors = array(
47
-        'black'			=> '0;30',
48
-        'dark_gray'		=> '1;30',
49
-        'blue'			=> '0;34',
50
-        'dark_blue'		=> '1;34',
51
-        'light_blue'	=> '1;34',
52
-        'green'			=> '0;32',
53
-        'light_green'	=> '1;32',
54
-        'cyan'			=> '0;36',
55
-        'light_cyan'	=> '1;36',
56
-        'red'			=> '0;31',
57
-        'light_red'		=> '1;31',
58
-        'purple'		=> '0;35',
59
-        'light_purple'	=> '1;35',
60
-        'light_yellow'	=> '0;33',
61
-        'yellow'		=> '1;33',
62
-        'light_gray'	=> '0;37',
63
-        'white'			=> '1;37',
64
-    );
65
-
66
-    protected static $background_colors = array(
67
-        'black'			=> '40',
68
-        'red'			=> '41',
69
-        'green'			=> '42',
70
-        'yellow'		=> '43',
71
-        'blue'			=> '44',
72
-        'magenta'		=> '45',
73
-        'cyan'			=> '46',
74
-        'light_gray'	=> '47',
75
-    );
76
-
77
-    //--------------------------------------------------------------------
78
-
79
-    /**
80
-     * Static constructor.	Parses all the CLI params.
81
-     */
82
-    public static function _init()
83
-    {
84
-	    if (static::$initialized === true)
85
-	    {
86
-		    return;
87
-	    }
88
-
89
-        if ( ! (PHP_SAPI === 'cli' || defined('STDIN')) )
90
-        {
91
-            throw new \Exception('Cli class cannot be used outside of the command line.');
92
-        }
93
-
94
-	    self::parseCommand();
95
-
96
-        // Readline is an extension for PHP that makes interactive with PHP much more bash-like
97
-        // http://www.php.net/manual/en/readline.installation.php
98
-        static::$readline_support = extension_loaded('readline');
99
-
100
-	    static::$initialized = true;
101
-    }
102
-
103
-    //--------------------------------------------------------------------
104
-
105
-    /**
106
-     * Grabs an individual
107
-     *
108
-     * @param $index
109
-     * @return null
110
-     */
111
-    public static function segment($index)
112
-    {
113
-        if (! isset(static::$segments[$index - 1]))
114
-        {
115
-            return null;
116
-        }
117
-
118
-        return static::$segments[$index - 1];
119
-    }
120
-
121
-    //--------------------------------------------------------------------
122
-
123
-    /**
124
-     * Returns the command string portion of the arguments. Used
125
-     * by the 'sprint' CLI script to grab the portion of the arguments
126
-     * that is used to call the CodeIgniter application.
127
-     *
128
-     * @return string
129
-     */
130
-    public static function cli_string()
131
-    {
132
-        return implode(' ', static::$segments);
133
-    }
134
-
135
-    //--------------------------------------------------------------------
136
-
137
-
138
-
139
-    /**
140
-     * Get input from the shell, using readline or the standard STDIN
141
-     *
142
-     * Named options must be in the following formats:
143
-     * php index.php user -v --v -name=John --name=John
144
-     *
145
-     * @param	string|int	$name	the name of the option (int if unnamed)
146
-     * @return	string
147
-     */
148
-    public static function input($prefix = '')
149
-    {
150
-        if (static::$readline_support)
151
-        {
152
-            return readline($prefix);
153
-        }
154
-
155
-        echo $prefix;
156
-        return fgets(STDIN);
157
-    }
158
-
159
-    //--------------------------------------------------------------------
160
-
161
-    /**
162
-     * Asks the user for input.  This can have either 1 or 2 arguments.
163
-     *
164
-     * Usage:
165
-     *
166
-     * // Waits for any key press
167
-     * CLI::prompt();
168
-     *
169
-     * // Takes any input
170
-     * $color = CLI::prompt('What is your favorite color?');
171
-     *
172
-     * // Takes any input, but offers default
173
-     * $color = CLI::prompt('What is your favourite color?', 'white');
174
-     *
175
-     * // Will only accept the options in the array
176
-     * $ready = CLI::prompt('Are you ready?', array('y','n'));
177
-     *
178
-     * @return	string	the user input
179
-     */
180
-    public static function prompt()
181
-    {
182
-        $args = func_get_args();
183
-
184
-        $options = array();
185
-        $output = '';
186
-        $default = null;
187
-
188
-        // How many we got
189
-        $arg_count = count($args);
190
-
191
-        // Is the last argument a boolean? True means required
192
-        $required = end($args) === true;
193
-
194
-        // Reduce the argument count if required was passed, we don't care about that anymore
195
-        $required === true and --$arg_count;
196
-
197
-        // This method can take a few crazy combinations of arguments, so lets work it out
198
-        switch ($arg_count)
199
-        {
200
-            case 2:
201
-
202
-                // E.g: $ready = CLI::prompt('Are you ready?', array('y','n'));
203
-                if (is_array($args[1]))
204
-                {
205
-                    list($output, $options)=$args;
206
-                }
207
-
208
-                // E.g: $color = CLI::prompt('What is your favourite color?', 'white');
209
-                elseif (is_string($args[1]))
210
-                {
211
-                    list($output, $default)=$args;
212
-                }
213
-
214
-                break;
215
-
216
-            case 1:
217
-
218
-                // No question (probably been asked already) so just show options
219
-                // E.g: $ready = CLI::prompt(array('y','n'));
220
-                if (is_array($args[0]))
221
-                {
222
-                    $options = $args[0];
223
-                }
224
-
225
-                // Question without options
226
-                // E.g: $ready = CLI::prompt('What did you do today?');
227
-                elseif (is_string($args[0]))
228
-                {
229
-                    $output = $args[0];
230
-                }
231
-
232
-                break;
233
-        }
234
-
235
-        // If a question has been asked with the read
236
-        if ($output !== '')
237
-        {
238
-            $extra_output = '';
239
-
240
-            if ($default !== null)
241
-            {
242
-                $extra_output = ' [ Default: "'.$default.'" ]';
243
-            }
244
-
245
-            elseif ($options !== array())
246
-            {
247
-                $extra_output = ' [ '.implode(', ', $options).' ]';
248
-            }
249
-
250
-            fwrite(STDOUT, $output.$extra_output.': ');
251
-        }
252
-
253
-        // Read the input from keyboard.
254
-        $input = trim(static::input()) ?: $default;
255
-
256
-        // No input provided and we require one (default will stop this being called)
257
-        if (empty($input) and $required === true)
258
-        {
259
-            static::write('This is required.');
260
-            static::new_line();
261
-
262
-            $input = forward_static_call_array(array(__CLASS__, 'prompt'), $args);
263
-        }
264
-
265
-        // If options are provided and the choice is not in the array, tell them to try again
266
-        if ( ! empty($options) and ! in_array($input, $options))
267
-        {
268
-            static::write('This is not a valid option. Please try again.');
269
-            static::new_line();
270
-
271
-            $input = forward_static_call_array(array(__CLASS__, 'prompt'), $args);
272
-        }
273
-
274
-        return $input;
275
-    }
276
-
277
-    //--------------------------------------------------------------------
278
-
279
-    /**
280
-     * Outputs a string to the cli.	 If you send an array it will implode them
281
-     * with a line break.
282
-     *
283
-     * @param	string|array	$text	the text to output, or array of lines
284
-     */
285
-    public static function write($text = '', $foreground = null, $background = null)
286
-    {
287
-        if (is_array($text))
288
-        {
289
-            $text = implode(PHP_EOL, $text);
290
-        }
291
-
292
-        if ($foreground or $background)
293
-        {
294
-            $text = static::color($text, $foreground, $background);
295
-        }
296
-
297
-        fwrite(STDOUT, $text.PHP_EOL);
298
-    }
299
-
300
-    //--------------------------------------------------------------------
301
-
302
-    /**
303
-     * Outputs an error to the CLI using STDERR instead of STDOUT
304
-     *
305
-     * @param	string|array	$text	the text to output, or array of errors
306
-     */
307
-    public static function error($text = '', $foreground = 'light_red', $background = null)
308
-    {
309
-        if (is_array($text))
310
-        {
311
-            $text = implode(PHP_EOL, $text);
312
-        }
313
-
314
-        if ($foreground OR $background)
315
-        {
316
-            $text = static::color($text, $foreground, $background);
317
-        }
318
-
319
-        fwrite(STDERR, $text.PHP_EOL);
320
-    }
321
-
322
-    //--------------------------------------------------------------------
323
-
324
-    /**
325
-     * Beeps a certain number of times.
326
-     *
327
-     * @param	int $num	the number of times to beep
328
-     */
329
-    public static function beep($num = 1)
330
-    {
331
-        echo str_repeat("\x07", $num);
332
-    }
333
-
334
-    //--------------------------------------------------------------------
335
-
336
-    /**
337
-     * Waits a certain number of seconds, optionally showing a wait message and
338
-     * waiting for a key press.
339
-     *
340
-     * @param	int		$seconds	number of seconds
341
-     * @param	bool	$countdown	show a countdown or not
342
-     */
343
-    public static function wait($seconds = 0, $countdown = false)
344
-    {
345
-        if ($countdown === true)
346
-        {
347
-            $time = $seconds;
348
-
349
-            while ($time > 0)
350
-            {
351
-                fwrite(STDOUT, $time.'... ');
352
-                sleep(1);
353
-                $time--;
354
-            }
355
-            static::write();
356
-        }
357
-
358
-        else
359
-        {
360
-            if ($seconds > 0)
361
-            {
362
-                sleep($seconds);
363
-            }
364
-            else
365
-            {
366
-                static::write(static::$wait_msg);
367
-                static::input();
368
-            }
369
-        }
370
-    }
371
-
372
-
373
-    //--------------------------------------------------------------------
374
-
375
-    /**
376
-     * if operating system === windows
377
-     */
378
-    public static function is_windows()
379
-    {
380
-        return 'win' === strtolower(substr(php_uname("s"), 0, 3));
381
-    }
382
-
383
-    //--------------------------------------------------------------------
384
-
385
-    /**
386
-     * Enter a number of empty lines
387
-     *
388
-     * @param	integer	Number of lines to output
389
-     * @return	void
390
-     */
391
-    public static function new_line($num = 1)
392
-    {
393
-        // Do it once or more, write with empty string gives us a new line
394
-        for($i = 0; $i < $num; $i++)
395
-        {
396
-            static::write();
397
-        }
398
-    }
399
-
400
-    //--------------------------------------------------------------------
401
-
402
-    /**
403
-     * Clears the screen of output
404
-     *
405
-     * @return	void
406
-     */
407
-    public static function clear_screen()
408
-    {
409
-        static::is_windows()
410
-
411
-            // Windows is a bit crap at this, but their terminal is tiny so shove this in
412
-            ? static::new_line(40)
413
-
414
-            // Anything with a flair of Unix will handle these magic characters
415
-            : fwrite(STDOUT, chr(27)."[H".chr(27)."[2J");
416
-    }
417
-
418
-    //--------------------------------------------------------------------
419
-
420
-    /**
421
-     * Returns the given text with the correct color codes for a foreground and
422
-     * optionally a background color.
423
-     *
424
-     * @param	string	$text		the text to color
425
-     * @param	string	$foreground the foreground color
426
-     * @param	string	$background the background color
427
-     * @param	string	$format		other formatting to apply. Currently only 'underline' is understood
428
-     * @return	string	the color coded string
429
-     */
430
-    public static function color($text, $foreground, $background = null, $format=null)
431
-    {
432
-        if (static::is_windows() and ! isset($_SERVER['ANSICON']))
433
-        {
434
-            return $text;
435
-        }
436
-
437
-        if ( ! array_key_exists($foreground, static::$foreground_colors))
438
-        {
439
-            throw new \RuntimeException('Invalid CLI foreground color: '.$foreground);
440
-        }
441
-
442
-        if ( $background !== null and ! array_key_exists($background, static::$background_colors))
443
-        {
444
-            throw new \RuntimeException('Invalid CLI background color: '.$background);
445
-        }
446
-
447
-        $string = "\033[".static::$foreground_colors[$foreground]."m";
448
-
449
-        if ($background !== null)
450
-        {
451
-            $string .= "\033[".static::$background_colors[$background]."m";
452
-        }
453
-
454
-        if ($format === 'underline')
455
-        {
456
-            $string .= "\033[4m";
457
-        }
458
-
459
-        $string .= $text."\033[0m";
460
-
461
-        return $string;
462
-    }
463
-
464
-    //--------------------------------------------------------------------
465
-
466
-    public static function getWidth($default=80)
467
-    {
468
-        if (static::is_windows())
469
-        {
470
-            return $default;
471
-        }
472
-
473
-        return (int)shell_exec('tput cols');
474
-    }
43
+	// Used by progress bar
44
+	protected static $inProgress = false;
45
+
46
+	protected static $foreground_colors = array(
47
+		'black'			=> '0;30',
48
+		'dark_gray'		=> '1;30',
49
+		'blue'			=> '0;34',
50
+		'dark_blue'		=> '1;34',
51
+		'light_blue'	=> '1;34',
52
+		'green'			=> '0;32',
53
+		'light_green'	=> '1;32',
54
+		'cyan'			=> '0;36',
55
+		'light_cyan'	=> '1;36',
56
+		'red'			=> '0;31',
57
+		'light_red'		=> '1;31',
58
+		'purple'		=> '0;35',
59
+		'light_purple'	=> '1;35',
60
+		'light_yellow'	=> '0;33',
61
+		'yellow'		=> '1;33',
62
+		'light_gray'	=> '0;37',
63
+		'white'			=> '1;37',
64
+	);
65
+
66
+	protected static $background_colors = array(
67
+		'black'			=> '40',
68
+		'red'			=> '41',
69
+		'green'			=> '42',
70
+		'yellow'		=> '43',
71
+		'blue'			=> '44',
72
+		'magenta'		=> '45',
73
+		'cyan'			=> '46',
74
+		'light_gray'	=> '47',
75
+	);
76
+
77
+	//--------------------------------------------------------------------
78
+
79
+	/**
80
+	 * Static constructor.	Parses all the CLI params.
81
+	 */
82
+	public static function _init()
83
+	{
84
+		if (static::$initialized === true)
85
+		{
86
+			return;
87
+		}
88
+
89
+		if ( ! (PHP_SAPI === 'cli' || defined('STDIN')) )
90
+		{
91
+			throw new \Exception('Cli class cannot be used outside of the command line.');
92
+		}
93
+
94
+		self::parseCommand();
95
+
96
+		// Readline is an extension for PHP that makes interactive with PHP much more bash-like
97
+		// http://www.php.net/manual/en/readline.installation.php
98
+		static::$readline_support = extension_loaded('readline');
99
+
100
+		static::$initialized = true;
101
+	}
102
+
103
+	//--------------------------------------------------------------------
104
+
105
+	/**
106
+	 * Grabs an individual
107
+	 *
108
+	 * @param $index
109
+	 * @return null
110
+	 */
111
+	public static function segment($index)
112
+	{
113
+		if (! isset(static::$segments[$index - 1]))
114
+		{
115
+			return null;
116
+		}
117
+
118
+		return static::$segments[$index - 1];
119
+	}
120
+
121
+	//--------------------------------------------------------------------
122
+
123
+	/**
124
+	 * Returns the command string portion of the arguments. Used
125
+	 * by the 'sprint' CLI script to grab the portion of the arguments
126
+	 * that is used to call the CodeIgniter application.
127
+	 *
128
+	 * @return string
129
+	 */
130
+	public static function cli_string()
131
+	{
132
+		return implode(' ', static::$segments);
133
+	}
134
+
135
+	//--------------------------------------------------------------------
136
+
137
+
138
+
139
+	/**
140
+	 * Get input from the shell, using readline or the standard STDIN
141
+	 *
142
+	 * Named options must be in the following formats:
143
+	 * php index.php user -v --v -name=John --name=John
144
+	 *
145
+	 * @param	string|int	$name	the name of the option (int if unnamed)
146
+	 * @return	string
147
+	 */
148
+	public static function input($prefix = '')
149
+	{
150
+		if (static::$readline_support)
151
+		{
152
+			return readline($prefix);
153
+		}
154
+
155
+		echo $prefix;
156
+		return fgets(STDIN);
157
+	}
158
+
159
+	//--------------------------------------------------------------------
160
+
161
+	/**
162
+	 * Asks the user for input.  This can have either 1 or 2 arguments.
163
+	 *
164
+	 * Usage:
165
+	 *
166
+	 * // Waits for any key press
167
+	 * CLI::prompt();
168
+	 *
169
+	 * // Takes any input
170
+	 * $color = CLI::prompt('What is your favorite color?');
171
+	 *
172
+	 * // Takes any input, but offers default
173
+	 * $color = CLI::prompt('What is your favourite color?', 'white');
174
+	 *
175
+	 * // Will only accept the options in the array
176
+	 * $ready = CLI::prompt('Are you ready?', array('y','n'));
177
+	 *
178
+	 * @return	string	the user input
179
+	 */
180
+	public static function prompt()
181
+	{
182
+		$args = func_get_args();
183
+
184
+		$options = array();
185
+		$output = '';
186
+		$default = null;
187
+
188
+		// How many we got
189
+		$arg_count = count($args);
190
+
191
+		// Is the last argument a boolean? True means required
192
+		$required = end($args) === true;
193
+
194
+		// Reduce the argument count if required was passed, we don't care about that anymore
195
+		$required === true and --$arg_count;
196
+
197
+		// This method can take a few crazy combinations of arguments, so lets work it out
198
+		switch ($arg_count)
199
+		{
200
+			case 2:
201
+
202
+				// E.g: $ready = CLI::prompt('Are you ready?', array('y','n'));
203
+				if (is_array($args[1]))
204
+				{
205
+					list($output, $options)=$args;
206
+				}
207
+
208
+				// E.g: $color = CLI::prompt('What is your favourite color?', 'white');
209
+				elseif (is_string($args[1]))
210
+				{
211
+					list($output, $default)=$args;
212
+				}
213
+
214
+				break;
215
+
216
+			case 1:
217
+
218
+				// No question (probably been asked already) so just show options
219
+				// E.g: $ready = CLI::prompt(array('y','n'));
220
+				if (is_array($args[0]))
221
+				{
222
+					$options = $args[0];
223
+				}
224
+
225
+				// Question without options
226
+				// E.g: $ready = CLI::prompt('What did you do today?');
227
+				elseif (is_string($args[0]))
228
+				{
229
+					$output = $args[0];
230
+				}
231
+
232
+				break;
233
+		}
234
+
235
+		// If a question has been asked with the read
236
+		if ($output !== '')
237
+		{
238
+			$extra_output = '';
239
+
240
+			if ($default !== null)
241
+			{
242
+				$extra_output = ' [ Default: "'.$default.'" ]';
243
+			}
244
+
245
+			elseif ($options !== array())
246
+			{
247
+				$extra_output = ' [ '.implode(', ', $options).' ]';
248
+			}
249
+
250
+			fwrite(STDOUT, $output.$extra_output.': ');
251
+		}
252
+
253
+		// Read the input from keyboard.
254
+		$input = trim(static::input()) ?: $default;
255
+
256
+		// No input provided and we require one (default will stop this being called)
257
+		if (empty($input) and $required === true)
258
+		{
259
+			static::write('This is required.');
260
+			static::new_line();
261
+
262
+			$input = forward_static_call_array(array(__CLASS__, 'prompt'), $args);
263
+		}
264
+
265
+		// If options are provided and the choice is not in the array, tell them to try again
266
+		if ( ! empty($options) and ! in_array($input, $options))
267
+		{
268
+			static::write('This is not a valid option. Please try again.');
269
+			static::new_line();
270
+
271
+			$input = forward_static_call_array(array(__CLASS__, 'prompt'), $args);
272
+		}
273
+
274
+		return $input;
275
+	}
276
+
277
+	//--------------------------------------------------------------------
278
+
279
+	/**
280
+	 * Outputs a string to the cli.	 If you send an array it will implode them
281
+	 * with a line break.
282
+	 *
283
+	 * @param	string|array	$text	the text to output, or array of lines
284
+	 */
285
+	public static function write($text = '', $foreground = null, $background = null)
286
+	{
287
+		if (is_array($text))
288
+		{
289
+			$text = implode(PHP_EOL, $text);
290
+		}
291
+
292
+		if ($foreground or $background)
293
+		{
294
+			$text = static::color($text, $foreground, $background);
295
+		}
296
+
297
+		fwrite(STDOUT, $text.PHP_EOL);
298
+	}
299
+
300
+	//--------------------------------------------------------------------
301
+
302
+	/**
303
+	 * Outputs an error to the CLI using STDERR instead of STDOUT
304
+	 *
305
+	 * @param	string|array	$text	the text to output, or array of errors
306
+	 */
307
+	public static function error($text = '', $foreground = 'light_red', $background = null)
308
+	{
309
+		if (is_array($text))
310
+		{
311
+			$text = implode(PHP_EOL, $text);
312
+		}
313
+
314
+		if ($foreground OR $background)
315
+		{
316
+			$text = static::color($text, $foreground, $background);
317
+		}
318
+
319
+		fwrite(STDERR, $text.PHP_EOL);
320
+	}
321
+
322
+	//--------------------------------------------------------------------
323
+
324
+	/**
325
+	 * Beeps a certain number of times.
326
+	 *
327
+	 * @param	int $num	the number of times to beep
328
+	 */
329
+	public static function beep($num = 1)
330
+	{
331
+		echo str_repeat("\x07", $num);
332
+	}
333
+
334
+	//--------------------------------------------------------------------
335
+
336
+	/**
337
+	 * Waits a certain number of seconds, optionally showing a wait message and
338
+	 * waiting for a key press.
339
+	 *
340
+	 * @param	int		$seconds	number of seconds
341
+	 * @param	bool	$countdown	show a countdown or not
342
+	 */
343
+	public static function wait($seconds = 0, $countdown = false)
344
+	{
345
+		if ($countdown === true)
346
+		{
347
+			$time = $seconds;
348
+
349
+			while ($time > 0)
350
+			{
351
+				fwrite(STDOUT, $time.'... ');
352
+				sleep(1);
353
+				$time--;
354
+			}
355
+			static::write();
356
+		}
357
+
358
+		else
359
+		{
360
+			if ($seconds > 0)
361
+			{
362
+				sleep($seconds);
363
+			}
364
+			else
365
+			{
366
+				static::write(static::$wait_msg);
367
+				static::input();
368
+			}
369
+		}
370
+	}
371
+
372
+
373
+	//--------------------------------------------------------------------
374
+
375
+	/**
376
+	 * if operating system === windows
377
+	 */
378
+	public static function is_windows()
379
+	{
380
+		return 'win' === strtolower(substr(php_uname("s"), 0, 3));
381
+	}
382
+
383
+	//--------------------------------------------------------------------
384
+
385
+	/**
386
+	 * Enter a number of empty lines
387
+	 *
388
+	 * @param	integer	Number of lines to output
389
+	 * @return	void
390
+	 */
391
+	public static function new_line($num = 1)
392
+	{
393
+		// Do it once or more, write with empty string gives us a new line
394
+		for($i = 0; $i < $num; $i++)
395
+		{
396
+			static::write();
397
+		}
398
+	}
399
+
400
+	//--------------------------------------------------------------------
401
+
402
+	/**
403
+	 * Clears the screen of output
404
+	 *
405
+	 * @return	void
406
+	 */
407
+	public static function clear_screen()
408
+	{
409
+		static::is_windows()
410
+
411
+			// Windows is a bit crap at this, but their terminal is tiny so shove this in
412
+			? static::new_line(40)
413
+
414
+			// Anything with a flair of Unix will handle these magic characters
415
+			: fwrite(STDOUT, chr(27)."[H".chr(27)."[2J");
416
+	}
417
+
418
+	//--------------------------------------------------------------------
419
+
420
+	/**
421
+	 * Returns the given text with the correct color codes for a foreground and
422
+	 * optionally a background color.
423
+	 *
424
+	 * @param	string	$text		the text to color
425
+	 * @param	string	$foreground the foreground color
426
+	 * @param	string	$background the background color
427
+	 * @param	string	$format		other formatting to apply. Currently only 'underline' is understood
428
+	 * @return	string	the color coded string
429
+	 */
430
+	public static function color($text, $foreground, $background = null, $format=null)
431
+	{
432
+		if (static::is_windows() and ! isset($_SERVER['ANSICON']))
433
+		{
434
+			return $text;
435
+		}
436
+
437
+		if ( ! array_key_exists($foreground, static::$foreground_colors))
438
+		{
439
+			throw new \RuntimeException('Invalid CLI foreground color: '.$foreground);
440
+		}
441
+
442
+		if ( $background !== null and ! array_key_exists($background, static::$background_colors))
443
+		{
444
+			throw new \RuntimeException('Invalid CLI background color: '.$background);
445
+		}
446
+
447
+		$string = "\033[".static::$foreground_colors[$foreground]."m";
448
+
449
+		if ($background !== null)
450
+		{
451
+			$string .= "\033[".static::$background_colors[$background]."m";
452
+		}
453
+
454
+		if ($format === 'underline')
455
+		{
456
+			$string .= "\033[4m";
457
+		}
458
+
459
+		$string .= $text."\033[0m";
460
+
461
+		return $string;
462
+	}
463
+
464
+	//--------------------------------------------------------------------
465
+
466
+	public static function getWidth($default=80)
467
+	{
468
+		if (static::is_windows())
469
+		{
470
+			return $default;
471
+		}
472
+
473
+		return (int)shell_exec('tput cols');
474
+	}
475 475
     
476
-    //--------------------------------------------------------------------
477
-
478
-    public static function getHeight($default=32)
479
-    {
480
-        if (static::is_windows())
481
-        {
482
-            return $default;
483
-        }
484
-
485
-        return (int)shell_exec('tput lines');
486
-    }
487
-
488
-    //--------------------------------------------------------------------
489
-
490
-    /**
491
-     * Displays a progress bar on the CLI. You must call it repeatedly
492
-     * to update it. Set $thisStep = false to erase the progress bar.
493
-     *
494
-     * @param int $thisStep
495
-     * @param int $totalSteps
496
-     */
497
-    public static function showProgress($thisStep=1, $totalSteps=10)
498
-    {
499
-        // The first time through, save
500
-        // our position so the script knows where to go
501
-        // back to when writing the bar, and
502
-        // at the end of the script.
503
-        if (! static::$inProgress) {
504
-            fwrite(STDOUT, "\0337");
505
-            static::$inProgress = true;
506
-        }
507
-
508
-        // Restore position
509
-        fwrite(STDERR, "\0338");
510
-
511
-        if ($thisStep !== false) {
512
-            // Don't allow div by zero or negative numbers....
513
-            $thisStep = abs($thisStep);
514
-            $totalSteps = $totalSteps < 1 ? 1 : $totalSteps;
515
-
516
-            $percent = intval( ($thisStep / $totalSteps) * 100 );
517
-            $step = (int)round($percent / 10);
518
-
519
-            // Write the progress bar
520
-            fwrite(STDOUT, "[\033[32m" . str_repeat('#', $step) . str_repeat('.', 10 - $step) . "\033[0m]");
521
-            // Textual representation...
522
-            fwrite(STDOUT, " {$percent}% Complete" . PHP_EOL);
523
-            // Move up, undo the PHP_EOL
524
-            fwrite(STDOUT, "\033[1A");
525
-        }
526
-        else
527
-        {
528
-            fwrite(STDERR, "\007");
529
-        }
530
-    }
531
-
532
-    //--------------------------------------------------------------------
476
+	//--------------------------------------------------------------------
477
+
478
+	public static function getHeight($default=32)
479
+	{
480
+		if (static::is_windows())
481
+		{
482
+			return $default;
483
+		}
484
+
485
+		return (int)shell_exec('tput lines');
486
+	}
487
+
488
+	//--------------------------------------------------------------------
489
+
490
+	/**
491
+	 * Displays a progress bar on the CLI. You must call it repeatedly
492
+	 * to update it. Set $thisStep = false to erase the progress bar.
493
+	 *
494
+	 * @param int $thisStep
495
+	 * @param int $totalSteps
496
+	 */
497
+	public static function showProgress($thisStep=1, $totalSteps=10)
498
+	{
499
+		// The first time through, save
500
+		// our position so the script knows where to go
501
+		// back to when writing the bar, and
502
+		// at the end of the script.
503
+		if (! static::$inProgress) {
504
+			fwrite(STDOUT, "\0337");
505
+			static::$inProgress = true;
506
+		}
507
+
508
+		// Restore position
509
+		fwrite(STDERR, "\0338");
510
+
511
+		if ($thisStep !== false) {
512
+			// Don't allow div by zero or negative numbers....
513
+			$thisStep = abs($thisStep);
514
+			$totalSteps = $totalSteps < 1 ? 1 : $totalSteps;
515
+
516
+			$percent = intval( ($thisStep / $totalSteps) * 100 );
517
+			$step = (int)round($percent / 10);
518
+
519
+			// Write the progress bar
520
+			fwrite(STDOUT, "[\033[32m" . str_repeat('#', $step) . str_repeat('.', 10 - $step) . "\033[0m]");
521
+			// Textual representation...
522
+			fwrite(STDOUT, " {$percent}% Complete" . PHP_EOL);
523
+			// Move up, undo the PHP_EOL
524
+			fwrite(STDOUT, "\033[1A");
525
+		}
526
+		else
527
+		{
528
+			fwrite(STDERR, "\007");
529
+		}
530
+	}
531
+
532
+	//--------------------------------------------------------------------
533 533
 
534 534
 	/**
535 535
 	 * Checks to see if an option was passed to us on the CLI and returns
@@ -541,11 +541,11 @@  discard block
 block discarded – undo
541 541
 	 */
542 542
 	public static function option($name)
543 543
 	{
544
-	    if (array_key_exists($name, self::$options))
545
-	    {
546
-		    $val = self::$options[$name] === null ? true : self::$options[$name];
547
-		    return $val;
548
-	    }
544
+		if (array_key_exists($name, self::$options))
545
+		{
546
+			$val = self::$options[$name] === null ? true : self::$options[$name];
547
+			return $val;
548
+		}
549 549
 
550 550
 		return null;
551 551
 	}
@@ -559,7 +559,7 @@  discard block
 block discarded – undo
559 559
 	 */
560 560
 	public static function getOptions()
561 561
 	{
562
-	    return self::$options;
562
+		return self::$options;
563 563
 	}
564 564
 
565 565
 	//--------------------------------------------------------------------
@@ -615,10 +615,10 @@  discard block
 block discarded – undo
615 615
 			return '';
616 616
 		}
617 617
 
618
-        if ($max == 0)
619
-        {
620
-            $max = CLI::getWidth();
621
-        }
618
+		if ($max == 0)
619
+		{
620
+			$max = CLI::getWidth();
621
+		}
622 622
 
623 623
 		if (CLI::getWidth() < $max)
624 624
 		{
Please login to merge, or discard this patch.