2014-02-03 19:24:49 +00:00
|
|
|
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
|
2013-06-12 15:59:58 +00:00
|
|
|
|
2012-04-13 13:51:10 +00:00
|
|
|
class ChannelsController < ApplicationController
|
2015-05-07 11:23:55 +00:00
|
|
|
before_action :authentication_check
|
2012-04-13 13:51:10 +00:00
|
|
|
|
2012-09-20 12:08:02 +00:00
|
|
|
=begin
|
|
|
|
|
2015-08-29 11:46:48 +00:00
|
|
|
Resource:
|
|
|
|
GET /api/v1/channels/#{id}.json
|
|
|
|
|
|
|
|
Response example 1:
|
2012-09-20 12:08:02 +00:00
|
|
|
|
|
|
|
{
|
|
|
|
"id":1,
|
2015-08-28 00:53:14 +00:00
|
|
|
"area":"Email::Account",
|
2012-09-20 12:08:02 +00:00
|
|
|
"group_id:": 1,
|
|
|
|
"options":{
|
2015-08-28 00:53:14 +00:00
|
|
|
"inbound": {
|
|
|
|
"adapter":"IMAP",
|
|
|
|
"options": {
|
|
|
|
"host":"mail.example.com",
|
|
|
|
"user":"some_user",
|
|
|
|
"password":"some_password",
|
|
|
|
"ssl":true
|
|
|
|
},
|
|
|
|
"outbound":{
|
|
|
|
"adapter":"SMTP",
|
|
|
|
"options": {
|
|
|
|
"host":"mail.example.com",
|
|
|
|
"user":"some_user",
|
|
|
|
"password":"some_password",
|
|
|
|
"start_tls":true
|
|
|
|
}
|
2012-09-20 12:08:02 +00:00
|
|
|
},
|
|
|
|
"active":true,
|
|
|
|
"updated_at":"2012-09-14T17:51:53Z",
|
|
|
|
"created_at":"2012-09-14T17:51:53Z",
|
|
|
|
"updated_by_id":2.
|
|
|
|
"created_by_id":2,
|
|
|
|
}
|
|
|
|
|
2015-08-29 11:46:48 +00:00
|
|
|
Response example 2:
|
|
|
|
|
2012-09-20 12:08:02 +00:00
|
|
|
{
|
|
|
|
"id":1,
|
2015-08-28 00:53:14 +00:00
|
|
|
"area":"Twitter::Account",
|
2012-09-20 12:08:02 +00:00
|
|
|
"group_id:": 1,
|
|
|
|
"options":{
|
2015-08-28 00:53:14 +00:00
|
|
|
"adapter":"Twitter",
|
2015-07-07 11:57:45 +00:00
|
|
|
"auth": {
|
2015-07-02 15:13:04 +00:00
|
|
|
"consumer_key":"PJ4c3dYYRtSZZZdOKo8ow",
|
|
|
|
"consumer_secret":"ggAdnJE2Al1Vv0cwwvX5bdvKOieFs0vjCIh5M8Dxk",
|
|
|
|
"oauth_token":"293437546-xxRa9g74CercnU5AvY1uQwLLGIYrV1ezYtpX8oKW",
|
|
|
|
"oauth_token_secret":"ju0E4l9OdY2Lh1iTKMymAu6XVfOaU2oGxmcbIMRZQK4",
|
|
|
|
},
|
|
|
|
"sync":{
|
|
|
|
"search":[
|
|
|
|
{
|
2015-07-09 09:38:06 +00:00
|
|
|
"term":"#otrs",
|
2015-07-02 15:13:04 +00:00
|
|
|
"type": "mixed", # optional, possible 'mixed' (default), 'recent', 'popular'
|
2015-07-03 09:42:54 +00:00
|
|
|
"group_id:": 1,
|
2015-07-02 15:13:04 +00:00
|
|
|
"limit": 1, # optional
|
|
|
|
},
|
|
|
|
{
|
2015-07-09 09:38:06 +00:00
|
|
|
"term":"#zombie23",
|
2015-07-03 09:42:54 +00:00
|
|
|
"group_id:": 2,
|
2015-07-02 15:13:04 +00:00
|
|
|
},
|
|
|
|
{
|
2015-07-09 09:38:06 +00:00
|
|
|
"term":"#otterhub",
|
2015-07-03 09:42:54 +00:00
|
|
|
"group_id:": 3,
|
2015-07-02 15:13:04 +00:00
|
|
|
}
|
|
|
|
],
|
|
|
|
"mentions" {
|
2015-07-03 09:42:54 +00:00
|
|
|
"group_id:": 4,
|
2015-07-02 15:13:04 +00:00
|
|
|
"limit": 100, # optional
|
2012-09-20 12:08:02 +00:00
|
|
|
},
|
2015-07-02 15:13:04 +00:00
|
|
|
"direct_messages": {
|
2015-07-03 09:42:54 +00:00
|
|
|
"group_id:": 4,
|
2015-07-02 15:13:04 +00:00
|
|
|
"limit": 1, # optional
|
2012-09-20 12:08:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"active":true,
|
|
|
|
"updated_at":"2012-09-14T17:51:53Z",
|
|
|
|
"created_at":"2012-09-14T17:51:53Z",
|
|
|
|
"updated_by_id":2.
|
|
|
|
"created_by_id":2,
|
|
|
|
}
|
|
|
|
|
|
|
|
Test:
|
2013-08-06 22:10:28 +00:00
|
|
|
curl http://localhost/api/v1/channels/#{id}.json -v -u #{login}:#{password}
|
2013-06-12 15:59:58 +00:00
|
|
|
|
2012-09-20 12:08:02 +00:00
|
|
|
=end
|
|
|
|
|
|
|
|
def show
|
2015-02-15 09:12:27 +00:00
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
2015-08-29 11:46:48 +00:00
|
|
|
return if !check_access
|
2012-09-20 12:08:02 +00:00
|
|
|
model_show_render(Channel, params)
|
2012-04-13 13:51:10 +00:00
|
|
|
end
|
|
|
|
|
2012-09-20 12:08:02 +00:00
|
|
|
=begin
|
|
|
|
|
|
|
|
Resource:
|
2013-08-06 22:10:28 +00:00
|
|
|
POST /api/v1/channels.json
|
2012-09-20 12:08:02 +00:00
|
|
|
|
|
|
|
Payload:
|
|
|
|
{
|
2015-08-28 00:53:14 +00:00
|
|
|
"area":"Email::Account",
|
2012-09-20 12:08:02 +00:00
|
|
|
"group_id:": 1,
|
|
|
|
"options":{
|
2015-08-28 00:53:14 +00:00
|
|
|
"inbound":
|
|
|
|
"adapter":"IMAP",
|
|
|
|
"options":{
|
|
|
|
"host":"mail.example.com",
|
|
|
|
"user":"some_user",
|
|
|
|
"password":"some_password",
|
|
|
|
"ssl":true
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"outbound":{
|
|
|
|
"adapter":"SMTP",
|
|
|
|
"options": {
|
|
|
|
"host":"mail.example.com",
|
|
|
|
"user":"some_user",
|
|
|
|
"password":"some_password",
|
|
|
|
"start_tls":true
|
|
|
|
}
|
2012-09-20 12:08:02 +00:00
|
|
|
},
|
|
|
|
"active":true,
|
|
|
|
}
|
|
|
|
|
|
|
|
Response:
|
|
|
|
{
|
2015-08-28 00:53:14 +00:00
|
|
|
"area":"Email::Account",
|
2012-09-20 12:08:02 +00:00
|
|
|
...
|
|
|
|
}
|
|
|
|
|
|
|
|
Test:
|
2013-08-06 22:10:28 +00:00
|
|
|
curl http://localhost/api/v1/channels.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"name": "some_name","active": true, "note": "some note"}'
|
2012-09-20 12:08:02 +00:00
|
|
|
|
|
|
|
=end
|
|
|
|
|
2012-04-13 13:51:10 +00:00
|
|
|
def create
|
2015-02-15 09:12:27 +00:00
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
2012-09-20 12:08:02 +00:00
|
|
|
model_create_render(Channel, params)
|
2012-04-13 13:51:10 +00:00
|
|
|
end
|
|
|
|
|
2012-09-20 12:08:02 +00:00
|
|
|
=begin
|
|
|
|
|
|
|
|
Resource:
|
2013-08-06 22:10:28 +00:00
|
|
|
PUT /api/v1/channels/{id}.json
|
2012-09-20 12:08:02 +00:00
|
|
|
|
|
|
|
Payload:
|
|
|
|
{
|
|
|
|
"id":1,
|
2015-08-28 00:53:14 +00:00
|
|
|
"area":"Email::Account",
|
2012-09-20 12:08:02 +00:00
|
|
|
"group_id:": 1,
|
|
|
|
"options":{
|
2015-08-28 00:53:14 +00:00
|
|
|
"inbound":
|
|
|
|
"adapter":"IMAP",
|
|
|
|
"options":{
|
|
|
|
"host":"mail.example.com",
|
|
|
|
"user":"some_user",
|
|
|
|
"password":"some_password",
|
|
|
|
"ssl":true
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"outbound":{
|
|
|
|
"adapter":"SMTP",
|
|
|
|
"options": {
|
|
|
|
"host":"mail.example.com",
|
|
|
|
"user":"some_user",
|
|
|
|
"password":"some_password",
|
|
|
|
"start_tls":true
|
|
|
|
}
|
2012-09-20 12:08:02 +00:00
|
|
|
},
|
|
|
|
"active":true,
|
|
|
|
}
|
|
|
|
|
|
|
|
Response:
|
|
|
|
{
|
|
|
|
"id": 1,
|
|
|
|
"name": "some_name",
|
|
|
|
...
|
|
|
|
}
|
|
|
|
|
|
|
|
Test:
|
2013-08-06 22:10:28 +00:00
|
|
|
curl http://localhost/api/v1/channels.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"name": "some_name","active": true, "note": "some note"}'
|
2012-04-13 13:51:10 +00:00
|
|
|
|
2012-09-20 12:08:02 +00:00
|
|
|
=end
|
|
|
|
|
|
|
|
def update
|
2015-02-15 09:12:27 +00:00
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
2015-08-29 11:46:48 +00:00
|
|
|
return if !check_access
|
2012-09-20 12:08:02 +00:00
|
|
|
model_update_render(Channel, params)
|
2012-04-13 13:51:10 +00:00
|
|
|
end
|
|
|
|
|
2012-09-20 12:08:02 +00:00
|
|
|
=begin
|
|
|
|
|
|
|
|
Resource:
|
2013-08-06 22:10:28 +00:00
|
|
|
DELETE /api/v1/channels/{id}.json
|
2012-04-13 13:51:10 +00:00
|
|
|
|
2012-09-20 12:08:02 +00:00
|
|
|
Response:
|
|
|
|
{}
|
|
|
|
|
|
|
|
Test:
|
2013-08-06 22:10:28 +00:00
|
|
|
curl http://localhost/api/v1/channels.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X DELETE
|
2012-09-20 12:08:02 +00:00
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
def destroy
|
2015-02-15 09:12:27 +00:00
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
2015-08-29 11:46:48 +00:00
|
|
|
return if !check_access
|
2012-09-20 12:08:02 +00:00
|
|
|
model_destory_render(Channel, params)
|
2012-04-13 13:51:10 +00:00
|
|
|
end
|
2015-08-28 00:53:14 +00:00
|
|
|
|
|
|
|
def email_index
|
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
|
|
|
|
|
|
|
assets = {}
|
|
|
|
Channel.all.each {|channel|
|
2015-08-29 11:46:48 +00:00
|
|
|
next if channel.preferences && channel.preferences[:online_service_disable]
|
2015-08-28 00:53:14 +00:00
|
|
|
assets = channel.assets(assets)
|
|
|
|
}
|
|
|
|
EmailAddress.all.each {|email_address|
|
2015-08-29 11:46:48 +00:00
|
|
|
next if email_address.preferences && email_address.preferences[:online_service_disable]
|
2015-08-28 00:53:14 +00:00
|
|
|
assets = email_address.assets(assets)
|
|
|
|
}
|
|
|
|
render json: {
|
|
|
|
assets: assets
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def email_probe
|
|
|
|
|
|
|
|
# check admin permissions
|
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
|
|
|
|
|
|
|
# probe settings based on email and password
|
|
|
|
result = EmailHelper::Probe.full(
|
|
|
|
email: params[:email],
|
|
|
|
password: params[:password],
|
|
|
|
)
|
|
|
|
|
|
|
|
# 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
|
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
|
|
|
|
2015-08-29 11:46:48 +00:00
|
|
|
# verify access
|
|
|
|
return if !check_access(params[:channel_id]) if 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
|
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
|
|
|
|
2015-08-29 11:46:48 +00:00
|
|
|
# verify access
|
|
|
|
return if !check_access(params[:channel_id]) if 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
|
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
|
|
|
|
|
|
|
email = params[:email] || params[:meta][:email]
|
|
|
|
email = email.downcase
|
|
|
|
channel_id = params[:channel_id]
|
|
|
|
|
2015-08-29 11:46:48 +00:00
|
|
|
# verify access
|
|
|
|
return if !check_access(channel_id) if 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
|
|
|
|
|
|
|
|
# update account
|
|
|
|
if channel_id
|
|
|
|
channel = Channel.find(channel_id)
|
|
|
|
channel.update_attributes(
|
|
|
|
options: {
|
|
|
|
inbound: params[:inbound],
|
|
|
|
outbound: params[:outbound],
|
|
|
|
},
|
2015-08-28 08:19:27 +00:00
|
|
|
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: 'ok',
|
|
|
|
}
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
# create new account
|
|
|
|
channel = Channel.create(
|
|
|
|
area: 'Email::Account',
|
|
|
|
options: {
|
|
|
|
inbound: params[:inbound],
|
|
|
|
outbound: params[:outbound],
|
|
|
|
},
|
2015-08-29 11:46:48 +00:00
|
|
|
last_log_in: nil,
|
|
|
|
last_log_out: nil,
|
|
|
|
status_in: 'ok',
|
|
|
|
status_out: 'ok',
|
2015-08-28 00:53:14 +00:00
|
|
|
active: true,
|
|
|
|
group_id: Group.first.id,
|
|
|
|
)
|
|
|
|
|
|
|
|
# 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: 'ok',
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def email_notification
|
|
|
|
|
2015-08-29 11:46:48 +00:00
|
|
|
return if !check_online_service
|
|
|
|
|
2015-08-28 00:53:14 +00:00
|
|
|
# check admin permissions
|
|
|
|
return if deny_if_not_role(Z_ROLENAME_ADMIN)
|
|
|
|
|
|
|
|
adapter = params[:adapter].downcase
|
|
|
|
|
2015-08-28 08:19:27 +00:00
|
|
|
# validate adapter
|
|
|
|
if adapter !~ /^(smtp|sendmail)$/
|
|
|
|
render json: {
|
|
|
|
result: 'failed',
|
|
|
|
message: "Unknown adapter '#{adapter}'",
|
|
|
|
}
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2015-08-28 00:53:14 +00:00
|
|
|
email = Setting.get('notification_sender')
|
|
|
|
|
|
|
|
# connection test
|
|
|
|
result = EmailHelper::Probe.outbound(params, email)
|
|
|
|
|
|
|
|
# save settings
|
|
|
|
if result[:result] == 'ok'
|
|
|
|
|
|
|
|
Channel.where(area: 'Email::Notification').each {|channel|
|
|
|
|
active = false
|
|
|
|
if adapter =~ /^#{channel.options[:outbound][:adapter]}$/i
|
|
|
|
active = true
|
|
|
|
channel.options = {
|
|
|
|
outbound: {
|
|
|
|
adapter: adapter,
|
|
|
|
options: params[:options],
|
|
|
|
},
|
|
|
|
}
|
2015-08-28 08:19:27 +00:00
|
|
|
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)
|
|
|
|
Channel.where(area: 'Email::Account').each {|channel|
|
|
|
|
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
|
2015-08-29 11:46:48 +00:00
|
|
|
|
|
|
|
def check_online_service
|
|
|
|
return true if !Setting.get('system_online_service')
|
|
|
|
response_access_deny
|
|
|
|
false
|
|
|
|
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]
|
|
|
|
|
|
|
|
response_access_deny
|
|
|
|
false
|
|
|
|
end
|
2012-04-13 13:51:10 +00:00
|
|
|
end
|