openstackid/app/Services/OpenId/UserService.php

260 lines
8.5 KiB
PHP

<?php namespace Services\OpenId;
/**
* Copyright 2016 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\IUserNameGeneratorService;
use Auth\Repositories\IUserRepository;
use Auth\User;
use Models\Member;
use OpenId\Models\IOpenIdUser;
use OpenId\Services\IUserService;
use Utils\Db\ITransactionService;
use Utils\Exceptions\EntityNotFoundException;
use Utils\Services\ILogService;
use Illuminate\Support\Facades\Mail;
use Utils\Services\IServerConfigurationService;
use Services\Exceptions\ValidationException;
/**
* Class UserService
* @package Services\OpenId
*/
final class UserService implements IUserService
{
/**
* @var IUserRepository
*/
private $repository;
/**
* @var ILogService
*/
private $log_service;
/**
* @var ITransactionService
*/
private $tx_service;
/**
* @var IUserNameGeneratorService
*/
private $user_name_generator;
/**
* @var IServerConfigurationService
*/
private $configuration_service;
/**
* UserService constructor.
* @param IUserRepository $repository
* @param IUserNameGeneratorService $user_name_generator
* @param ITransactionService $tx_service
* @param IServerConfigurationService $configuration_service
* @param ILogService $log_service
*/
public function __construct
(
IUserRepository $repository,
IUserNameGeneratorService $user_name_generator,
ITransactionService $tx_service,
IServerConfigurationService $configuration_service,
ILogService $log_service
)
{
$this->repository = $repository;
$this->user_name_generator = $user_name_generator;
$this->configuration_service = $configuration_service;
$this->log_service = $log_service;
$this->tx_service = $tx_service;
}
/**
* @param int $user_id
* @return void
* @throws EntityNotFoundException
*/
public function updateLastLoginDate($user_id)
{
$this->tx_service->transaction(function() use($user_id){
$user = $this->repository->get($user_id);
if(is_null($user)) throw new EntityNotFoundException();
$user->last_login_date = gmdate("Y-m-d H:i:s", time());
$this->repository->add($user);
});
}
/**
* @param int $user_id
* @return void
* @throws EntityNotFoundException
*/
public function updateFailedLoginAttempts($user_id)
{
$this->tx_service->transaction(function() use($user_id){
$user = $this->repository->get($user_id);
if(is_null($user)) throw new EntityNotFoundException();
$user->login_failed_attempt += 1;
$this->repository->add($user);
});
}
/**
* @param int $user_id
* @return void
* @throws EntityNotFoundException
*/
public function lockUser($user_id)
{
$this->tx_service->transaction(function() use($user_id){
$user = $this->repository->get($user_id);
if(is_null($user)) throw new EntityNotFoundException();
$user->lock = true;
$this->repository->add($user);
$support_email = $this->configuration_service->getConfigValue('SupportEmail');
Mail::send('emails.auth.user_locked', [
'user_name' => $user->getFullName(),
'attempts' => $user->login_failed_attempt,
'support_email' => $support_email,
], function($message) use ($user, $support_email)
{
$message
->from($support_email, 'OpenStack Support Team')
->to($user->getEmail(), $user->getFullName())
->subject('OpenStackId - your user has been locked!');
});
});
}
/**
* @param int $user_id
* @return void
* @throws EntityNotFoundException
*/
public function unlockUser($user_id)
{
$this->tx_service->transaction(function() use($user_id){
$user = $this->repository->get($user_id);
if(is_null($user)) throw new EntityNotFoundException();
$user->lock = false;
$this->repository->update($user);
});
}
/**
* @param int $user_id
* @return void
* @throws EntityNotFoundException
*/
public function activateUser($user_id)
{
$this->tx_service->transaction(function() use($user_id){
$user = $this->repository->get($user_id);
if(is_null($user)) throw new EntityNotFoundException();
$user->active = true;
$this->repository->update($user);
});
}
/**
* @param int $user_id
* @return void
* @throws EntityNotFoundException
*/
public function deActivateUser($user_id)
{
$this->tx_service->transaction(function() use($user_id){
$user = $this->repository->get($user_id);
if(is_null($user)) throw new EntityNotFoundException();
$user->active = false;
$this->repository->update($user);
});
}
/**
* @param int $user_id
* @param bool $show_pic
* @param bool $show_full_name
* @param bool $show_email
* @param string $identifier
* @return bool
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function saveProfileInfo($user_id, $show_pic, $show_full_name, $show_email, $identifier)
{
return $this->tx_service->transaction(function() use($user_id, $show_pic, $show_full_name, $show_email, $identifier){
$user = $this->repository->get($user_id);
if(is_null($user)) throw new EntityNotFoundException();
$former_user = $this->repository->getByIdentifier($identifier);
if(!is_null($former_user) && $former_user->id != $user_id){
throw new ValidationException("there is already another user with that openid identifier");
}
$user->public_profile_show_photo = $show_pic;
$user->public_profile_show_fullname = $show_full_name;
$user->public_profile_show_email = $show_email;
$user->identifier = $identifier;
$this->repository->update($user);
return true;
});
}
/**
* @param Member $member
* @return IOpenIdUser
*/
public function buildUser(Member $member)
{
$repository = $this->repository;
$user_name_generator = $this->user_name_generator;
return $this->tx_service->transaction(function () use($member, $user_name_generator, $repository){
//create user
$old_user = $repository->getByExternalId($member->ID);
if(!is_null($old_user))
throw new ValidationException(sprintf('already exists an user with external_identifier %s', $member->ID));
$user = new User();
$user->external_identifier = $member->ID;
$user->identifier = $member->ID;
$user->last_login_date = gmdate("Y-m-d H:i:s", time());
$user->active = true;
$user->lock = false;
$user->login_failed_attempt = 0;
$done = false;
$fragment_nbr = 1;
$identifier = $original_identifier = $user_name_generator->generate($member);
do
{
$old_user = $repository->getByIdentifier($identifier);
if(!is_null($old_user))
{
$identifier = $original_identifier . IUserNameGeneratorService::USER_NAME_CHAR_CONNECTOR . $fragment_nbr;
$fragment_nbr++;
continue;
}
$user->identifier = $identifier;
break;
} while (1);
$repository->add($user);
return $user;
});
}
}