2017-05-05 00:46:59 +03:00
< ? php
2018-06-13 22:25:21 +03:00
declare ( strict_types = 1 );
2017-05-05 00:46:59 +03:00
/**
* @ copyright Copyright ( c ) 2017 Lukas Reschke < lukas @ statuscode . ch >
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
*
*/
namespace OCA\OAuth2\Controller ;
2017-05-12 17:14:32 +03:00
use OC\Authentication\Token\DefaultTokenMapper ;
use OCA\OAuth2\Db\AccessTokenMapper ;
2017-05-05 00:46:59 +03:00
use OCA\OAuth2\Db\Client ;
use OCA\OAuth2\Db\ClientMapper ;
use OCP\AppFramework\Controller ;
2018-06-26 16:27:20 +03:00
use OCP\AppFramework\Http ;
2018-06-08 10:52:27 +03:00
use OCP\AppFramework\Http\JSONResponse ;
2018-06-26 16:27:20 +03:00
use OCP\IL10N ;
2017-05-05 00:46:59 +03:00
use OCP\IRequest ;
use OCP\Security\ISecureRandom ;
class SettingsController extends Controller {
/** @var ClientMapper */
private $clientMapper ;
/** @var ISecureRandom */
private $secureRandom ;
2017-05-12 17:14:32 +03:00
/** @var AccessTokenMapper */
private $accessTokenMapper ;
/** @var DefaultTokenMapper */
private $defaultTokenMapper ;
2018-06-26 16:27:20 +03:00
/** @var IL10N */
private $l ;
2017-05-05 00:46:59 +03:00
const validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' ;
/**
* @ param string $appName
* @ param IRequest $request
* @ param ClientMapper $clientMapper
* @ param ISecureRandom $secureRandom
2017-05-12 17:14:32 +03:00
* @ param AccessTokenMapper $accessTokenMapper
* @ param DefaultTokenMapper $defaultTokenMapper
2017-05-05 00:46:59 +03:00
*/
2018-06-08 10:52:27 +03:00
public function __construct ( string $appName ,
2017-05-05 00:46:59 +03:00
IRequest $request ,
ClientMapper $clientMapper ,
2017-05-12 17:14:32 +03:00
ISecureRandom $secureRandom ,
AccessTokenMapper $accessTokenMapper ,
2018-06-26 16:27:20 +03:00
DefaultTokenMapper $defaultTokenMapper ,
IL10N $l
2017-05-12 17:14:32 +03:00
) {
2017-05-05 00:46:59 +03:00
parent :: __construct ( $appName , $request );
$this -> secureRandom = $secureRandom ;
$this -> clientMapper = $clientMapper ;
2017-05-12 17:14:32 +03:00
$this -> accessTokenMapper = $accessTokenMapper ;
$this -> defaultTokenMapper = $defaultTokenMapper ;
2018-06-26 16:27:20 +03:00
$this -> l = $l ;
2017-05-05 00:46:59 +03:00
}
2018-06-08 10:52:27 +03:00
public function addClient ( string $name ,
string $redirectUri ) : JSONResponse {
2018-06-26 16:27:20 +03:00
if ( filter_var ( $redirectUri , FILTER_VALIDATE_URL , FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_HOST_REQUIRED ) === false ) {
return new JSONResponse ([ 'message' => $this -> l -> t ( 'Your redirect url needs to be a full url for example: https://yourdomain.com/path' )], Http :: STATUS_BAD_REQUEST );
}
2017-05-05 00:46:59 +03:00
$client = new Client ();
$client -> setName ( $name );
$client -> setRedirectUri ( $redirectUri );
$client -> setSecret ( $this -> secureRandom -> generate ( 64 , self :: validChars ));
$client -> setClientIdentifier ( $this -> secureRandom -> generate ( 64 , self :: validChars ));
2018-06-08 10:52:27 +03:00
$client = $this -> clientMapper -> insert ( $client );
$result = [
'id' => $client -> getId (),
'name' => $client -> getName (),
'redirectUri' => $client -> getRedirectUri (),
'clientId' => $client -> getClientIdentifier (),
'clientSecret' => $client -> getSecret (),
];
return new JSONResponse ( $result );
2017-05-05 00:46:59 +03:00
}
2018-06-08 10:52:27 +03:00
public function deleteClient ( int $id ) : JSONResponse {
2017-05-12 17:14:32 +03:00
$client = $this -> clientMapper -> getByUid ( $id );
$this -> accessTokenMapper -> deleteByClientId ( $id );
$this -> defaultTokenMapper -> deleteByName ( $client -> getName ());
2017-05-05 00:46:59 +03:00
$this -> clientMapper -> delete ( $client );
2018-06-08 10:52:27 +03:00
return new JSONResponse ([]);
}
public function getClients () : JSONResponse {
$clients = $this -> clientMapper -> getClients ();
$result = [];
foreach ( $clients as $client ) {
$result [] = [
'id' => $client -> getId (),
'name' => $client -> getName (),
'redirectUri' => $client -> getRedirectUri (),
'clientId' => $client -> getClientIdentifier (),
'clientSecret' => $client -> getSecret (),
];
}
return new JSONResponse ( $result );
2017-05-05 00:46:59 +03:00
}
}