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.

Validation::notEqual()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 2
1
<?php
2
3
/**
4
 * Validation class
5
 *
6
 * A small library for validation.
7
 * It has plenty of validation rules.
8
 *
9
 * @license    http://opensource.org/licenses/MIT The MIT License (MIT)
10
 * @author     Omar El Gabry <[email protected]>
11
 */
12
13
class Validation {
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
14
15
    /**
16
     * validation errors
17
     *
18
     *
19
     * @var array
20
     */
21
    private $errors = [];
22
23
    /**
24
     * Custom rule messages.
25
     *
26
     * @var array
27
     */
28
    private $ruleMessages = [];
29
30
     /**
31
      * Start the validation using values and rules passed in $data
32
      *
33
      * @param  array  $data
34
      * @param  bool   $skip To skip validations as soon as one of the rules fails.
35
      *
36
      * @throws Exception if rule method doesn't exist
37
      * @return bool
38
      */
39
    public function validate($data, $skip = false){
40
41
        $passed = true;
42
43
        foreach($data as $placeholder => $rules){
44
45
            $value = $rules[0];
46
            $rules = explode('|', $rules[1]);
47
48
            // no need to validate the value if the value is empty and not required
49
            if(!$this->isRequired($rules) && $this->isEmpty($value)){
50
                continue;
51
            }
52
53
            // it doesn't make sense to continue and validate the rest of rules on an empty & required value.
54
            // instead add error, and skip this value.
55
            if($this->isRequired($rules) && $this->isEmpty($value)){
56
                $this->addError("required", $placeholder, $value);
57
                $passed = false;
58
                continue;
59
            }
60
61
            foreach($rules as $rule){
62
63
                $method = $rule;
64
                $args = [];
65
66
                // if it was empty and required or not required,
67
                // it would be detected by the previous ifs
68
                if($rule === "required") {
69
                    continue;
70
                }
71
72
                if(self::isruleHasArgs($rule)){
73
74
                    // get arguments for rules like in max(), min(), ..etc.
75
                    $method = $this->getRuleName($rule);
76
                    $args   = $this->getRuleArgs($rule);
77
                }
78
79
                if(!method_exists($this, $method)){
80
                    throw new Exception("Method doesnt exists: " . $method);
81
                }
82
83
                if(!call_user_func_array([$this, $method], [$value, $args])) {
84
85
                    $this->addError($method, $placeholder, $value, $args);
86
                    $passed = false;
87
88
                    if($skip){ return false; }
89
                }
90
            }
91
        }
92
93
        // possible change is to return the current validation object,
94
        // and use passes() instead.
0 ignored issues
show
Unused Code Comprehensibility introduced by
37% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
95
        return $passed;
96
    }
97
98
    /**
99
     * Determine if a given value is empty,
100
     * excluding '0', false, 0, 0.0, and files uploaded with UPLOAD_ERR_NO_FILE error,
101
     * because these could be perfectly valid values,
102
     * then, the validation methods has to decide if this value is valid or not.
103
     *
104
     * @param  mixed  $value
105
     * @return bool
106
     *
107
     */
108
    private function isEmpty($value){
109
110
        if(is_null($value)) {
111
            return true;
112
        }
113
        else if(is_string($value)){
114
            if(trim($value) === '') return true;
115
        }
116
        else if (empty($value) && $value !== '0' && $value !== false && $value !== 0 && $value !== 0.0){
117
            return true;
118
        }
119
        else if (is_array($value) && isset($value['name'], $value['type'], $value['tmp_name'], $value['error'])) {
120
            return (int)$value['error'] === UPLOAD_ERR_NO_FILE;
121
        }
122
        return false;
123
     }
124
125
    /**
126
     * Determine if a given rules has 'required' rule
127
     *
128
     * @param  array  $rules
129
     * @return bool
130
     */
131
    private function isRequired($rules){
132
        return in_array("required", $rules, true);
133
    }
134
135
    /**
136
     * Determine if a given rule has arguments, Ex: max(4)
137
     *
138
     * @param  string  $rule
139
     * @return bool
140
     */
141
    private function isruleHasArgs($rule) {
142
        return isset(explode('(', $rule)[1]);
143
    }
144
145
    /**
146
     * get rule name for rules that have args
147
     *
148
     * @param  string  $rule
149
     * @return string
150
     */
151
    private function getRuleName($rule){
152
        return explode('(', $rule)[0];
153
    }
154
155
    /**
156
     * get arguments for rules that have args
157
     *
158
     * @param  string  $rule
159
     * @return array
160
     */
161
    private  function getRuleArgs($rule){
162
163
        $argsWithBracketAtTheEnd = explode('(', $rule)[1];
164
        $args = rtrim($argsWithBracketAtTheEnd, ')');
165
        $args = preg_replace('/\s+/', '', $args);
166
167
        // as result of an empty array coming from user input
168
        // $args will be empty string,
169
        // So, using explode(',', empty string) will return array with size = 1
170
        // return empty($args)? []: explode(',', $args);
0 ignored issues
show
Unused Code Comprehensibility introduced by
72% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
171
        return explode(',', $args);
172
    }
173
174
    /**
175
     * Add a custom rule message.
176
     * This message will be displayed instead of default.
177
     *
178
     * @param  string  $rule
179
     * @param  string  $message
180
     * @return array
181
     */
182
    public function addRuleMessage($rule, $message){
183
        $this->ruleMessages[$rule] = $message;
184
    }
185
186
    /**
187
     * Add an error
188
     *
189
     * @param  string  $rule
190
     * @param  string  $placeholder for field
191
     * @param  mixed   $value
192
     * @param  array   $args
193
     *
194
     */
195
    private function addError($rule, $placeholder, $value, $args = []){
196
197
        if(isset($this->ruleMessages[$rule])){
198
            $this->errors[] = $this->ruleMessages[$rule];
199
        }
200
201
        else{
202
203
            // get the default message for the current $rule
204
            $message = self::defaultMessages($rule);
205
206
            if(isset($message)){
207
208
                // if $message is set to empty string,
209
                // this means the error will be added inside the validation method itself
210
                // check attempts()
211
                if(trim($message) !== ""){
212
213
                    // replace placeholder, value, arguments with their values
214
                    $replace = ['{placeholder}', '{value}'];
215
                    $value   = is_string($value)? $value: "";
216
                    $with    = array_merge([$placeholder, $value], $args);
217
                    $count   = count($args);
218
219
                    // arguments will take the shape of: {0} {1} {2} ...
0 ignored issues
show
Unused Code Comprehensibility introduced by
39% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
220
                    for($i = 0; $i < $count; $i++) $replace[] = "{{$i}}";
221
222
                    $this->errors[] = str_replace($replace, $with, $message);
223
                }
224
225
            } else{
226
227
                // if no message defined, then use this one.
228
                $this->errors[] = "The value you entered for " . $placeholder . " is invalid";
229
            }
230
        }
231
    }
232
233
    /**
234
     * Checks if validation has passed.
235
     *
236
     * @return bool
237
     */
238
    public function passes(){
239
        return empty($this->errors);
240
    }
241
242
    /**
243
     * get all errors
244
     *
245
     * @return array
246
     */
247
    public function errors(){
248
        return $this->errors;
249
    }
250
251
    /**
252
     * clear all existing errors
253
     *
254
     * @return bool
255
     */
256
    public function clearErrors(){
257
        $this->errors = [];
258
    }
259
260
    /** *********************************************** **/
261
    /** **************    Validations    ************** **/
262
    /** *********************************************** **/
263
264
    /**
265
     * Is value not empty?
266
     *
267
     * @param  mixed  $value
268
     * @return bool
269
     */
270
    /*private function required($value){
0 ignored issues
show
Unused Code Comprehensibility introduced by
69% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
271
        return !$this->isEmpty($value);
272
    }*/
273
274
    /**
275
     * min string length
276
     *
277
     * @param  string  $str
278
     * @param  array  $args(min)
0 ignored issues
show
Bug introduced by
There is no parameter named $args(min). Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
279
     *
280
     * @return bool
281
     */
282
    private function minLen($str, $args){
283
        return mb_strlen($str, 'UTF-8') >= (int)$args[0];
284
    }
285
286
    /**
287
     * max string length
288
     *
289
     * @param  string  $str
290
     * @param  array  $args(max)
0 ignored issues
show
Bug introduced by
There is no parameter named $args(max). Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
291
     *
292
     * @return bool
293
     */
294
    private function maxLen($str, $args){
295
        return mb_strlen($str, 'UTF-8') <= (int)$args[0];
296
    }
297
298
    /**
299
     * check if number between given range of numbers
300
     *
301
     * @param  int     $num
302
     * @param  array   $args(min,max)
0 ignored issues
show
Bug introduced by
There is no parameter named $args(min,max). Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
303
     * @return bool
304
     */
305
    private function rangeNum($num, $args){
306
        return $num >= (int)$args[0] && $num <= (int)$args[1];
307
    }
308
309
    /**
310
     * check if value is a valid number
311
     *
312
     * @param  string|integer  $value
313
     * @return bool
314
     */
315
    private function integer($value){
316
        return filter_var($value, FILTER_VALIDATE_INT);
317
    }
318
319
    /**
320
     * check if value(s) is in a given array
321
     *
322
     * @param  string|array  $value
323
     * @param  array         $arr
324
     * @return bool
325
     */
326
    private function inArray($value, $arr){
327
328
        if(is_array($value)){
329
            foreach($value as $val){
330
                if(!in_array($val, $arr, true)){
331
                    return false;
332
                }
333
            }
334
            return true;
335
        }
336
        return in_array($value, $arr, true);
337
    }
338
339
    /**
340
     * check if value is contains alphabetic characters and numbers
341
     *
342
     * @param  mixed   $value
343
     * @return bool
344
     */
345
    private function alphaNum($value){
346
        return preg_match('/\A[a-z0-9]+\z/i', $value);
347
    }
348
349
    /**
350
     * check if value is contains alphabetic characters, numbers and spaces
351
     *
352
     * @param  mixed   $value
353
     * @return bool
354
     */
355
    private function alphaNumWithSpaces($value){
356
        return preg_match('/\A[a-z0-9 ]+\z/i', $value);
357
    }
358
359
    /**
360
     * check if password has at least
361
     * - one lowercase letter
362
     * - one uppercase letter
363
     * - one number
364
     * - one special(non-word) character
365
     *
366
     * @param  mixed   $value
367
     * @return bool
368
     * @see http://stackoverflow.com/questions/8141125/regex-for-password-php
369
     * @see http://code.runnable.com/UmrnTejI6Q4_AAIM/how-to-validate-complex-passwords-using-regular-expressions-for-php-and-pcre
370
     */
371
    private function password($value) {
372
        return preg_match_all('$\S*(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])(?=\S*[\W])\S*$', $value);
373
    }
374
375
    /**
376
     * check if value is equals to another value(strings)
377
     *
378
     * @param  string  $value
379
     * @param  array   $args(value)
0 ignored issues
show
Bug introduced by
There is no parameter named $args(value). Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
380
     * @return bool
381
     */
382
    private function equals($value, $args){
383
        return $value === $args[0];
384
    }
385
386
    /**
387
     * check if value is not equal to another value(strings)
388
     *
389
     * @param  string  $value
390
     * @param  array   $args(value)
0 ignored issues
show
Bug introduced by
There is no parameter named $args(value). Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
391
     * @return bool
392
     */
393
    private function notEqual($value, $args){
394
        return $value !== $args[0];
395
    }
396
397
    /**
398
     * check if value is a valid email
399
     *
400
     * @param  string  $email
401
     * @return bool
402
     */
403
    private function email($email){
404
        return filter_var($email, FILTER_VALIDATE_EMAIL);
405
    }
406
407
    /** *********************************************** **/
408
    /** ************  Database Validations  *********** **/
409
    /** *********************************************** **/
410
411
    /**
412
     * check if a value of a column is unique.
413
     *
414
     * @param  string  $value
415
     * @param  array   $args(table, column)
0 ignored issues
show
Bug introduced by
There is no parameter named $args(table,. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
416
     * @return bool
417
     */
418
    private function unique($value, $args){
419
420
        $table = $args[0];
421
        $col   = $args[1];
422
423
        $database = Database::openConnection();
424
        $database->prepare("SELECT * FROM {$table} WHERE {$col} = :{$col}");
425
        $database->bindValue(":{$col}", $value);
426
        $database->execute();
427
428
        return $database->countRows() === 0;
429
430
    }
431
432
    /**
433
     * check if email is unique
434
     * This will check if email exists and activated.
435
     *
436
     * @param  string  $email
437
     * @return bool
438
     */
439
    private function emailUnique($email){
440
441
        $database = Database::openConnection();
442
443
        // email is unique in the database, So, we can't have more than 2 same emails
444
        $database->prepare("SELECT * FROM users WHERE email = :email LIMIT 1");
445
        $database->bindValue(':email', $email);
446
        $database->execute();
447
        $user = $database->fetchAssociative();
448
449
        if ($database->countRows() === 1) {
450
451
            if(!empty($user["is_email_activated"])){
452
                return false;
453
454
            } else {
455
456
                $expiry_time = (24 * 60 * 60);
457
                $time_elapsed = time() - $user['email_last_verification'];
458
459
                // If time elapsed exceeded the expiry time, it worth to reset the token, and the email as well.
460
                // This indicates the email of $user hasn't been verified, and token is expired.
461
                if($time_elapsed >= $expiry_time) {
462
463
                    $login = new Login();
464
                    $login->resetEmailVerificationToken($user["id"], false);
465
                    return true;
466
467
                }else {
468
469
                    // TODO check if $email is same as current user's email(not-activated),
470
                    // then ask the user to verify his email
471
                    return false;
472
                }
473
            }
474
        }
475
        return true;
476
    }
477
478
    /** *********************************************** **/
479
    /** ************    Login Validations   *********** **/
480
    /** *********************************************** **/
481
482
    /**
483
     * check if user credentials are valid or not.
484
     *
485
     * @param  array   $user
486
     * @return bool
487
     * @see Login::doLogin()
488
     */
489
    private function credentials($user){
490
        if(empty($user["hashed_password"]) || empty($user["user_id"])) {
491
            return false;
492
        }
493
        return password_verify($user["password"], $user["hashed_password"]);
494
    }
495
496
    /**
497
     * check if user has exceeded number of failed logins or number of forgotten password attempts.
498
     *
499
     * @param  array   $attempts
500
     * @return bool
501
     */
502
    private function attempts($attempts){
503
504
        if(empty($attempts['last_time']) && empty($attempts['count'])) {
505
            return true;
506
        }
507
508
        $block_time = (10 * 60);
509
        $time_elapsed = time() - $attempts['last_time'];
510
511
        // TODO If user is Blocked, Update failed logins/forgotten passwords
512
        // to current time and optionally number of attempts to be incremented,
513
        // but, this will reset the last_time every time there is a failed attempt
514
515
        if ($attempts["count"] >= 5 && $time_elapsed < $block_time) {
516
517
            // here i can't define a default error message as in defaultMessages()
518
            // because the error message depends on variables like $block_time & $time_elapsed
519
            $this->errors[] = "You exceeded number of possible attempts, please try again later after " .
520
                date("i", $block_time - $time_elapsed) . " minutes";
521
            return false;
522
523
        }else{
524
525
            return true;
526
        }
527
    }
528
529
    /** *********************************************** **/
530
    /** ************    File Validations    *********** **/
531
    /** *********************************************** **/
532
533
    /**
534
     * checks if file unique.
535
     *
536
     * @param  array  $path
537
     * @return bool
538
     *
539
     * @see
540
     */
541
    private function fileUnique($path){
542
        return !file_exists($path);
543
    }
544
545
    /**
546
     * checks for file errors
547
     *
548
     * @param  array   $file
549
     * @return bool
550
     */
551
    private function fileErrors($file){
552
        return (int)$file['error'] === UPLOAD_ERR_OK;
553
    }
554
555
    /**
556
     * checks if file uploaded successfully via HTTP POST
557
     *
558
     * @param  array   $file
559
     * @return bool
560
     *
561
     * @see
562
     */
563
    private function fileUploaded($file){
564
        return is_uploaded_file($file["tmp_name"]);
565
    }
566
567
    /**
568
     * checks from file size
569
     *
570
     * @param  array   $file
571
     * @param  array   $args(min,max)
0 ignored issues
show
Bug introduced by
There is no parameter named $args(min,max). Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
572
     * @return bool
573
     */
574
    private function fileSize($file, $args){
575
576
        // size in bytes,
577
        // 1 KB = 1024 bytes, and 1 MB = 1048,576 bytes.
578
        $size = array ("min" => (int)$args[0], "max" => (int)$args[1]);
579
580
        if ($file['size'] > $size['max']) {
581
            $this->errors[] = "File size can't exceed max limit (". ($size['max']/1048576) . " MB)";
582
            return false;
583
        }
584
585
        // better not to say the min limits.
586
        if($file['size'] < $size['min']){
587
            $this->errors[] = "File size either is too small or corrupted";
588
            return false;
589
        }
590
        return true;
591
    }
592
593
    /**
594
     * checks from image size(dimensions)
595
     *
596
     * @param  array   $file
597
     * @param  array   $dimensions(width,height)
0 ignored issues
show
Documentation introduced by
There is no parameter named $dimensions(width,height). Did you maybe mean $dimensions?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
598
     * @return bool
599
     */
600
    private function imageSize($file, $dimensions){
601
602
        $imageSize  = array('width' => 0, 'height' => 0);
603
        list($imageSize['width'], $imageSize['height'])   = getimagesize($file["tmp_name"]);
604
605
        if($imageSize["width"] < 10 || $imageSize["height"] < 10){
606
            $this->errors[] = "This image is too small or corrupted";
607
            return false;
608
        }
609
        if($imageSize["width"] > $dimensions[0] || $imageSize["height"] > $dimensions[1]){
610
            $this->errors[] = "Image width & height must be below ". $dimensions[0] ." pixels";
611
            return false;
612
        }
613
        return true;
614
    }
615
616
    /**
617
     * validate mime type
618
     *
619
     * @param  array   $file
620
     * @param  array   $mimeTypes
621
     * @throws Exception if finfo_open() doesn't exists
622
     * @return bool
623
     */
624 View Code Duplication
    private function mimeType($file, $mimeTypes){
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
625
626
        if(!file_exists($file["tmp_name"])){
627
            return false;
628
        }
629
        if(!function_exists('finfo_open')) {
630
            throw new Exception("Function finfo_open() doesn't exist");
631
        }
632
633
        $finfo_open = finfo_open(FILEINFO_MIME_TYPE);
634
        $finfo_file = finfo_file($finfo_open, $file["tmp_name"]);
635
        finfo_close($finfo_open);
636
637
        list($mime) = explode(';', $finfo_file);
638
639
        // in case of zip file it returns application/octet-stream
640
        return in_array($mime, $mimeTypes, true);
641
    }
642
643
    /**
644
     * validate file extension returned from pathinfo() Vs mapped mime type to extension
645
     *
646
     * This reveal un desired errors in case of files with extension: zip, csv, ..etc
647
     *
648
     * @param  array   $file
649
     * @param  array   $extension
650
     * @return bool
651
     */
652
    private function fileExtension($file, $extension){
653
654
        if(isset($extension[0])){
655
            return $extension[0] === pathinfo($file['name'])['extension'];
656
        }
657
        return false;
658
    }
659
660
    /** *********************************************** **/
661
    /** ************   Default Messages     *********** **/
662
    /** *********************************************** **/
663
664
    /**
665
     * get default message for a rule
666
     *
667
     * Instead of passing your custom message every time,
668
     * you can define a set of default messages.
669
     *
670
     * The pitfall of this method is, if you changed the validation method name,
671
     * you need to change it here as well.
672
     *
673
     * @param  string  $rule
674
     * @return mixed
675
     */
676
    private static function defaultMessages($rule){
677
        $messages = [
678
            "required" => "{placeholder} can't be empty",
679
            "minLen"   => "{placeholder} can't be less than {0} character",
680
            "maxLen"   => "{placeholder} can't be greater than {0} character",
681
            "rangeNum" => "{placeholder} must be between {0} and {1}",
682
            "integer"  => "{placeholder} must be a valid number",
683
            "inArray"  => "{placeholder} is not valid",
684
            "alphaNum" => "Only letters and numbers are allowed for {placeholder}",
685
            "alphaNumWithSpaces" => "Only letters, numbers and spaces are allowed for {placeholder}",
686
            "password"      => "Passwords must contain at least one lowercase, uppercase, number and special character",
687
            "equals"        => "{placeholder}s aren't equal",
688
            "notEqual"      => "{placeholder} can't be equal to {0}",
689
            "email"         => "Invalid email, Please enter a valid email address",
690
            "unique"        => "{placeholder} already exists",
691
            "emailUnique"   => "Email already exists",
692
            "credentials"   => "User ID & Password combination doesn't exist",
693
            "attempts"      => "",
694
            "fileUnique"    => "File already exists",
695
            "fileUploaded"  => "Your uploaded file is invalid!",
696
            "fileErrors"    => "There was an error with the uploaded file",
697
            "fileSize"      => "",
698
            "imageSize"     => "",
699
            "mimeType"      => "Your file format is invalid",
700
            "fileExtension" => "Your file format is invalid"
701
        ];
702
703
        return isset($messages[$rule])? $messages[$rule]: null;
704
    }
705
}
706