adcopy 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ doc
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Eddie Siegel
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,55 @@
1
+ = AdCopy
2
+
3
+ Author:: Eddie Siegel
4
+ Info:: http://www.adcopy.com
5
+ Documentation:: http://rdoc.info/projects/atomon/adcopy
6
+
7
+ == Installation
8
+
9
+ Currently AdCopy can only be installed as a rails plugin (gem coming soon):
10
+
11
+ script/plugin install git://github.com/atomon/adcopy.git
12
+
13
+ == API Keys
14
+
15
+ Your AdCopy API keys should be stored in <tt>config/adcopy_config.yml</tt>, which can be generated by running
16
+
17
+ rake adcopy:setup
18
+
19
+ == Adding An AdCopy Puzzle To A View
20
+
21
+ Displaying an AdCopy Puzzle is as simple as calling +adcopy_puzzle+ inside a form within your view. For example:
22
+
23
+ <% form_for(@user) do |f| %>
24
+ # ...
25
+ <p>
26
+ <%= adcopy_puzzle %>
27
+ </p>
28
+ # ...
29
+ <% end %>
30
+
31
+ The appearance of the puzzle can be adjusted by passing options to +adcopy_puzzle+. For a full list of options, see the documentation.
32
+
33
+ == Verifying The Input To An AdCopy Puzzle In A Controller
34
+
35
+ The +verify_adcopy_puzzle+ method verifies the user's input and returns +true+ if the user provided the correct input. In the simplest case, verification could be performed as follows:
36
+
37
+ respond_to do |format|
38
+ if verify_adcopy_puzzle && @user.save
39
+ # ...
40
+ else
41
+ # ...
42
+ end
43
+ end
44
+
45
+ +verify_adcopy_puzzle+ can also be used to add an error to a model object if the verification fails:
46
+
47
+ respond_to do |format|
48
+ if verify_adcopy_puzzle(:model => @user, :error_message => 'AdCopy puzzle input is invalid') && @user.save
49
+ # ...
50
+ else
51
+ # ...
52
+ end
53
+ end
54
+
55
+ See the documentation for a full list of options accepted by +verify_adcopy_puzzle+.
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require 'rake'
2
+ require 'rake/rdoctask'
3
+
4
+ desc 'Generate documentation for the adcopy plugin.'
5
+ Rake::RDocTask.new(:rdoc) do |rdoc|
6
+ rdoc.rdoc_dir = 'rdoc'
7
+ rdoc.title = 'Adcopy'
8
+ rdoc.options << '--line-numbers' << '--inline-source'
9
+ rdoc.rdoc_files.include('README')
10
+ rdoc.rdoc_files.include('lib/**/*.rb')
11
+ end
12
+
13
+ begin
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ gem.name = "adcopy"
17
+ gem.summary = "Simplifies the use of AdCopy puzzles within rails applications"
18
+ gem.description = "Simplifies the use of AdCopy puzzles within rails applications"
19
+ gem.email = "atomon@gmail.com"
20
+ gem.homepage = "http://github.com/atomon/adcopy"
21
+ gem.authors = ["Eddie Siegel"]
22
+ end
23
+ Jeweler::GemcutterTasks.new
24
+ rescue LoadError
25
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
26
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
data/init.rb ADDED
@@ -0,0 +1,10 @@
1
+ # Include hook code here
2
+ require 'adcopy'
3
+
4
+ class ActionView::Base
5
+ include AdCopy::ViewMethods
6
+ end
7
+
8
+ class ActionController::Base
9
+ include AdCopy::ControllerMethods
10
+ end
data/install.rb ADDED
@@ -0,0 +1,4 @@
1
+ puts ""
2
+ puts "Run 'rake adcopy:setup' to generate adcopy_config.yml"
3
+ puts "Don't forget to add your API keys to adcopy_config.yml"
4
+ puts ""
data/lib/adcopy.rb ADDED
@@ -0,0 +1,20 @@
1
+ # Adcopy
2
+ require 'view_methods'
3
+ require 'controller_methods'
4
+
5
+ module AdCopy
6
+ CONFIG_FILE = "#{RAILS_ROOT}/config/adcopy_config.yml"
7
+ CONFIG = YAML.load_file(CONFIG_FILE) if File.exist?(CONFIG_FILE)
8
+ VERIFY_SERVER = 'http://verify.adcopy.com'
9
+ API_SERVER = 'http://api.adcopy.com'
10
+ SIGNUP_URL = 'http://portal.adcopy.com/portal/public/signup'
11
+
12
+ class AdCopyError < StandardError
13
+ end
14
+
15
+ def self.check_for_keys!
16
+ if !File.exist?(CONFIG_FILE) || CONFIG.nil? || CONFIG['C_KEY'].nil? || CONFIG['V_KEY'].nil? || CONFIG['H_KEY'].nil?
17
+ raise AdCopyError, "AdCopy API keys not found. Keys can be obtained at #{SIGNUP_URL}"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,52 @@
1
+ module AdCopy
2
+
3
+ # Methods within this module will be included in ActionController::Base
4
+ module ControllerMethods
5
+
6
+ # Sends a POST request to the AdCopy server in order to verify the user's input.
7
+ # Returns +true+ if the user's input is valid, +false+ otherwise
8
+ #
9
+ # Options:
10
+ # <tt>:validate_response</tt>:: Whether or not the AdCopy authenticator should be used to validate the server's response. If this is set to +true+ and the validation fails, an AdCopyError is raised.
11
+ # <tt>:timeout</tt>:: The amount of time in seconds before the request should timeout. If the request times out, a Timeout::Error is raised.
12
+ # <tt>:model</tt>:: An ActiveRecord model. If verification fails, an error will be added to this model.
13
+ # <tt>:error_message</tt>:: A custom error message (to be used in conjunction with <tt>:model</tt>) to be used if verification fails.
14
+ def verify_adcopy_puzzle(options = {})
15
+ AdCopy::check_for_keys!
16
+ options = { :validate_response => true,
17
+ :timeout => 5,
18
+ :model => nil,
19
+ :error_message => nil
20
+ }.merge(options)
21
+
22
+ #Send POST to AdCopy
23
+ response = nil
24
+ Timeout::timeout(options[:timeout]) do
25
+ response = Net::HTTP.post_form URI.parse("#{AdCopy::VERIFY_SERVER}/papi/verify"), {
26
+ "privatekey" => AdCopy::CONFIG['V_KEY'],
27
+ "challenge" => params[:adcopy_challenge],
28
+ "response" => params[:adcopy_response],
29
+ "remoteip" => request.remote_ip
30
+ }
31
+ end
32
+ answer, error, authenticator = response.body.split("\n")
33
+
34
+ #validate the response
35
+ if options[:validate_response] && authenticator != Digest::SHA1.hexdigest("#{answer}#{params[:adcopy_challenge]}#{AdCopy::CONFIG['H_KEY']}")
36
+ raise AdCopyError, "AdCopy Error: Unable to Validate Response"
37
+ end
38
+
39
+ if answer.downcase == "true"
40
+ return true
41
+ else
42
+ #Add error to the model
43
+ if options[:model]
44
+ options[:model].valid?
45
+ options[:model].errors.add_to_base options[:error_message] || "AdCopy Puzzle: #{error}"
46
+ end
47
+
48
+ return false
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,44 @@
1
+ module AdCopy
2
+
3
+ # Methods within this module will be included in ActionView::Base
4
+ module ViewMethods
5
+
6
+ # Returns the HTML for an AdCopy puzzle
7
+ #
8
+ # Options:
9
+ # <tt>tabindex</tt>:: The tab index of the text field within the puzzle (defaults to <tt>nil</tt>)
10
+ # <tt>theme</tt>:: The theme applied to the puzzle (defaults to <tt>'purple'</tt>)
11
+ # <tt>lang</tt>:: The language of the puzzle (defaults to <tt>'en'</tt>)
12
+ def adcopy_puzzle(options = {})
13
+ AdCopy::check_for_keys!
14
+ options = { :tabindex => nil,
15
+ :theme => 'purple',
16
+ :lang => 'en'
17
+ }.merge(options)
18
+
19
+ output = ""
20
+
21
+ output << %{<script type="text/javascript">\n}
22
+ output << " var ACPuzzleOptions = {\n"
23
+ output << %{ tabindex: #{options[:tabindex]},\n} unless options[:tabindex].nil?
24
+ output << %{ theme: '#{options[:theme]}',\n}
25
+ output << %{ lang: '#{options[:lang]}'\n}
26
+ output << " };\n"
27
+ output << %{</script>\n}
28
+
29
+ output << %{<script type="text/javascript"}
30
+ output << %{ src="#{AdCopy::API_SERVER}/papi/challenge.script?k=#{AdCopy::CONFIG['C_KEY']}">}
31
+ output << %{</script>}
32
+
33
+ output << %{<noscript>}
34
+ output << %{ <iframe src="#{AdCopy::API_SERVER}/papi/challenge.noscript?k=#{AdCopy::CONFIG['C_KEY']}"}
35
+ output << %{ height="300" width="500" frameborder="0"></iframe><br/>}
36
+ output << %{ <textarea name="adcopy_challenge" rows="3" cols="40">}
37
+ output << %{ </textarea>}
38
+ output << %{ <input type="hidden" name="adcopy_response"}
39
+ output << %{ value="manual_challenge"/>}
40
+ output << %{</noscript>}
41
+ return output
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,17 @@
1
+ namespace :adcopy do
2
+ desc "Creates YAML file for API keys"
3
+ task :setup do
4
+ file_loc = "#{RAILS_ROOT}/config/adcopy_config.yml"
5
+
6
+ if File.exist?(file_loc)
7
+ puts "#{file_loc} exists. Nothing to do."
8
+ else
9
+ puts "Creating #{file_loc}"
10
+ file = File.new(file_loc, 'w')
11
+ file.puts "C_KEY: your_c_key_here"
12
+ file.puts "V_KEY: your_V_key_here"
13
+ file.puts "H_KEY: your_H_key_here"
14
+ puts "Don't forget to put your own API keys in adcopy_config.yml"
15
+ end
16
+ end
17
+ end
data/uninstall.rb ADDED
File without changes
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adcopy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Eddie Siegel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-20 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Simplifies the use of AdCopy puzzles within rails applications
17
+ email: atomon@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - LICENSE
24
+ - README.rdoc
25
+ files:
26
+ - .gitignore
27
+ - LICENSE
28
+ - README.rdoc
29
+ - Rakefile
30
+ - VERSION
31
+ - init.rb
32
+ - install.rb
33
+ - lib/adcopy.rb
34
+ - lib/controller_methods.rb
35
+ - lib/view_methods.rb
36
+ - tasks/adcopy_tasks.rake
37
+ - uninstall.rb
38
+ has_rdoc: true
39
+ homepage: http://github.com/atomon/adcopy
40
+ licenses: []
41
+
42
+ post_install_message:
43
+ rdoc_options:
44
+ - --charset=UTF-8
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ requirements: []
60
+
61
+ rubyforge_project:
62
+ rubygems_version: 1.3.5
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: Simplifies the use of AdCopy puzzles within rails applications
66
+ test_files: []
67
+