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
Pull Request — develop (#155)
by
unknown
08:46
created
build/scripts/SubTreeSplit.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -12,12 +12,12 @@
 block discarded – undo
12 12
  */
13 13
 class SubTreeSplit extends BaseBuilder {
14 14
 
15
-    public function run()
16
-    {
15
+	public function run()
16
+	{
17 17
 
18
-    }
18
+	}
19 19
 
20
-    //--------------------------------------------------------------------
20
+	//--------------------------------------------------------------------
21 21
 
22 22
 
23 23
 }
24 24
\ No newline at end of file
Please login to merge, or discard this patch.
myth/Api/Auth/APIAuthentication.php 1 patch
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
 	 */
75 75
 	public function setRealm($realm)
76 76
 	{
77
-	    $this->realm = $realm;
77
+		$this->realm = $realm;
78 78
 		return $this;
79 79
 	}
80 80
 
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
 			'password'  => $password
117 117
 		];
118 118
 
119
-	    $user = $this->validate($data, true);
119
+		$user = $this->validate($data, true);
120 120
 
121 121
 		$this->user = $user;
122 122
 
@@ -272,7 +272,7 @@  discard block
 block discarded – undo
272 272
 	 */
273 273
 	public function checkIPBlacklist()
274 274
 	{
275
-	    $blacklist = explode(',', config_item('api.ip_blacklist'));
275
+		$blacklist = explode(',', config_item('api.ip_blacklist'));
276 276
 
277 277
 		array_walk($blacklist, function (&$item, $key) {
278 278
 			$item = trim($item);
Please login to merge, or discard this patch.
myth/Api/Server/ApiController.php 1 patch
Indentation   +39 added lines, -39 removed lines patch added patch discarded remove patch
@@ -141,8 +141,8 @@  discard block
 block discarded – undo
141 141
 	 * @var array
142 142
 	 */
143 143
 	protected $codes = array(
144
-        'created'                   => 201,
145
-        'deleted'                   => 200,
144
+		'created'                   => 201,
145
+		'deleted'                   => 200,
146 146
 		'invalid_request'           => 400,
147 147
 		'unsupported_response_type' => 400,
148 148
 		'invalid_scope'             => 400,
@@ -166,32 +166,32 @@  discard block
 block discarded – undo
166 166
 		'not_implemented'           => 501
167 167
 	);
168 168
 
169
-    /**
170
-     * Convert common browser-sent langauge
171
-     * strings to a folder name in the languages folder
172
-     * that we want to use.
173
-     *
174
-     * Primarily used for converting to english when
175
-     * viewing the API in a browser.
176
-     *
177
-     * @var array
178
-     */
179
-    protected $lang_map = [
180
-        'en-us' => 'english',
181
-        'en'    => 'english',
182
-        'eng'   => 'english',
183
-        'en-au' => 'english',
184
-        'en-nz' => 'english',
185
-        'en-za' => 'english',
186
-        'en-tt' => 'english',
187
-        'en-gb' => 'english',
188
-        'en-ca' => 'english',
189
-        'en-ie' => 'english',
190
-        'en-jm' => 'english',
191
-        'en-bz' => 'english',
192
-    ];
193
-
194
-    /**
169
+	/**
170
+	 * Convert common browser-sent langauge
171
+	 * strings to a folder name in the languages folder
172
+	 * that we want to use.
173
+	 *
174
+	 * Primarily used for converting to english when
175
+	 * viewing the API in a browser.
176
+	 *
177
+	 * @var array
178
+	 */
179
+	protected $lang_map = [
180
+		'en-us' => 'english',
181
+		'en'    => 'english',
182
+		'eng'   => 'english',
183
+		'en-au' => 'english',
184
+		'en-nz' => 'english',
185
+		'en-za' => 'english',
186
+		'en-tt' => 'english',
187
+		'en-gb' => 'english',
188
+		'en-ca' => 'english',
189
+		'en-ie' => 'english',
190
+		'en-jm' => 'english',
191
+		'en-bz' => 'english',
192
+	];
193
+
194
+	/**
195 195
 	 * If you wish to override the default authentication
196 196
 	 * library used for authentication, set this to the
197 197
 	 * fully namespaced class name.
@@ -544,7 +544,7 @@  discard block
 block discarded – undo
544 544
 	 */
545 545
 	public function grabVar($name)
546 546
 	{
547
-	    return array_key_exists($name, $this->vars) ? $this->vars[$name] : false;
547
+		return array_key_exists($name, $this->vars) ? $this->vars[$name] : false;
548 548
 	}
549 549
 
550 550
 	//--------------------------------------------------------------------
@@ -757,12 +757,12 @@  discard block
 block discarded – undo
757 757
 				// Remove weight and strip space
758 758
 				list($lang) = explode(';', $lang);
759 759
 
760
-                $lang = strtolower(trim($lang));
760
+				$lang = strtolower(trim($lang));
761 761
 
762
-                if (array_key_exists($lang, $this->lang_map))
763
-                {
764
-                    $lang = $this->lang_map[$lang];
765
-                }
762
+				if (array_key_exists($lang, $this->lang_map))
763
+				{
764
+					$lang = $this->lang_map[$lang];
765
+				}
766 766
 
767 767
 				$return_langs[] = $lang;
768 768
 			}
@@ -782,10 +782,10 @@  discard block
 block discarded – undo
782 782
 	 */
783 783
 	public function detectFields()
784 784
 	{
785
-	    if (! array_key_exists('fields', $_GET))
786
-	    {
787
-		    return;
788
-	    }
785
+		if (! array_key_exists('fields', $_GET))
786
+		{
787
+			return;
788
+		}
789 789
 
790 790
 		$fields = explode(',', $_GET['fields']);
791 791
 
@@ -814,7 +814,7 @@  discard block
 block discarded – undo
814 814
 			return;
815 815
 		}
816 816
 
817
-	    $model = new LogModel();
817
+		$model = new LogModel();
818 818
 
819 819
 		$data = [
820 820
 			'duration' => microtime(true) - $this->start_time,
Please login to merge, or discard this patch.
myth/Auth/AuthTrait.php 1 patch
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -1,34 +1,34 @@  discard block
 block discarded – undo
1 1
 <?php namespace Myth\Auth;
2 2
 /**
3
- * Sprint
4
- *
5
- * A set of power tools to enhance the CodeIgniter framework and provide consistent workflow.
6
- *
7
- * Permission is hereby granted, free of charge, to any person obtaining a copy
8
- * of this software and associated documentation files (the "Software"), to deal
9
- * in the Software without restriction, including without limitation the rights
10
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- * copies of the Software, and to permit persons to whom the Software is
12
- * furnished to do so, subject to the following conditions:
13
- *
14
- * The above copyright notice and this permission notice shall be included in
15
- * all copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- * THE SOFTWARE.
24
- *
25
- * @package     Sprint
26
- * @author      Lonnie Ezell
27
- * @copyright   Copyright 2014-2015, New Myth Media, LLC (http://newmythmedia.com)
28
- * @license     http://opensource.org/licenses/MIT  (MIT)
29
- * @link        http://sprintphp.com
30
- * @since       Version 1.0
31
- */
3
+	 * Sprint
4
+	 *
5
+	 * A set of power tools to enhance the CodeIgniter framework and provide consistent workflow.
6
+	 *
7
+	 * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+	 * of this software and associated documentation files (the "Software"), to deal
9
+	 * in the Software without restriction, including without limitation the rights
10
+	 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+	 * copies of the Software, and to permit persons to whom the Software is
12
+	 * furnished to do so, subject to the following conditions:
13
+	 *
14
+	 * The above copyright notice and this permission notice shall be included in
15
+	 * all copies or substantial portions of the Software.
16
+	 *
17
+	 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+	 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+	 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+	 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+	 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+	 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+	 * THE SOFTWARE.
24
+	 *
25
+	 * @package     Sprint
26
+	 * @author      Lonnie Ezell
27
+	 * @copyright   Copyright 2014-2015, New Myth Media, LLC (http://newmythmedia.com)
28
+	 * @license     http://opensource.org/licenses/MIT  (MIT)
29
+	 * @link        http://sprintphp.com
30
+	 * @since       Version 1.0
31
+	 */
32 32
 
33 33
 trait AuthTrait {
34 34
 
@@ -58,7 +58,7 @@  discard block
 block discarded – undo
58 58
 	 */
59 59
 	public function restrict($uri=null, $return_only=false)
60 60
 	{
61
-	    $this->setupAuthClasses();
61
+		$this->setupAuthClasses();
62 62
 
63 63
 		if ($this->authenticate->isLoggedIn())
64 64
 		{
@@ -108,7 +108,7 @@  discard block
 block discarded – undo
108 108
 	 */
109 109
 	public function restrictToGroups($groups, $uri='')
110 110
 	{
111
-	    $this->setupAuthClasses();
111
+		$this->setupAuthClasses();
112 112
 
113 113
 		if ($this->authenticate->isLoggedIn())
114 114
 		{
@@ -149,7 +149,7 @@  discard block
 block discarded – undo
149 149
 	 */
150 150
 	public function restrictWithPermissions($permissions, $uri='')
151 151
 	{
152
-	    $this->setupAuthClasses();
152
+		$this->setupAuthClasses();
153 153
 
154 154
 		if ($this->authenticate->isLoggedIn())
155 155
 		{
Please login to merge, or discard this patch.
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.