Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create new base64 mime type validation rules #8

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 11 additions & 18 deletions src/Rules/StartsWithMimeType.php → src/Rules/BaseTypeRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,25 @@

use Owowagency\LaravelMedia\Rules\Concerns\ValidatesBase64;

class StartsWithMimeType extends IsBase64
abstract class BaseTypeRule extends IsBase64
{
use ValidatesBase64;

/**
* The mime type to validate.
* The type to validate.
*
* @var string
*/
protected $mimeType;
protected $type;

/**
* StartsWithMimeType constructor.
*
* @param string $mimeType
* @param string $type
*/
public function __construct(string $mimeType)
public function __construct(string $type)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What if we want to validate multiple at once?

{
$this->mimeType = $mimeType;
$this->type = $type;
}

/**
Expand All @@ -38,23 +38,16 @@ public function passes($attribute, $value)
return false;
}

return $this->startsWithMimeType($value);
return $this->validateType($this->getMimeType($value));
}

/**
* Checks if base64 is image.
* Checks if base64 has valid type.
*
* @param string $value
* @param string $mimeType
* @return bool
*/
protected function startsWithMimeType(string $value): bool
{
$mimeType = $this->getMimeType($value);

$exploded = explode('/', $mimeType);

return ($exploded[0] == $this->mimeType);
}
abstract protected function validateType(string $mimeType): bool;

/**
* Get the validation error message.
Expand All @@ -63,6 +56,6 @@ protected function startsWithMimeType(string $value): bool
*/
public function message(): string
{
return trans('validation.custom.is_base_64_type', ['type' => $this->mimeType]);
return trans('validation.custom.is_base_64_type', ['type' => $this->type]);
}
}
28 changes: 0 additions & 28 deletions src/Rules/IsBase64Audio.php

This file was deleted.

28 changes: 0 additions & 28 deletions src/Rules/IsBase64Image.php

This file was deleted.

17 changes: 17 additions & 0 deletions src/Rules/IsBase64MimeType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace Owowagency\LaravelMedia\Rules;

class IsBase64MimeType extends BaseTypeRule
{
/**
* Checks if base64 has a valid MIME type
*
* @param string $mimeType
* @return bool
*/
protected function validateType(string $mimeType): bool
{
return $mimeType == $this->type;
}
}
19 changes: 19 additions & 0 deletions src/Rules/IsBase64Subtype.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Owowagency\LaravelMedia\Rules;

class IsBase64Subtype extends BaseTypeRule
{
/**
* Checks if base64 has a valid subtype.
*
* @param string $mimeType
* @return bool
*/
protected function validateType(string $mimeType): bool
{
$exploded = explode('/', $mimeType);

return $exploded[1] == $this->type;
}
}
48 changes: 6 additions & 42 deletions src/Rules/IsBase64Type.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,18 @@

namespace Owowagency\LaravelMedia\Rules;

use Illuminate\Support\Arr;
use Owowagency\LaravelMedia\Rules\Concerns\ValidatesBase64;

class IsBase64Type extends IsBase64
class IsBase64Type extends BaseTypeRule
{
use ValidatesBase64;

/**
* The base64 types to check in the test.
*
* @var array
*/
private $types;

/**
* Create a notification instance.
*
* @param string|array $type
* @return void
*/
public function __construct($types)
{
$this->types = Arr::wrap($types);
}

/**
* Determine if the validation rule passes.
* Checks if base64 has a valid type.
*
* @param string $attribute
* @param mixed $value
* @param string $mimeType
* @return bool
*/
public function passes($attribute, $value)
protected function validateType(string $mimeType): bool
{
if (! $this->isBase64($value)) {
return false;
}

return in_array($this->getMimeType($value), $this->types);
}
$exploded = explode('/', $mimeType);

/**
* Get the validation error message.
*
* @return string
*/
public function message(): string
{
return trans('validation.custom.is_base_64_type', ['type' => implode(',', $this->types)]);
return $exploded[0] == $this->type;
}
}
8 changes: 4 additions & 4 deletions tests/Unit/Rules/IsBase64AudioTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
namespace Owowagency\LaravelMedia\Tests\Unit\Rules;

use Owowagency\LaravelMedia\Tests\TestCase;
use Owowagency\LaravelMedia\Rules\IsBase64Audio;
use Owowagency\LaravelMedia\Rules\IsBase64Type;

class IsBase64AudioTest extends TestCase
{
/**
* The IsBase64Audio rule instance.
* The rule instance.
*
* @var \Owowagency\LaravelMedia\Rules\IsBase64Audio
* @var \Owowagency\LaravelMedia\Rules\IsBase64Type
*/
private $rule;

Expand All @@ -24,7 +24,7 @@ protected function setUp(): void
parent::setup();

$this->base64 = file_get_contents(__DIR__ . '/../../Support/content/audio');
$this->rule = new IsBase64Audio();
$this->rule = new IsBase64Type('audio');
}

/** @test */
Expand Down
59 changes: 59 additions & 0 deletions tests/Unit/Rules/IsBase64MimeTypeTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

namespace Owowagency\LaravelMedia\Tests\Unit\Rules;

use Owowagency\LaravelMedia\Tests\TestCase;
use Owowagency\LaravelMedia\Rules\IsBase64MimeType;

class IsBase64MimeTypeTest extends TestCase
{
/**
* The IsBase64MimeType rule instance.
*
* @var \Owowagency\LaravelMedia\Rules\IsBase64MimeType
*/
private $rule;

/**
* Setup the test environment.
*
* @return void
*/
protected function setUp(): void
{
parent::setup();

$this->rule = new IsBase64MimeType('image/png');
}

/** @test */
public function passes_valid_mime_type()
{
$this->assertTrue($this->validate($this->base64));
}

/** @test */
public function fails_invalid_mime_type()
{
$txt = 'SWsgaGViIGluIGVlbiBwbGFudGVuYmFrIGdla29zdHMK';

$this->assertFalse($this->validate($txt));
}

/** @test */
public function fails_no_base64()
{
$this->assertFalse($this->validate('no_base_64'));
}

/**
* Validates the rule.
*
* @param mixed $base64
* @return bool
*/
private function validate($base64): bool
{
return $this->rule->passes('', $base64);
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
<?php

namespace Owowagency\LaravelMedia\Tests\Rules;
namespace Owowagency\LaravelMedia\Tests\Unit\Rules;

use Owowagency\LaravelMedia\Tests\TestCase;
use Owowagency\LaravelMedia\Rules\IsBase64Image;
use Owowagency\LaravelMedia\Rules\IsBase64Subtype;

class IsBase64ImageTest extends TestCase
class IsBase64SubtypeTest extends TestCase
{
/**
* The IsBase64Image rule instance.
* The IsBase64Type rule instance.
*
* @var \Owowagency\LaravelMedia\Rules\IsBase64Image
* @var \Owowagency\LaravelMedia\Rules\IsBase64Type
*/
private $rule;

Expand All @@ -23,7 +23,7 @@ protected function setUp(): void
{
parent::setup();

$this->rule = new IsBase64Image;
$this->rule = new IsBase64Subtype('png');
}

/** @test */
Expand Down
16 changes: 13 additions & 3 deletions tests/Unit/Rules/IsBase64TypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,21 @@ protected function setUp(): void
{
parent::setup();

$this->rule = new IsBase64Type(['text/css', 'text/plain']);
$this->rule = new IsBase64Type('text');
}

/** @test */
public function passes_text_css_or_text_plain_file()
public function passes_images()
{
$this->rule = new IsBase64Type('image');

$image = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk/g8AAQsBBD48D9kAAAAASUVORK5CYII=';

$this->assertTrue($this->validate($image));
}

/** @test */
public function passes_text_css_file()
{
$this->assertTrue($this->validate($this->base64));
}
Expand All @@ -46,7 +56,7 @@ public function fails_no_base64()
}

/** @test */
public function fails_no_text_css_or_text_plain_file()
public function fails_no_text_css_file()
{
$image = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk/g8AAQsBBD48D9kAAAAASUVORK5CYII=';

Expand Down