Allow administrators to send e-mail invitations;

pull/815/head
Marcelo Schmidt 10 years ago
parent 4fab550ad6
commit ac8a8bae94
  1. 34
      client/views/admin/users/adminInviteUser.coffee
  2. 31
      client/views/admin/users/adminInviteUser.html
  3. 7
      client/views/admin/users/adminUsers.coffee
  4. 9
      i18n/en.i18n.json
  5. 1
      packages/rocketchat-lib/package.js
  6. 22
      packages/rocketchat-lib/server/methods/sendInvitationEmail.coffee
  7. 3
      packages/rocketchat-lib/settings/server/startup.coffee

@ -0,0 +1,34 @@
Template.adminInviteUser.helpers
isAdmin: ->
console.log 'isAdmin', Meteor.user().admin is true
return Meteor.user().admin is true
emailEnabled: ->
console.log 'emailEnabled', RocketChat.settings.get('MAIL_URL') or (RocketChat.settings.get('SMTP_Host') and RocketChat.settings.get('SMTP_Username') and RocketChat.settings.get('SMTP_Password'))
return RocketChat.settings.get('MAIL_URL') or (RocketChat.settings.get('SMTP_Host') and RocketChat.settings.get('SMTP_Username') and RocketChat.settings.get('SMTP_Password'))
inviteEmails: ->
return Template.instance().inviteEmails.get()
Template.adminInviteUser.events
'click .send': (e, instance) ->
emails = $('#inviteEmails').val().split /[\s,;]/
rfcMailPattern = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
validEmails = _.compact _.map emails, (email) -> return email if rfcMailPattern.test email
if validEmails.length
Meteor.call 'sendInvitationEmail', validEmails, (error, result) ->
if result
instance.clearForm()
instance.inviteEmails.set validEmails
if error
toastr.error error.reason
else
toastr.error t('Send_invitation_email_error')
'click .cancel': (e, instance) ->
instance.clearForm()
instance.inviteEmails.set []
RocketChat.TabBar.closeFlex()
Template.adminInviteUser.onCreated ->
@inviteEmails = new ReactiveVar []
@clearForm = ->
$('#inviteEmails').val('')

@ -0,0 +1,31 @@
<template name="adminInviteUser">
{{#if isAdmin}}
{{#if emailEnabled}}
<div class="about clearfix">
<form class="edit-form">
<h3>{{_ "Send_invitation_email"}}</h3>
<div class="input-line">
<label for="inviteEmails">{{_ "Send_invitation_email_info"}}</label>
<textarea id="inviteEmails" rows="3" style="height: auto"></textarea>
</div>
</form>
</div>
<nav>
<button class='button button-block cancel secondary'><span>{{_ "Cancel"}}</span></button>
<button class='button button-block blue send' data-loading-text="{{_ "Please_wait"}}"><span>{{_ "Send"}}</span></button>
</nav>
{{#if inviteEmails.length}}
<div class="about clearfix" style="margin-top: 30px">
<p style="color: #51a351"> {{_ "Send_invitation_email_success"}} </p>
<ul style="margin: 5px 10px">
{{#each inviteEmails}}
<li style="margin-top: 5px">{{.}}</li>
{{/each}}
</ul>
</div>
{{/if}}
{{else}}
{{_ "Send_invitation_email_warning"}}
{{/if}}
{{/if}}
</template>

@ -33,6 +33,8 @@ Template.adminUsers.onCreated ->
@filter = new ReactiveVar ''
@ready = new ReactiveVar true
RocketChat.TabBar.addButton({ id: 'invite-user', title: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 })
@autorun ->
filter = instance.filter.get()
limit = instance.limit.get()
@ -43,10 +45,11 @@ Template.adminUsers.onCreated ->
if Session.get 'adminSelectedUser'
channelSubscription = instance.subscribe 'userChannels', Session.get 'adminSelectedUser'
RocketChat.TabBar.setData Meteor.users.findOne Session.get 'adminSelectedUser'
RocketChat.TabBar.addButton({ id: 'user-info', title: t('User_Info'), icon: 'icon-user', template: 'adminUserInfo', order: 1 })
# RocketChat.TabBar.addButton({ id: 'user-channel', title: t('User_Channels'), icon: 'icon-hash', template: 'adminUserChannels', order: 2 })
RocketChat.TabBar.addButton({ id: 'user-info', title: t('User_Info'), icon: 'icon-user', template: 'adminUserInfo', order: 2 })
# RocketChat.TabBar.addButton({ id: 'user-channel', title: t('User_Channels'), icon: 'icon-hash', template: 'adminUserChannels', order: 3 })
else
RocketChat.TabBar.reset()
RocketChat.TabBar.addButton({ id: 'invite-user', title: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 })
@users = ->
filter = _.trim instance.filter?.get()

@ -122,6 +122,9 @@
"Invalid_room_name" : "<strong>%s</strong> is not a valid room name,<br/> use only letters, numbers and dashes",
"invisible" : "invisible",
"Invisible" : "Invisible",
"Invitation HTML" : "Invitation HTML",
"Invitation_Subject" : "Invitation Subject",
"Invite_Users" : "Invite Users",
"is_also_typing" : "is also typing",
"is_also_typing_female" : "is also typing",
"is_also_typing_male" : "is also typing",
@ -260,7 +263,13 @@
"Select_file" : "Select file",
"Select_service_to_login" : "Select a service to login to load your picture or upload one directly from your computer",
"Selected_users" : "Selected members",
"Send" : "Send",
"Send_confirmation_email" : "Send confirmation email",
"Send_invitation_email" : "Send invitation e-mail",
"Send_invitation_email_error" : "You haven't provided any valid e-mail address.",
"Send_invitation_email_info" : "You can send multiple e-mail invitations at once.",
"Send_invitation_email_success" : "You have successfully sent an invitation e-mail to the following addresses:",
"Send_invitation_email_warning" : "In order to send invitation e-mails, you must first configure SMTP settings.",
"Send_Message" : "Send Message",
"Settings" : "Settings",
"Settings_updated" : "Settings updated",

@ -37,6 +37,7 @@ Package.onUse(function(api) {
api.addFiles('server/functions/setUsername.coffee', 'server');
api.addFiles('server/methods/joinDefaultChannels.coffee', 'server');
api.addFiles('server/methods/sendInvitationEmail.coffee', 'server');
api.addFiles('server/methods/setAdminStatus.coffee', 'server');
api.addFiles('server/methods/setUsername.coffee', 'server');
api.addFiles('server/methods/updateUser.coffee', 'server');

@ -0,0 +1,22 @@
Meteor.methods
sendInvitationEmail: (emails) ->
if not Meteor.userId()
throw new Meteor.Error 'invalid-user', "[methods] sendInvitationEmail -> Invalid user"
unless Meteor.user()?.admin is true
throw new Meteor.Error 'not-authorized', '[methods] sendInvitationEmail -> Not authorized'
rfcMailPattern = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
validEmails = _.compact _.map emails, (email) -> return email if rfcMailPattern.test email
for email in validEmails
@unblock()
Email.send
to: email
from: RocketChat.settings.get 'From_Email'
subject: RocketChat.settings.get 'Invitation_Subject'
html: RocketChat.settings.get 'Invitation_HTML'
return validEmails

@ -45,6 +45,9 @@ Meteor.startup ->
RocketChat.settings.add 'SMTP_Username', '', { type: 'string', group: 'SMTP' }
RocketChat.settings.add 'SMTP_Password', '', { type: 'string', group: 'SMTP' }
RocketChat.settings.add 'From_Email', 'no-reply@rocket.chat', { type: 'string', group: 'SMTP' }
RocketChat.settings.add 'Invitation_Subject', 'You have been invited to Rocket.Chat', { type: 'string', group: 'SMTP', section: 'Invitation' }
RocketChat.settings.add 'Invitation_HTML', '<h2>You have been invited to <h1>Rocket.Chat</h1></h2><p>Go to https://demo.rocket.chat and try the best open source chat solution available today!</p>', { type: 'string', multiline: true, group: 'SMTP', section: 'Invitation' }
RocketChat.settings.addGroup 'Message'
RocketChat.settings.add 'Message_AllowEditing', true, { type: 'boolean', group: 'Message', public: true }

Loading…
Cancel
Save