kiji 0.1.2
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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +48 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/Guardfile +48 -0
- data/LICENSE.md +7 -0
- data/README.md +217 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/egov.gemspec +42 -0
- data/lib/kiji.rb +3 -0
- data/lib/kiji/access.rb +114 -0
- data/lib/kiji/api.rb +9 -0
- data/lib/kiji/authentication.rb +82 -0
- data/lib/kiji/client.rb +56 -0
- data/lib/kiji/digester.rb +77 -0
- data/lib/kiji/format/900A01020000100001.xml +126 -0
- data/lib/kiji/format/kousei.xml +174 -0
- data/lib/kiji/signer.rb +341 -0
- data/lib/kiji/version.rb +3 -0
- data/lib/kiji/zipper.rb +47 -0
- metadata +292 -0
data/lib/kiji/access.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext/object'
|
3
|
+
|
4
|
+
module Kiji
|
5
|
+
module Access
|
6
|
+
def apply(file_name, file_data)
|
7
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
8
|
+
xml.DataRoot {
|
9
|
+
xml.ApplData(Id: 'ApplData') {
|
10
|
+
xml.Upload {
|
11
|
+
xml.FileName file_name
|
12
|
+
xml.FileData file_data
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
connection.post('/shinsei/1/access/apply') do |req|
|
19
|
+
req.body = appl_data.to_xml
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def sended_applications_by_id(send_number)
|
24
|
+
connection.get("/shinsei/1/access/apply;id=#{send_number}")
|
25
|
+
end
|
26
|
+
|
27
|
+
def sended_applications_by_date(from, to)
|
28
|
+
connection.get("/shinsei/1/access/apply;date=#{from}-#{to}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def arrived_applications(send_number)
|
32
|
+
connection.get("/shinsei/1/access/apply/#{send_number}")
|
33
|
+
end
|
34
|
+
|
35
|
+
def reference(arrive_id)
|
36
|
+
connection.get("/shinsei/1/access/reference/#{arrive_id}")
|
37
|
+
end
|
38
|
+
|
39
|
+
def withdraw(arrive_id, file_data)
|
40
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
41
|
+
xml.DataRoot {
|
42
|
+
xml.ApplData(Id: 'ApplData') {
|
43
|
+
xml.ArriveID arrive_id
|
44
|
+
xml.Upload {
|
45
|
+
xml.FileData file_data
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
connection.post('/shinsei/1/access/withdrawal') do |req|
|
52
|
+
req.body = appl_data.to_xml
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def amends(arrive_id)
|
57
|
+
connection.get("/shinsei/1/access/amend/#{arrive_id}")
|
58
|
+
end
|
59
|
+
|
60
|
+
def notices(arrive_id)
|
61
|
+
connection.get("/shinsei/1/access/notice/#{arrive_id}")
|
62
|
+
end
|
63
|
+
|
64
|
+
def officialdocument(arrive_id, notice_sub_id)
|
65
|
+
connection.get("/shinsei/1/access/officialdocument/#{arrive_id}/#{notice_sub_id}")
|
66
|
+
end
|
67
|
+
|
68
|
+
def verify_officialdocument(arrive_id, file_name, file_data, sig_xml_file_name)
|
69
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
70
|
+
xml.DataRoot {
|
71
|
+
xml.ApplData(Id: 'ApplData') {
|
72
|
+
xml.ArriveID arrive_id
|
73
|
+
xml.Upload {
|
74
|
+
xml.FileName file_name
|
75
|
+
xml.FileData file_data
|
76
|
+
xml.SigVerificationXMLFileName sig_xml_file_name
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
connection.post('/shinsei/1/access/officialdocument/verify') do |req|
|
83
|
+
req.body = appl_data.to_xml
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def comment(arrive_id, notice_sub_id)
|
88
|
+
connection.get("/shinsei/1/access/comment/#{arrive_id}/#{notice_sub_id}")
|
89
|
+
end
|
90
|
+
|
91
|
+
def done_comment(arrive_id, notice_sub_id)
|
92
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
93
|
+
xml.DataRoot {
|
94
|
+
xml.ApplData(Id: 'ApplData') {
|
95
|
+
xml.ArriveID arrive_id
|
96
|
+
xml.NoticeSubID notice_sub_id
|
97
|
+
}
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
connection.put('/shinsei/1/access/comment') do |req|
|
102
|
+
req.body = appl_data.to_xml
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def banks
|
107
|
+
connection.get('/shinsei/1/access/bank')
|
108
|
+
end
|
109
|
+
|
110
|
+
def payments(arrive_id)
|
111
|
+
connection.get("/shinsei/1/access/payment/#{arrive_id}")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
data/lib/kiji/api.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
module Kiji
|
2
|
+
module Authentication
|
3
|
+
def register(user_id)
|
4
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
5
|
+
xml.DataRoot {
|
6
|
+
xml.ApplData(Id: 'ApplData') {
|
7
|
+
xml.UserID user_id
|
8
|
+
}
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
connection.post('/shinsei/1/authentication/user') do |req|
|
13
|
+
req.body = sign(appl_data).to_xml
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def login(user_id)
|
18
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
19
|
+
xml.DataRoot {
|
20
|
+
xml.ApplData(Id: 'ApplData') {
|
21
|
+
xml.UserID user_id
|
22
|
+
}
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
connection.post('/shinsei/1/authentication/login') do |req|
|
27
|
+
req.body = sign(appl_data).to_xml
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def append_certificate(user_id, new_cert)
|
32
|
+
x509_cert = Base64.encode64(new_cert.to_der).gsub('\n', '')
|
33
|
+
|
34
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
35
|
+
xml.DataRoot {
|
36
|
+
xml.ApplData(Id: 'ApplData') {
|
37
|
+
xml.UserID user_id
|
38
|
+
xml.AddX509Certificate x509_cert
|
39
|
+
}
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
connection.post('/shinsei/1/authentication/certificate/append') do |req|
|
44
|
+
req.body = sign(appl_data).to_xml
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def update_certificate(user_id, old_cert)
|
49
|
+
x509_cert = Base64.encode64(old_cert.to_der).gsub('\n', '')
|
50
|
+
|
51
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
52
|
+
xml.DataRoot {
|
53
|
+
xml.ApplData(Id: 'ApplData') {
|
54
|
+
xml.UserID user_id
|
55
|
+
xml.X509Certificate x509_cert
|
56
|
+
}
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
connection.post('/shinsei/1/authentication/certificate/update') do |req|
|
61
|
+
req.body = sign(appl_data).to_xml
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def delete_certificate(user_id, cert_to_delete)
|
66
|
+
x509_cert = Base64.encode64(cert_to_delete.to_der).gsub('\n', '')
|
67
|
+
|
68
|
+
appl_data = Nokogiri::XML::Builder.new do |xml|
|
69
|
+
xml.DataRoot {
|
70
|
+
xml.ApplData(Id: 'ApplData') {
|
71
|
+
xml.UserID user_id
|
72
|
+
xml.DelX509Certificate x509_cert
|
73
|
+
}
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
connection.post('/shinsei/1/authentication/certificate/delete') do |req|
|
78
|
+
req.body = sign(appl_data).to_xml
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/kiji/client.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'kiji/signer'
|
3
|
+
require 'kiji/api'
|
4
|
+
|
5
|
+
module Kiji
|
6
|
+
class Client
|
7
|
+
include Kiji::API
|
8
|
+
attr_accessor :cert, :private_key, :access_key,
|
9
|
+
:software_id, :api_end_point,
|
10
|
+
:basic_auth_id, :basic_auth_password
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@software_id = software_id
|
14
|
+
@api_end_point = api_end_point
|
15
|
+
@basic_auth_id = basic_auth_id
|
16
|
+
@basic_auth_password = basic_auth_password
|
17
|
+
|
18
|
+
yield(self) if block_given?
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def connection
|
24
|
+
Faraday.new(url: @api_end_point) do |c|
|
25
|
+
# c.response :logger
|
26
|
+
c.adapter Faraday.default_adapter
|
27
|
+
c.basic_auth(@basic_auth_id, @basic_auth_password) unless @basic_auth_id.nil?
|
28
|
+
c.headers['User-Agent'] = 'SmartHR v0.0.1'
|
29
|
+
c.headers['x-eGovAPI-SoftwareID'] = software_id
|
30
|
+
c.headers['x-eGovAPI-AccessKey'] = access_key unless access_key.nil?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def sign(appl_data)
|
35
|
+
fail 'Please specify cert & private_key' if cert.nil? || private_key.nil?
|
36
|
+
|
37
|
+
doc = appl_data.to_xml(save_with: 0)
|
38
|
+
|
39
|
+
signer = Signer.new(doc) do |s|
|
40
|
+
s.cert = cert
|
41
|
+
s.private_key = private_key
|
42
|
+
s.digest_algorithm = :sha256
|
43
|
+
s.signature_digest_algorithm = :sha256
|
44
|
+
end
|
45
|
+
|
46
|
+
signer.security_node = signer.document.root
|
47
|
+
|
48
|
+
signer.document.xpath('/DataRoot/ApplData').each do |node|
|
49
|
+
signer.digest!(node, id: '#ApplData')
|
50
|
+
end
|
51
|
+
|
52
|
+
signer.sign!(issuer_serial: true)
|
53
|
+
signer
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# Copyright (c) 2012 Edgars Beigarts
|
2
|
+
# Released under the MIT license
|
3
|
+
# http://opensource.org/licenses/mit-license.php
|
4
|
+
require 'openssl'
|
5
|
+
|
6
|
+
module Kiji
|
7
|
+
# Digest algorithms supported "out of the box"
|
8
|
+
DIGEST_ALGORITHMS = {
|
9
|
+
# SHA 1
|
10
|
+
sha1: {
|
11
|
+
name: 'SHA1',
|
12
|
+
id: 'http://www.w3.org/2000/09/xmldsig#sha1',
|
13
|
+
digester: -> { OpenSSL::Digest::SHA1.new }
|
14
|
+
},
|
15
|
+
# SHA 256
|
16
|
+
sha256: {
|
17
|
+
name: 'SHA256',
|
18
|
+
id: 'http://www.w3.org/2001/04/xmlenc#sha256',
|
19
|
+
digester: -> { OpenSSL::Digest::SHA256.new }
|
20
|
+
},
|
21
|
+
# GOST R 34-11 94
|
22
|
+
gostr3411: {
|
23
|
+
name: 'GOST R 34.11-94',
|
24
|
+
id: 'http://www.w3.org/2001/04/xmldsig-more#gostr3411',
|
25
|
+
digester: -> { OpenSSL::Digest.new('md_gost94') }
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
# Class that holds +OpenSSL::Digest+ instance with some meta information for digesting in XML.
|
30
|
+
class Digester
|
31
|
+
# You may pass either a one of +:sha1+, +:sha256+ or +:gostr3411+ symbols
|
32
|
+
# or +Hash+ with keys +:id+ with a string, which will denote algorithm in XML Reference tag
|
33
|
+
# and +:digester+ with instance of class with interface compatible with +OpenSSL::Digest+ class.
|
34
|
+
def initialize(algorithm)
|
35
|
+
if algorithm.is_a? Symbol
|
36
|
+
@digest_info = DIGEST_ALGORITHMS[algorithm].dup
|
37
|
+
@digest_info[:digester] = @digest_info[:digester].call
|
38
|
+
@symbol = algorithm
|
39
|
+
else
|
40
|
+
@digest_info = algorithm
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
attr_reader :symbol
|
45
|
+
|
46
|
+
# Digest
|
47
|
+
def digest(message)
|
48
|
+
digester.digest(message)
|
49
|
+
end
|
50
|
+
|
51
|
+
def hexdigest(message)
|
52
|
+
digester.hexdigest(message)
|
53
|
+
end
|
54
|
+
|
55
|
+
def base64(message)
|
56
|
+
hex = digester.hexdigest(message)
|
57
|
+
[[hex].pack('H*')].pack('m0')
|
58
|
+
end
|
59
|
+
|
60
|
+
alias_method :call, :digest
|
61
|
+
|
62
|
+
# Returns +OpenSSL::Digest+ (or derived class) instance
|
63
|
+
def digester
|
64
|
+
@digest_info[:digester].reset
|
65
|
+
end
|
66
|
+
|
67
|
+
# Human-friendly name
|
68
|
+
def digest_name
|
69
|
+
@digest_info[:name]
|
70
|
+
end
|
71
|
+
|
72
|
+
# XML-friendly name (for specifying in XML +DigestMethod+ node +Algorithm+ attribute)
|
73
|
+
def digest_id
|
74
|
+
@digest_info[:id]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<?xml-stylesheet type="text/xsl" href="900A01020000100001.xsl" ?>
|
3
|
+
<DataRoot>
|
4
|
+
<様式ID>900A01020000100001</様式ID>
|
5
|
+
<様式バージョン>0003</様式バージョン>
|
6
|
+
<STYLESHEET>900A01020000100001.xsl</STYLESHEET>
|
7
|
+
<様式コピー情報>0</様式コピー情報>
|
8
|
+
<Doctype>1</Doctype>
|
9
|
+
<G00005-A-250045-001_1>
|
10
|
+
<帳票種別>13101</帳票種別>
|
11
|
+
<被保険者番号>
|
12
|
+
<被保険者番号4桁></被保険者番号4桁>
|
13
|
+
<被保険者番号6桁></被保険者番号6桁>
|
14
|
+
<被保険者番号CD></被保険者番号CD>
|
15
|
+
</被保険者番号>
|
16
|
+
<取得></取得>
|
17
|
+
<被保険者氏名></被保険者氏名>
|
18
|
+
<被保険者氏名フリガナ></被保険者氏名フリガナ>
|
19
|
+
<変更後の氏名></変更後の氏名>
|
20
|
+
<変更後の氏名フリガナ></変更後の氏名フリガナ>
|
21
|
+
<性別></性別>
|
22
|
+
<生年月日>
|
23
|
+
<年号>昭和</年号>
|
24
|
+
<年></年>
|
25
|
+
<月></月>
|
26
|
+
<日></日>
|
27
|
+
</生年月日>
|
28
|
+
<事業所番号>
|
29
|
+
<事業所番号4桁></事業所番号4桁>
|
30
|
+
<事業所番号6桁></事業所番号6桁>
|
31
|
+
<事業所番号CD></事業所番号CD>
|
32
|
+
</事業所番号>
|
33
|
+
<資格取得年月日>
|
34
|
+
<年号>平成</年号>
|
35
|
+
<年></年>
|
36
|
+
<月></月>
|
37
|
+
<日></日>
|
38
|
+
</資格取得年月日>
|
39
|
+
<被保険者となったことの原因></被保険者となったことの原因>
|
40
|
+
<賃金>
|
41
|
+
<支払の態様></支払の態様>
|
42
|
+
<賃金月額></賃金月額>
|
43
|
+
</賃金>
|
44
|
+
<雇用形態></雇用形態>
|
45
|
+
<職種></職種>
|
46
|
+
<取得時被保険者種類区分></取得時被保険者種類区分>
|
47
|
+
<番号複数取得チェック不要></番号複数取得チェック不要>
|
48
|
+
<契約期間の定め></契約期間の定め>
|
49
|
+
<契約期間の定めの有無>
|
50
|
+
<契約期間の定め有>
|
51
|
+
<契約期間開始>
|
52
|
+
<年号>平成</年号>
|
53
|
+
<年></年>
|
54
|
+
<月></月>
|
55
|
+
<日></日>
|
56
|
+
</契約期間開始>
|
57
|
+
<契約期間終了>
|
58
|
+
<年号>平成</年号>
|
59
|
+
<年></年>
|
60
|
+
<月></月>
|
61
|
+
<日></日>
|
62
|
+
</契約期間終了>
|
63
|
+
<契約更新条項有無></契約更新条項有無>
|
64
|
+
</契約期間の定め有>
|
65
|
+
</契約期間の定めの有無>
|
66
|
+
<一週間の所定労働時間>
|
67
|
+
<時間></時間>
|
68
|
+
<分></分>
|
69
|
+
</一週間の所定労働時間>
|
70
|
+
<事業所名称></事業所名称>
|
71
|
+
<備考欄_申請者>
|
72
|
+
<国籍></国籍>
|
73
|
+
<在留資格></在留資格>
|
74
|
+
<在留期間>
|
75
|
+
<年></年>
|
76
|
+
<月></月>
|
77
|
+
<日></日>
|
78
|
+
</在留期間>
|
79
|
+
<資格外活動許可の有無></資格外活動許可の有無>
|
80
|
+
<派遣請負労働者></派遣請負労働者>
|
81
|
+
<備考></備考>
|
82
|
+
</備考欄_申請者>
|
83
|
+
<事業主>
|
84
|
+
<住所></住所>
|
85
|
+
<氏名></氏名>
|
86
|
+
<電話番号>
|
87
|
+
<市外局番></市外局番>
|
88
|
+
<市内局番></市内局番>
|
89
|
+
<加入者番号></加入者番号>
|
90
|
+
</電話番号>
|
91
|
+
</事業主>
|
92
|
+
<届出年月日>
|
93
|
+
<年号>平成</年号>
|
94
|
+
<年></年>
|
95
|
+
<月></月>
|
96
|
+
<日></日>
|
97
|
+
</届出年月日>
|
98
|
+
<あて先></あて先>
|
99
|
+
<社会保険労務士記載欄>
|
100
|
+
<作成年月日>
|
101
|
+
<年号>平成</年号>
|
102
|
+
<年></年>
|
103
|
+
<月></月>
|
104
|
+
<日></日>
|
105
|
+
</作成年月日>
|
106
|
+
<提出代行者事務代理者の表示></提出代行者事務代理者の表示>
|
107
|
+
<氏名></氏名>
|
108
|
+
<電話番号>
|
109
|
+
<市外局番></市外局番>
|
110
|
+
<市内局番></市内局番>
|
111
|
+
<加入者番号></加入者番号>
|
112
|
+
</電話番号>
|
113
|
+
<付記欄></付記欄>
|
114
|
+
</社会保険労務士記載欄>
|
115
|
+
<備考欄_職員>
|
116
|
+
<備考></備考>
|
117
|
+
<確認通知年月日>
|
118
|
+
<年号>平成</年号>
|
119
|
+
<年></年>
|
120
|
+
<月></月>
|
121
|
+
<日></日>
|
122
|
+
</確認通知年月日>
|
123
|
+
</備考欄_職員>
|
124
|
+
<Xmit>0</Xmit>
|
125
|
+
</G00005-A-250045-001_1>
|
126
|
+
</DataRoot>
|