Moved to new wording to access external services.

This commit is contained in:
Martin Edenhofer 2015-07-15 21:45:40 +02:00
parent 326e007481
commit ae4f48a954
20 changed files with 356 additions and 219 deletions

View file

@ -17,8 +17,8 @@ class System extends App.ControllerTabs
@title 'System', true
@tabs = [
{ name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'System::Base' } },
{ name: 'Services', 'target': 'services', controller: App.SettingsArea, params: { area: 'System::Services' } },
{ name: 'Storage', 'target': 'storage', controller: App.SettingsArea, params: { area: 'System::Storage' } },
{ name: 'Geo Services', 'target': 'geo', controller: App.SettingsArea, params: { area: 'System::Geo' } },
{ name: 'Frontend', 'target': 'ui', controller: App.SettingsArea, params: { area: 'System::UI' } },
]
@render()
@ -65,7 +65,7 @@ class Ticket extends App.ControllerTabs
App.Config.set( 'SettingBranding', { prio: 1200, parent: '#settings', name: 'Branding', target: '#settings/branding', controller: Branding, role: ['Admin'] }, 'NavBarAdmin' )
App.Config.set( 'SettingSystem', { prio: 1400, parent: '#settings', name: 'System', target: '#settings/system', controller: System, role: ['Admin'] }, 'NavBarAdmin' )
App.Config.set( 'SettingSecurity', { prio: 1500, parent: '#settings', name: 'Security', target: '#settings/security', controller: Security, role: ['Admin'] }, 'NavBarAdmin' )
App.Config.set( 'SettingTicket', { prio: 1600, parent: '#settings', name: 'Ticket', target: '#settings/ticket', controller: Ticket, role: ['Admin'] }, 'NavBarAdmin' )
App.Config.set( 'SettingImport', { prio: 1700, parent: '#settings', name: 'Import', target: '#settings/import', controller: Import, role: ['Admin'] }, 'NavBarAdmin' )
App.Config.set( 'SettingSecurity', { prio: 1600, parent: '#settings', name: 'Security', target: '#settings/security', controller: Security, role: ['Admin'] }, 'NavBarAdmin' )
App.Config.set( 'SettingTicket', { prio: 1700, parent: '#settings', name: 'Ticket', target: '#settings/ticket', controller: Ticket, role: ['Admin'] }, 'NavBarAdmin' )
App.Config.set( 'SettingImport', { prio: 1800, parent: '#settings', name: 'Import', target: '#settings/import', controller: Import, role: ['Admin'] }, 'NavBarAdmin' )

View file

@ -86,7 +86,7 @@ class ApplicationController < ActionController::Base
# check if remote ip need to be updated
if !session[:remote_id] || session[:remote_id] != request.remote_ip
session[:remote_id] = request.remote_ip
session[:geo] = GeoIp.location( request.remote_ip )
session[:geo] = Service::GeoIp.location( request.remote_ip )
end
# fill user agent

View file

@ -130,7 +130,7 @@ class UsersController < ApplicationController
# fetch org logo
if user.email
Zammad::BigData::Organization.suggest_system_image(user.email)
Service::Image.organization_suggest(user.email)
end
end

View file

@ -146,7 +146,7 @@ add a avatar
end
# fetch image
image = Zammad::BigData::User.image(data[:url])
image = Service::Image.user(data[:url])
return if !image
if !data[:resize]
data[:resize] = {}

View file

@ -54,7 +54,7 @@ class Observer::User::Geo < ActiveRecord::Observer
return if address == ''
# lookup
latlng = GeoLocation.geocode( address )
latlng = Service::GeoLocation.geocode( address )
return if !latlng
# store data

View file

@ -0,0 +1,76 @@
class UpdateServices < ActiveRecord::Migration
def up
Setting.create_or_update(
title: 'Image Service',
name: 'image_backend',
area: 'System::Services',
description: 'Defines the backend for user and organization image lookups.',
options: {
form: [
{
display: '',
null: true,
name: 'image_backend',
tag: 'select',
options: {
'' => '-',
'Service::Image::Zammad' => 'Zammad Image Service',
},
},
],
},
state: 'Service::Image::Zammad',
preferences: { prio: 1 },
frontend: false
)
Setting.create_or_update(
title: 'Geo IP Service',
name: 'geo_ip_backend',
area: 'System::Services',
description: 'Defines the backend for geo IP lookups. Show also location of an IP address if an IP address is shown.',
options: {
form: [
{
display: '',
null: true,
name: 'geo_ip_backend',
tag: 'select',
options: {
'' => '-',
'Service::GeoIp::Zammad' => 'Zammad GeoIP Service',
},
},
],
},
state: 'Service::GeoIp::Zammad',
preferences: { prio: 2 },
frontend: false
)
Setting.create_or_update(
title: 'Geo Location Service',
name: 'geo_location_backend',
area: 'System::Services',
description: 'Defines the backend for geo location lookups to store geo locations for addresses.',
options: {
form: [
{
display: '',
null: true,
name: 'geo_location_backend',
tag: 'select',
options: {
'' => '-',
'Service::GeoLocation::Gmaps' => 'Google Maps',
},
},
],
},
state: 'Service::GeoLocation::Gmaps',
preferences: { prio: 3 },
frontend: false
)
end
end

View file

@ -49,7 +49,7 @@ Setting.create_if_not_exists(
],
},
preferences: { render: true, session_check: true, prio: 1 },
state: 'Zammad',
state: 'Zammad Helpdesk',
frontend: true
)
Setting.create_if_not_exists(
@ -196,33 +196,36 @@ Setting.create_if_not_exists(
state: 'DB',
frontend: false
)
Setting.create_if_not_exists(
title: 'Geo Location Backend',
name: 'geo_location_backend',
area: 'System::Geo',
description: 'Defines the backend for geo location lookups.',
title: 'Image Service',
name: 'image_backend',
area: 'System::Services',
description: 'Defines the backend for user and organization image lookups.',
options: {
form: [
{
display: '',
null: true,
name: 'geo_location_backend',
name: 'image_backend',
tag: 'select',
options: {
'' => '-',
'GeoLocation::Gmaps' => 'Google Maps',
'Service::Image::Zammad' => 'Zammad Image Service',
},
},
],
},
state: 'GeoLocation::Gmaps',
state: 'Service::Image::Zammad',
preferences: { prio: 1 },
frontend: false
)
Setting.create_if_not_exists(
title: 'Geo IP Backend',
title: 'Geo IP Service',
name: 'geo_ip_backend',
area: 'System::Geo',
description: 'Defines the backend for geo ip lookups.',
area: 'System::Services',
description: 'Defines the backend for geo IP lookups. Show also location of an IP address if an IP address is shown.',
options: {
form: [
{
@ -232,12 +235,37 @@ Setting.create_if_not_exists(
tag: 'select',
options: {
'' => '-',
'GeoIp::ZammadGeoIp' => 'Zammad GeoIP Service',
'Service::GeoIp::Zammad' => 'Zammad GeoIP Service',
},
},
],
},
state: 'GeoIp::ZammadGeoIp',
state: 'Service::GeoIp::Zammad',
preferences: { prio: 2 },
frontend: false
)
Setting.create_if_not_exists(
title: 'Geo Location Service',
name: 'geo_location_backend',
area: 'System::Services',
description: 'Defines the backend for geo location lookups to store geo locations for addresses.',
options: {
form: [
{
display: '',
null: true,
name: 'geo_location_backend',
tag: 'select',
options: {
'' => '-',
'Service::GeoLocation::Gmaps' => 'Google Maps',
},
},
],
},
state: 'Service::GeoLocation::Gmaps',
preferences: { prio: 3 },
frontend: false
)

View file

@ -111,7 +111,7 @@ returns
# fetch org logo
if admin_user.email
Zammad::BigData::Organization.suggest_system_image(admin_user.email)
Service::Image.organization_suggest(admin_user.email)
end
}
end

View file

@ -1,49 +0,0 @@
# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
class GeoLocation
include ApplicationLib
=begin
lookup lat and lng for address
result = GeoLocation.geocode( 'Marienstrasse 13, 10117 Berlin' )
returns
result = [ 4.21312, 1.3123 ]
=end
def self.geocode(address)
# load backend
backend = load_adapter_by_setting( 'geo_location_backend' )
return if !backend
# db lookup
backend.geocode(address)
end
=begin
lookup address for lat and lng
result = GeoLocation.reverse_geocode( 4.21312, 1.3123 )
returns
result = 'some address'
=end
def self.reverse_geocode(lat, lng)
# load backend
backend = load_adapter_by_setting( 'geo_location_backend' )
return if !backend
# db lookup
backend.reverse_geocode(lat, lng)
end
end

View file

@ -1,13 +1,14 @@
# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
class GeoIp
module Service
class GeoIp
include ApplicationLib
=begin
lookup location based on ip or hostname
result = GeoIp.location( '172.0.0.1' )
result = Service::GeoIp.location( '172.0.0.1' )
returns
@ -36,4 +37,5 @@ returns
# db lookup
backend.location(address)
end
end
end

View file

@ -2,7 +2,7 @@
require 'cache'
class GeoIp::ZammadGeoIp
class Service::GeoIp::Zammad
def self.location(address)
# check cache

View file

@ -0,0 +1,51 @@
# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
module Service
class GeoLocation
include ApplicationLib
=begin
lookup lat and lng for address
result = Service::GeoLocation.geocode( 'Marienstrasse 13, 10117 Berlin' )
returns
result = [ 4.21312, 1.3123 ]
=end
def self.geocode(address)
# load backend
backend = load_adapter_by_setting( 'geo_location_backend' )
return if !backend
# db lookup
backend.geocode(address)
end
=begin
lookup address for lat and lng
result = GeoLocation.reverse_geocode( 4.21312, 1.3123 )
returns
result = 'some address'
=end
def self.reverse_geocode(lat, lng)
# load backend
backend = load_adapter_by_setting( 'geo_location_backend' )
return if !backend
# db lookup
backend.reverse_geocode(lat, lng)
end
end
end

View file

@ -1,6 +1,6 @@
# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
class GeoLocation::Gmaps
class Service::GeoLocation::Gmaps
def self.geocode(address)
url = "http://maps.googleapis.com/maps/api/geocode/json?address=#{CGI.escape address}&sensor=true"

79
lib/service/image.rb Normal file
View file

@ -0,0 +1,79 @@
# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
module Service
class Image
include ApplicationLib
=begin
lookup user image based on email address
file = Service::Image.user( 'skywalker@zammad.org' )
returns
{
content: content,
mime_type: mime_type,
}
=end
def self.user(address)
# load backend
backend = load_adapter_by_setting( 'image_backend' )
return if !backend
backend.user(address)
end
=begin
lookup organization image based on domain
file = Service::Image.organization('edenhofer.de')
file = Service::Image.organization('user@edenhofer.de') # will just use domain
returns
{
content: content,
mime_type: mime_type,
}
=end
def self.organization(domain)
# load backend
backend = load_adapter_by_setting( 'image_backend' )
return if !backend
backend.organization(domain)
end
=begin
find organization image suggestion
result = Service::Image.organization_suggest('edenhofer.de')
returns
true # or false
=end
def self.organization_suggest(domain)
# load backend
backend = load_adapter_by_setting( 'image_backend' )
return if !backend
backend.organization_suggest(domain)
end
end
end

View file

@ -0,0 +1,74 @@
# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
class Service::Image::Zammad
# rubocop:disable Style/ClassVars
@@api_host = 'https://bigdata.zammad.com'
@@open_timeout = 4
@@read_timeout = 6
def self.user(email)
# fetch image
response = UserAgent.post(
"#{@@api_host}/api/v1/person/image",
{
email: email,
},
{
open_timeout: @@open_timeout,
read_timeout: @@read_timeout,
},
)
if !response.success?
Rails.logger.info "Can't fetch image for '#{email}' (maybe no avatar available), http code: #{response.code}"
return
end
Rails.logger.info "Fetched image for '#{email}', http code: #{response.code}"
mime_type = 'image/jpeg'
{
content: response.body,
mime_type: mime_type,
}
end
def self.organization(domain)
# strip, just use domain name
domain = domain.sub(/^.+?@(.+?)$/, '\1')
# fetch org logo
response = UserAgent.post(
"#{@@api_host}/api/v1/organization/image",
{
domain: domain
},
{
open_timeout: @@open_timeout,
read_timeout: @@read_timeout,
},
)
if !response.success?
Rails.logger.info "Can't fetch image for '#{domain}' (maybe no avatar available), http code: #{response.code}"
return
end
Rails.logger.info "Fetched image for '#{domain}', http code: #{response.code}"
mime_type = 'image/png'
{
content: response.body,
mime_type: mime_type,
}
end
def self.organization_suggest(domain)
image = self.organization(domain)
return false if !image
# store image 1:1
product_logo = StaticAssets.store_raw( image[:content], image[:mime_type] )
Setting.set('product_logo', product_logo)
true
end
end

View file

@ -1,10 +0,0 @@
module Zammad
module BigData
class Base
# rubocop:disable Style/ClassVars
@@api_host = 'https://bigdata.zammad.com'
@@open_timeout = 4
@@read_timeout = 6
end
end
end

View file

@ -1,69 +0,0 @@
module Zammad
module BigData
class Organization < Zammad::BigData::Base
=begin
file = Zammad::BigData::Organization.image('edenhofer.de')
file = Zammad::BigData::Organization.image('user@edenhofer.de') # will just use domain
returns
{
content: content,
mime_type: mime_type,
}
=end
def self.image(domain)
# strip, just use domain name
domain = domain.sub(/^.+?@(.+?)$/, '\1')
# fetch org logo
response = UserAgent.post(
"#{@@api_host}/api/v1/organization/image",
{
domain: domain
},
{
open_timeout: @@open_timeout,
read_timeout: @@read_timeout,
},
)
if !response.success?
Rails.logger.info "Can't fetch image for '#{domain}' (maybe no avatar available), http code: #{response.code}"
return
end
Rails.logger.info "Fetched image for '#{domain}', http code: #{response.code}"
mime_type = 'image/png'
{
content: response.body,
mime_type: mime_type,
}
end
=begin
result = Zammad::BigData::Organization.suggest_system_image('edenhofer.de')
returns
true # or false
=end
def self.suggest_system_image(domain)
image = self.image(domain)
return false if !image
# store image 1:1
product_logo = StaticAssets.store_raw( image[:content], image[:mime_type] )
Setting.set('product_logo', product_logo)
true
end
end
end
end

View file

@ -1,45 +0,0 @@
module Zammad
module BigData
class User < Zammad::BigData::Base
=begin
file = Zammad::BigData::User.image('client@edenhofer.de')
returns
{
content: content,
mime_type: mime_type,
}
=end
def self.image(email)
# fetch logo
response = UserAgent.post(
"#{@@api_host}/api/v1/person/image",
{
email: email,
},
{
open_timeout: @@open_timeout,
read_timeout: @@read_timeout,
},
)
if !response.success?
Rails.logger.info "Can't fetch image for '#{email}' (maybe no avatar available), http code: #{response.code}"
return
end
Rails.logger.info "Fetched image for '#{email}', http code: #{response.code}"
mime_type = 'image/jpeg'
{
content: response.body,
mime_type: mime_type,
}
end
end
end
end

View file

@ -6,7 +6,7 @@ class GeoIpTest < ActiveSupport::TestCase
# check
test 'check some results' do
result = GeoIp.location( '127.0.0.0.1' )
result = Service::GeoIp.location( '127.0.0.0.1' )
assert(result)
assert_equal(nil, result['country_name'])
assert_equal(nil, result['city_name'])
@ -15,7 +15,7 @@ class GeoIpTest < ActiveSupport::TestCase
assert_equal(nil, result['latitude'])
assert_equal(nil, result['longitude'])
result = GeoIp.location( '195.65.29.254' )
result = Service::GeoIp.location( '195.65.29.254' )
assert(result)
assert_equal('Switzerland', result['country_name'])
assert_equal('Regensdorf', result['city_name'])
@ -24,7 +24,7 @@ class GeoIpTest < ActiveSupport::TestCase
assert_equal(47.4299, result['latitude'])
assert_equal(8.465100000000007, result['longitude'])
result = GeoIp.location( '134.109.140.74' )
result = Service::GeoIp.location( '134.109.140.74' )
assert(result)
assert_equal('Germany', result['country_name'])
assert_equal('Chemnitz', result['city_name'])
@ -33,7 +33,7 @@ class GeoIpTest < ActiveSupport::TestCase
assert_equal(50.83330000000001, result['latitude'])
assert_equal(12.916699999999992, result['longitude'])
result = GeoIp.location( '46.253.55.170' )
result = Service::GeoIp.location( '46.253.55.170' )
assert(result)
assert_equal('Germany', result['country_name'])
assert_equal('Halle', result['city_name'])
@ -42,7 +42,7 @@ class GeoIpTest < ActiveSupport::TestCase
assert_equal(51.5, result['latitude'])
assert_equal(12.0, result['longitude'])
result = GeoIp.location( '169.229.216.200' )
result = Service::GeoIp.location( '169.229.216.200' )
assert(result)
assert_equal('United States', result['country_name'])
assert_equal('Berkeley', result['city_name'])

View file

@ -6,22 +6,22 @@ class GeoLocationTest < ActiveSupport::TestCase
# check
test 'check simple results' do
result = GeoLocation.geocode( 'Marienstrasse 13, 10117 Berlin' )
result = Service::GeoLocation.geocode( 'Marienstrasse 13, 10117 Berlin' )
assert(result)
assert_equal(52.52204, result[0])
assert_equal(13.38319, result[1])
result = GeoLocation.geocode( 'Marienstrasse 13 10117 Berlin' )
result = Service::GeoLocation.geocode( 'Marienstrasse 13 10117 Berlin' )
assert(result)
assert_equal(52.52204, result[0])
assert_equal(13.38319, result[1])
result = GeoLocation.geocode( 'Martinsbruggstrasse 35, 9016 St. Gallen' )
result = Service::GeoLocation.geocode( 'Martinsbruggstrasse 35, 9016 St. Gallen' )
assert(result)
assert_equal(47.4366664, result[0])
assert_equal(9.409814899999999, result[1])
result = GeoLocation.geocode( 'Martinsbruggstrasse 35 9016 St. Gallen' )
result = Service::GeoLocation.geocode( 'Martinsbruggstrasse 35 9016 St. Gallen' )
assert(result)
assert_equal(47.4366664, result[0])
assert_equal(9.409814899999999, result[1])