Added Rabbit MQ config
added endpoint /api/v1/users/{id} scope users-read-all Change-Id: Ibe066b728b460052c619a2fcb0e83b8225543a1f Signed-off-by: smarcet <smarcet@gmail.com>
This commit is contained in:
parent
a20eb03b69
commit
68c10a2765
16
.env.example
16
.env.example
@ -65,4 +65,18 @@ BANNING_ENABLE=
|
|||||||
SUPPORT_EMAIL=
|
SUPPORT_EMAIL=
|
||||||
USER_SPAM_PROCESSOR_TO=
|
USER_SPAM_PROCESSOR_TO=
|
||||||
MAIL_FROM_EMAIL="noreply@openstack.org"
|
MAIL_FROM_EMAIL="noreply@openstack.org"
|
||||||
MAIL_FROM_NAME="noreply@openstack.org"
|
MAIL_FROM_NAME="noreply@openstack.org"
|
||||||
|
|
||||||
|
## RABBIT MQ
|
||||||
|
RABBITMQ_EXCHANGE_NAME=databus-exchange
|
||||||
|
RABBITMQ_HOST=
|
||||||
|
RABBITMQ_PORT=5671
|
||||||
|
RABBITMQ_VHOST=databus
|
||||||
|
RABBITMQ_LOGIN=admin
|
||||||
|
RABBITMQ_PASSWORD=1qaz2wsx
|
||||||
|
RABBITMQ_QUEUE=default
|
||||||
|
RABBITMQ_SSL=true
|
||||||
|
RABBITMQ_SSL_CAFILE=/certs/rabbit/ca-osf.pem
|
||||||
|
RABBITMQ_SSL_LOCALCERT=/certs/rabbit/client-cert-osf.pem
|
||||||
|
RABBITMQ_SSL_LOCALKEY=/certs/rabbit/client-key-osf.pem
|
||||||
|
RABBITMQ_SSL_VERIFY_PEER=false
|
@ -13,53 +13,66 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
use App\Http\Controllers\GetAllTrait;
|
use App\Http\Controllers\GetAllTrait;
|
||||||
|
use App\Http\Utils\PagingConstants;
|
||||||
use App\ModelSerializers\SerializerRegistry;
|
use App\ModelSerializers\SerializerRegistry;
|
||||||
use Auth\Repositories\IUserRepository;
|
use Auth\Repositories\IUserRepository;
|
||||||
|
use Illuminate\Support\Facades\Input;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Support\Facades\Response;
|
use Illuminate\Support\Facades\Response;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use models\exceptions\EntityNotFoundException;
|
||||||
|
use models\exceptions\ValidationException;
|
||||||
use OAuth2\Builders\IdTokenBuilder;
|
use OAuth2\Builders\IdTokenBuilder;
|
||||||
use OAuth2\IResourceServerContext;
|
use OAuth2\IResourceServerContext;
|
||||||
use OAuth2\Repositories\IClientRepository;
|
use OAuth2\Repositories\IClientRepository;
|
||||||
use OAuth2\ResourceServer\IUserService;
|
use OAuth2\ResourceServer\IUserService;
|
||||||
|
use utils\Filter;
|
||||||
|
use utils\FilterParser;
|
||||||
use Utils\Http\HttpContentType;
|
use Utils\Http\HttpContentType;
|
||||||
|
use utils\OrderParser;
|
||||||
|
use utils\PagingInfo;
|
||||||
use Utils\Services\ILogService;
|
use Utils\Services\ILogService;
|
||||||
use Exception;
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class OAuth2UserApiController
|
* Class OAuth2UserApiController
|
||||||
* @package App\Http\Controllers\Api\OAuth2
|
* @package App\Http\Controllers\Api\OAuth2
|
||||||
*/
|
*/
|
||||||
final class OAuth2UserApiController extends OAuth2ProtectedController
|
final class OAuth2UserApiController extends OAuth2ProtectedController
|
||||||
{
|
{
|
||||||
use GetAllTrait;
|
use GetAllTrait;
|
||||||
|
|
||||||
protected function getAllSerializerType():string{
|
protected function getAllSerializerType(): string
|
||||||
|
{
|
||||||
return SerializerRegistry::SerializerType_Private;
|
return SerializerRegistry::SerializerType_Private;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
protected function getFilterRules():array
|
protected function getFilterRules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'first_name' => ['=@', '=='],
|
'first_name' => ['=@', '=='],
|
||||||
'last_name' => ['=@', '=='],
|
'last_name' => ['=@', '=='],
|
||||||
'email' => ['=@', '=='],
|
'email' => ['=@', '=='],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOrderRules():array{
|
public function getOrderRules(): array
|
||||||
|
{
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
protected function getFilterValidatorRules():array
|
protected function getFilterValidatorRules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'first_name' => 'sometimes|required|string',
|
'first_name' => 'sometimes|required|string',
|
||||||
'last_name' => 'sometimes|required|string',
|
'last_name' => 'sometimes|required|string',
|
||||||
'email' => 'sometimes|required|string',
|
'email' => 'sometimes|required|string',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,10 +110,10 @@ use Exception;
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
parent::__construct($resource_server_context, $log_service);
|
parent::__construct($resource_server_context, $log_service);
|
||||||
$this->repository = $repository;
|
$this->repository = $repository;
|
||||||
$this->user_service = $user_service;
|
$this->user_service = $user_service;
|
||||||
$this->client_repository = $client_repository;
|
$this->client_repository = $client_repository;
|
||||||
$this->id_token_builder = $id_token_builder;
|
$this->id_token_builder = $id_token_builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -109,13 +122,10 @@ use Exception;
|
|||||||
*/
|
*/
|
||||||
public function me()
|
public function me()
|
||||||
{
|
{
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
$data = $this->user_service->getCurrentUserInfo();
|
$data = $this->user_service->getCurrentUserInfo();
|
||||||
return $this->ok($data);
|
return $this->ok($data);
|
||||||
}
|
} catch (Exception $ex) {
|
||||||
catch(Exception $ex)
|
|
||||||
{
|
|
||||||
$this->log_service->error($ex);
|
$this->log_service->error($ex);
|
||||||
return $this->error500($ex);
|
return $this->error500($ex);
|
||||||
}
|
}
|
||||||
@ -123,11 +133,10 @@ use Exception;
|
|||||||
|
|
||||||
public function userInfo()
|
public function userInfo()
|
||||||
{
|
{
|
||||||
try
|
try {
|
||||||
{
|
$claims = $this->user_service->getCurrentUserInfoClaims();
|
||||||
$claims = $this->user_service->getCurrentUserInfoClaims();
|
|
||||||
$client_id = $this->resource_server_context->getCurrentClientId();
|
$client_id = $this->resource_server_context->getCurrentClientId();
|
||||||
$client = $this->client_repository->getClientById($client_id);
|
$client = $this->client_repository->getClientById($client_id);
|
||||||
|
|
||||||
// The UserInfo Claims MUST be returned as the members of a JSON object unless a signed or encrypted response
|
// The UserInfo Claims MUST be returned as the members of a JSON object unless a signed or encrypted response
|
||||||
// was requested during Client Registration.
|
// was requested during Client Registration.
|
||||||
@ -135,29 +144,47 @@ use Exception;
|
|||||||
|
|
||||||
$sig_alg = $user_info_response_info->getSigningAlgorithm();
|
$sig_alg = $user_info_response_info->getSigningAlgorithm();
|
||||||
$enc_alg = $user_info_response_info->getEncryptionKeyAlgorithm();
|
$enc_alg = $user_info_response_info->getEncryptionKeyAlgorithm();
|
||||||
$enc = $user_info_response_info->getEncryptionContentAlgorithm();
|
$enc = $user_info_response_info->getEncryptionContentAlgorithm();
|
||||||
|
|
||||||
if($sig_alg || ($enc_alg && $enc) )
|
if ($sig_alg || ($enc_alg && $enc)) {
|
||||||
{
|
|
||||||
$jwt = $this->id_token_builder->buildJWT($claims, $user_info_response_info, $client);
|
$jwt = $this->id_token_builder->buildJWT($claims, $user_info_response_info, $client);
|
||||||
$http_response = Response::make($jwt->toCompactSerialization(), 200);
|
$http_response = Response::make($jwt->toCompactSerialization(), 200);
|
||||||
$http_response->header('Content-Type', HttpContentType::JWT);
|
$http_response->header('Content-Type', HttpContentType::JWT);
|
||||||
$http_response->header('Cache-Control','no-cache, no-store, max-age=0, must-revalidate');
|
$http_response->header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate');
|
||||||
$http_response->header('Pragma','no-cache');
|
$http_response->header('Pragma', 'no-cache');
|
||||||
return $http_response;
|
return $http_response;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// return plain json
|
// return plain json
|
||||||
return $this->ok( $claims->toArray() );
|
return $this->ok($claims->toArray());
|
||||||
}
|
}
|
||||||
}
|
} catch (Exception $ex) {
|
||||||
catch(Exception $ex)
|
|
||||||
{
|
|
||||||
$this->log_service->error($ex);
|
$this->log_service->error($ex);
|
||||||
return $this->error500($ex);
|
return $this->error500($ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $id
|
||||||
|
* @return \Illuminate\Http\JsonResponse|mixed
|
||||||
|
*/
|
||||||
|
public function get($id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$user = $this->repository->getById(intval($id));
|
||||||
|
if (is_null($user)) {
|
||||||
|
throw new EntityNotFoundException();
|
||||||
|
}
|
||||||
|
return $this->ok(SerializerRegistry::getInstance()->getSerializer($user, SerializerRegistry::SerializerType_Private)->serialize());
|
||||||
|
} catch (ValidationException $ex1) {
|
||||||
|
Log::warning($ex1);
|
||||||
|
return $this->error412($ex1->getMessages());
|
||||||
|
} catch (EntityNotFoundException $ex2) {
|
||||||
|
Log::warning($ex2);
|
||||||
|
return $this->error404(['message' => $ex2->getMessage()]);
|
||||||
|
} catch (Exception $ex) {
|
||||||
|
Log::error($ex);
|
||||||
|
return $this->error500($ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -376,6 +376,7 @@ Route::group(
|
|||||||
|
|
||||||
Route::group(['prefix' => 'users'], function () {
|
Route::group(['prefix' => 'users'], function () {
|
||||||
Route::get('', 'OAuth2UserApiController@getAll');
|
Route::get('', 'OAuth2UserApiController@getAll');
|
||||||
|
Route::get('/{id}', 'OAuth2UserApiController@get');
|
||||||
Route::get('/me', 'OAuth2UserApiController@me');
|
Route::get('/me', 'OAuth2UserApiController@me');
|
||||||
Route::get('/info', 'OAuth2UserApiController@userInfo');
|
Route::get('/info', 'OAuth2UserApiController@userInfo');
|
||||||
Route::post('/info', 'OAuth2UserApiController@userInfo');
|
Route::post('/info', 'OAuth2UserApiController@userInfo');
|
||||||
|
56
app/Jobs/PublishUserCreated.php
Normal file
56
app/Jobs/PublishUserCreated.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?php namespace App\Jobs;
|
||||||
|
/**
|
||||||
|
* Copyright 2020 OpenStack Foundation
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
||||||
|
|
||||||
|
use Auth\User;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PublishUserCreated
|
||||||
|
* @package App\Jobs
|
||||||
|
*/
|
||||||
|
class PublishUserCreated implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public $user_id;
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $user_email;
|
||||||
|
|
||||||
|
public function __construct(User $newUser)
|
||||||
|
{
|
||||||
|
$this->user_email = $newUser->getEmail();
|
||||||
|
$this->user_id = $newUser->getId();
|
||||||
|
Log::debug(sprintf("PublishUserCreated::PublishUserCreated user %s", $this->user_email));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
55
app/Jobs/PublishUserDeleted.php
Normal file
55
app/Jobs/PublishUserDeleted.php
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?php namespace App\Jobs;
|
||||||
|
/**
|
||||||
|
* Copyright 2020 OpenStack Foundation
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
||||||
|
use Auth\User;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PublishUserDeleted
|
||||||
|
* @package App\Jobs
|
||||||
|
*/
|
||||||
|
class PublishUserDeleted implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public $user_id;
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $user_email;
|
||||||
|
|
||||||
|
public function __construct(User $newUser)
|
||||||
|
{
|
||||||
|
$this->user_email = $newUser->getEmail();
|
||||||
|
$this->user_id = $newUser->getId();
|
||||||
|
Log::debug(sprintf("PublishUserDeleted::PublishUserDeleted user %s", $this->user_email));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
55
app/Jobs/PublishUserUpdated.php
Normal file
55
app/Jobs/PublishUserUpdated.php
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?php namespace App\Jobs;
|
||||||
|
/**
|
||||||
|
* Copyright 2020 OpenStack Foundation
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
||||||
|
use Auth\User;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PublishUserUpdated
|
||||||
|
* @package App\Jobs
|
||||||
|
*/
|
||||||
|
class PublishUserUpdated implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public $user_id;
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $user_email;
|
||||||
|
|
||||||
|
public function __construct(User $newUser)
|
||||||
|
{
|
||||||
|
$this->user_email = $newUser->getEmail();
|
||||||
|
$this->user_id = $newUser->getId();
|
||||||
|
Log::debug(sprintf("PublishUserUpdated::PublishUserUpdated user %s", $this->user_email));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -11,7 +11,12 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
use App\ModelSerializers\BaseSerializer;
|
use App\ModelSerializers\BaseSerializer;
|
||||||
|
use Auth\Group;
|
||||||
|
use Auth\User;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class BaseUserSerializer
|
* Class BaseUserSerializer
|
||||||
* @package App\ModelSerializers\Auth
|
* @package App\ModelSerializers\Auth
|
||||||
@ -19,23 +24,51 @@ use App\ModelSerializers\BaseSerializer;
|
|||||||
class BaseUserSerializer extends BaseSerializer
|
class BaseUserSerializer extends BaseSerializer
|
||||||
{
|
{
|
||||||
protected static $array_mappings = [
|
protected static $array_mappings = [
|
||||||
'FirstName' => 'first_name:json_string',
|
'FirstName' => 'first_name:json_string',
|
||||||
'LastName' => 'last_name:json_string',
|
'LastName' => 'last_name:json_string',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
final class PublicUserSerializer extends BaseUserSerializer {
|
final class PublicUserSerializer extends BaseUserSerializer
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final class PrivateUserSerializer extends BaseUserSerializer {
|
final class PrivateUserSerializer extends BaseUserSerializer
|
||||||
|
{
|
||||||
|
|
||||||
protected static $array_mappings = [
|
protected static $array_mappings = [
|
||||||
'Email' => 'email:json_string',
|
'Email' => 'email:json_string',
|
||||||
'SpamType' => 'spam_type:json_string',
|
'Bio' => 'bio:json_string',
|
||||||
'Identifier' => 'identifier:json_string',
|
'Gender' => 'gender:json_string',
|
||||||
'LastLoginDate' => 'last_login_date:datetime_epoch',
|
'SpamType' => 'spam_type:json_string',
|
||||||
'Active' => 'active:json_boolean',
|
'Identifier' => 'identifier:json_string',
|
||||||
'EmailVerified' => 'email_verified:json_boolean'
|
'LastLoginDate' => 'last_login_date:datetime_epoch',
|
||||||
|
'Active' => 'active:json_boolean',
|
||||||
|
'EmailVerified' => 'email_verified:json_boolean'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param null $expand
|
||||||
|
* @param array $fields
|
||||||
|
* @param array $relations
|
||||||
|
* @param array $params
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function serialize($expand = null, array $fields = [], array $relations = [], array $params = [])
|
||||||
|
{
|
||||||
|
$user = $this->object;
|
||||||
|
if (!$user instanceof User) return [];
|
||||||
|
|
||||||
|
$values = parent::serialize($expand, $fields, $relations, $params);
|
||||||
|
|
||||||
|
$groups = [];
|
||||||
|
foreach ($user->getGroups() as $group) {
|
||||||
|
if (!$group instanceof Group) continue;
|
||||||
|
$groups[] = $group->getSlug();
|
||||||
|
}
|
||||||
|
|
||||||
|
$values['groups'] = $groups;
|
||||||
|
return $values;
|
||||||
|
}
|
||||||
}
|
}
|
@ -17,6 +17,7 @@ use App\Events\UserLocked;
|
|||||||
use App\Events\UserPasswordResetRequestCreated;
|
use App\Events\UserPasswordResetRequestCreated;
|
||||||
use App\Events\UserPasswordResetSuccessful;
|
use App\Events\UserPasswordResetSuccessful;
|
||||||
use App\Events\UserSpamStateUpdated;
|
use App\Events\UserSpamStateUpdated;
|
||||||
|
use App\Jobs\PublishUserCreated;
|
||||||
use App\libs\Auth\Repositories\IUserPasswordResetRequestRepository;
|
use App\libs\Auth\Repositories\IUserPasswordResetRequestRepository;
|
||||||
use App\Mail\UserLockedEmail;
|
use App\Mail\UserLockedEmail;
|
||||||
use App\Mail\UserPasswordResetMail;
|
use App\Mail\UserPasswordResetMail;
|
||||||
@ -30,6 +31,7 @@ use Illuminate\Support\Facades\App;
|
|||||||
use App\Events\UserCreated;
|
use App\Events\UserCreated;
|
||||||
use App\Events\UserEmailVerified;
|
use App\Events\UserEmailVerified;
|
||||||
use Illuminate\Support\Facades\Event;
|
use Illuminate\Support\Facades\Event;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Support\Facades\Mail;
|
use Illuminate\Support\Facades\Mail;
|
||||||
use Illuminate\Support\Facades\Config;
|
use Illuminate\Support\Facades\Config;
|
||||||
use Models\OAuth2\Client;
|
use Models\OAuth2\Client;
|
||||||
@ -80,6 +82,14 @@ final class EventServiceProvider extends ServiceProvider
|
|||||||
Mail::queue(new WelcomeNewUserEmail($user));
|
Mail::queue(new WelcomeNewUserEmail($user));
|
||||||
if(!$user->isEmailVerified() && !$user->hasCreator())
|
if(!$user->isEmailVerified() && !$user->hasCreator())
|
||||||
$user_service->sendVerificationEmail($user);
|
$user_service->sendVerificationEmail($user);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(Config::get("queue.enable_message_broker", false) == true)
|
||||||
|
PublishUserCreated::dispatch($user)->onConnection('message_broker');
|
||||||
|
}
|
||||||
|
catch (\Exception $ex){
|
||||||
|
Log::warning($ex);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Event::listen(UserSpamStateUpdated::class, function($event)
|
Event::listen(UserSpamStateUpdated::class, function($event)
|
||||||
|
@ -11,11 +11,15 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
use App\Jobs\PublishUserUpdated;
|
||||||
use App\libs\Auth\Factories\GroupFactory;
|
use App\libs\Auth\Factories\GroupFactory;
|
||||||
use App\libs\Auth\Repositories\IGroupRepository;
|
use App\libs\Auth\Repositories\IGroupRepository;
|
||||||
use App\Services\AbstractService;
|
use App\Services\AbstractService;
|
||||||
use Auth\Group;
|
use Auth\Group;
|
||||||
use Auth\Repositories\IUserRepository;
|
use Auth\Repositories\IUserRepository;
|
||||||
|
use Illuminate\Support\Facades\Config;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use models\exceptions\EntityNotFoundException;
|
use models\exceptions\EntityNotFoundException;
|
||||||
use models\exceptions\ValidationException;
|
use models\exceptions\ValidationException;
|
||||||
use models\utils\IEntity;
|
use models\utils\IEntity;
|
||||||
@ -148,6 +152,14 @@ final class GroupService extends AbstractService implements IGroupService
|
|||||||
throw new EntityNotFoundException();
|
throw new EntityNotFoundException();
|
||||||
|
|
||||||
$user->addToGroup($group);
|
$user->addToGroup($group);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(Config::get("queue.enable_message_broker", false) == true)
|
||||||
|
PublishUserUpdated::dispatch($user)->onConnection('message_broker');
|
||||||
|
}
|
||||||
|
catch (\Exception $ex){
|
||||||
|
Log::warning($ex);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,6 +177,14 @@ final class GroupService extends AbstractService implements IGroupService
|
|||||||
throw new EntityNotFoundException();
|
throw new EntityNotFoundException();
|
||||||
|
|
||||||
$user->removeFromGroup($group);
|
$user->removeFromGroup($group);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(Config::get("queue.enable_message_broker", false) == true)
|
||||||
|
PublishUserUpdated::dispatch($user)->onConnection('message_broker');
|
||||||
|
}
|
||||||
|
catch (\Exception $ex){
|
||||||
|
Log::warning($ex);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,12 +12,16 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
use App\Events\UserEmailUpdated;
|
use App\Events\UserEmailUpdated;
|
||||||
|
use App\Jobs\PublishUserCreated;
|
||||||
|
use App\Jobs\PublishUserDeleted;
|
||||||
|
use App\Jobs\PublishUserUpdated;
|
||||||
use App\libs\Auth\Factories\UserFactory;
|
use App\libs\Auth\Factories\UserFactory;
|
||||||
use App\libs\Auth\Repositories\IGroupRepository;
|
use App\libs\Auth\Repositories\IGroupRepository;
|
||||||
use App\Services\AbstractService;
|
use App\Services\AbstractService;
|
||||||
use Auth\IUserNameGeneratorService;
|
use Auth\IUserNameGeneratorService;
|
||||||
use Auth\Repositories\IUserRepository;
|
use Auth\Repositories\IUserRepository;
|
||||||
use Auth\User;
|
use Auth\User;
|
||||||
|
use Illuminate\Support\Facades\Config;
|
||||||
use Illuminate\Support\Facades\Event;
|
use Illuminate\Support\Facades\Event;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use models\exceptions\EntityNotFoundException;
|
use models\exceptions\EntityNotFoundException;
|
||||||
@ -258,6 +262,14 @@ final class UserService extends AbstractService implements IUserService
|
|||||||
Event::fire(new UserEmailUpdated($user->getId()));
|
Event::fire(new UserEmailUpdated($user->getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(Config::get("queue.enable_message_broker", false) == true)
|
||||||
|
PublishUserUpdated::dispatch($user)->onConnection('message_broker');
|
||||||
|
}
|
||||||
|
catch (\Exception $ex){
|
||||||
|
Log::warning($ex);
|
||||||
|
}
|
||||||
|
|
||||||
return $user;
|
return $user;
|
||||||
|
|
||||||
});
|
});
|
||||||
@ -275,6 +287,14 @@ final class UserService extends AbstractService implements IUserService
|
|||||||
if(is_null($user) || !$user instanceof User)
|
if(is_null($user) || !$user instanceof User)
|
||||||
throw new EntityNotFoundException("user not found");
|
throw new EntityNotFoundException("user not found");
|
||||||
$this->repository->delete($user);
|
$this->repository->delete($user);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(Config::get("queue.enable_message_broker", false) == true)
|
||||||
|
PublishUserDeleted::dispatch($user)->onConnection('message_broker');
|
||||||
|
}
|
||||||
|
catch (\Exception $ex){
|
||||||
|
Log::warning($ex);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -284,7 +284,7 @@ final class AuthService implements IAuthService
|
|||||||
{
|
{
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$rps = Cookie::get(IAuthService::LOGGED_RELAYING_PARTIES_COOKIE_NAME);
|
$rps = Cookie::get(IAuthService::LOGGED_RELAYING_PARTIES_COOKIE_NAME, "");
|
||||||
$zlib = CompressionAlgorithms_Registry::getInstance()->get(CompressionAlgorithmsNames::ZLib);
|
$zlib = CompressionAlgorithms_Registry::getInstance()->get(CompressionAlgorithmsNames::ZLib);
|
||||||
|
|
||||||
if (!empty($rps)) {
|
if (!empty($rps)) {
|
||||||
|
@ -32,8 +32,8 @@ final class OAuth2AuthorizationRequestFactory
|
|||||||
public function build(OAuth2Message $msg){
|
public function build(OAuth2Message $msg){
|
||||||
|
|
||||||
$auth_request = new OAuth2AuthorizationRequest($msg);
|
$auth_request = new OAuth2AuthorizationRequest($msg);
|
||||||
|
$scope = $auth_request->getScope();
|
||||||
if( str_contains($auth_request->getScope(), OAuth2Protocol::OpenIdConnect_Scope) ) {
|
if(!is_null($scope) && str_contains($scope, OAuth2Protocol::OpenIdConnect_Scope) ) {
|
||||||
$auth_request = new OAuth2AuthenticationRequest($auth_request);
|
$auth_request = new OAuth2AuthenticationRequest($auth_request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,28 +16,29 @@
|
|||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"ext-pdo": "*",
|
"ext-pdo": "*",
|
||||||
"beberlei/DoctrineExtensions": "1.1.5",
|
"beberlei/DoctrineExtensions": "1.1.5",
|
||||||
"ezyang/htmlpurifier": "^4.10",
|
"ezyang/htmlpurifier": "v4.12.0",
|
||||||
"fideloper/proxy": "^4.0",
|
"fideloper/proxy": "^4.0",
|
||||||
"glenscott/url-normalizer": "1.4.*",
|
"glenscott/url-normalizer": "1.4.0",
|
||||||
"greggilbert/recaptcha": "2.1.*",
|
"greggilbert/recaptcha": "2.1.1",
|
||||||
"guzzlehttp/guzzle": "6.3.3",
|
"guzzlehttp/guzzle": "6.3.3",
|
||||||
"ircmaxell/random-lib": "1.1.*",
|
"ircmaxell/random-lib": "1.1.0",
|
||||||
"jenssegers/agent": "2.6.3",
|
"jenssegers/agent": "2.6.3",
|
||||||
"doctrine/orm": "2.6.4",
|
"doctrine/orm": "2.6.4",
|
||||||
"doctrine/persistence": "1.1.1",
|
"doctrine/persistence": "1.1.1",
|
||||||
"laravel-doctrine/extensions": "1.0.*",
|
"laravel-doctrine/extensions": "1.0.14",
|
||||||
"laravel-doctrine/migrations": "^1.2",
|
"laravel-doctrine/migrations": "1.2.0",
|
||||||
"laravel-doctrine/orm": "1.4.11",
|
"laravel-doctrine/orm": "1.4.11",
|
||||||
"laravel/framework": "5.6.*",
|
"laravel/framework": "5.6.39",
|
||||||
"laravel/tinker": "^1.0",
|
"laravel/tinker": "^1.0",
|
||||||
"laravelcollective/html": "5.6.*",
|
"laravelcollective/html": "5.6.10",
|
||||||
"phpseclib/phpseclib": "2.0.11",
|
"phpseclib/phpseclib": "2.0.11",
|
||||||
"predis/predis": "1.0.*",
|
"predis/predis": "v1.0.4",
|
||||||
"s-ichikawa/laravel-sendgrid-driver": "^2.0",
|
"s-ichikawa/laravel-sendgrid-driver": "2.1.0",
|
||||||
"smarcet/jose4php": "1.0.17",
|
"smarcet/jose4php": "1.0.17",
|
||||||
"sokil/php-isocodes": "^3.0",
|
"sokil/php-isocodes": "^3.0",
|
||||||
"zendframework/zend-crypt": "3.3.0",
|
"zendframework/zend-crypt": "3.3.0",
|
||||||
"zendframework/zend-math": "3.1.1"
|
"zendframework/zend-math": "3.1.1",
|
||||||
|
"vladimir-yuldashev/laravel-queue-rabbitmq": "v7.5.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"filp/whoops": "^2.0",
|
"filp/whoops": "^2.0",
|
||||||
|
1112
composer.lock
generated
1112
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -17,7 +17,7 @@ return [
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
'default' => env('QUEUE_DRIVER', 'database'),
|
'default' => env('QUEUE_DRIVER', 'database'),
|
||||||
|
'enable_message_broker' => env("ENABLE_MESSAGE_BROKER", false),
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Queue Connections
|
| Queue Connections
|
||||||
@ -39,6 +39,102 @@ return [
|
|||||||
'queue' => 'default',
|
'queue' => 'default',
|
||||||
'expire' => 60,
|
'expire' => 60,
|
||||||
],
|
],
|
||||||
|
// ...
|
||||||
|
'message_broker' => [
|
||||||
|
|
||||||
|
'driver' => 'rabbitmq',
|
||||||
|
|
||||||
|
'dsn' => env('RABBITMQ_DSN', null),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Could be one a class that implements \Interop\Amqp\AmqpConnectionFactory for example:
|
||||||
|
* - \EnqueueAmqpExt\AmqpConnectionFactory if you install enqueue/amqp-ext
|
||||||
|
* - \EnqueueAmqpLib\AmqpConnectionFactory if you install enqueue/amqp-lib
|
||||||
|
* - \EnqueueAmqpBunny\AmqpConnectionFactory if you install enqueue/amqp-bunny
|
||||||
|
*/
|
||||||
|
|
||||||
|
'factory_class' => Enqueue\AmqpLib\AmqpConnectionFactory::class,
|
||||||
|
|
||||||
|
'host' => env('RABBITMQ_HOST', '127.0.0.1'),
|
||||||
|
'port' => env('RABBITMQ_PORT', 5672),
|
||||||
|
|
||||||
|
'vhost' => env('RABBITMQ_VHOST', 'default'),
|
||||||
|
'login' => env('RABBITMQ_LOGIN', 'guest'),
|
||||||
|
'password' => env('RABBITMQ_PASSWORD', 'guest'),
|
||||||
|
|
||||||
|
'queue' => env('RABBITMQ_QUEUE', ''),
|
||||||
|
|
||||||
|
'options' => [
|
||||||
|
|
||||||
|
'exchange' => [
|
||||||
|
|
||||||
|
'name' => env('RABBITMQ_EXCHANGE_NAME'),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine if exchange should be created if it does not exist.
|
||||||
|
*/
|
||||||
|
|
||||||
|
'declare' => env('RABBITMQ_EXCHANGE_DECLARE', true),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
'type' => env('RABBITMQ_EXCHANGE_TYPE', \Interop\Amqp\AmqpTopic::TYPE_FANOUT),
|
||||||
|
'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false),
|
||||||
|
'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true),
|
||||||
|
'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', true),
|
||||||
|
'arguments' => env('RABBITMQ_EXCHANGE_ARGUMENTS'),
|
||||||
|
],
|
||||||
|
|
||||||
|
'queue' => [
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine if queue should be created if it does not exist.
|
||||||
|
*/
|
||||||
|
|
||||||
|
'declare' => env('RABBITMQ_QUEUE_DECLARE', false),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine if queue should be binded to the exchange created.
|
||||||
|
*/
|
||||||
|
|
||||||
|
'bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', false),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
'passive' => env('RABBITMQ_QUEUE_PASSIVE', false),
|
||||||
|
'durable' => env('RABBITMQ_QUEUE_DURABLE', true),
|
||||||
|
'exclusive' => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
|
||||||
|
'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false),
|
||||||
|
'arguments' => env('RABBITMQ_QUEUE_ARGUMENTS'),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine the number of seconds to sleep if there's an error communicating with rabbitmq
|
||||||
|
* If set to false, it'll throw an exception rather than doing the sleep for X seconds.
|
||||||
|
*/
|
||||||
|
|
||||||
|
'sleep_on_error' => env('RABBITMQ_ERROR_SLEEP', 5),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optional SSL params if an SSL connection is used
|
||||||
|
* Using an SSL connection will also require to configure your RabbitMQ to enable SSL. More details can be founds here: https://www.rabbitmq.com/ssl.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
'ssl_params' => [
|
||||||
|
'ssl_on' => env('RABBITMQ_SSL', false),
|
||||||
|
'cafile' => env('RABBITMQ_SSL_CAFILE', null),
|
||||||
|
'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null),
|
||||||
|
'local_key' => env('RABBITMQ_SSL_LOCALKEY', null),
|
||||||
|
'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', false),
|
||||||
|
'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null),
|
||||||
|
],
|
||||||
|
|
||||||
|
],
|
||||||
],
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -73,8 +73,17 @@ class ApiEndpointSeeder extends Seeder
|
|||||||
'scopes' => [
|
'scopes' => [
|
||||||
\App\libs\OAuth2\IUserScopes::ReadAll
|
\App\libs\OAuth2\IUserScopes::ReadAll
|
||||||
],
|
],
|
||||||
|
],
|
||||||
|
// get user by id
|
||||||
|
[
|
||||||
|
'name' => 'get-user-by-id',
|
||||||
|
'active' => true,
|
||||||
|
'route' => '/api/v1/users/{id}',
|
||||||
|
'http_method' => 'GET',
|
||||||
|
'scopes' => [
|
||||||
|
\App\libs\OAuth2\IUserScopes::ReadAll
|
||||||
|
],
|
||||||
]
|
]
|
||||||
|
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use Illuminate\Support\Facades\Artisan;
|
use Illuminate\Support\Facades\Artisan;
|
||||||
use Illuminate\Support\Facades\Mail;
|
use Illuminate\Support\Facades\Mail;
|
||||||
|
use Illuminate\Support\Facades\Queue;
|
||||||
use Illuminate\Support\Facades\Redis;
|
use Illuminate\Support\Facades\Redis;
|
||||||
use Laravel\BrowserKitTesting\TestCase as BaseTestCase;
|
use Laravel\BrowserKitTesting\TestCase as BaseTestCase;
|
||||||
/**
|
/**
|
||||||
@ -51,6 +52,7 @@ abstract class BrowserKitTestCase extends BaseTestCase
|
|||||||
{
|
{
|
||||||
Artisan::call('doctrine:migrations:migrate', ['--connection=model ']);
|
Artisan::call('doctrine:migrations:migrate', ['--connection=model ']);
|
||||||
Mail::fake();
|
Mail::fake();
|
||||||
|
Queue::fake();
|
||||||
$this->seed('TestSeeder');
|
$this->seed('TestSeeder');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ final class OAuth2ClientTests extends TestCase
|
|||||||
$this->redis->flushall();
|
$this->redis->flushall();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetClient($appName = 'Call For Presentations'):Client
|
public function testGetClient($appName = 'Call For Presentations'): Client
|
||||||
{
|
{
|
||||||
$repo = EntityManager::getRepository(Client::class);
|
$repo = EntityManager::getRepository(Client::class);
|
||||||
$client = $repo->getByApplicationName($appName);
|
$client = $repo->getByApplicationName($appName);
|
||||||
@ -48,11 +48,4 @@ final class OAuth2ClientTests extends TestCase
|
|||||||
|
|
||||||
return $client;
|
return $client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testClearAccessTokens(){
|
|
||||||
$client = $this->testGetClient();
|
|
||||||
$this->assertTrue($client->hasAccessTokens());
|
|
||||||
$client->removeAllAccessTokens();
|
|
||||||
EntityManager::flush();
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -65,6 +65,7 @@ final class OAuth2UserRegistrationServiceApiTest extends OAuth2ProtectedApiTest
|
|||||||
protected function getScopes()
|
protected function getScopes()
|
||||||
{
|
{
|
||||||
$scope = [
|
$scope = [
|
||||||
|
"openid",
|
||||||
IUserScopes::Registration,
|
IUserScopes::Registration,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user