1
0
Fork 0
mirror of synced 2024-06-28 19:20:25 +12:00
appwrite/src/Appwrite/Network/Validator/Origin.php

152 lines
3.8 KiB
PHP
Raw Normal View History

2020-04-14 17:44:15 +12:00
<?php
2020-06-12 07:36:10 +12:00
namespace Appwrite\Network\Validator;
2020-04-14 17:44:15 +12:00
use Utopia\Validator;
class Origin extends Validator
{
const CLIENT_TYPE_UNKNOWN = 'unknown';
const CLIENT_TYPE_WEB = 'web';
const CLIENT_TYPE_FLUTTER_IOS = 'flutter-ios';
const CLIENT_TYPE_FLUTTER_ANDROID = 'flutter-android';
const CLIENT_TYPE_FLUTTER_MACOS = 'flutter-macos';
const CLIENT_TYPE_FLUTTER_WINDOWS = 'flutter-windows';
const CLIENT_TYPE_FLUTTER_LINUX = 'flutter-linux';
2021-06-10 21:35:16 +12:00
const CLIENT_TYPE_ANDROID = 'android';
const CLIENT_TYPE_IOS = 'ios';
2021-06-10 21:35:16 +12:00
2020-04-14 17:44:15 +12:00
const SCHEME_TYPE_HTTP = 'http';
const SCHEME_TYPE_HTTPS = 'https';
const SCHEME_TYPE_IOS = 'appwrite-ios';
const SCHEME_TYPE_ANDROID = 'appwrite-android';
const SCHEME_TYPE_MACOS = 'appwrite-macos';
const SCHEME_TYPE_WINDOWS = 'appwrite-windows';
const SCHEME_TYPE_LINUX = 'appwrite-linux';
/**
* @var array
*/
protected $platforms = [
self::SCHEME_TYPE_HTTP => 'Web',
self::SCHEME_TYPE_HTTPS => 'Web',
self::SCHEME_TYPE_IOS => 'iOS',
self::SCHEME_TYPE_ANDROID => 'Android',
self::SCHEME_TYPE_MACOS => 'macOS',
self::SCHEME_TYPE_WINDOWS => 'Windows',
self::SCHEME_TYPE_LINUX => 'Linux',
];
/**
* @var array
*/
protected $clients = [
];
/**
* @var string
*/
protected $client = self::CLIENT_TYPE_UNKNOWN;
/**
* @var string
*/
protected $host = '';
/**
* @param string $target
*/
public function __construct($platforms)
{
2020-06-25 09:02:27 +12:00
foreach ($platforms as $platform) {
2020-04-14 17:44:15 +12:00
$type = (isset($platform['type'])) ? $platform['type'] : '';
switch ($type) {
case self::CLIENT_TYPE_WEB:
$this->clients[] = (isset($platform['hostname'])) ? $platform['hostname'] : '';
break;
case self::CLIENT_TYPE_FLUTTER_IOS:
case self::CLIENT_TYPE_FLUTTER_ANDROID:
case self::CLIENT_TYPE_FLUTTER_MACOS:
case self::CLIENT_TYPE_FLUTTER_WINDOWS:
case self::CLIENT_TYPE_FLUTTER_LINUX:
2021-06-10 21:35:16 +12:00
case self::CLIENT_TYPE_ANDROID:
case self::CLIENT_TYPE_IOS:
2020-04-14 17:44:15 +12:00
$this->clients[] = (isset($platform['key'])) ? $platform['key'] : '';
break;
default:
# code...
break;
}
}
}
public function getDescription()
{
2020-06-25 09:02:27 +12:00
if (!\array_key_exists($this->client, $this->platforms)) {
2020-04-14 17:44:15 +12:00
return 'Unsupported platform';
}
return 'Invalid Origin. Register your new client ('.$this->host.') as a new '
.$this->platforms[$this->client].' platform on your project console dashboard';
2020-04-14 17:44:15 +12:00
}
/**
2021-06-10 21:43:32 +12:00
* Check if Origin has been allowed
2020-04-14 17:44:15 +12:00
* for access to the API
2020-06-25 09:05:16 +12:00
*
* @param mixed $origin
2020-04-14 17:44:15 +12:00
*
* @return bool
*/
public function isValid($origin)
{
2020-10-28 08:44:15 +13:00
if (!is_string($origin)) {
return false;
}
$scheme = \parse_url($origin, PHP_URL_SCHEME);
$host = \parse_url($origin, PHP_URL_HOST);
2020-04-14 17:44:15 +12:00
$this->host = $host;
$this->client = $scheme;
2020-06-25 09:02:27 +12:00
if (empty($host)) {
2020-04-14 17:44:15 +12:00
return true;
}
2020-06-25 09:02:27 +12:00
if (\in_array($host, $this->clients)) {
2020-04-14 17:44:15 +12:00
return true;
}
return false;
}
/**
* Is array
*
* Function will return true if object is array.
*
* @return bool
*/
public function isArray(): bool
{
return false;
}
/**
* Get Type
*
* Returns validator type.
*
* @return string
*/
public function getType(): string
{
return self::TYPE_STRING;
}
2020-04-14 17:44:15 +12:00
}