%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/space/models/forms/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/space/models/forms/InviteForm.php |
<?php
namespace humhub\modules\space\models\forms;
use humhub\modules\admin\permissions\ManageUsers;
use humhub\modules\space\jobs\AddUsersToSpaceJob;
use humhub\modules\space\models\Membership;
use humhub\modules\space\models\Space;
use humhub\modules\user\models\User;
use Yii;
use yii\base\Model;
use yii\validators\EmailValidator;
/**
* @author Luke
* @package humhub.modules_core.space.forms
* @since 0.5
*/
class InviteForm extends Model
{
/**
* Field for Invite GUIDs
*
* @var array
*/
public $invite;
/**
* Field for external e-mails to invite
*
* @var string
*/
public $inviteExternal;
/**
* Current Space
*
* @var Space
*/
public $space;
/**
* Parsed Invites with User Objects
*
* @var array
*/
public $invites = [];
/**
* @var int[] invite user ids
*/
public $inviteIds = [];
/**
* Parsed list of E-Mails of field inviteExternal
*/
public $invitesExternal = [];
/**
* Indicate for add users to space without invite notification
* @var bool
*/
public $withoutInvite = false;
public $allRegisteredUsers = false;
/**
* Declares the validation rules.
* The rules state that username and password are required,
* and password needs to be authenticated.
*/
public function rules()
{
return [
[['withoutInvite', 'allRegisteredUsers'], 'boolean'],
['invite', 'checkInvite'],
['inviteExternal', 'checkInviteExternal'],
];
}
/**
* Declares attribute labels.
*/
public function attributeLabels()
{
return [
'invite' => Yii::t('SpaceModule.base', 'Invites'),
'inviteExternal' => Yii::t('SpaceModule.base', 'New user by e-mail (comma separated)'),
];
}
/**
* Saves the form and either directly invites the selected users directly or by queue if forceinvite or all registered
* users are selected.
*
* @return bool true if save was successful otherwise false
*/
public function save()
{
if(!$this->validate()) {
return false;
}
if ($this->isQueuedJob()) {
$this->forceInvite();
} else {
$this->inviteMembers();
}
$this->inviteExternal();
return true;
}
/**
* @return bool checks if user is allowed to add without invite
*/
public function isQueuedJob()
{
// Pre-check if adding without invite / adding all members was requested
if (!($this->withoutInvite || $this->allRegisteredUsers)) {
return false;
}
// If user has permission to manage users, this action is allowed
if (Yii::$app->user->can(ManageUsers::class)) {
return true;
}
// Allow users to perform this action if this is allowed by config file
// Pre-check if user is member of the space in question
if (Yii::$app->getModule('space')->membersCanAddWithoutInvite === true) {
$membership = Membership::findOne([
'space_id' => $this->space->id,
'user_id' => Yii::$app->user->identity->id,
]);
if ($membership && $membership->status == Membership::STATUS_MEMBER) {
return true;
}
}
return false;
}
public function forceInvite()
{
Yii::$app->queue->push(new AddUsersToSpaceJob([
'originatorId' => Yii::$app->user->identity->id,
'forceMembership' => $this->withoutInvite,
'spaceId' => $this->space->id,
'userIds' => $this->getInviteIds(),
'allUsers' => $this->allRegisteredUsers,
]));
}
/**
* Invites selected members immediately
*
* @throws \yii\base\Exception
*/
public function inviteMembers()
{
foreach ($this->getInvites() as $user) {
$this->space->inviteMember($user->id, Yii::$app->user->id);
}
}
/**
* Invite external users by mail
*/
public function inviteExternal()
{
if ($this->canInviteExternal()) {
foreach ($this->getInvitesExternal() as $email) {
$this->space->inviteMemberByEMail($email, Yii::$app->user->id);
}
}
}
/**
* Checks if external user invitation setting is enabled
*
* @return int
*/
public function canInviteExternal()
{
return Yii::$app->getModule('user')->settings->get('auth.internalUsersCanInvite');
}
/**
* Add User to invite list
*
* @param User $user
* @return bool true if user can be added to invite list
*/
private function addUserToInviteList(User $user): bool
{
$membership = Membership::findOne([
'space_id' => $this->space->id,
'user_id' => $user->id,
'status' => Membership::STATUS_MEMBER,
]);
if ($membership) {
return false;
}
$this->invites[] = $user;
$this->inviteIds[] = $user->id;
return true;
}
/**
* Form Validator which checks the invite field
*
* @param string $attribute
* @param array $params
*/
public function checkInvite($attribute, $params)
{
// Check if email field is not empty
if ($this->$attribute != '') {
$invites = $this->$attribute;
foreach ($invites as $userGuid) {
$userGuid = preg_replace("/[^A-Za-z0-9\-]/", '', $userGuid);
if ($userGuid == '') {
continue;
}
$user = User::findOne(['guid' => $userGuid]);
if ($user === null) {
$this->addError($attribute, Yii::t('SpaceModule.base', 'User not found!'));
continue;
}
if (!$this->addUserToInviteList($user)) {
$this->addError(
$attribute,
Yii::t(
'SpaceModule.base',
"User '{username}' is already a member of this space!",
['username' => $user->getDisplayName()]
)
);
}
}
}
}
/**
* Checks a comma separated list of e-mails which should invited to space.
* E-Mails needs to be valid and not already registered.
*
* @param string $attribute
* @param array $params
*/
public function checkInviteExternal($attribute, $params)
{
// Check if email field is not empty
if ($this->$attribute != '') {
$emails = explode(",", $this->$attribute);
// Loop over each given e-mail
foreach ($emails as $email) {
$email = trim($email);
$validator = new EmailValidator();
if (!$validator->validate($email)) {
$this->addError($attribute,
Yii::t('SpaceModule.base', "{email} is not valid!", ["{email}" => $email]));
continue;
}
$user = User::findOne(['email' => $email]);
if ($user) {
$this->addUserToInviteList($user);
} else {
$this->invitesExternal[] = $email;
}
}
}
}
/**
* @return User[] an Array with selected recipients
*/
public function getInvites()
{
return $this->invites;
}
/**
* @return int[] user invite ids
*/
public function getInviteIds()
{
return $this->inviteIds;
}
/**
* Returns an Array with selected recipients
*/
public function getInvitesExternal()
{
return $this->invitesExternal;
}
/**
* E-Mails entered in form
*
* @return array the emails
*/
public function getEmails()
{
$emails = [];
foreach (explode(',', $this->inviteExternal) as $email) {
$emails[] = trim($email);
}
return $emails;
}
}