doc_juan 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -0
- data/README.md +7 -1
- data/lib/doc_juan/token.rb +36 -0
- data/lib/doc_juan/url_generator.rb +7 -23
- data/lib/doc_juan/url_helper.rb +1 -2
- data/lib/doc_juan/version.rb +1 -1
- data/spec/token_spec.rb +48 -0
- data/spec/url_generator_spec.rb +19 -48
- data/spec/url_helper_spec.rb +12 -2
- metadata +6 -9
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -17,6 +17,11 @@ You need to provide your secret key and the host of the Doc-Juan instance.
|
|
17
17
|
|
18
18
|
If you are using Rails an initializer would be the appropriate place for this.
|
19
19
|
|
20
|
+
### Authentication
|
21
|
+
|
22
|
+
If your site is behind HTTP Basic Authentication `DocJuan.config.username` and `DocJuan.config.password` is your friends.
|
23
|
+
|
24
|
+
**BEWARE!** Setting these will append your credentials to every DocJuan url generated and, depending on how you use them, can be _fully visible to your users_. The authentication credentials is foremost available for testing in your staging environment.
|
20
25
|
|
21
26
|
### Generating urls
|
22
27
|
|
@@ -30,7 +35,8 @@ Valid options are:
|
|
30
35
|
* `height` - Page height in millimeters.
|
31
36
|
* `size` - a4, letter etc. This will be ignored if width and height is set. [List of sizes](http://stackoverflow.com/questions/6394905/wkhtmltopdf-what-paper-sizes-are-valid).
|
32
37
|
* `orientation` - `landscape` or `portrait`. Defaults to portrait.
|
33
|
-
* `lowquality` - Renders the pdf in low quality if set to `true
|
38
|
+
* `lowquality` - Renders the pdf in low quality if set to `true`.
|
39
|
+
* `format` - Output file format, `pdf` or `jpg`. Defaults to `pdf`.
|
34
40
|
|
35
41
|
#### Example
|
36
42
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require_relative 'config.rb'
|
3
|
+
|
4
|
+
module DocJuan
|
5
|
+
class NoSecretGivenError < StandardError; end
|
6
|
+
|
7
|
+
class Token
|
8
|
+
def initialize url_generator
|
9
|
+
@url_generator = url_generator
|
10
|
+
|
11
|
+
raise NoSecretGivenError if secret == ''
|
12
|
+
end
|
13
|
+
|
14
|
+
def key
|
15
|
+
sha1 = OpenSSL::Digest::Digest.new 'sha1'
|
16
|
+
OpenSSL::HMAC.hexdigest sha1, secret, seed
|
17
|
+
end
|
18
|
+
|
19
|
+
def secret
|
20
|
+
DocJuan.config.secret.to_s.strip
|
21
|
+
end
|
22
|
+
|
23
|
+
def seed
|
24
|
+
seed = []
|
25
|
+
seed << "filename:#{@url_generator.filename}"
|
26
|
+
seed << "format:#{@url_generator.format}"
|
27
|
+
Hash[(@url_generator.options).sort].each do |k,v|
|
28
|
+
seed << "options_#{k}:#{v}"
|
29
|
+
end
|
30
|
+
seed << "url:#{@url_generator.url}"
|
31
|
+
|
32
|
+
seed.join '-'
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -1,24 +1,23 @@
|
|
1
|
-
require 'openssl'
|
2
1
|
require 'cgi'
|
3
2
|
|
3
|
+
require_relative 'token'
|
4
4
|
require_relative 'config'
|
5
5
|
|
6
6
|
module DocJuan
|
7
7
|
class NoHostGivenError < StandardError; end
|
8
|
-
class NoSecretGivenError < StandardError; end
|
9
8
|
|
10
9
|
class UrlGenerator
|
11
|
-
attr_reader :url, :filename, :options
|
10
|
+
attr_reader :url, :filename, :format, :options
|
12
11
|
|
13
|
-
def initialize url, filename, options = {}
|
12
|
+
def initialize url, filename, format = 'pdf', options = {}
|
14
13
|
@url = url
|
15
14
|
@filename = filename.to_s
|
15
|
+
@format = format
|
16
16
|
|
17
17
|
options = {} unless options
|
18
18
|
options = options.merge authentication_credentials if has_authentication_credentials?
|
19
|
-
@options =
|
19
|
+
@options = options
|
20
20
|
|
21
|
-
raise NoSecretGivenError if secret_key == ''
|
22
21
|
raise NoHostGivenError if host == ''
|
23
22
|
end
|
24
23
|
|
@@ -26,6 +25,7 @@ module DocJuan
|
|
26
25
|
params = []
|
27
26
|
params << "url=#{CGI.escape(url)}"
|
28
27
|
params << "filename=#{CGI.escape(filename)}"
|
28
|
+
params << "format=#{CGI.escape(format)}"
|
29
29
|
options.each do |k,v|
|
30
30
|
params << "options[#{CGI.escape(k.to_s)}]=#{CGI.escape v.to_s}"
|
31
31
|
end
|
@@ -35,19 +35,7 @@ module DocJuan
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def public_key
|
38
|
-
|
39
|
-
OpenSSL::HMAC.hexdigest sha1, secret_key, seed_string
|
40
|
-
end
|
41
|
-
|
42
|
-
def seed_string
|
43
|
-
seed = []
|
44
|
-
seed << "filename:#{filename}"
|
45
|
-
options.each do |k,v|
|
46
|
-
seed << "options_#{k}:#{v}"
|
47
|
-
end
|
48
|
-
seed << "url:#{url}"
|
49
|
-
|
50
|
-
seed.join '-'
|
38
|
+
@public_key ||= DocJuan::Token.new(self).key
|
51
39
|
end
|
52
40
|
|
53
41
|
def host
|
@@ -58,10 +46,6 @@ module DocJuan
|
|
58
46
|
end
|
59
47
|
end
|
60
48
|
|
61
|
-
def secret_key
|
62
|
-
DocJuan.config.secret.to_s.strip
|
63
|
-
end
|
64
|
-
|
65
49
|
def authentication_credentials
|
66
50
|
{
|
67
51
|
username: DocJuan.config.username,
|
data/lib/doc_juan/url_helper.rb
CHANGED
data/lib/doc_juan/version.rb
CHANGED
data/spec/token_spec.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
require_relative '../lib/doc_juan/token.rb'
|
3
|
+
require 'mocha'
|
4
|
+
|
5
|
+
describe DocJuan::Token do
|
6
|
+
before :each do
|
7
|
+
DocJuan.config.secret = 'zecret'
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:url_generator) do
|
11
|
+
stub(url: 'http://example.com', filename: 'file', format: 'pdf', options: {
|
12
|
+
title: 'The Site',
|
13
|
+
size: 'A4',
|
14
|
+
print_stylesheet: true
|
15
|
+
})
|
16
|
+
end
|
17
|
+
|
18
|
+
subject { DocJuan::Token.new(url_generator) }
|
19
|
+
|
20
|
+
it 'compiles into a seed string for the public key computation' do
|
21
|
+
subject.seed.must_equal 'filename:file-format:pdf-options_print_stylesheet:true-options_size:A4-options_title:The Site-url:http://example.com'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'calculates the public key' do
|
25
|
+
subject.key.must_equal 'b55142f9fdb148e8844e37e064e8eb2af6aabac6'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'calculates the public key with no options given' do
|
29
|
+
url_generator = stub url: 'http://example.com', filename: 'file', format: 'pdf', options: {}
|
30
|
+
token = DocJuan::Token.new(url_generator)
|
31
|
+
|
32
|
+
token.key.must_equal '539ebb1f6cd3fec40591acdc756e9b047e7093b3'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'has the secret key' do
|
36
|
+
subject.secret.must_equal 'zecret'
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'fails with NoSecretGivenError unless there is a secret set' do
|
40
|
+
DocJuan.config.secret = nil
|
41
|
+
|
42
|
+
proc {
|
43
|
+
subject
|
44
|
+
}.must_raise DocJuan::NoSecretGivenError
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
end
|
data/spec/url_generator_spec.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
require 'addressable/uri'
|
2
|
+
|
1
3
|
require_relative 'spec_helper'
|
2
4
|
|
3
5
|
require_relative '../lib/doc_juan/config.rb'
|
4
6
|
require_relative '../lib/doc_juan/url_generator.rb'
|
5
7
|
|
8
|
+
require 'mocha'
|
9
|
+
|
6
10
|
describe DocJuan::UrlGenerator do
|
7
11
|
before :each do
|
8
12
|
DocJuan.config.host = 'doc-juan.example.com'
|
@@ -10,7 +14,7 @@ describe DocJuan::UrlGenerator do
|
|
10
14
|
end
|
11
15
|
|
12
16
|
subject do
|
13
|
-
DocJuan::UrlGenerator.new('http://example.com', 'file
|
17
|
+
DocJuan::UrlGenerator.new('http://example.com', 'file', 'pdf', {
|
14
18
|
title: 'The Site',
|
15
19
|
size: 'A4',
|
16
20
|
print_stylesheet: true
|
@@ -18,32 +22,22 @@ describe DocJuan::UrlGenerator do
|
|
18
22
|
end
|
19
23
|
|
20
24
|
it 'generates the url' do
|
21
|
-
|
22
|
-
|
23
|
-
expected = 'http://doc-juan.example.com/render?'
|
24
|
-
expected << "url=#{CGI.escape subject.url}"
|
25
|
-
expected << "&filename=#{CGI.escape subject.filename}"
|
26
|
-
expected << "&options[print_stylesheet]=true"
|
27
|
-
expected << "&options[size]=A4"
|
28
|
-
expected << "&options[title]=#{CGI.escape 'The Site'}"
|
29
|
-
expected << "&key=#{subject.public_key}"
|
30
|
-
|
31
|
-
url.must_equal expected
|
32
|
-
end
|
25
|
+
uri = Addressable::URI.parse subject.generate
|
26
|
+
query = CGI.parse uri.query
|
33
27
|
|
34
|
-
|
35
|
-
|
36
|
-
url = subject.generate
|
28
|
+
uri.host.must_equal 'doc-juan.example.com'
|
29
|
+
uri.path.must_equal '/render'
|
37
30
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
31
|
+
query['url'].first.must_equal subject.url
|
32
|
+
query['filename'].first.must_equal subject.filename
|
33
|
+
query['key'].first.must_equal subject.public_key
|
34
|
+
query['format'].first.must_equal subject.format
|
42
35
|
|
43
|
-
|
36
|
+
subject.options.each do |k, v|
|
37
|
+
query["options[#{k}]"].first.must_equal v.to_s
|
38
|
+
end
|
44
39
|
end
|
45
40
|
|
46
|
-
|
47
41
|
it 'has the host' do
|
48
42
|
DocJuan.config.host = 'example.com'
|
49
43
|
|
@@ -58,16 +52,9 @@ describe DocJuan::UrlGenerator do
|
|
58
52
|
}.must_raise DocJuan::NoHostGivenError
|
59
53
|
end
|
60
54
|
|
61
|
-
it '
|
62
|
-
subject.
|
63
|
-
|
64
|
-
|
65
|
-
it 'fails with NoSecretGivenError unless there is a secret set' do
|
66
|
-
DocJuan.config.secret = nil
|
67
|
-
|
68
|
-
proc {
|
69
|
-
subject
|
70
|
-
}.must_raise DocJuan::NoSecretGivenError
|
55
|
+
it 'uses the token class to calculate the key' do
|
56
|
+
DocJuan::Token.expects(:new).with(subject).returns stub(key: 'verypublickey')
|
57
|
+
subject.public_key.must_equal 'verypublickey'
|
71
58
|
end
|
72
59
|
|
73
60
|
describe '#authentication' do
|
@@ -92,7 +79,6 @@ describe DocJuan::UrlGenerator do
|
|
92
79
|
subject.has_authentication_credentials?.must_equal false
|
93
80
|
end
|
94
81
|
|
95
|
-
|
96
82
|
it 'appends username and password to options if set as config variables' do
|
97
83
|
subject.options[:username].must_equal 'xkcd'
|
98
84
|
subject.options[:password].must_equal 'correct horse battery staple'
|
@@ -100,19 +86,4 @@ describe DocJuan::UrlGenerator do
|
|
100
86
|
|
101
87
|
end
|
102
88
|
|
103
|
-
it 'compiles into a seed string for the public key computation' do
|
104
|
-
subject.seed_string.must_equal 'filename:file.pdf-options_print_stylesheet:true-options_size:A4-options_title:The Site-url:http://example.com'
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'calculates the public key' do
|
108
|
-
subject.public_key.must_equal 'b55142f9fdb148e8844e37e064e8eb2af6aabac6'
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'calculates the public key with no options given' do
|
112
|
-
url_generator = DocJuan::UrlGenerator.new 'http://example.com', 'file.pdf'
|
113
|
-
key = url_generator.public_key
|
114
|
-
|
115
|
-
key.must_equal '539ebb1f6cd3fec40591acdc756e9b047e7093b3'
|
116
|
-
end
|
117
|
-
|
118
89
|
end
|
data/spec/url_helper_spec.rb
CHANGED
@@ -13,12 +13,22 @@ describe 'DocJuan#url' do
|
|
13
13
|
generator = stub
|
14
14
|
generator.expects(:generate).returns 'generated-url'
|
15
15
|
DocJuan::UrlGenerator.expects(:new).
|
16
|
-
with('http://example.com', 'the_file
|
16
|
+
with('http://example.com', 'the_file', nil, size: 'A4').
|
17
17
|
returns(generator)
|
18
18
|
|
19
|
-
url = DocJuan.url 'http://example.com', 'the_file
|
19
|
+
url = DocJuan.url 'http://example.com', 'the_file', size: 'A4'
|
20
20
|
|
21
21
|
url.must_equal 'generated-url'
|
22
22
|
end
|
23
23
|
|
24
|
+
it 'passes format if set to UrlGenerator instance' do
|
25
|
+
generator = stub
|
26
|
+
generator.expects(:generate)
|
27
|
+
DocJuan::UrlGenerator.expects(:new).
|
28
|
+
with('http://example.com', 'the_file', 'jpg', {}).
|
29
|
+
returns(generator)
|
30
|
+
|
31
|
+
DocJuan.url 'http://example.com', 'the_file', format: 'jpg'
|
32
|
+
end
|
33
|
+
|
24
34
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: doc_juan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-26 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A small helper class to generate urls to a Doc-Juan instance
|
15
15
|
email:
|
@@ -26,11 +26,13 @@ files:
|
|
26
26
|
- doc_juan.gemspec
|
27
27
|
- lib/doc_juan.rb
|
28
28
|
- lib/doc_juan/config.rb
|
29
|
+
- lib/doc_juan/token.rb
|
29
30
|
- lib/doc_juan/url_generator.rb
|
30
31
|
- lib/doc_juan/url_helper.rb
|
31
32
|
- lib/doc_juan/version.rb
|
32
33
|
- spec/configuration_spec.rb
|
33
34
|
- spec/spec_helper.rb
|
35
|
+
- spec/token_spec.rb
|
34
36
|
- spec/url_generator_spec.rb
|
35
37
|
- spec/url_helper_spec.rb
|
36
38
|
homepage: https://github.com/Oktavilla/Doc-Juan-Helper
|
@@ -45,21 +47,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
45
47
|
- - ! '>='
|
46
48
|
- !ruby/object:Gem::Version
|
47
49
|
version: '0'
|
48
|
-
segments:
|
49
|
-
- 0
|
50
|
-
hash: -3331118814664929665
|
51
50
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
51
|
none: false
|
53
52
|
requirements:
|
54
53
|
- - ! '>='
|
55
54
|
- !ruby/object:Gem::Version
|
56
55
|
version: '0'
|
57
|
-
segments:
|
58
|
-
- 0
|
59
|
-
hash: -3331118814664929665
|
60
56
|
requirements: []
|
61
57
|
rubyforge_project:
|
62
|
-
rubygems_version: 1.8.
|
58
|
+
rubygems_version: 1.8.24
|
63
59
|
signing_key:
|
64
60
|
specification_version: 3
|
65
61
|
summary: Given a url and options the DocJuan generates a url to a DocJuan server including
|
@@ -67,5 +63,6 @@ summary: Given a url and options the DocJuan generates a url to a DocJuan server
|
|
67
63
|
test_files:
|
68
64
|
- spec/configuration_spec.rb
|
69
65
|
- spec/spec_helper.rb
|
66
|
+
- spec/token_spec.rb
|
70
67
|
- spec/url_generator_spec.rb
|
71
68
|
- spec/url_helper_spec.rb
|