ruby_universign 1.2.0 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/CHANGELOG.md +27 -0
- data/README.md +38 -9
- data/lib/universign.rb +1 -2
- data/lib/universign/client.rb +5 -12
- data/lib/universign/configuration.rb +6 -4
- data/lib/universign/document.rb +13 -22
- data/lib/universign/error.rb +31 -11
- data/lib/universign/safeguard.rb +5 -5
- data/lib/universign/service/document.rb +1 -1
- data/lib/universign/service/transaction.rb +2 -2
- data/lib/universign/signature_field.rb +6 -4
- data/lib/universign/transaction.rb +1 -1
- data/lib/universign/version.rb +1 -1
- data/ruby_universign.gemspec +4 -3
- metadata +23 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7f7b34b6f2e64791dbf6910f67dc2d39fda890db4e90c0c6e20a3516a50b26e
|
4
|
+
data.tar.gz: 24b47db3af2b7dd0a644649e80fc61880e06ef546909c2479d0c3b93fac7aa66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b868fd44745e5fc5671f17977249d538a406de57c04219448eec046f7f053c5325bfdaa78ca70e0c8f4fd67fb1bcda738590725f01ba692e207ac4b0c80794d4
|
7
|
+
data.tar.gz: 6a7fbc730e6687ad99fb528f638cc3b43121f5728229b634065545fedff9bc111ed487f06f71d10fbc448173e46eb77856d8363376d4e3a6d40a99af2b89e7a4
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
v1.5.1
|
2
|
+
-------------------------
|
3
|
+
- Fix bugs on multi-threads requests.
|
4
|
+
|
5
|
+
v1.5.0
|
6
|
+
-------------------------
|
7
|
+
- Add `xmlrpc` as dependency, and raise required ruby version to 2.3.
|
8
|
+
|
9
|
+
v1.4.0
|
10
|
+
-------------------------
|
11
|
+
- Refactor and rename errors. They now all inherit from `Universign::Error`.
|
12
|
+
|
13
|
+
v1.3.1
|
14
|
+
-------------------------
|
15
|
+
|
16
|
+
- Fixing regressions added
|
17
|
+
|
18
|
+
v1.3.0 - NOT WORKING
|
19
|
+
-------------------------
|
20
|
+
|
21
|
+
- Adding the possibility to configure proxy and timeout options for the XMLRPC Client
|
22
|
+
|
23
|
+
v1.2.1
|
24
|
+
-------------------------
|
25
|
+
|
26
|
+
- Bumping rake development dependancy due to security issues
|
27
|
+
|
1
28
|
v1.2.0
|
2
29
|
-------------------------
|
3
30
|
|
data/README.md
CHANGED
@@ -38,9 +38,11 @@ Configuration:
|
|
38
38
|
```ruby
|
39
39
|
# if you're using Rails, put this in an initializer
|
40
40
|
Universign.configure do |config|
|
41
|
-
config.endpoint =
|
42
|
-
config.login =
|
43
|
-
config.password =
|
41
|
+
config.endpoint = 'your_universign_endpoint' # Required ...
|
42
|
+
config.login = 'your_login' # Required ...
|
43
|
+
config.password = 'your_password' # Required ...
|
44
|
+
config.proxy = 'your_proxy_uri:your_proxy_port' # Optionnal ...
|
45
|
+
config.timeout = 30 # Optionnal if you wanna change the default XMLRPC Timeout ...
|
44
46
|
end
|
45
47
|
```
|
46
48
|
|
@@ -57,12 +59,12 @@ document_from_content = Universign::Document.new(
|
|
57
59
|
)
|
58
60
|
|
59
61
|
signer = Universign::TransactionSigner.new(
|
60
|
-
first_name:
|
61
|
-
last_name:
|
62
|
-
email:
|
63
|
-
phone_number:
|
64
|
-
success_url:
|
65
|
-
|
62
|
+
first_name: "Signer's first name",
|
63
|
+
last_name: "Signer's last name",
|
64
|
+
email: 'test@gmail.com',
|
65
|
+
phone_number: '0101010101',
|
66
|
+
success_url: 'https://google.com/',
|
67
|
+
signature_field: Universign::SignatureField.new(coordinate: [20, 20], page: 1)
|
66
68
|
)
|
67
69
|
|
68
70
|
transaction = Universign::Transaction.create(
|
@@ -83,6 +85,33 @@ transaction = Universign::Transaction.new('9696179e-a43d-4803-beeb-9e5c02fd159b'
|
|
83
85
|
transaction.signed?
|
84
86
|
```
|
85
87
|
|
88
|
+
The gem also supports the updated way of creating multiple signature fields per document:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
doc_1 = Universign::Document.new(
|
92
|
+
name: 'one.pdf',
|
93
|
+
content: File.open('spec/fixtures/universign-guide-8.8.pdf').read,
|
94
|
+
signature_fields: [
|
95
|
+
Universign::SignatureField.new(coordinate: [20, 20], page: 1, signer_index: 0),
|
96
|
+
Universign::SignatureField.new(coordinate: [80, 20], page: 1, signer_index: 0)
|
97
|
+
]
|
98
|
+
)
|
99
|
+
|
100
|
+
doc_2 = Universign::Document.new(
|
101
|
+
name: 'two.pdf',
|
102
|
+
content: File.open('spec/fixtures/universign-guide-8.8.pdf').read,
|
103
|
+
signature_fields: [
|
104
|
+
Universign::SignatureField.new(coordinate: [100, 120], page: 4, signer_index: 0),
|
105
|
+
]
|
106
|
+
)
|
107
|
+
|
108
|
+
transaction = Universign::Transaction.create(
|
109
|
+
documents: [doc_1, doc_2],
|
110
|
+
signers: [signer],
|
111
|
+
options: { profile: 'default', final_doc_sent: true }
|
112
|
+
)
|
113
|
+
```
|
114
|
+
|
86
115
|
### `Universign::Document`
|
87
116
|
|
88
117
|
It can be created with either your file's content or your file's url.
|
data/lib/universign.rb
CHANGED
@@ -10,11 +10,10 @@ require 'universign/transaction'
|
|
10
10
|
require 'universign/signature_field'
|
11
11
|
require 'universign/signer_infos'
|
12
12
|
require 'universign/transaction_signer'
|
13
|
+
require 'universign/error'
|
13
14
|
require 'universign/client'
|
14
15
|
require 'universign/document'
|
15
16
|
require 'universign/configuration'
|
16
|
-
require 'universign/error'
|
17
17
|
|
18
18
|
module Universign
|
19
|
-
include Error
|
20
19
|
end
|
data/lib/universign/client.rb
CHANGED
@@ -2,11 +2,14 @@ require 'singleton'
|
|
2
2
|
|
3
3
|
module Universign
|
4
4
|
class Client
|
5
|
-
include ::Singleton
|
6
5
|
attr_reader :client
|
7
6
|
|
8
7
|
def initialize
|
9
|
-
@client = XMLRPC::Client.new2(
|
8
|
+
@client = XMLRPC::Client.new2(
|
9
|
+
Universign.configuration.endpoint,
|
10
|
+
Universign.configuration.proxy,
|
11
|
+
Universign.configuration.timeout
|
12
|
+
)
|
10
13
|
@client.user = Universign.configuration.login
|
11
14
|
@client.password = Universign.configuration.password
|
12
15
|
end
|
@@ -18,15 +21,5 @@ module Universign
|
|
18
21
|
super(method, *args, &block)
|
19
22
|
end
|
20
23
|
end
|
21
|
-
|
22
|
-
# _ _
|
23
|
-
# _____ _____ ___ _ __ | |_(_) ___ _ __ ___
|
24
|
-
# / _ \ \/ / __/ _ \ '_ \| __| |/ _ \| '_ \/ __|
|
25
|
-
# | __/> < (_| __/ |_) | |_| | (_) | | | \__ \
|
26
|
-
# \___/_/\_\___\___| .__/ \__|_|\___/|_| |_|___/
|
27
|
-
# |_|
|
28
|
-
class InvalidCredentials < StandardError; end
|
29
|
-
class ErrorWhenSigningPDF < StandardError; end
|
30
|
-
class UnknownException < StandardError; end
|
31
24
|
end
|
32
25
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
module Universign
|
2
2
|
class Configuration
|
3
|
-
attr_accessor :login, :password, :endpoint
|
3
|
+
attr_accessor :login, :password, :endpoint, :proxy, :timeout
|
4
4
|
|
5
5
|
def initialize
|
6
|
-
@login =
|
7
|
-
@password =
|
8
|
-
@endpoint =
|
6
|
+
@login = nil
|
7
|
+
@password = nil
|
8
|
+
@endpoint = nil
|
9
|
+
@proxy = nil
|
10
|
+
@timeout = nil
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
data/lib/universign/document.rb
CHANGED
@@ -75,6 +75,19 @@ module Universign
|
|
75
75
|
params['name'] = data
|
76
76
|
end
|
77
77
|
|
78
|
+
def signature_fields=(data)
|
79
|
+
if !data.is_a?(Array)
|
80
|
+
raise 'SignatureFieldsMustBeAnArray'
|
81
|
+
end
|
82
|
+
|
83
|
+
@signature_fields = data
|
84
|
+
params['signatureFields'] = data.map do |d|
|
85
|
+
raise 'BadSignatureFieldType' unless d.instance_of?(SignatureField)
|
86
|
+
|
87
|
+
d.params
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
78
91
|
# The meta data of the PDF document
|
79
92
|
#
|
80
93
|
# @return [Hash]
|
@@ -90,27 +103,5 @@ module Universign
|
|
90
103
|
@meta_data = data
|
91
104
|
params['metaData'] = data
|
92
105
|
end
|
93
|
-
|
94
|
-
# _ _
|
95
|
-
# _____ _____ ___ _ __ | |_(_) ___ _ __ ___
|
96
|
-
# / _ \ \/ / __/ _ \ '_ \| __| |/ _ \| '_ \/ __|
|
97
|
-
# | __/> < (_| __/ |_) | |_| | (_) | | | \__ \
|
98
|
-
# \___/_/\_\___\___| .__/ \__|_|\___/|_| |_|___/
|
99
|
-
# |_|
|
100
|
-
class UnknownDocument < StandardError; end
|
101
|
-
class NotSigned < StandardError; end
|
102
|
-
class MissingDocument < StandardError; end
|
103
|
-
class MetaDataMustBeAHash < StandardError; end
|
104
|
-
class DocumentURLInvalid < StandardError
|
105
|
-
attr_accessor :url
|
106
|
-
|
107
|
-
def initialize(url)
|
108
|
-
@url = url
|
109
|
-
end
|
110
|
-
|
111
|
-
def to_s
|
112
|
-
"Can't find document at '#{@url}''"
|
113
|
-
end
|
114
|
-
end
|
115
106
|
end
|
116
107
|
end
|
data/lib/universign/error.rb
CHANGED
@@ -1,14 +1,34 @@
|
|
1
1
|
module Universign
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
2
|
+
class Error < ::StandardError
|
3
|
+
def self.match_class(code)
|
4
|
+
{
|
5
|
+
73002 => Universign::ErrorWhenSigningPDF, # An error occured when signing the PDF document
|
6
|
+
73010 => Universign::InvalidCredentials, # The login and/or password are invalid.
|
7
|
+
73025 => Universign::UnknownDocument, # The used transaction id or custom id is invalid
|
8
|
+
73027 => Universign::DocumentNotSigned
|
9
|
+
}.fetch(code, nil)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class NotEnoughTokens < Error; end
|
14
|
+
|
15
|
+
class ErrorWhenSigningPDF < Error; end
|
16
|
+
class InvalidCredentials < Error; end
|
17
|
+
class UnknownException < Error; end
|
18
|
+
|
19
|
+
class UnknownDocument < Error; end
|
20
|
+
class DocumentNotSigned < Error; end
|
21
|
+
class MissingDocument < Error; end
|
22
|
+
class MetaDataMustBeAHash < Error; end
|
23
|
+
class DocumentURLInvalid < Error
|
24
|
+
attr_accessor :url
|
25
|
+
|
26
|
+
def initialize(url)
|
27
|
+
@url = url
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
"Can't find document at '#{@url}'"
|
32
|
+
end
|
13
33
|
end
|
14
34
|
end
|
data/lib/universign/safeguard.rb
CHANGED
@@ -16,27 +16,27 @@ module Universign
|
|
16
16
|
raise ex
|
17
17
|
end
|
18
18
|
|
19
|
-
known_exception = Universign::
|
19
|
+
known_exception = Universign::Error.match_class(ex.faultCode)
|
20
20
|
|
21
21
|
if known_exception
|
22
22
|
raise known_exception
|
23
23
|
elsif ex.faultString.include?('Error on document download for this URL')
|
24
24
|
url = ex.faultString.match(/<(.+)>/)[1] rescue 'unknown URL'
|
25
|
-
raise Universign::
|
25
|
+
raise Universign::DocumentURLInvalid.new(url)
|
26
26
|
elsif ex.faultString.include?('Invalid document URL')
|
27
27
|
url = ex.faultString.match(/<(.+)>/)[1] rescue 'unknown URL'
|
28
|
-
raise Universign::
|
28
|
+
raise Universign::DocumentURLInvalid.new(url)
|
29
29
|
elsif ex.faultString.include?('Not enough tokens')
|
30
30
|
raise Universign::NotEnoughTokens
|
31
31
|
elsif ex.faultString.include?('ID is unknown')
|
32
|
-
raise Universign::
|
32
|
+
raise Universign::UnknownDocument
|
33
33
|
else
|
34
34
|
handle_exception(ex, callback)
|
35
35
|
end
|
36
36
|
|
37
37
|
rescue RuntimeError => ex
|
38
38
|
if ex.message.include?('Authorization failed')
|
39
|
-
raise Universign::
|
39
|
+
raise Universign::InvalidCredentials
|
40
40
|
end
|
41
41
|
raise ex
|
42
42
|
end
|
@@ -26,7 +26,7 @@ module Universign
|
|
26
26
|
#
|
27
27
|
# @return [Universign::Transaction]
|
28
28
|
def get
|
29
|
-
@client = Universign::Client.
|
29
|
+
@client = Universign::Client.new
|
30
30
|
|
31
31
|
safeguard do
|
32
32
|
result = @client.call('requester.getTransactionInfo', @transaction_id)
|
@@ -59,7 +59,7 @@ module Universign
|
|
59
59
|
#
|
60
60
|
# @return [Universign::Transaction]
|
61
61
|
def create(documents:, signers:, options: {})
|
62
|
-
@client = Universign::Client.
|
62
|
+
@client = Universign::Client.new
|
63
63
|
|
64
64
|
sign_options = DEFAULT_OPTIONS.merge(
|
65
65
|
documents: documents.map(&:params),
|
@@ -2,15 +2,17 @@ module Universign
|
|
2
2
|
class SignatureField
|
3
3
|
attr_reader :params
|
4
4
|
|
5
|
-
def initialize(coordinate:, name: nil, page:)
|
5
|
+
def initialize(coordinate:, name: nil, page:, signer_index: 0)
|
6
6
|
@coordinate = coordinate || [0, 0]
|
7
7
|
@name = name
|
8
8
|
@page = page
|
9
|
+
@signer_index = signer_index
|
9
10
|
|
10
11
|
@params = {
|
11
|
-
page:
|
12
|
-
x:
|
13
|
-
y:
|
12
|
+
page: @page,
|
13
|
+
x: @coordinate[0],
|
14
|
+
y: @coordinate[1],
|
15
|
+
'signerIndex': @signer_index
|
14
16
|
}
|
15
17
|
|
16
18
|
@params[:name] = @name unless @name.nil?
|
data/lib/universign/version.rb
CHANGED
data/ruby_universign.gemspec
CHANGED
@@ -23,12 +23,13 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
24
|
spec.require_paths = ["lib"]
|
25
25
|
|
26
|
-
spec.required_ruby_version = '>= 2.
|
26
|
+
spec.required_ruby_version = '>= 2.3'
|
27
27
|
|
28
28
|
spec.add_runtime_dependency 'activesupport', '>= 4.1'
|
29
|
+
spec.add_runtime_dependency "xmlrpc"
|
29
30
|
|
30
|
-
spec.add_development_dependency "bundler", "
|
31
|
-
spec.add_development_dependency "rake", "
|
31
|
+
spec.add_development_dependency "bundler", ">= 1.10"
|
32
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
32
33
|
spec.add_development_dependency "rspec", "~> 3.0"
|
33
34
|
spec.add_development_dependency "dotenv", "~> 2.0"
|
34
35
|
spec.add_development_dependency "webmock", "~> 3.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_universign
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicolas Besnard
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2021-03-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -26,34 +26,48 @@ dependencies:
|
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '4.1'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: xmlrpc
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
29
43
|
- !ruby/object:Gem::Dependency
|
30
44
|
name: bundler
|
31
45
|
requirement: !ruby/object:Gem::Requirement
|
32
46
|
requirements:
|
33
|
-
- - "
|
47
|
+
- - ">="
|
34
48
|
- !ruby/object:Gem::Version
|
35
49
|
version: '1.10'
|
36
50
|
type: :development
|
37
51
|
prerelease: false
|
38
52
|
version_requirements: !ruby/object:Gem::Requirement
|
39
53
|
requirements:
|
40
|
-
- - "
|
54
|
+
- - ">="
|
41
55
|
- !ruby/object:Gem::Version
|
42
56
|
version: '1.10'
|
43
57
|
- !ruby/object:Gem::Dependency
|
44
58
|
name: rake
|
45
59
|
requirement: !ruby/object:Gem::Requirement
|
46
60
|
requirements:
|
47
|
-
- - "
|
61
|
+
- - ">="
|
48
62
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
63
|
+
version: 12.3.3
|
50
64
|
type: :development
|
51
65
|
prerelease: false
|
52
66
|
version_requirements: !ruby/object:Gem::Requirement
|
53
67
|
requirements:
|
54
|
-
- - "
|
68
|
+
- - ">="
|
55
69
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
70
|
+
version: 12.3.3
|
57
71
|
- !ruby/object:Gem::Dependency
|
58
72
|
name: rspec
|
59
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -161,7 +175,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
161
175
|
requirements:
|
162
176
|
- - ">="
|
163
177
|
- !ruby/object:Gem::Version
|
164
|
-
version: '2.
|
178
|
+
version: '2.3'
|
165
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
180
|
requirements:
|
167
181
|
- - ">="
|