X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=actions%2Finvite.php;h=89b7e83bf6d19a32899e05db5fe2b32ac1439cb3;hb=edd62e58fdf2a2b0bd4010ec80e6428c92572cb8;hp=e9adb3b7f93255cca5aa0234566857416a1b42c0;hpb=76946ea5a3636479d713f64471e86643936bc540;p=quix0rs-gnu-social.git diff --git a/actions/invite.php b/actions/invite.php index e9adb3b7f9..89b7e83bf6 100644 --- a/actions/invite.php +++ b/actions/invite.php @@ -1,7 +1,7 @@ . */ -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } +if (!defined('GNUSOCIAL')) { exit(1); } -class InviteAction extends CurrentUserDesignAction +// @todo XXX: Add documentation. +class InviteAction extends Action { var $mode = null; var $error = null; @@ -27,6 +28,11 @@ class InviteAction extends CurrentUserDesignAction var $subbed = null; var $sent = null; + function showNoticeForm() + { + return; + } + function isReadOnly($args) { return false; @@ -53,54 +59,84 @@ class InviteAction extends CurrentUserDesignAction function sendInvitations() { - # CSRF protection - $token = $this->trimmed('token'); - if (!$token || $token != common_session_token()) { - $this->showForm(_('There was a problem with your session token. Try again, please.')); - return; - } + if (Event::handle('StartSendInvitations', array(&$this))) { + // CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + // TRANS: Client error displayed when the session token does not match or is not given. + $this->showForm(_('There was a problem with your session token. Try again, please.')); + return; + } - $user = common_current_user(); - $profile = $user->getProfile(); + $user = common_current_user(); + $profile = $user->getProfile(); - $bestname = $profile->getBestName(); - $sitename = common_config('site', 'name'); - $personal = $this->trimmed('personal'); + $bestname = $profile->getBestName(); + $sitename = common_config('site', 'name'); + $personal = $this->trimmed('personal'); - $addresses = explode("\n", $this->trimmed('addresses')); + $addresses = explode("\n", $this->trimmed('addresses')); + foreach ($addresses as $email) { + $email = trim($email); + $valid = null; - foreach ($addresses as $email) { - $email = trim($email); - if (!Validate::email($email, common_config('email', 'check_domain'))) { - // TRANS: Form validation message when providing an e-mail address that does not validate. - // TRANS: %s is an invalid e-mail address. - $this->showForm(sprintf(_('Invalid email address: %s.'), $email)); - return; + try { + + if (Event::handle('StartValidateUserEmail', array(null, $email, &$valid))) { + $valid = Validate::email($email, common_config('email', 'check_domain')); + Event::handle('EndValidateUserEmail', array(null, $email, &$valid)); + } + + if ($valid) { + if (Event::handle('StartValidateEmailInvite', array($user, $email, &$valid))) { + $valid = true; + Event::handle('EndValidateEmailInvite', array($user, $email, &$valid)); + } + } + + if (!$valid) { + // TRANS: Form validation message when providing an e-mail address that does not validate. + // TRANS: %s is an invalid e-mail address. + $this->showForm(sprintf(_('Invalid email address: %s.'), $email)); + return; + } + } catch (ClientException $e) { + $this->showForm($e->getMessage()); + return; + } } - } - $this->already = array(); - $this->subbed = array(); - - foreach ($addresses as $email) { - $email = common_canonical_email($email); - $other = User::staticGet('email', $email); - if ($other) { - if ($user->isSubscribed($other)) { - $this->already[] = $other; - } else { - subs_subscribe_to($user, $other); - $this->subbed[] = $other; + $this->already = array(); + $this->subbed = array(); + + foreach ($addresses as $email) { + $email = common_canonical_email($email); + try { + // If this user is already registered, subscribe to it! + $other = Profile::getByEmail($email); + if ($user->isSubscribed($other)) { + $this->already[] = $other; + } else { + try { + Subscription::ensureStart($profile, $other); + $this->subbed[] = $other; + } catch (Exception $e) { + // subscription failed, but keep working + common_debug('Invitation-based subscription failed: '.$e->getMessage()); + } + } + } catch (NoSuchUserException $e) { + // If email was not known, let's send an invite! + $this->sent[] = $email; + $this->sendInvitation($email, $user, $personal); } - } else { - $this->sent[] = $email; - $this->sendInvitation($email, $user, $personal); } - } - $this->mode = 'sent'; + $this->mode = 'sent'; - $this->showPage(); + $this->showPage(); + Event::handle('EndSendInvitations', array($this)); + } } function showScripts() @@ -131,50 +167,53 @@ class InviteAction extends CurrentUserDesignAction function showInvitationSuccess() { - if ($this->already) { - // TRANS: Message displayed inviting users to use a StatusNet site while the inviting user - // TRANS: is already subscribed to one or more users with the given e-mail address(es). - // TRANS: Plural form is based on the number of reported already subscribed e-mail addresses. - // TRANS: Followed by a bullet list. - $this->element('p', null, _m('You are already subscribed to this user:', - 'You are already subscribed to these users:', - count($this->already))); - $this->elementStart('ul'); - foreach ($this->already as $other) { - // TRANS: Used as list item for already subscribed users (%1$s is nickname, %2$s is e-mail address). - $this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email)); + if (Event::handle('StartShowInvitationSuccess', array($this))) { + if ($this->already) { + // TRANS: Message displayed inviting users to use a StatusNet site while the inviting user + // TRANS: is already subscribed to one or more users with the given e-mail address(es). + // TRANS: Plural form is based on the number of reported already subscribed e-mail addresses. + // TRANS: Followed by a bullet list. + $this->element('p', null, _m('You are already subscribed to this user:', + 'You are already subscribed to these users:', + count($this->already))); + $this->elementStart('ul'); + foreach ($this->already as $other) { + // TRANS: Used as list item for already subscribed users (%1$s is nickname, %2$s is e-mail address). + $this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email)); + } + $this->elementEnd('ul'); } - $this->elementEnd('ul'); - } - if ($this->subbed) { - // TRANS: Message displayed inviting users to use a StatusNet site while the invited user - // TRANS: already uses a this StatusNet site. Plural form is based on the number of - // TRANS: reported already present people. Followed by a bullet list. - $this->element('p', null, _m('This person is already a user and you were automatically subscribed:', - 'These people are already users and you were automatically subscribed to them:', - count($this->subbed))); - $this->elementStart('ul'); - foreach ($this->subbed as $other) { - // TRANS: Used as list item for already registered people (%1$s is nickname, %2$s is e-mail address). - $this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email)); + if ($this->subbed) { + // TRANS: Message displayed inviting users to use a StatusNet site while the invited user + // TRANS: already uses a this StatusNet site. Plural form is based on the number of + // TRANS: reported already present people. Followed by a bullet list. + $this->element('p', null, _m('This person is already a user and you were automatically subscribed:', + 'These people are already users and you were automatically subscribed to them:', + count($this->subbed))); + $this->elementStart('ul'); + foreach ($this->subbed as $other) { + // TRANS: Used as list item for already registered people (%1$s is nickname, %2$s is e-mail address). + $this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email)); + } + $this->elementEnd('ul'); } - $this->elementEnd('ul'); - } - if ($this->sent) { - // TRANS: Message displayed inviting users to use a StatusNet site. Plural form is - // TRANS: based on the number of invitations sent. Followed by a bullet list of - // TRANS: e-mail addresses to which invitations were sent. - $this->element('p', null, _m('Invitation sent to the following person:', - 'Invitations sent to the following people:', - count($this->sent))); - $this->elementStart('ul'); - foreach ($this->sent as $other) { - $this->element('li', null, $other); + if ($this->sent) { + // TRANS: Message displayed inviting users to use a StatusNet site. Plural form is + // TRANS: based on the number of invitations sent. Followed by a bullet list of + // TRANS: e-mail addresses to which invitations were sent. + $this->element('p', null, _m('Invitation sent to the following person:', + 'Invitations sent to the following people:', + count($this->sent))); + $this->elementStart('ul'); + foreach ($this->sent as $other) { + $this->element('li', null, $other); + } + $this->elementEnd('ul'); + // TRANS: Generic message displayed after sending out one or more invitations to + // TRANS: people to join a StatusNet site. + $this->element('p', null, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!')); } - $this->elementEnd('ul'); - // TRANS: Generic message displayed after sending out one or more invitations to - // TRANS: people to join a StatusNet site. - $this->element('p', null, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!')); + Event::handle('EndShowInvitationSuccess', array($this)); } } @@ -202,35 +241,11 @@ class InviteAction extends CurrentUserDesignAction function showInviteForm() { - $this->elementStart('form', array('method' => 'post', - 'id' => 'form_invite', - 'class' => 'form_settings', - 'action' => common_local_url('invite'))); - $this->elementStart('fieldset'); - // TRANS: Form legend. - $this->element('legend', null, 'Send an invitation'); - $this->hidden('token', common_session_token()); - - $this->elementStart('ul', 'form_data'); - $this->elementStart('li'); - // TRANS: Field label for a list of e-mail addresses. - $this->textarea('addresses', _('Email addresses'), - $this->trimmed('addresses'), - // TRANS: Tooltip for field label for a list of e-mail addresses. - _('Addresses of friends to invite (one per line)')); - $this->elementEnd('li'); - $this->elementStart('li'); - // TRANS: Field label for a personal message to send to invitees. - $this->textarea('personal', _('Personal message'), - $this->trimmed('personal'), - // TRANS: Tooltip for field label for a personal message to send to invitees. - _('Optionally add a personal message to the invitation.')); - $this->elementEnd('li'); - $this->elementEnd('ul'); - // TRANS: Send button for inviting friends - $this->submit('send', _m('BUTTON', 'Send')); - $this->elementEnd('fieldset'); - $this->elementEnd('form'); + if (Event::handle('StartShowInviteForm', array($this))) { + $form = new InviteForm($this); + $form->show(); + Event::handle('EndShowInviteForm', array($this)); + } } function sendInvitation($email, $user, $personal) @@ -253,44 +268,31 @@ class InviteAction extends CurrentUserDesignAction return false; } + $confirmUrl = common_local_url('register', array('code' => $invite->code)); + $recipients = array($email); $headers['From'] = mail_notify_from(); $headers['To'] = trim($email); + $headers['Content-Type'] = 'text/html; charset=UTF-8'; + // TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral // TRANS: singular 3rd-person pronoun in English. %1$s is the inviting user, $2$s is // TRANS: the StatusNet sitename. $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename); - // TRANS: Body text for invitation email. Note that 'them' is correct as a gender-neutral - // TRANS: singular 3rd-person pronoun in English. %1$s is the inviting user, %2$s is the - // TRANS: StatusNet sitename, %3$s is the site URL, %4$s is the personal message from the - // TRANS: inviting user, %s%5 a link to the timeline for the inviting user, %s$6 is a link - // TRANS: to register with the StatusNet site. - $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n". - "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n". - "You can also share news about yourself, your thoughts, or your life online with people who know about you. ". - "It's also great for meeting new people who share your interests.\n\n". - "%1\$s said:\n\n%4\$s\n\n". - "You can see %1\$s's profile page on %2\$s here:\n\n". - "%5\$s\n\n". - "If you'd like to try the service, click on the link below to accept the invitation.\n\n". - "%6\$s\n\n". - "If not, you can ignore this message. Thanks for your patience and your time.\n\n". - "Sincerely, %2\$s\n"), - $bestname, - $sitename, - common_root_url(), - $personal, - common_local_url('showstream', array('nickname' => $user->nickname)), - common_local_url('register', array('code' => $invite->code))); + $title = (empty($personal)) ? 'invite' : 'invitepersonal'; - mail_send($recipients, $headers, $body); - } + // @todo FIXME: i18n issue. + $inviteTemplate = DocFile::forTitle($title, DocFile::mailPaths()); - function showLocalNav() - { - $nav = new SubGroupNav($this, common_current_user()); - $nav->show(); + $body = $inviteTemplate->toHTML(array('inviter' => $bestname, + 'inviterurl' => $profile->profileurl, + 'confirmurl' => $confirmUrl, + 'personal' => $personal)); + + common_debug('Confirm URL is ' . common_local_url('register', array('code' => $invite->code))); + + mail_send($recipients, $headers, $body); } }