Credentials-Validator 0.0.4
Credential validation
Requires Python: >=3.6

# Account credentials checker

This package takes care of verifing the credentials serverside.

## Download
You can `pip install` by
```commandline
pip3 install Credentials-Validator
```

## Usage

You can import the pakage by typing

```python
from Credentials_Validator import UsernameValidator, PasswordValidator
```
\
The general usage is:

```python
from Credentials_Validator import UsernameValidator

user = UsernameValidator([4], # length range
                         [1], # number of lower-case chars range
                         [1], # number of upper-case chars range
                         [1,3], # number of numbers range
                         [0,0], # number of symbols range
                         )
```
\
The use of range is:

```python
[2, 5] # minimum 2, maximum 5 characters
[1] # at least one
[0] # not necessary, not denied
[0, 4] # not necessary, maximum 4 characters
[0, 0] # denied
```

### Validation
In order to validate a `text` (Username or password) you have to call the method `Validator.verify(text)`.\
It returns two objects:
1. a `boolean` (`True` if the text is valid, `False` if there is one or more errors)
2. a `string`, that can be:
    * `''` empty, if there are no errors
    * `'length'` if the `text` is too short or too long
    * `'lower'` if there are too few or too many lower-case characters
    * `'upper'` if there are too few or too many upper-case characters
    * `'digit'` if there are too few or too many numbers
    * `'symbols'` if there are too few or too many allowed symbols
```python
from Credentials_Validator import UsernameValidator

user = UsernameValidator([4, 10], [1], [2], [0], [1],)

is_valid, error = user.verify('PasswOrd!')
print((is_valid, error))
#returns (True, '')

is_valid, error = user.verify('PasswOrd3')
print((is_valid, error))
#returns (False, 'symbols')

is_valid, error = user.verify('Password!')
print((is_valid, error))
#returns (False, 'upper')

is_valid, error = user.verify('th1sPasswOrdist00long')
print((is_valid, error))
#returns (False, 'length')
```

## Differences between UsernameValidator and PasswordValidator

### UsernameValidator
The `UsernameValidator` comes with a special argument called `django_model`.\
It can be used to automatically check if the username is already taken in the Django User model, if it is taken, it will return the error `'existing'`\
In this example the default User model is passed:
```python
from django.contrib.auth.models import User
from Credentials_Validator import UsernameValidator

user = UsernameValidator([4,10], [1], [1], [2], [0,0], django_model=User)
```
If you are using a custom Django User model:
```python
from django.contrib.auth import get_user_model
from Credentials_Validator import UsernameValidator

user = UsernameValidator([4,10], [1], [1], [2], [0,0], django_model=get_user_model())
```

### PasswordValidator
The `PasswordValidator` comes with a special argument called `username`.\
It checks if the password is the same as the username, in which case it returns the `'equal'` error.\
```python
from Credentials_Validator import PasswordValidator

username = 'myusername'

password = PasswordValidator([8,12], [2], [2], [2], [1], username=username)
```
## Extra features

### Customization
\
The default symbols are: `!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`.\
\
You can customize the simbols by passing your custom list (string) as a keyword argument:

```python
from Credentials_Validator import UsernameValidator

my_symbols = '!?$%&@#'

user = UsernameValidator([4, 10], [1], [1], [0], [1], symbols_list=my_symbols)
```

### Inheritance
You can add your custom verification function by inheriting the `Validator` class and overriding the `__init__` method to add keyword arguments and `extra_validation` one to add your validatin function.\
The `__init__` should look like this:
```python
from Credentials_Validator import Validator

class MyValidator(Validator):

    def __init__(self, length, chars, Chars, nums, symbols, **kwargs):
        super().__init__(length, chars, Chars, nums, symbols, **kwargs) # DON'T EDIT THIS!

        self.myargument = kwargs.get('mykeyword', None) # Edit 'myargument' and 'mykeyword'
``` 
The `extra_validation` should return `None` if the `text` is valid, if it is not, `False` and `myerrormessage` (can be anything)
```python
    def extra_validation(self, text): # text is the .verify() argument
        if self.myargument in text: # can be any condition
            return False, 'myerror'
        return None
```