csv-safe 1.0.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.

Potentially problematic release.


This version of csv-safe might be problematic. Click here for more details.

Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/csv-safe.rb +48 -0
  3. metadata +87 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bb010abb98b2115fcf5cc26ca41a5978a48e6227
4
+ data.tar.gz: 3211e1a6684a8a9f39b9236fd97640c864664f19
5
+ SHA512:
6
+ metadata.gz: 9592cb999ccdbbfb807d63e4418b700f757aef57b7be49bfa26cdc2923cf73edad981214669a8dd080e5b620fe13c630f5cc879c10ca01f0008f88058314ba10
7
+ data.tar.gz: 8fda9200e55cf73dcb49505adde5a38dc524294d9ca80fe3e6bc9a9c44b43cc7648e9ba21b870ef98dc7beccfbc8b3e2cbbb5ffe0e9a95915adbe8c317a03408
data/lib/csv-safe.rb ADDED
@@ -0,0 +1,48 @@
1
+ require 'csv'
2
+
3
+ # Decorate the built in CSV library
4
+ # Override << to sanitize incoming rows
5
+ # Override initialize to add a converter that will sanitize fields being read
6
+ class CSVSafe < CSV
7
+ def initialize(data, options = {})
8
+ options[:converters] = [] if options[:converters].nil?
9
+ options[:converters] << lambda(&method(:sanitize_field))
10
+ super
11
+ end
12
+
13
+ def <<(row)
14
+ super(sanitize_row(row))
15
+ end
16
+
17
+ private
18
+
19
+ def prefix_if_necessary(field)
20
+ if field.is_a?(String) && %w[- = + @].include?(field[0])
21
+ "'" + field
22
+ else
23
+ field
24
+ end
25
+ end
26
+
27
+ def sanitize_field(field)
28
+ if field.nil?
29
+ field
30
+ else
31
+ encoded = field.encode(CSV::ConverterEncoding)
32
+ prefix_if_necessary(encoded)
33
+ end
34
+ rescue StandardError # encoding conversion errors
35
+ field
36
+ end
37
+
38
+ def sanitize_row(row)
39
+ case row
40
+ when self.class::Row
41
+ then row.fields.map { |field| sanitize_field(field) }
42
+ when Hash
43
+ then @headers.map { |header| sanitize_field(row[header]) }
44
+ else
45
+ row.map { |field| sanitize_field(field) }
46
+ end
47
+ end
48
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: csv-safe
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alex Zvorygin
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-07-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ description:
56
+ email:
57
+ - alexander.zvorygin@influitive.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/csv-safe.rb
63
+ homepage: https://github.com/zvory/csv-safe
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 2.6.12
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: Decorate ruby CSV library to sanitize output CSV against CSV injection attacks.
87
+ test_files: []