komandir 1.0.1 → 1.1.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/README.md +11 -0
- data/app/models/protocol.rb +82 -0
- data/lib/komandir.rb +2 -0
- data/lib/komandir/action_controller.rb +10 -25
- data/lib/komandir/engine.rb +4 -0
- data/lib/komandir/exceptions.rb +3 -0
- data/lib/komandir/version.rb +1 -1
- metadata +8 -4
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
class Protocol < ActiveRecord::Base
|
2
|
+
|
3
|
+
belongs_to :user
|
4
|
+
|
5
|
+
before_validation :set_client_time, :on => :create
|
6
|
+
before_validation :set_account_name, :on => :create
|
7
|
+
before_validation :set_certificate, :on => :create
|
8
|
+
|
9
|
+
validates :action_url, :presence => true
|
10
|
+
validates :client_time_epoch, :presence => true
|
11
|
+
validates :client_time, :presence => true
|
12
|
+
validates :client_ip, :presence => true
|
13
|
+
validates :body, :presence => true
|
14
|
+
validates :signature, :presence => true
|
15
|
+
validates :account_name, :presence => true
|
16
|
+
validate :validate_signature
|
17
|
+
|
18
|
+
attr_accessor :client_time_epoch
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def set_client_time
|
23
|
+
self.client_time = Time.at(client_time_epoch.to_i)
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_account_name
|
27
|
+
if user.respond_to?(:email)
|
28
|
+
self.account_name = user.email
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_certificate
|
33
|
+
self.certificate_id = user.certificate.id
|
34
|
+
end
|
35
|
+
|
36
|
+
def validate_signature
|
37
|
+
verification_set = {
|
38
|
+
:message => digest,
|
39
|
+
:signature => signature,
|
40
|
+
:certificate => user.certificate.body
|
41
|
+
}
|
42
|
+
unless Cryptopro::Signature.verify(verification_set)
|
43
|
+
errors.add(:signature, "Signature not valid")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def digest
|
48
|
+
"#{system_params}:#{body}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def system_params
|
52
|
+
check_client_time!
|
53
|
+
"#{action_url}:#{client_ip}:#{client_time_epoch}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def check_client_time!
|
57
|
+
if client_time_epoch.present?
|
58
|
+
server_time_epoch = Time.now.to_i
|
59
|
+
self.client_time_epoch = client_time_epoch.to_i
|
60
|
+
raise Komandir::WrongTime if (client_time_epoch - server_time_epoch).abs > 60
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
# == Schema Information
|
68
|
+
#
|
69
|
+
# Table name: protocols
|
70
|
+
#
|
71
|
+
# id :integer not null, primary key
|
72
|
+
# user_id :integer
|
73
|
+
# certificate_id :integer
|
74
|
+
# action_url :string(255)
|
75
|
+
# account_name :string(255)
|
76
|
+
# client_ip :string(255)
|
77
|
+
# client_time :datetime
|
78
|
+
# body :text
|
79
|
+
# signature :text
|
80
|
+
# created_at :datetime
|
81
|
+
# updated_at :datetime
|
82
|
+
#
|
data/lib/komandir.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
module Komandir
|
2
|
-
class WrongTime < Exception; end
|
3
|
-
|
4
2
|
module ControllerMethods
|
5
3
|
|
6
4
|
module ClassMethods
|
@@ -13,20 +11,20 @@ module Komandir
|
|
13
11
|
raise "Blank komandir_signature" if params[:komandir_signature].blank?
|
14
12
|
raise "Blank certificate for user. Make sure user.certificate.body contains certificate" unless user.certificate.try(:body?)
|
15
13
|
|
16
|
-
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
|
21
|
-
|
14
|
+
protocol = Protocol.new(
|
15
|
+
:user => user,
|
16
|
+
:action_url => request.path,
|
17
|
+
:client_ip => request.remote_ip,
|
18
|
+
:client_time_epoch => params[:komandir_time],
|
19
|
+
:body => serialized_form,
|
20
|
+
:signature => params[:komandir_signature]
|
21
|
+
)
|
22
|
+
|
23
|
+
protocol.save
|
22
24
|
end
|
23
25
|
|
24
26
|
private
|
25
27
|
|
26
|
-
def digest
|
27
|
-
"#{system_params}:#{serialized_form}"
|
28
|
-
end
|
29
|
-
|
30
28
|
def serialized_form
|
31
29
|
# TODO Сортировать по алфавиту
|
32
30
|
pairs = request.raw_post.split("&")
|
@@ -42,19 +40,6 @@ module Komandir
|
|
42
40
|
odd_param_names.include?(param_name) || filtered_param_names.any? { |filtered_param_name| param_name.include?(filtered_param_name) }
|
43
41
|
end
|
44
42
|
end
|
45
|
-
|
46
|
-
def system_params
|
47
|
-
check_client_time!
|
48
|
-
"#{request.path}:#{request.remote_ip}:#{params[:komandir_time]}"
|
49
|
-
end
|
50
|
-
|
51
|
-
def check_client_time!
|
52
|
-
if params[:komandir_time].present?
|
53
|
-
server_time_epoch = Time.now.to_i
|
54
|
-
client_time_epoch = params[:komandir_time].to_i
|
55
|
-
raise Komandir::WrongTime if (client_time_epoch - server_time_epoch).abs > 60
|
56
|
-
end
|
57
|
-
end
|
58
43
|
end
|
59
44
|
|
60
45
|
def self.included(receiver) # :nodoc:
|
data/lib/komandir/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: komandir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- divineforest
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-11-
|
18
|
+
date: 2011-11-30 00:00:00 +04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -43,10 +43,14 @@ extra_rdoc_files: []
|
|
43
43
|
files:
|
44
44
|
- .gitignore
|
45
45
|
- Gemfile
|
46
|
+
- README.md
|
46
47
|
- Rakefile
|
48
|
+
- app/models/protocol.rb
|
47
49
|
- komandir.gemspec
|
48
50
|
- lib/komandir.rb
|
49
51
|
- lib/komandir/action_controller.rb
|
52
|
+
- lib/komandir/engine.rb
|
53
|
+
- lib/komandir/exceptions.rb
|
50
54
|
- lib/komandir/railtie.rb
|
51
55
|
- lib/komandir/version.rb
|
52
56
|
has_rdoc: true
|