appoxy_api 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown ADDED
@@ -0,0 +1 @@
1
+ Nada.
@@ -0,0 +1,80 @@
1
+ module Appoxy
2
+
3
+ module Api
4
+
5
+ # The api controllers that use this should set:
6
+ # protect_from_forgery :only => [] # can add methods to here, eg: :create, :update, :destroy
7
+
8
+ # rescue_from SigError, :with => :send_error
9
+ # rescue_from Api::ApiError, :with => :send_error
10
+ # before_filter :verify_signature(params)
11
+
12
+ # Your Controller must define a sig_should method which will return the signature to compare against.
13
+
14
+ module ApiController
15
+
16
+ def verify_signature(params, operation)
17
+
18
+ # puts 'params in base=' + params.inspect
19
+
20
+ access_key = params["access_key"]
21
+ sigv = params["sigv"]
22
+ timestamp = params["timestamp"]
23
+ sig = params["sig"]
24
+
25
+ raise Api::SigError, "No access_key" if access_key.nil?
26
+ raise Api::SigError, "No sigv" if sigv.nil?
27
+ raise Api::SigError, "No timestamp" if timestamp.nil?
28
+ raise Api::SigError, "No sig" if sig.nil?
29
+
30
+ # todo: verify sig! Use SimpleWorker::HttpEnabled signature methods
31
+ sig2 = Appoxy::Api::Signatures.generate_signature(operation, timestamp, @project.secret_key)
32
+
33
+ raise Api::ApiError, "Invalid signature!" unless sig_should == sig2
34
+
35
+ end
36
+
37
+ def sig_should
38
+ raise "You didn't define a sig_should method in your controller!"
39
+ end
40
+
41
+
42
+ def send_ok(msg={})
43
+ response_as_string = '' # in case we want to add debugging or something
44
+ respond_to do |format|
45
+ # format.json { render :json=>msg }
46
+ response_as_string = render_to_string :json => msg
47
+ render :json => response_as_string
48
+ end
49
+ true
50
+ end
51
+
52
+
53
+ def send_error(statuscode_or_error, msg)
54
+ exc = nil
55
+ if statuscode_or_error.is_a? Exception
56
+ exc = statuscode_or_error
57
+ statuscode_or_error = 400
58
+ msg = exc.message
59
+ end
60
+ # deprecate status, should use status_code
61
+ json_msg = {"status_code"=>statuscode_or_error, "msg"=>msg}
62
+ render :json=>json_msg, :status=>statuscode_or_error
63
+ true
64
+ end
65
+
66
+
67
+ end
68
+
69
+ class ApiError < StandardError
70
+
71
+ def initialize(msg=nil)
72
+ super(msg)
73
+
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+ end
data/lib/api/client.rb ADDED
@@ -0,0 +1,41 @@
1
+ module Appoxy
2
+ module Api
3
+
4
+ # Subclass must define:
5
+ # host: endpoint url for service
6
+ class Client
7
+
8
+ attr_accessor :access_key, :secret_key
9
+
10
+ def initialize(host, access_key, secret_key, options={})
11
+ @access_key = access_key
12
+ @secret_key = secret_key
13
+
14
+ end
15
+
16
+ def get(method, params={}, options={})
17
+ parse_response ClientHelper.run_http(host, access_key, secret_key, :get, method, nil, params)
18
+ end
19
+
20
+ def post(method, params={}, options={})
21
+ parse_response ClientHelper.run_http(host, access_key, secret_key, :post, method, nil, params)
22
+ end
23
+
24
+ def put(method, body, options={})
25
+ parse_response ClientHelper.run_http(host, access_key, secret_key, :put, method, body, nil)
26
+ end
27
+
28
+ def parse_response(response)
29
+ begin
30
+ return ActiveSupport::JSON.decode(response)
31
+ rescue => ex
32
+ puts 'response that caused error = ' + response.to_s
33
+ raise ex
34
+ end
35
+ end
36
+
37
+
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,109 @@
1
+ module Appoxy
2
+ module Api
3
+ module ClientHelper
4
+
5
+ # TODO: SWAP OUT ALL THIS CRAP AND USE REST-CLIENT INSTEAD
6
+
7
+ # body is a hash
8
+ def self.run_http(host, access_key, secret_key, http_method, command_path, body=nil, parameters={}, extra_headers=nil)
9
+ ts = Appoxy::Api::Signatures.generate_timestamp(Time.now.gmtime)
10
+ # puts 'timestamp = ' + ts
11
+ sig = Appoxy::Api::Signatures.generate_signature(command_path, ts, secret_key)
12
+ # puts "My signature = " + sig
13
+ url = host + command_path
14
+ # puts url
15
+
16
+ user_agent = "Ruby Client"
17
+ headers = {'User-Agent' => user_agent}
18
+
19
+ if !extra_headers.nil?
20
+ extra_headers.each_pair do |k, v|
21
+ headers[k] = v
22
+ end
23
+ end
24
+
25
+ extra_params = {'sigv'=>"0.1", 'sig' => sig, 'timestamp' => ts, 'access_key' => access_key}
26
+ if http_method == :put
27
+ body.update(extra_params)
28
+ else
29
+ parameters = {} if parameters.nil?
30
+ parameters.update(extra_params)
31
+ # puts 'params=' + parameters.inspect
32
+
33
+ end
34
+
35
+
36
+ uri = URI.parse(url)
37
+ #puts 'body=' + body.to_s
38
+ if (http_method == :put)
39
+ req = Net::HTTP::Put.new(uri.path)
40
+ body = ActiveSupport::JSON.encode(body)
41
+ req.body = body unless body.nil?
42
+ elsif (http_method == :post)
43
+ req = Net::HTTP::Post.new(uri.path)
44
+ if !parameters.nil?
45
+ req.set_form_data(parameters)
46
+ else
47
+ req.body = body unless body.nil?
48
+ end
49
+ elsif (http_method == :delete)
50
+ req = Net::HTTP::Delete.new(uri.path)
51
+ if !parameters.nil?
52
+ req.set_form_data(parameters)
53
+ end
54
+ else
55
+ req = Net::HTTP::Get.new(uri.path)
56
+ if !parameters.nil?
57
+ req.set_form_data(parameters)
58
+ end
59
+ end
60
+ headers.each_pair do |k, v|
61
+ req[k] = v
62
+ end
63
+ # req.each_header do |k, v|
64
+ # puts 'header ' + k + '=' + v
65
+ #end
66
+ res = Net::HTTP.start(uri.host, uri.port) do |http|
67
+ http.request(req)
68
+ end
69
+
70
+ ret = ''
71
+ case res
72
+ when Net::HTTPSuccess
73
+ # puts 'response body=' + res.body
74
+ ret = res.body
75
+ when Net::HTTPClientError
76
+ raise ClientError.new(res.class.name, ActiveSupport::JSON.decode(res.body))
77
+ else
78
+ #res.error
79
+ raise ServiceError.new(res.class.name, res.body)
80
+ end
81
+ return ret
82
+
83
+ end
84
+
85
+ end
86
+
87
+ class ClientError < StandardError
88
+
89
+ attr_reader :response_hash
90
+
91
+ def initialize(class_name, response_hash)
92
+ puts 'response-hash=' + response_hash.inspect
93
+ super("#{class_name} - #{response_hash["msg"]}")
94
+ @response_hash = response_hash
95
+ end
96
+ end
97
+
98
+ class ServiceError < StandardError
99
+ attr_reader :body
100
+
101
+ def initialize(class_name, body)
102
+ super("#{class_name}")
103
+ @body = body
104
+
105
+ end
106
+ end
107
+ end
108
+ end
109
+
@@ -0,0 +1,22 @@
1
+ module Appoxy
2
+ module Api
3
+ module Signatures
4
+
5
+
6
+ def self.generate_timestamp(gmtime)
7
+ return gmtime.strftime("%Y-%m-%dT%H:%M:%SZ")
8
+ end
9
+
10
+ def self.generate_signature(operation, timestamp, secret_key)
11
+ # if USE_EMBEDDED_HMAC
12
+ # my_sha_hmac = HMAC::SHA1.digest(secret_key, operation + timestamp)
13
+ # else
14
+ my_sha_hmac = Digest::HMAC.digest(operation + timestamp, secret_key, Digest::SHA1)
15
+ # end
16
+ my_b64_hmac_digest = Base64.encode64(my_sha_hmac).strip
17
+ return my_b64_hmac_digest
18
+ end
19
+
20
+ end
21
+ end
22
+ end
data/lib/appoxy_api.rb ADDED
@@ -0,0 +1,5 @@
1
+
2
+ require File.join(File.dirname(__FILE__), "api", "api_controller")
3
+ require File.join(File.dirname(__FILE__), "api", "client_helper")
4
+ require File.join(File.dirname(__FILE__), "api", "signatures")
5
+
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: appoxy_api
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Travis Reeder
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-02-21 00:00:00 -08:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rest-client
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ description: Appoxy API Helper gem description...
33
+ email: travis@appoxy.com
34
+ executables: []
35
+
36
+ extensions: []
37
+
38
+ extra_rdoc_files:
39
+ - README.markdown
40
+ files:
41
+ - lib/api/api_controller.rb
42
+ - lib/api/client.rb
43
+ - lib/api/client_helper.rb
44
+ - lib/api/signatures.rb
45
+ - lib/appoxy_api.rb
46
+ - README.markdown
47
+ has_rdoc: true
48
+ homepage: http://www.appoxy.com
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options:
53
+ - --charset=UTF-8
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ requirements: []
71
+
72
+ rubyforge_project:
73
+ rubygems_version: 1.3.6
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: Appoxy API Helper gem
77
+ test_files: []
78
+