trabajo-afectivo/app/controllers/channels_controller.rb

457 lines
9.3 KiB
Ruby
Raw Normal View History

2014-02-03 19:24:49 +00:00
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
class ChannelsController < ApplicationController
before_action :authentication_check
=begin
Format:
JSON
Example:
{
"id":1,
2015-08-28 00:53:14 +00:00
"area":"Email::Account",
"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
}
},
"active":true,
"updated_at":"2012-09-14T17:51:53Z",
"created_at":"2012-09-14T17:51:53Z",
"updated_by_id":2.
"created_by_id":2,
}
{
"id":1,
2015-08-28 00:53:14 +00:00
"area":"Twitter::Account",
"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'
"group_id:": 1,
2015-07-02 15:13:04 +00:00
"limit": 1, # optional
},
{
2015-07-09 09:38:06 +00:00
"term":"#zombie23",
"group_id:": 2,
2015-07-02 15:13:04 +00:00
},
{
2015-07-09 09:38:06 +00:00
"term":"#otterhub",
"group_id:": 3,
2015-07-02 15:13:04 +00:00
}
],
"mentions" {
"group_id:": 4,
2015-07-02 15:13:04 +00:00
"limit": 100, # optional
},
2015-07-02 15:13:04 +00:00
"direct_messages": {
"group_id:": 4,
2015-07-02 15:13:04 +00:00
"limit": 1, # optional
}
}
},
"active":true,
"updated_at":"2012-09-14T17:51:53Z",
"created_at":"2012-09-14T17:51:53Z",
"updated_by_id":2.
"created_by_id":2,
}
=end
=begin
Resource:
GET /api/v1/channels.json
Response:
[
{
"id": 1,
2015-08-28 00:53:14 +00:00
"area":"Email::Account",
...
},
{
"id": 2,
2015-08-28 00:53:14 +00:00
"area":"Email::Account",
...
}
]
Test:
curl http://localhost/api/v1/channels.json -v -u #{login}:#{password}
=end
def index
2015-02-15 09:12:27 +00:00
return if deny_if_not_role(Z_ROLENAME_ADMIN)
model_index_render(Channel, params)
end
=begin
Resource:
GET /api/v1/channels/#{id}.json
Response:
{
"id": 1,
2015-08-28 00:53:14 +00:00
"area":"Email::Account",
...
}
Test:
curl http://localhost/api/v1/channels/#{id}.json -v -u #{login}:#{password}
=end
def show
2015-02-15 09:12:27 +00:00
return if deny_if_not_role(Z_ROLENAME_ADMIN)
model_show_render(Channel, params)
end
=begin
Resource:
POST /api/v1/channels.json
Payload:
{
2015-08-28 00:53:14 +00:00
"area":"Email::Account",
"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
}
},
"active":true,
}
Response:
{
2015-08-28 00:53:14 +00:00
"area":"Email::Account",
...
}
Test:
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"}'
=end
def create
2015-02-15 09:12:27 +00:00
return if deny_if_not_role(Z_ROLENAME_ADMIN)
model_create_render(Channel, params)
end
=begin
Resource:
PUT /api/v1/channels/{id}.json
Payload:
{
"id":1,
2015-08-28 00:53:14 +00:00
"area":"Email::Account",
"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
}
},
"active":true,
}
Response:
{
"id": 1,
"name": "some_name",
...
}
Test:
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"}'
=end
def update
2015-02-15 09:12:27 +00:00
return if deny_if_not_role(Z_ROLENAME_ADMIN)
model_update_render(Channel, params)
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
2015-02-15 09:12:27 +00:00
return if deny_if_not_role(Z_ROLENAME_ADMIN)
model_destory_render(Channel, params)
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|
assets = channel.assets(assets)
}
EmailAddress.all.each {|email_address|
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)
# 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)
# 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]
# 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],
},
last_log_in: '',
last_log_out: '',
status_in: nil,
status_out: nil,
)
render json: {
result: 'ok',
}
return
end
# create new account
channel = Channel.create(
area: 'Email::Account',
options: {
inbound: params[:inbound],
outbound: params[:outbound],
},
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
# check admin permissions
return if deny_if_not_role(Z_ROLENAME_ADMIN)
adapter = params[:adapter].downcase
email = Setting.get('notification_sender')
# connection test
result = EmailHelper::Probe.outbound(params, email)
# save settings
if result[:result] == 'ok'
# validate adapter
if adapter !~ /^(smtp|sendmail)$/
render json: {
result: 'failed',
message: "Unknown adapter '#{adapter}'",
}
return
end
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],
},
}
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
end