pki_express 1.3.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -2
  3. data/.github/workflows/test.yml +22 -0
  4. data/.gitignore +27 -27
  5. data/.rspec +1 -0
  6. data/CHANGELOG.md +19 -12
  7. data/Gemfile +9 -4
  8. data/README.md +24 -24
  9. data/Rakefile +7 -1
  10. data/lib/pki_express/auth_complete_result.rb +21 -21
  11. data/lib/pki_express/auth_start_result.rb +76 -76
  12. data/lib/pki_express/authentication.rb +284 -284
  13. data/lib/pki_express/base_signer.rb +54 -54
  14. data/lib/pki_express/cades_signature.rb +89 -89
  15. data/lib/pki_express/cades_signature_starter.rb +242 -242
  16. data/lib/pki_express/check_service_result.rb +15 -15
  17. data/lib/pki_express/command_error.rb +13 -13
  18. data/lib/pki_express/commands.rb +24 -24
  19. data/lib/pki_express/digest_algorithm.rb +118 -118
  20. data/lib/pki_express/digest_algorithm_and_value.rb +30 -30
  21. data/lib/pki_express/discovery_service_result.rb +25 -25
  22. data/lib/pki_express/enum.rb +9 -9
  23. data/lib/pki_express/error_codes.rb +46 -46
  24. data/lib/pki_express/installation_not_found_error.rb +8 -8
  25. data/lib/pki_express/name.rb +47 -47
  26. data/lib/pki_express/oids.rb +30 -30
  27. data/lib/pki_express/pades_certification_level.rb +7 -7
  28. data/lib/pki_express/pades_horizontal_align.rb +9 -9
  29. data/lib/pki_express/pades_measurement_units.rb +8 -8
  30. data/lib/pki_express/pades_page_optimization.rb +50 -50
  31. data/lib/pki_express/pades_page_orientation.rb +9 -9
  32. data/lib/pki_express/pades_paper_size.rb +21 -21
  33. data/lib/pki_express/pades_signature.rb +16 -16
  34. data/lib/pki_express/pades_signature_explorer.rb +30 -30
  35. data/lib/pki_express/pades_signature_starter.rb +251 -251
  36. data/lib/pki_express/pades_signer.rb +274 -274
  37. data/lib/pki_express/pades_signer_info.rb +9 -9
  38. data/lib/pki_express/pades_size.rb +17 -17
  39. data/lib/pki_express/pades_text_horizontal_align.rb +8 -8
  40. data/lib/pki_express/pades_vertical_align.rb +9 -9
  41. data/lib/pki_express/pades_visual_auto_positioning.rb +21 -21
  42. data/lib/pki_express/pades_visual_image.rb +51 -51
  43. data/lib/pki_express/pades_visual_manual_positioning.rb +16 -16
  44. data/lib/pki_express/pades_visual_positioning.rb +27 -27
  45. data/lib/pki_express/pades_visual_rectangle.rb +74 -74
  46. data/lib/pki_express/pades_visual_representation.rb +22 -22
  47. data/lib/pki_express/pades_visual_text.rb +35 -35
  48. data/lib/pki_express/pk_algorithms.rb +157 -157
  49. data/lib/pki_express/pk_certificate.rb +61 -61
  50. data/lib/pki_express/pki_brazil_certificate_fields.rb +57 -57
  51. data/lib/pki_express/pki_brazil_certificate_types.rb +19 -19
  52. data/lib/pki_express/pki_express_config.rb +39 -26
  53. data/lib/pki_express/pki_express_operator.rb +240 -234
  54. data/lib/pki_express/pki_italy_certificate_fields.rb +15 -15
  55. data/lib/pki_express/pki_italy_certificate_types.rb +11 -11
  56. data/lib/pki_express/signature_algorithm_and_value.rb +34 -34
  57. data/lib/pki_express/signature_explorer.rb +74 -74
  58. data/lib/pki_express/signature_finisher.rb +314 -314
  59. data/lib/pki_express/signature_policy_identifier.rb +20 -20
  60. data/lib/pki_express/signature_start_result.rb +12 -12
  61. data/lib/pki_express/signature_starter.rb +116 -116
  62. data/lib/pki_express/signer.rb +151 -151
  63. data/lib/pki_express/standard_signature_policies.rb +58 -58
  64. data/lib/pki_express/timestamp_authority.rb +50 -50
  65. data/lib/pki_express/trust_service_auth_parameters.rb +20 -20
  66. data/lib/pki_express/trust_service_info.rb +37 -37
  67. data/lib/pki_express/trust_service_manager.rb +258 -258
  68. data/lib/pki_express/trust_service_session_result.rb +29 -29
  69. data/lib/pki_express/trust_service_session_types.rb +7 -7
  70. data/lib/pki_express/tsa_authentication_type.rb +14 -14
  71. data/lib/pki_express/validation_error.rb +8 -8
  72. data/lib/pki_express/validation_item.rb +43 -43
  73. data/lib/pki_express/validation_item_types.rb +103 -103
  74. data/lib/pki_express/validation_results.rb +120 -120
  75. data/lib/pki_express/version.rb +3 -3
  76. data/lib/pki_express/version_manager.rb +20 -20
  77. data/lib/pki_express.rb +69 -69
  78. data/pki_express.gemspec +26 -26
  79. data/spec/pki_express/pki_express_config_spec.rb +73 -0
  80. data/spec/pki_express/pki_express_operator_spec.rb +31 -0
  81. data/spec/spec_helper.rb +13 -0
  82. metadata +17 -9
data/lib/pki_express.rb CHANGED
@@ -1,70 +1,70 @@
1
- require_relative 'pki_express/pki_express_config'
2
- require_relative 'pki_express/pki_express_operator'
3
- require_relative 'pki_express/enum'
4
- require_relative 'pki_express/pk_algorithms'
5
- require_relative 'pki_express/base_signer'
6
- require_relative 'pki_express/signature_starter'
7
- require_relative 'pki_express/signature_explorer'
8
- require_relative 'pki_express/signer'
9
- require_relative 'pki_express/auth_complete_result'
10
- require_relative 'pki_express/auth_start_result'
11
- require_relative 'pki_express/authentication'
12
- require_relative 'pki_express/cades_signature'
13
- require_relative 'pki_express/cades_signature_starter'
14
- require_relative 'pki_express/check_service_result'
15
- require_relative 'pki_express/command_error'
16
- require_relative 'pki_express/commands'
17
- require_relative 'pki_express/digest_algorithm'
18
- require_relative 'pki_express/digest_algorithm_and_value'
19
- require_relative 'pki_express/discovery_service_result'
20
- require_relative 'pki_express/error_codes'
21
- require_relative 'pki_express/installation_not_found_error'
22
- require_relative 'pki_express/oids'
23
- require_relative 'pki_express/name'
24
- require_relative 'pki_express/pades_certification_level'
25
- require_relative 'pki_express/pades_horizontal_align'
26
- require_relative 'pki_express/pades_measurement_units'
27
- require_relative 'pki_express/pades_page_optimization'
28
- require_relative 'pki_express/pades_page_optimization'
29
- require_relative 'pki_express/pades_paper_size'
30
- require_relative 'pki_express/pades_signature'
31
- require_relative 'pki_express/pades_signature_explorer'
32
- require_relative 'pki_express/pades_signature_starter'
33
- require_relative 'pki_express/pades_signer'
34
- require_relative 'pki_express/pades_signer_info'
35
- require_relative 'pki_express/pades_size'
36
- require_relative 'pki_express/pades_text_horizontal_align'
37
- require_relative 'pki_express/pades_vertical_align'
38
- require_relative 'pki_express/pades_visual_positioning'
39
- require_relative 'pki_express/pades_visual_auto_positioning'
40
- require_relative 'pki_express/pades_visual_image'
41
- require_relative 'pki_express/pades_visual_manual_positioning'
42
- require_relative 'pki_express/pades_visual_rectangle'
43
- require_relative 'pki_express/pades_visual_representation'
44
- require_relative 'pki_express/pades_visual_text'
45
- require_relative 'pki_express/pk_certificate'
46
- require_relative 'pki_express/pki_brazil_certificate_fields'
47
- require_relative 'pki_express/pki_brazil_certificate_types'
48
- require_relative 'pki_express/pki_italy_certificate_fields'
49
- require_relative 'pki_express/pki_italy_certificate_types'
50
- require_relative 'pki_express/signature_algorithm_and_value'
51
- require_relative 'pki_express/signature_finisher'
52
- require_relative 'pki_express/signature_policy_identifier'
53
- require_relative 'pki_express/signature_start_result'
54
- require_relative 'pki_express/standard_signature_policies'
55
- require_relative 'pki_express/timestamp_authority'
56
- require_relative 'pki_express/trust_service_auth_parameters'
57
- require_relative 'pki_express/trust_service_info'
58
- require_relative 'pki_express/trust_service_manager'
59
- require_relative 'pki_express/trust_service_session_result'
60
- require_relative 'pki_express/trust_service_session_types'
61
- require_relative 'pki_express/tsa_authentication_type'
62
- require_relative 'pki_express/validation_error'
63
- require_relative 'pki_express/validation_item'
64
- require_relative 'pki_express/validation_item_types'
65
- require_relative 'pki_express/validation_results'
66
- require_relative 'pki_express/version'
67
- require_relative 'pki_express/version_manager'
68
-
69
- module PkiExpress
1
+ require_relative 'pki_express/pki_express_config'
2
+ require_relative 'pki_express/pki_express_operator'
3
+ require_relative 'pki_express/enum'
4
+ require_relative 'pki_express/pk_algorithms'
5
+ require_relative 'pki_express/base_signer'
6
+ require_relative 'pki_express/signature_starter'
7
+ require_relative 'pki_express/signature_explorer'
8
+ require_relative 'pki_express/signer'
9
+ require_relative 'pki_express/auth_complete_result'
10
+ require_relative 'pki_express/auth_start_result'
11
+ require_relative 'pki_express/authentication'
12
+ require_relative 'pki_express/cades_signature'
13
+ require_relative 'pki_express/cades_signature_starter'
14
+ require_relative 'pki_express/check_service_result'
15
+ require_relative 'pki_express/command_error'
16
+ require_relative 'pki_express/commands'
17
+ require_relative 'pki_express/digest_algorithm'
18
+ require_relative 'pki_express/digest_algorithm_and_value'
19
+ require_relative 'pki_express/discovery_service_result'
20
+ require_relative 'pki_express/error_codes'
21
+ require_relative 'pki_express/installation_not_found_error'
22
+ require_relative 'pki_express/oids'
23
+ require_relative 'pki_express/name'
24
+ require_relative 'pki_express/pades_certification_level'
25
+ require_relative 'pki_express/pades_horizontal_align'
26
+ require_relative 'pki_express/pades_measurement_units'
27
+ require_relative 'pki_express/pades_page_optimization'
28
+ require_relative 'pki_express/pades_page_optimization'
29
+ require_relative 'pki_express/pades_paper_size'
30
+ require_relative 'pki_express/pades_signature'
31
+ require_relative 'pki_express/pades_signature_explorer'
32
+ require_relative 'pki_express/pades_signature_starter'
33
+ require_relative 'pki_express/pades_signer'
34
+ require_relative 'pki_express/pades_signer_info'
35
+ require_relative 'pki_express/pades_size'
36
+ require_relative 'pki_express/pades_text_horizontal_align'
37
+ require_relative 'pki_express/pades_vertical_align'
38
+ require_relative 'pki_express/pades_visual_positioning'
39
+ require_relative 'pki_express/pades_visual_auto_positioning'
40
+ require_relative 'pki_express/pades_visual_image'
41
+ require_relative 'pki_express/pades_visual_manual_positioning'
42
+ require_relative 'pki_express/pades_visual_rectangle'
43
+ require_relative 'pki_express/pades_visual_representation'
44
+ require_relative 'pki_express/pades_visual_text'
45
+ require_relative 'pki_express/pk_certificate'
46
+ require_relative 'pki_express/pki_brazil_certificate_fields'
47
+ require_relative 'pki_express/pki_brazil_certificate_types'
48
+ require_relative 'pki_express/pki_italy_certificate_fields'
49
+ require_relative 'pki_express/pki_italy_certificate_types'
50
+ require_relative 'pki_express/signature_algorithm_and_value'
51
+ require_relative 'pki_express/signature_finisher'
52
+ require_relative 'pki_express/signature_policy_identifier'
53
+ require_relative 'pki_express/signature_start_result'
54
+ require_relative 'pki_express/standard_signature_policies'
55
+ require_relative 'pki_express/timestamp_authority'
56
+ require_relative 'pki_express/trust_service_auth_parameters'
57
+ require_relative 'pki_express/trust_service_info'
58
+ require_relative 'pki_express/trust_service_manager'
59
+ require_relative 'pki_express/trust_service_session_result'
60
+ require_relative 'pki_express/trust_service_session_types'
61
+ require_relative 'pki_express/tsa_authentication_type'
62
+ require_relative 'pki_express/validation_error'
63
+ require_relative 'pki_express/validation_item'
64
+ require_relative 'pki_express/validation_item_types'
65
+ require_relative 'pki_express/validation_results'
66
+ require_relative 'pki_express/version'
67
+ require_relative 'pki_express/version_manager'
68
+
69
+ module PkiExpress
70
70
  end
data/pki_express.gemspec CHANGED
@@ -1,27 +1,27 @@
1
- # coding: utf-8
2
- require_relative 'lib/pki_express/version'
3
-
4
- Gem::Specification.new do |spec|
5
- spec.name = 'pki_express'
6
- spec.version = PkiExpress::VERSION
7
- spec.license = 'MIT'
8
- spec.authors = ['Ismael Medeiros']
9
- spec.email = %w{ismaelm@lacunasoftware.com}
10
- spec.homepage = 'http://docs.lacunasoftware.com/en-us/articles/pki-express'
11
- spec.summary = 'Gem for using PKI Express on Ruby'
12
- spec.description = 'Classes to use Lacuna Software\'s PKI Express'
13
- spec.files = `git ls-files -z`.split("\x0")
14
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
- spec.require_paths = ['lib']
17
-
18
- spec.metadata = {
19
- 'bug_tracker_uri' => 'https://github.com/LacunaSoftware/PkiExpressRuby/issues',
20
- 'changelog_uri' => 'https://github.com/LacunaSoftware/PkiExpressRuby/blob/develop/CHANGELOG.md',
21
- 'documentation_uri' => 'http://docs.lacunasoftware.com/en-us/articles/pki-express',
22
- 'source_code_uri' => 'https://github.com/LacunaSoftware/PkiExpressRuby'
23
- }
24
-
25
- spec.add_development_dependency 'bundler', '~> 1.7'
26
- spec.add_development_dependency 'rake', '~> 13'
1
+ # coding: utf-8
2
+ require_relative 'lib/pki_express/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = 'pki_express'
6
+ spec.version = PkiExpress::VERSION
7
+ spec.license = 'MIT'
8
+ spec.authors = ['Ismael Medeiros']
9
+ spec.email = %w{ismaelm@lacunasoftware.com}
10
+ spec.homepage = 'http://docs.lacunasoftware.com/en-us/articles/pki-express'
11
+ spec.summary = 'Gem for using PKI Express on Ruby'
12
+ spec.description = 'Classes to use Lacuna Software\'s PKI Express'
13
+ spec.files = `git ls-files -z`.split("\x0")
14
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
+ spec.require_paths = ['lib']
17
+
18
+ spec.metadata = {
19
+ 'bug_tracker_uri' => 'https://github.com/LacunaSoftware/PkiExpressRuby/issues',
20
+ 'changelog_uri' => 'https://github.com/LacunaSoftware/PkiExpressRuby/blob/develop/CHANGELOG.md',
21
+ 'documentation_uri' => 'http://docs.lacunasoftware.com/en-us/articles/pki-express',
22
+ 'source_code_uri' => 'https://github.com/LacunaSoftware/PkiExpressRuby'
23
+ }
24
+
25
+ spec.add_development_dependency 'bundler', '~> 2.3'
26
+ spec.add_development_dependency 'rake', '~> 13'
27
27
  end
@@ -0,0 +1,73 @@
1
+ require 'faker'
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ module PkiExpress
6
+ describe PkiExpressConfig do
7
+ it 'should set valid default values when no value is passed in contructor' do
8
+ config = PkiExpressConfig.new
9
+ expect(config.pki_express_home).to be_nil
10
+ expect(File.directory?(config.temp_folder)).to be(true)
11
+ expect(File.directory?(config.transfer_data_folder)).to be(true)
12
+ end
13
+
14
+ it 'should set pki_express_home folder when a valid path is passed' do
15
+ fake_pki_express_home = Dir.mktmpdir('pkie')
16
+ config = PkiExpressConfig.new(fake_pki_express_home)
17
+ expect(config.pki_express_home).to equal(fake_pki_express_home)
18
+ Dir.rmdir(fake_pki_express_home)
19
+ end
20
+
21
+ it 'should raise ArgumentError when an invalid path is passed' do
22
+ expect { PkiExpressConfig.new(Faker::String.random) }.to raise_error(ArgumentError)
23
+ end
24
+
25
+ it 'should raise ArgumentError when a path is passed but doesn\'t exist' do
26
+ fake_pki_express_home = Faker::File.dir
27
+ expect { PkiExpressConfig.new(fake_pki_express_home) }.to raise_error(ArgumentError)
28
+ end
29
+
30
+ it 'should set temp_folder when a valid path is passed' do
31
+ fake_temp_folder = Dir.mktmpdir('pkie')
32
+ config = PkiExpressConfig.new(nil, fake_temp_folder)
33
+ expect(config.temp_folder).to equal(fake_temp_folder)
34
+ Dir.rmdir(fake_temp_folder)
35
+ end
36
+
37
+ it 'should set temp_folder with a default folder when no path is passed' do
38
+ config1 = PkiExpressConfig.new
39
+ config2 = PkiExpressConfig.new
40
+ expect(config1.temp_folder).to equal(config2.temp_folder)
41
+ end
42
+
43
+ it 'should raise ArgumentError when an invalid path is passed' do
44
+ expect { PkiExpressConfig.new(nil, Faker::String.random) }.to raise_error(ArgumentError)
45
+ end
46
+
47
+ it 'should raise ArgumentError when a path is passed but doesn\'t exist' do
48
+ fake_pki_express_home = Faker::File.dir
49
+ expect { PkiExpressConfig.new(nil, fake_pki_express_home) }.to raise_error(ArgumentError)
50
+ end
51
+
52
+ it 'should set transfer_data_folder when a valid path is passed' do
53
+ fake_transfer_data_folder = Dir.mktmpdir('pkie')
54
+ config = PkiExpressConfig.new(nil, nil, fake_transfer_data_folder)
55
+ expect(config.transfer_data_folder).to equal(fake_transfer_data_folder)
56
+ Dir.rmdir(fake_transfer_data_folder)
57
+ end
58
+
59
+ it 'should set transfer_data_folder with temp_folder value when no path is passed' do
60
+ config = PkiExpressConfig.new
61
+ expect(config.transfer_data_folder).to equal(config.temp_folder)
62
+ end
63
+
64
+ it 'should raise ArgumentError when an invalid path is passed' do
65
+ expect { PkiExpressConfig.new(nil, nil, Faker::String.random) }.to raise_error(ArgumentError)
66
+ end
67
+
68
+ it 'should raise ArgumentError when a path is passed but doesn\'t exist' do
69
+ fake_pki_express_home = Faker::File.dir
70
+ expect { PkiExpressConfig.new(nil, nil, fake_pki_express_home) }.to raise_error(ArgumentError)
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module PkiExpress
4
+ describe PkiExpressOperator do
5
+ it "should remove files created by child classes when GC remove its instance" do
6
+ operator = ChildOperator.new
7
+ temp_files = []
8
+ (1..3).each {
9
+ created_file = operator.create_temp_file
10
+ temp_files.append(created_file)
11
+ expect(File.exist?(created_file)).to equal(true)
12
+ }
13
+ operator = nil
14
+ GC.start
15
+
16
+ temp_files.each do |file|
17
+ expect(File.exist?(file)).to equal(false)
18
+ end
19
+ end
20
+ end
21
+
22
+ class ChildOperator < PkiExpressOperator
23
+ def initialize(config=PkiExpressConfig.new)
24
+ super(config)
25
+ end
26
+
27
+ def create_temp_file
28
+ super
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../lib/pki_express'
2
+
3
+ RSpec.configure do |config|
4
+ config.expect_with :rspec do |expectations|
5
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
6
+ end
7
+
8
+ config.mock_with :rspec do |mocks|
9
+ mocks.verify_partial_doubles = true
10
+ end
11
+
12
+ config.shared_context_metadata_behavior = :apply_to_host_groups
13
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pki_express
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ismael Medeiros
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-04 00:00:00.000000000 Z
11
+ date: 2023-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '2.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '2.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -46,7 +46,9 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - ".gitattributes"
49
+ - ".github/workflows/test.yml"
49
50
  - ".gitignore"
51
+ - ".rspec"
50
52
  - CHANGELOG.md
51
53
  - Gemfile
52
54
  - README.md
@@ -120,6 +122,9 @@ files:
120
122
  - lib/pki_express/version.rb
121
123
  - lib/pki_express/version_manager.rb
122
124
  - pki_express.gemspec
125
+ - spec/pki_express/pki_express_config_spec.rb
126
+ - spec/pki_express/pki_express_operator_spec.rb
127
+ - spec/spec_helper.rb
123
128
  homepage: http://docs.lacunasoftware.com/en-us/articles/pki-express
124
129
  licenses:
125
130
  - MIT
@@ -128,7 +133,7 @@ metadata:
128
133
  changelog_uri: https://github.com/LacunaSoftware/PkiExpressRuby/blob/develop/CHANGELOG.md
129
134
  documentation_uri: http://docs.lacunasoftware.com/en-us/articles/pki-express
130
135
  source_code_uri: https://github.com/LacunaSoftware/PkiExpressRuby
131
- post_install_message:
136
+ post_install_message:
132
137
  rdoc_options: []
133
138
  require_paths:
134
139
  - lib
@@ -143,8 +148,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
148
  - !ruby/object:Gem::Version
144
149
  version: '0'
145
150
  requirements: []
146
- rubygems_version: 3.0.3
147
- signing_key:
151
+ rubygems_version: 3.0.3.1
152
+ signing_key:
148
153
  specification_version: 4
149
154
  summary: Gem for using PKI Express on Ruby
150
- test_files: []
155
+ test_files:
156
+ - spec/pki_express/pki_express_config_spec.rb
157
+ - spec/pki_express/pki_express_operator_spec.rb
158
+ - spec/spec_helper.rb