Skip to content

Commit

Permalink
orWhereEncryptedLike, orderByEncryptedSort, whereInEncrypted added
Browse files Browse the repository at this point in the history
  • Loading branch information
PrajapatiDhara1510 committed Dec 15, 2023
1 parent 4eeff35 commit 6be8a7c
Show file tree
Hide file tree
Showing 8 changed files with 139 additions and 36 deletions.
15 changes: 9 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ Automatically encrypt and decrypt fields in your Models.
## Install
### 1. Composer
```bash
composer require dhara15101991/laravel-mysql-encrypt
composer require PrajapatiDhara1510/laravel-mysql-encrypt
```

### 2. Publish config (optional)
`Laravel`
```bash
php artisan vendor:publish --provider="dhara15101991\MysqlEncrypt\Providers\LaravelServiceProvider"
php artisan vendor:publish --provider="PrajapatiDhara1510\MysqlEncrypt\Providers\LaravelServiceProvider"
```

`Lumen`
```bash
mkdir -p config
cp vendor/dhara15101991/laravel-mysql-encrypt/config/config.php config/mysql-encrypt.php
cp vendor/prajapatidhara1510/laravel-mysql-encrypt/config/config.php config/mysql-encrypt.php
```

### 3. Configure Provider
Expand All @@ -30,14 +30,14 @@ cp vendor/dhara15101991/laravel-mysql-encrypt/config/config.php config/mysql-enc
- For Laravel 5.4 or earlier, add the following to `config/app.php`:
```php
'providers' => array(
dhara15101991\\MysqlEncrypt\\Providers\\LaravelServiceProvider::class
PrajapatiDhara1510\\MysqlEncrypt\\Providers\\LaravelServiceProvider::class
);
```

`Lumen`
- For Lumen, add the following to `bootstrap/app.php`:
```php
$app->register(dhara15101991\MysqlEncrypt\Providers\LumenServiceProvider::class);
$app->register(PrajapatiDhara1510\MysqlEncrypt\Providers\LumenServiceProvider::class);
```

### 4. Set encryption key in `.env` file
Expand All @@ -51,7 +51,7 @@ APP_AESENCRYPT_KEY=yourencryptionkey

namespace App;

use dhara15101991\MysqlEncrypt\Traits\Encryptable;
use PrajapatiDhara1510\MysqlEncrypt\Traits\Encryptable;
use Illuminate\Database\Eloquent\Model;

class User extends Model
Expand Down Expand Up @@ -85,7 +85,10 @@ Custom Local scopes available:
`whereNotEncrypted`
`orWhereEncrypted`
`orWhereNotEncrypted`
`orWhereEncryptedLike`
`orderByEncrypted`
`orderByEncryptedSort`
`whereInEncrypted`

Global scope `DecryptSelectScope` automatically booted in models using `Encryptable` trait.

Expand Down
12 changes: 6 additions & 6 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"name": "chr15k/laravel-mysql-encrypt",
"name": "prajapatidhara1510/laravel-mysql-encrypt",
"description": "Laravel 5.x | 6.x | 7.x | 8.x Database encryption mysql side",
"keywords": [
"laravel",
"chr15k",
"prajapatidhara1510",
"mysql",
"encryption",
"php",
Expand All @@ -12,8 +12,8 @@
"license": "MIT",
"authors": [
{
"name": "Christopher Keller",
"email": "ctk8501@gmail.com"
"name": "Dhara Prajapati",
"email": "prajapatidhara1510@gmail.com"
}
],
"require": {
Expand All @@ -23,7 +23,7 @@
},
"autoload": {
"psr-4": {
"Chr15k\\MysqlEncrypt\\": "src/"
"PrajapatiDhara1510\\MysqlEncrypt\\": "src/"
},
"files": [
"src/helpers.php"
Expand All @@ -35,7 +35,7 @@
"extra": {
"laravel": {
"providers": [
"Chr15k\\MysqlEncrypt\\Providers\\LaravelServiceProvider"
"PrajapatiDhara1510\\MysqlEncrypt\\Providers\\LaravelServiceProvider"
]
}
},
Expand Down
8 changes: 4 additions & 4 deletions src/Providers/LaravelServiceProvider.php
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<?php

namespace Chr15k\MysqlEncrypt\Providers;
namespace PrajapatiDhara1510\MysqlEncrypt\Providers;

use Illuminate\Support\ServiceProvider;
use Chr15k\MysqlEncrypt\Traits\ValidatesEncrypted;
use PrajapatiDhara1510\MysqlEncrypt\Traits\ValidatesEncrypted;

class LaravelServiceProvider extends ServiceProvider
{
Expand All @@ -15,7 +15,7 @@ class LaravelServiceProvider extends ServiceProvider
public function boot()
{
$this->publishes([
__DIR__.'/../../config/config.php' => config_path('mysql-encrypt.php'),
__DIR__ . '/../../config/config.php' => config_path('mysql-encrypt.php'),
], 'config');

$this->addValidators();
Expand All @@ -26,6 +26,6 @@ public function boot()
*/
public function register()
{
$this->mergeConfigFrom(__DIR__.'/../../config/config.php', 'mysql-encrypt');
$this->mergeConfigFrom(__DIR__ . '/../../config/config.php', 'mysql-encrypt');
}
}
6 changes: 3 additions & 3 deletions src/Providers/LumenServiceProvider.php
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<?php

namespace Chr15k\MysqlEncrypt\Providers;
namespace PrajapatiDhara1510\MysqlEncrypt\Providers;

use Illuminate\Support\ServiceProvider;
use Chr15k\MysqlEncrypt\Traits\ValidatesEncrypted;
use PrajapatiDhara1510\MysqlEncrypt\Traits\ValidatesEncrypted;

class LumenServiceProvider extends ServiceProvider
{
Expand All @@ -16,7 +16,7 @@ public function boot()
{
$this->app->configure('mysql-encrypt');

$path = realpath(__DIR__.'/../../config/config.php');
$path = realpath(__DIR__ . '/../../config/config.php');

$this->mergeConfigFrom($path, 'mysql-encrypt');

Expand Down
4 changes: 2 additions & 2 deletions src/Scopes/DecryptSelectScope.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace Chr15k\MysqlEncrypt\Scopes;
namespace PrajapatiDhara1510\MysqlEncrypt\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
Expand All @@ -26,7 +26,7 @@ public function apply(Builder $builder, Model $model)
return $builder->addSelect(...$columns);
}

$select = collect($columns)->map(function($column) use ($encryptable) {
$select = collect($columns)->map(function ($column) use ($encryptable) {
return (in_array($column, $encryptable)) ? db_decrypt($column) : $column;
});

Expand Down
77 changes: 74 additions & 3 deletions src/Traits/Encryptable.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php

namespace Chr15k\MysqlEncrypt\Traits;
namespace PrajapatiDhara1510\MysqlEncrypt\Traits;

use Chr15k\MysqlEncrypt\Scopes\DecryptSelectScope;
use PrajapatiDhara1510\MysqlEncrypt\Scopes\DecryptSelectScope;

trait Encryptable
{
Expand Down Expand Up @@ -37,7 +37,7 @@ public function encryptable(): array
return $this->encryptable ?? [];
}

/**
/**
* where for encrypted columns
*
* @param $query
Expand Down Expand Up @@ -111,4 +111,75 @@ public function scopeOrderByEncrypted($query, $column, $direction)
/** @var Builder $query */
return $query->orderByRaw(db_decrypt_string($column, $direction, ''));
}

/**
* where for encrypted columns like
*
* @param $query
* @param $column
* @param $value
*
* @return mixed
*/
public function scopeWhereEncryptedLike($query, $column, $value)
{
/** @var Builder $query */
return $query->whereRaw(db_decrypt_string_like($column, $value));
}

/**
* orWhere not for encrypted columns like
*
* @param $query
* @param $column
* @param $value
*
* @return mixed
*/
public function scopeOrWhereEncryptedLike($query, $column, $value)
{
/** @var Builder $query */
return $query->orWhereRaw(db_decrypt_string_like($column, $value));
}

/**
* orderBy for encrypted columns
*
* @param $query
* @param $column
* @param $direction
*
* @return mixed
*/
public function scopeOrderByEncryptedSort($query, $column, $direction)
{
/** @var Builder $query */
return $query->orderByRaw(db_decrypt_string_sort($column, $direction));
}

/**
* whereIn for encrypted columns
*
* @param $query
* @param $column
* @param $value
*
* @return mixed
*/
public function scopeWhereInEncrypted($query, $column, $value)
{
/** @var Builder $query */
if (is_array($value) || $value->count() > 1) {
for ($i = 0; $i < count($value); $i++) {
if ($i === 0) {
$query->whereRaw(db_decrypt_string($column, $value[$i]));
} else {

$query->orWhereRaw(db_decrypt_string($column, $value[$i]));
}
}
return $query;
}
return $query->whereRaw(db_decrypt_string($column, $value));
}
}
14 changes: 7 additions & 7 deletions src/Traits/ValidatesEncrypted.php
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
<?php

namespace Chr15k\MysqlEncrypt\Traits;
namespace PrajapatiDhara1510\MysqlEncrypt\Traits;

use PDOException;
use InvalidArgumentException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Validator;
use InvalidArgumentException;
use PDOException;

trait ValidatesEncrypted
{
/**
/**
* Validators.
*
* @return void
Expand All @@ -26,7 +26,7 @@ public function addValidators()
$field = isset($parameters[1]) ? $parameters[1] : $attribute;
$ignore = isset($parameters[2]) ? $parameters[2] : null;

$items = DB::select("SELECT count(*) as aggregate FROM `".$parameters[0]."` WHERE AES_DECRYPT(`".$field."`, '".config("app.key")."') LIKE '".$value."' COLLATE utf8mb4_general_ci".($ignore ? " AND id != ".$ignore : ''));
$items = DB::select("SELECT count(*) as aggregate FROM `" . $parameters[0] . "` WHERE AES_DECRYPT(`" . $field . "`, '" . config("app.key") . "') LIKE '" . $value . "' COLLATE utf8mb4_general_ci" . ($ignore ? " AND id != " . $ignore : ''));

return $items[0]->aggregate == 0;
});
Expand All @@ -39,7 +39,7 @@ public function addValidators()

$field = isset($parameters[1]) ? $parameters[1] : $attribute;

$items = DB::select("SELECT count(*) as aggregate FROM `".$parameters[0]."` WHERE AES_DECRYPT(`".$field."`, '".config("app.key")."') LIKE '".$value."' COLLATE utf8mb4_general_ci");
$items = DB::select("SELECT count(*) as aggregate FROM `" . $parameters[0] . "` WHERE AES_DECRYPT(`" . $field . "`, '" . config("app.key") . "') LIKE '" . $value . "' COLLATE utf8mb4_general_ci");

return $items[0]->aggregate > 0;
});
Expand Down Expand Up @@ -72,7 +72,7 @@ public function requireParameterCount($count, $parameters, $rule)
*/
public function requireTableExists($table)
{
if (! Schema::hasTable($table)) {
if (!Schema::hasTable($table)) {
throw new PDOException("Table $table not found.");
}
}
Expand Down
39 changes: 34 additions & 5 deletions src/helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

use Illuminate\Support\Facades\DB;

if (! function_exists('db_encrypt')) {
if (!function_exists('db_encrypt')) {
/**
* Encrypt value.
*
Expand All @@ -17,7 +17,7 @@ function db_encrypt($value)
}
}

if (! function_exists('db_decrypt')) {
if (!function_exists('db_decrypt')) {
/**
* Decrpyt value.
*
Expand All @@ -32,8 +32,7 @@ function db_decrypt($column)
}
}


if (! function_exists('db_decrypt_string')) {
if (!function_exists('db_decrypt_string')) {
/**
* Decrpyt value.
*
Expand All @@ -44,6 +43,36 @@ function db_decrypt($column)
*/
function db_decrypt_string($column, $value, $operator = 'LIKE')
{
return 'AES_DECRYPT('.$column.', "'.config("mysql-encrypt.key").'") '.$operator.' "'.$value.'" COLLATE utf8mb4_general_ci';
return 'AES_DECRYPT(' . $column . ', "' . config("mysql-encrypt.key") . '") ' . $operator . ' "' . $value . '" COLLATE utf8mb4_general_ci';
}
}

if (!function_exists('db_decrypt_string_like')) {
/**
* Decrpyt value.
*
* @param string $column
* @param string $value
* @param string $operator
* @return string
*/
function db_decrypt_string_like($column, $value, $operator = 'LIKE')
{
return 'AES_DECRYPT(' . $column . ', "' . config("mysql-encrypt.key") . '") ' . $operator . ' "%' . $value . '%" COLLATE utf8mb4_general_ci';
}
}

if (!function_exists('db_decrypt_string_sort')) {
/**
* Decrpyt value.
*
* @param string $column
* @param string $value
* @param string $operator
* @return string
*/
function db_decrypt_string_sort($column, $value)
{
return 'AES_DECRYPT(' . $column . ', "' . config("mysql-encrypt.key") . '") ' . $value;
}
}

0 comments on commit 6be8a7c

Please sign in to comment.