inital commit
This commit is contained in:
commit
499efe73d6
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
vendor/
|
||||
composer.lock
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2017 meta-tech.academy
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# MetaTech Silex Core Package
|
||||
|
||||
Core package for silex2 applications
|
35
composer.json
Normal file
35
composer.json
Normal file
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"name" : "meta-tech/silex-core",
|
||||
"type" : "library",
|
||||
"homepage" : "https://github.com/meta-tech/silex-core",
|
||||
"description" : "meta-tech silex-core package for silex2 applications",
|
||||
"license" : "MIT",
|
||||
"authors" : [
|
||||
{
|
||||
"name" : "a-Sansara",
|
||||
"homepage" : "https://github.com/a-sansara/"
|
||||
}
|
||||
],
|
||||
"keywords" : ["Silex", "Core", "WebService"],
|
||||
"autoload" : {
|
||||
"psr-4" : {
|
||||
"" : "src/"
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"meta-tech/pws-auth" : "@dev",
|
||||
"meta-tech/silex-controller-service" : "@dev",
|
||||
"silex/silex": "~2.0",
|
||||
"gecko-packages/gecko-silex-config-service": "^2.0"
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/meta-tech/pws-auth.git"
|
||||
},
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/meta-tech/silex-controller-service.git"
|
||||
}
|
||||
]
|
||||
}
|
10
config/main.yml.dist
Normal file
10
config/main.yml.dist
Normal file
|
@ -0,0 +1,10 @@
|
|||
env :
|
||||
name : local
|
||||
prod : 0
|
||||
debug : 1
|
||||
url : pwsserver.docker
|
||||
protocol : http
|
||||
|
||||
info :
|
||||
app_name : pwsserver
|
||||
version : 1.0.2
|
22
config/pwsauth.yml.dist
Normal file
22
config/pwsauth.yml.dist
Normal file
|
@ -0,0 +1,22 @@
|
|||
type : PwsAuth2
|
||||
|
||||
header :
|
||||
auth : Pws-Authorization
|
||||
ident : Pws-Ident
|
||||
|
||||
salt :
|
||||
common : jK5#p9Mh5.Zv}
|
||||
# used for generating user specific salt
|
||||
user.index : 10
|
||||
user.length : 12
|
||||
|
||||
hash :
|
||||
sep : /
|
||||
algo : sha256
|
||||
# effective token length size. out of bound data is simply noise
|
||||
length : 52
|
||||
# session index (or obfuscate length)
|
||||
session.index : 58
|
||||
# ending noise data length)
|
||||
noise.length : 12
|
||||
|
83
src/MetaTech/Silex/Application.php
Normal file
83
src/MetaTech/Silex/Application.php
Normal file
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
/*
|
||||
* This file is part of the silex-core package.
|
||||
*
|
||||
* (c) meta-tech.academy
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace MetaTech\Silex;
|
||||
|
||||
use Silex\Application as BaseApplication;
|
||||
use Silex\Provider\SessionServiceProvider;
|
||||
use Silex\Provider\ServiceControllerServiceProvider;
|
||||
use GeckoPackages\Silex\Services\Config\ConfigServiceProvider;
|
||||
|
||||
/*!
|
||||
* @package MetaTech\Silex
|
||||
* @class Application
|
||||
* @extends Silex\Application
|
||||
* @author a-Sansara
|
||||
* @date 2017-03-12 21:46:43 CET
|
||||
*/
|
||||
class Application extends BaseApplication
|
||||
{
|
||||
/*!
|
||||
* @@constrcutor
|
||||
* @public
|
||||
* @param [] $values
|
||||
*/
|
||||
public function __construct(array $values = array())
|
||||
{
|
||||
parent::__construct();
|
||||
foreach ($values as $k => $v) {
|
||||
$this[$k] = $v;
|
||||
}
|
||||
$this->setProviders();
|
||||
$this->setServices();
|
||||
$this->setGlobals();
|
||||
$this->routingDefinition();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method setProviders
|
||||
* @protected
|
||||
*/
|
||||
protected function setProviders()
|
||||
{
|
||||
$this->register(new ConfigServiceProvider('config'), [
|
||||
'config.dir' => $this['path'].'/config/',
|
||||
'config.format' => '%key%.yml'
|
||||
]);
|
||||
$this->register(new SessionServiceProvider());
|
||||
$this->register(new ServiceControllerServiceProvider());
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method setServices
|
||||
* @protected
|
||||
*/
|
||||
protected function setServices()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method setGlobals
|
||||
* @protected
|
||||
*/
|
||||
protected function setGlobals()
|
||||
{
|
||||
$this['debug'] = boolval($this['config']['main']['env']['debug']);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method routingDefinition
|
||||
* @protected
|
||||
*/
|
||||
protected function routingDefinition()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
70
src/MetaTech/Silex/Ctrl/Base.php
Normal file
70
src/MetaTech/Silex/Ctrl/Base.php
Normal file
|
@ -0,0 +1,70 @@
|
|||
<?php
|
||||
/*
|
||||
* This file is part of the silex-core package.
|
||||
*
|
||||
* (c) meta-tech.academy
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace MetaTech\Silex\Ctrl;
|
||||
|
||||
use Silex\Application;
|
||||
use Silex\Api\ControllerProviderInterface;
|
||||
use Silex\ControllerCollection;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
/*!
|
||||
* @package MetaTech\silex\Ctrl
|
||||
* @class Base
|
||||
* @abstract
|
||||
* @implements Silex\Api\ControllerProviderInterface
|
||||
* @author a-Sansara
|
||||
* @date 2017-03-12 15:34:26 CET
|
||||
*/
|
||||
abstract class Base implements ControllerProviderInterface
|
||||
{
|
||||
const PRIORITY = Application::EARLY_EVENT;
|
||||
const NS = 'ctrl.';
|
||||
|
||||
/*!
|
||||
* @constrcutor
|
||||
* @param Silex\Application $silex
|
||||
*/
|
||||
public function __construct(Application $app = null)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function ns()
|
||||
{
|
||||
return static::NS . (new \ReflectionClass(static::class))->getShortName();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method init
|
||||
* @public
|
||||
* @param Silex\Application $app
|
||||
*/
|
||||
public function before(Request $request, Application $app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method connect
|
||||
* @public
|
||||
* @param Silex\Application $app
|
||||
* @return Silex\ControllerCollection
|
||||
*/
|
||||
public function connect(Application $app)
|
||||
{
|
||||
$collection = $app['controllers_factory'];
|
||||
$ctrl = $this;
|
||||
$collection->before(function(Request $request, Application $app) use ($ctrl) {
|
||||
return $ctrl->before($request, $app);
|
||||
}, static::PRIORITY);
|
||||
//~ var_dump($collection);
|
||||
return $this->routing($collection);
|
||||
}
|
||||
}
|
164
src/MetaTech/Silex/Ws/Authentication.php
Normal file
164
src/MetaTech/Silex/Ws/Authentication.php
Normal file
|
@ -0,0 +1,164 @@
|
|||
<?php
|
||||
/*
|
||||
* This file is part of the silex-core package.
|
||||
*
|
||||
* (c) meta-tech.academy
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace MetaTech\Silex\Ws;
|
||||
|
||||
use Silex\Application;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Session\Session;
|
||||
use MetaTech\PwsAuth\Authenticator;
|
||||
use MetaTech\PwsAuth\Token;
|
||||
|
||||
/*!
|
||||
* @package MetaTech\Silex\Ws
|
||||
* @class Authentication
|
||||
* @author a-Sansara
|
||||
* @date 2017-03-12 16:04:40 CET
|
||||
*/
|
||||
class Authentication
|
||||
{
|
||||
/*! @protected @®ar Symfony\Component\HttpFoundation\Session\Session $session */
|
||||
protected $session;
|
||||
/*! @protected @®ar MetaTech\PwsAuth\Authenticator $authenticator */
|
||||
protected $authenticator;
|
||||
|
||||
/*!
|
||||
* @constructor
|
||||
* @public
|
||||
* @param Symfony\Component\HttpFoundation\Session\Session $session
|
||||
* @param MetaTech\PwsAuth\Authenticator $authenticator
|
||||
*/
|
||||
public function __construct(Session $session, Authenticator $authenticator)
|
||||
{
|
||||
$this->session = $session;
|
||||
$this->authenticator = $authenticator;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method isAllowedRoute
|
||||
* @public
|
||||
* @param str $route
|
||||
* @return bool
|
||||
*/
|
||||
public function isAllowedRoute($route)
|
||||
{
|
||||
$allowed = false;
|
||||
$p = '/ws/public/';
|
||||
if (in_array($route, ['/ws/auth']) || substr($route, 0, strlen($p)) == $p) {
|
||||
$allowed = true;
|
||||
}
|
||||
return $allowed;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method sessionInvalidate
|
||||
* @public
|
||||
*/
|
||||
public function sessionInvalidate()
|
||||
{
|
||||
$this->session->invalidate(1);
|
||||
$this->session->save();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method checkUser
|
||||
* @public
|
||||
* @param str $login
|
||||
* @param str $password
|
||||
* @param str $key
|
||||
* @return bool
|
||||
*/
|
||||
public function checkUser($login, $password, $key)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method auth
|
||||
* @param Symfony\Component\HttpFoundation\Request $request
|
||||
* @public
|
||||
*/
|
||||
public function auth(Request $request)
|
||||
{
|
||||
$this->sessionInvalidate();
|
||||
$done = false;
|
||||
$msg = 'authentication require';
|
||||
$token = $this->authenticator->getToken();
|
||||
if ($this->authenticator->isValid($token)) {
|
||||
$login = $request->get('login');
|
||||
$password = $request->get('password');
|
||||
if ($done = $this->authenticator->check($token, $login)) {
|
||||
if ($this->checkUser($login, $password, $token->getIdent())) {
|
||||
$sid = $this->onSuccess($token, $login);
|
||||
$msg = "authentication sucessful ! logged as $login";
|
||||
$data = compact('sid');
|
||||
}
|
||||
}
|
||||
}
|
||||
return new JsonResponse(compact('done', 'msg', 'data'), $done ? 200 : 401);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method onsuccess
|
||||
* @public
|
||||
* @param MetaTech\PwsAuth\Token $token
|
||||
* @param str $login
|
||||
*/
|
||||
public function onsuccess(Token $token, $login)
|
||||
{
|
||||
$this->session->start();
|
||||
$sid = $this->session->getId();
|
||||
$user = new \stdclass();
|
||||
$user->key = $token->getIdent();
|
||||
$user->login = $login;
|
||||
$this->session->set('user', $user);
|
||||
$this->session->save();
|
||||
return $sid;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method check
|
||||
* @public
|
||||
* @param Symfony\Component\HttpFoundation\Request $request
|
||||
* @return void | Symfony\Component\HttpFoundation\JsonResponse
|
||||
*/
|
||||
public function check(Request $request)
|
||||
{
|
||||
if (!$this->isAllowedRoute($request->getPathInfo())) {
|
||||
$this->sessionInvalidate();
|
||||
$done = false;
|
||||
$msg = "authentication require";
|
||||
try {
|
||||
$token = $this->authenticator->getToken();
|
||||
|
||||
if ($this->authenticator->isValid($token)) {
|
||||
$sid = $this->authenticator->getSessionId($token);
|
||||
$this->session->setId($sid);
|
||||
$this->session->start();
|
||||
$user = $this->session->get('user');
|
||||
// done : lets controller takes hand
|
||||
if (!is_null($user) && $user->key == $token->getIdent()) {
|
||||
$user->wskey = $token->getValue();
|
||||
$this->session->set('user', $user);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
$this->sessionInvalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(\Exception $e) {
|
||||
$done = false;
|
||||
$msg = $e->getMessage();
|
||||
}
|
||||
return new JsonResponse(compact('done', 'msg'), 401);
|
||||
}
|
||||
}
|
||||
}
|
129
src/MetaTech/Silex/Ws/Controller.php
Normal file
129
src/MetaTech/Silex/Ws/Controller.php
Normal file
|
@ -0,0 +1,129 @@
|
|||
<?php
|
||||
/*
|
||||
* This file is part of the silex-core package.
|
||||
*
|
||||
* (c) meta-tech.academy
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace MetaTech\Silex\Ws;
|
||||
|
||||
use Silex\Application;
|
||||
use Silex\ControllerCollection;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use MetaTech\Silex\Ctrl\Base;
|
||||
use MetaTech\Silex\Ws\Authentication;
|
||||
|
||||
/*!
|
||||
* @package MetaTech\Silex\Ws
|
||||
* @class Controller
|
||||
* @extends MetaTech\Core\Ctrl\Base
|
||||
* @author a-Sansara
|
||||
* @date 2017-03-12 15:39:30 CET
|
||||
*/
|
||||
class Controller extends Base
|
||||
{
|
||||
/*! @protected @var MetaTech\Core\Ws\Authentication $handler */
|
||||
protected $handler;
|
||||
/*! @protected @var Symfony\Component\HttpFoundation\Session\Session $session */
|
||||
protected $session;
|
||||
|
||||
/*!
|
||||
* @constrcutor
|
||||
* @public
|
||||
* @param Silex\Application $app
|
||||
*/
|
||||
public function __construct(Application $app = null)
|
||||
{
|
||||
$this->session = $app['session'];
|
||||
$this->handler = new Authentication($this->session, $app['ws.authenticator']);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method response
|
||||
* @public
|
||||
* @param bool $done
|
||||
* @param str $msg
|
||||
* @param [] $data
|
||||
* @return Symfony\Component\HttpFoundation\JsonResponse
|
||||
*/
|
||||
public function response($done = false, $msg = "fail", $data = null)
|
||||
{
|
||||
if (is_null($data)) {
|
||||
unset($data);
|
||||
}
|
||||
$response = new JsonResponse(compact('done', 'msg', 'data'), 200);
|
||||
return $response;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method before
|
||||
* @public
|
||||
* @param Symfony\Component\HttpFoundation\Request $request
|
||||
* @param Silex\Application $app
|
||||
* @return
|
||||
*/
|
||||
public function before(Request $request, Application $app)
|
||||
{
|
||||
return $this->handler->check($request);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method auth
|
||||
* @public
|
||||
* @return Symfony\Component\HttpFoundation\JsonResponse
|
||||
*/
|
||||
public function auth(Request $request)
|
||||
{
|
||||
return $this->handler->auth($request);
|
||||
}
|
||||
|
||||
/*!
|
||||
* Authentication handler already check that user is authenticate.
|
||||
* This is just the response
|
||||
*
|
||||
* @method isAuthenticate
|
||||
* @public
|
||||
* @return Symfony\Component\HttpFoundation\JsonResponse
|
||||
*/
|
||||
public function isAuthenticate()
|
||||
{
|
||||
$done = true;
|
||||
$user = $this->session->get('user');
|
||||
$msg = 'logged as '.$user->login;
|
||||
return $this->response($done, $msg);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method logout
|
||||
* @public
|
||||
* @return Symfony\Component\HttpFoundation\JsonResponse
|
||||
*/
|
||||
public function logout()
|
||||
{
|
||||
$this->handler->sessionInvalidate();
|
||||
$sessid = $this->session->getId();
|
||||
$done = true;
|
||||
$msg = 'session logout';
|
||||
return $this->response($done, $msg);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @method routing
|
||||
* @public
|
||||
* @param Silex\ControllerCollection $collection
|
||||
* @return Silex\ControllerCollection
|
||||
*/
|
||||
public function routing(ControllerCollection $collection) : ControllerCollection
|
||||
{
|
||||
$_ = $this->ns();
|
||||
|
||||
$collection->match('/auth' , "$_:auth");
|
||||
$collection->match('/logout' , "$_:logout");
|
||||
$collection->match('/isauth' , "$_:isAuthenticate");
|
||||
|
||||
return $collection;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user