trabajo-afectivo/app/controllers/channels_controller.rb

361 lines
9.2 KiB
Ruby
Raw Normal View History

2016-10-19 03:11:36 +00:00
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class ChannelsController < ApplicationController
before_action :authentication_check
=begin
2015-09-11 15:22:58 +00:00
Resource:
POST /api/v1/channels/group/{id}.json
Response:
{}
Test:
curl http://localhost/api/v1/group/channels.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST '{group_id:123}'
=end
def group_update
permission_check('admin')
check_access
2015-09-11 15:22:58 +00:00
channel = Channel.find(params[:id])
channel.group_id = params[:group_id]
channel.save
render json: {}
end
=begin
Resource:
DELETE /api/v1/channels/{id}.json
Response:
{}
Test:
curl http://localhost/api/v1/channels.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X DELETE
=end
def destroy
permission_check('admin')
check_access
model_destroy_render(Channel, params)
end
2015-08-28 00:53:14 +00:00
2015-12-21 00:48:49 +00:00
def twitter_index
permission_check('admin.channel_twitter')
2015-12-21 00:48:49 +00:00
assets = {}
2016-06-30 20:04:48 +00:00
ExternalCredential.where(name: 'twitter').each { |external_credential|
2015-12-21 00:48:49 +00:00
assets = external_credential.assets(assets)
}
channel_ids = []
2016-06-30 20:04:48 +00:00
Channel.order(:id).each { |channel|
2015-12-21 00:48:49 +00:00
next if channel.area != 'Twitter::Account'
assets = channel.assets(assets)
channel_ids.push channel.id
}
render json: {
assets: assets,
channel_ids: channel_ids,
callback_url: ExternalCredential.callback_url('twitter'),
2015-12-21 00:48:49 +00:00
}
end
def twitter_verify
permission_check('admin.channel_twitter')
2015-12-21 00:48:49 +00:00
model_update_render(Channel, params)
end
def facebook_index
permission_check('admin.channel_facebook')
assets = {}
2016-06-30 20:04:48 +00:00
ExternalCredential.where(name: 'facebook').each { |external_credential|
assets = external_credential.assets(assets)
}
channel_ids = []
2016-06-30 20:04:48 +00:00
Channel.order(:id).each { |channel|
next if channel.area != 'Facebook::Account'
assets = channel.assets(assets)
channel_ids.push channel.id
}
render json: {
assets: assets,
channel_ids: channel_ids,
callback_url: ExternalCredential.callback_url('facebook'),
}
end
def facebook_verify
permission_check('admin.channel_facebook')
model_update_render(Channel, params)
end
2015-08-28 00:53:14 +00:00
def email_index
permission_check('admin.channel_email')
system_online_service = Setting.get('system_online_service')
account_channel_ids = []
notification_channel_ids = []
email_address_ids = []
not_used_email_address_ids = []
accounts_fixed = []
2015-08-28 00:53:14 +00:00
assets = {}
2016-06-30 20:04:48 +00:00
Channel.order(:id).each { |channel|
if system_online_service && channel.preferences && channel.preferences['online_service_disable']
email_addresses = EmailAddress.where(channel_id: channel.id)
2016-06-30 20:04:48 +00:00
email_addresses.each { |email_address|
accounts_fixed.push email_address
}
next
end
if channel.area == 'Email::Account'
account_channel_ids.push channel.id
assets = channel.assets(assets)
elsif channel.area == 'Email::Notification' && channel.active
notification_channel_ids.push channel.id
assets = channel.assets(assets)
end
2015-08-28 00:53:14 +00:00
}
2016-06-30 20:04:48 +00:00
EmailAddress.all.each { |email_address|
next if system_online_service && email_address.preferences && email_address.preferences['online_service_disable']
email_address_ids.push email_address.id
2015-08-28 00:53:14 +00:00
assets = email_address.assets(assets)
if !email_address.channel_id || !email_address.active || !Channel.find_by(id: email_address.channel_id)
not_used_email_address_ids.push email_address.id
end
2015-08-28 00:53:14 +00:00
}
render json: {
accounts_fixed: accounts_fixed,
assets: assets,
account_channel_ids: account_channel_ids,
notification_channel_ids: notification_channel_ids,
email_address_ids: email_address_ids,
not_used_email_address_ids: not_used_email_address_ids,
2015-08-31 23:12:51 +00:00
channel_driver: {
email: EmailHelper.available_driver,
2015-09-11 15:22:58 +00:00
},
config: {
notification_sender: Setting.get('notification_sender'),
2015-08-31 23:12:51 +00:00
}
2015-08-28 00:53:14 +00:00
}
end
def email_probe
# check admin permissions
permission_check('admin.channel_email')
2015-08-28 00:53:14 +00:00
# probe settings based on email and password
result = EmailHelper::Probe.full(
email: params[:email],
password: params[:password],
2016-03-10 13:41:42 +00:00
folder: params[:folder],
2015-08-28 00:53:14 +00:00
)
# verify if user+host already exists
if result[:result] == 'ok'
return if email_account_duplicate?(result)
end
render json: result
end
def email_outbound
# check admin permissions
permission_check('admin.channel_email')
2015-08-28 00:53:14 +00:00
# verify access
2015-11-30 13:29:23 +00:00
return if params[:channel_id] && !check_access(params[:channel_id])
2015-08-28 00:53:14 +00:00
# connection test
render json: EmailHelper::Probe.outbound(params, params[:email])
end
def email_inbound
# check admin permissions
permission_check('admin.channel_email')
2015-08-28 00:53:14 +00:00
# verify access
2015-11-30 13:29:23 +00:00
return if params[:channel_id] && !check_access(params[:channel_id])
2015-08-28 00:53:14 +00:00
# connection test
result = EmailHelper::Probe.inbound(params)
# check account duplicate
return if email_account_duplicate?({ setting: { inbound: params } }, params[:channel_id])
render json: result
end
def email_verify
# check admin permissions
permission_check('admin.channel_email')
2015-08-28 00:53:14 +00:00
email = params[:email] || params[:meta][:email]
email = email.downcase
channel_id = params[:channel_id]
# verify access
2015-11-30 13:29:23 +00:00
return if channel_id && !check_access(channel_id)
2015-08-28 00:53:14 +00:00
# check account duplicate
return if email_account_duplicate?({ setting: { inbound: params[:inbound] } }, channel_id)
# check delivery for 30 sek.
result = EmailHelper::Verify.email(
outbound: params[:outbound],
inbound: params[:inbound],
sender: email,
subject: params[:subject],
)
if result[:result] != 'ok'
render json: result
return
end
2015-09-11 15:22:58 +00:00
# fallback
if !params[:group_id]
params[:group_id] = Group.first.id
end
2015-08-28 00:53:14 +00:00
# update account
if channel_id
channel = Channel.find(channel_id)
channel.update_attributes(
options: {
inbound: params[:inbound],
outbound: params[:outbound],
},
2015-09-11 15:22:58 +00:00
group_id: params[:group_id],
last_log_in: nil,
last_log_out: nil,
status_in: 'ok',
status_out: 'ok',
2015-08-28 00:53:14 +00:00
)
render json: result
2015-08-28 00:53:14 +00:00
return
end
# create new account
channel = Channel.create(
area: 'Email::Account',
options: {
inbound: params[:inbound],
outbound: params[:outbound],
},
2015-09-11 15:22:58 +00:00
group_id: params[:group_id],
last_log_in: nil,
last_log_out: nil,
status_in: 'ok',
status_out: 'ok',
2015-08-28 00:53:14 +00:00
active: true,
)
# remember address && set channel for email address
address = EmailAddress.find_by(email: email)
# if we are on initial setup, use already exisiting dummy email address
if Channel.count == 1
address = EmailAddress.first
end
if address
address.update_attributes(
realname: params[:meta][:realname],
email: email,
active: true,
channel_id: channel.id,
)
else
address = EmailAddress.create(
realname: params[:meta][:realname],
email: email,
active: true,
channel_id: channel.id,
)
end
render json: result
2015-08-28 00:53:14 +00:00
end
def email_notification
check_online_service
2015-08-28 00:53:14 +00:00
# check admin permissions
permission_check('admin.channel_email')
2015-08-28 00:53:14 +00:00
adapter = params[:adapter].downcase
email = Setting.get('notification_sender')
# connection test
result = EmailHelper::Probe.outbound(params, email)
# save settings
if result[:result] == 'ok'
2016-06-30 20:04:48 +00:00
Channel.where(area: 'Email::Notification').each { |channel|
2015-08-28 00:53:14 +00:00
active = false
if adapter =~ /^#{channel.options[:outbound][:adapter]}$/i
active = true
channel.options = {
outbound: {
adapter: adapter,
options: params[:options],
},
}
channel.status_out = 'ok'
channel.last_log_out = nil
2015-08-28 00:53:14 +00:00
end
channel.active = active
channel.save
}
end
render json: result
end
private
def email_account_duplicate?(result, channel_id = nil)
2016-06-30 20:04:48 +00:00
Channel.where(area: 'Email::Account').each { |channel|
2015-08-28 00:53:14 +00:00
next if !channel.options
next if !channel.options[:inbound]
next if !channel.options[:inbound][:adapter]
next if channel.options[:inbound][:adapter] != result[:setting][:inbound][:adapter]
next if channel.options[:inbound][:options][:host] != result[:setting][:inbound][:options][:host]
next if channel.options[:inbound][:options][:user] != result[:setting][:inbound][:options][:user]
next if channel.id.to_s == channel_id.to_s
render json: {
result: 'duplicate',
message: 'Account already exists!',
}
return true
}
false
end
def check_online_service
return true if !Setting.get('system_online_service')
raise Exceptions::NotAuthorized
2015-08-29 22:58:21 +00:00
end
def check_access(id = nil)
if !id
id = params[:id]
end
return true if !Setting.get('system_online_service')
channel = Channel.find(id)
return true if channel.preferences && !channel.preferences[:online_service_disable]
raise Exceptions::NotAuthorized
end
end