test_server 0.4.1 → 0.5.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -3
  3. data/Gemfile +13 -5
  4. data/README.md +16 -0
  5. data/Rakefile +17 -3
  6. data/app/assets/javascripts/test_server/file_uploader.js.coffee +3 -0
  7. data/app/assets/stylesheets/application.scss +31 -0
  8. data/app/assets/stylesheets/test_server/file_uploader.css.scss +3 -0
  9. data/app/controllers/test_server/file_uploader_controller.rb +42 -0
  10. data/app/helpers/test_server/file_uploader_helper.rb +2 -0
  11. data/app/models/test_server/file_upload.rb +41 -0
  12. data/app/views/layouts/application.html.haml +10 -0
  13. data/app/views/test_server/dashboard/show.html.haml +1 -0
  14. data/app/views/test_server/file_uploader/_form.html.haml +27 -0
  15. data/app/views/test_server/file_uploader/_overview.html.haml +1 -0
  16. data/app/views/test_server/file_uploader/index.html.haml +1 -0
  17. data/app/views/test_server/file_uploader/result.html.haml +40 -0
  18. data/app/views/test_server/file_uploader/upload.html.haml +1 -0
  19. data/config/routes.rb +8 -2
  20. data/lib/test_server/checksum.rb +21 -0
  21. data/lib/test_server/checksum_calculator.rb +27 -0
  22. data/lib/test_server/command_runner.rb +58 -0
  23. data/lib/test_server/exceptions.rb +3 -0
  24. data/lib/test_server/file_size.rb +14 -0
  25. data/lib/test_server/filetype_detector.rb +21 -0
  26. data/lib/test_server/locales/en.yml +28 -1
  27. data/lib/test_server/main.rb +6 -1
  28. data/lib/test_server/md5_calculator.rb +17 -0
  29. data/lib/test_server/permitted_params.rb +25 -7
  30. data/lib/test_server/sha256_calculator.rb +17 -0
  31. data/lib/test_server/uploaded_file.rb +58 -0
  32. data/lib/test_server/version.rb +1 -1
  33. data/lib/test_server/virus_detector.rb +43 -0
  34. data/lib/test_server.rb +15 -0
  35. data/public/assets/{manifest-7c069da388f8a976fadfaab958b9feb7.json → manifest-1a3c45fcd482cca628c8cdc72631eb98.json} +0 -0
  36. data/spec/controllers/test_server/file_uploader_controller_spec.rb +26 -0
  37. data/spec/encoder_spec.rb +3 -3
  38. data/spec/features/fetch_data_via_javascript_spec.rb +18 -18
  39. data/spec/filetype_detector_spec.rb +31 -0
  40. data/spec/fixtures/file_uploader/file.bin +0 -0
  41. data/spec/permitted_params_spec.rb +1 -1
  42. data/spec/sha256_calculator_spec.rb +36 -0
  43. data/spec/spec_helper.rb +2 -0
  44. data/spec/support/commands.rb +15 -0
  45. data/spec/support/debugging.rb +6 -1
  46. data/spec/support/eicar.rb +15 -0
  47. data/spec/support/fixtures.rb +16 -0
  48. data/spec/support/rails.rb +2 -0
  49. data/spec/uploaded_file_spec.rb +167 -0
  50. data/spec/views/errors/not_found.html.haml_spec.rb +1 -1
  51. data/spec/views/test_server/file_uploader/index.html.haml_spec.rb +32 -0
  52. data/spec/views/test_server/file_uploader/result.html.haml_spec.rb +58 -0
  53. data/spec/views/test_server/file_uploader/upload.html.haml_spec.rb +12 -0
  54. data/spec/views/test_server/reflector/client_ip_address.html.haml_spec.rb +1 -1
  55. data/spec/virus_detector_spec.rb +45 -0
  56. data/test_server.gemspec +2 -3
  57. metadata +48 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 874f5e088c703ee03277bce9a3df17595af41c27
4
- data.tar.gz: 9560b6328e965d2c9f99ffe91561903fa183bae1
3
+ metadata.gz: a0839da7e6f8d02b97d87791f434e1261c44138b
4
+ data.tar.gz: 84d82d475f288e3cb05354733a2e66b2261fbc54
5
5
  SHA512:
6
- metadata.gz: 87e0b68dcb6a6807ebfff8de0302c4c8c618cd44844674c8e97675a8457ff48a14b4a36bd30fac299cdea8b8b2e0cc0c0208a66a05f80947158c4ae2df16897b
7
- data.tar.gz: b4c445dd155489d0dcdcc47e47ad40ee370aa1c3c7edae5da775f0d18ba8f90f97ba17a01c7a409ec9f209c3bd93d6e99a04a2590ce4aa0199a583afa493e42c
6
+ metadata.gz: d4ec38e852ea5b9c4dbd46036d418fdb8719a47d568e7b1b9318bcc947cdde9e6bcf3c389d9cd50758a464abc430522e072ab82310cc912f31f546f8fc7f6713
7
+ data.tar.gz: a273daf3ec47e04e7c04b2d997344da073424e82569ab4a33276203a895494df61369077f7cc396edfcdbfd2cc61b121117b8a8bbae716f244a0f5f2256dc357
data/.travis.yml CHANGED
@@ -1,8 +1,11 @@
1
1
  language: ruby
2
2
  bundler_args: --without development
3
3
  rvm:
4
- - 1.9.3
5
- - 2.0.0
6
4
  - 2.1.0
7
- # - jruby-19mode
8
5
  script: script/ci
6
+ before_install:
7
+ - sudo apt-get update -qq
8
+ - sudo apt-get install -y clamav clamav-freshclam libmagic
9
+ - sudo freshclam
10
+ - sudo apt-get install -y clamav-daemon
11
+
data/Gemfile CHANGED
@@ -24,9 +24,7 @@ gem 'turbolinks'
24
24
  gem 'uglifier', '>= 1.3.0'
25
25
  gem 'breadcrumbs_on_rails'
26
26
  gem 'puma', '~> 2.8.2'
27
- gem 'pry-rails'
28
- gem 'pry', require: false
29
- gem 'pry-debugger', require: false
27
+ gem 'ruby-filemagic'
30
28
 
31
29
  gemspec
32
30
 
@@ -53,8 +51,16 @@ group :development, :test do
53
51
  gem 'capybara', require: false
54
52
  gem 'coveralls', require: false
55
53
  gem 'cucumber', require: false
56
- gem 'debugger'
57
- gem 'debugger-completion'
54
+
55
+ if RUBY_VERSION < '2.0.0'
56
+ gem 'pry-debugger', require: false
57
+ gem 'debugger'
58
+ gem 'debugger-completion', require: false
59
+ else
60
+ gem 'pry-byebug', require: false
61
+ gem 'byebug'
62
+ end
63
+
58
64
  gem 'erubis'
59
65
  gem 'excon'
60
66
  gem 'fedux_org-stdlib', require: false
@@ -62,6 +68,8 @@ group :development, :test do
62
68
  gem 'launchy'
63
69
  gem 'nokogiri'
64
70
  gem 'poltergeist', require: 'capybara/poltergeist'
71
+ gem 'pry-rails', require: false
72
+ gem 'pry', require: false
65
73
  gem 'pry-doc', require: false
66
74
  gem 'rack-test', require: 'rack/test'
67
75
  gem 'rake', require: false
data/README.md CHANGED
@@ -44,6 +44,22 @@ Or build from git
44
44
  $ gem package:gem
45
45
  $ gem install pkg/test_server-<version>
46
46
 
47
+ ### Required libraries and external programs
48
+
49
+ * File Type detection
50
+
51
+ You need to install `libmagic` for filetype detection. This library uses the
52
+ same database as the linux `file`-command. The source for that library can be
53
+ found at `http://www.darwinsys.com/file/`.
54
+
55
+ On `Arch Linux` and `Debian` you need to install the `file`-package. On `Red
56
+ Hat` make sure the `file-libs`-package is installed.
57
+
58
+ * Virus detection
59
+
60
+ You need to install `clamav` for virus detection. Make sure the clamav-daemon
61
+ is running (`clamd`) and has fresh virus patterns.
62
+
47
63
  ### Archlinux
48
64
 
49
65
  Install via `AUR`
data/Rakefile CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'filegen'
4
4
  require 'fedux_org/stdlib/rake'
5
- require 'active_support/core_ext/string/inflections'
5
+ require 'active_support/all'
6
6
  require 'open3'
7
7
 
8
8
  def software
@@ -109,7 +109,8 @@ namespace :archlinux do
109
109
  sh "sudo pacman -U #{archlinux_package_name}"
110
110
  end
111
111
 
112
- task :build => ['package:gem', archlinux_build_directory] do
112
+ desc 'Prepare package build'
113
+ task :prepare => ['package:gem', archlinux_build_directory] do
113
114
  generator = Filegen::Rubygen.new
114
115
  template = File.read(File.expand_path('../share/archlinux/PKGBUILD.sh.erb', __FILE__))
115
116
  build_file = File.expand_path('../share/archlinux/PKGBUILD', __FILE__)
@@ -118,7 +119,8 @@ namespace :archlinux do
118
119
  package_file = ::File.join(pkg_directory, "#{software}-#{version}.gem")
119
120
  source = ''
120
121
  else
121
- package_file = '$pkgname-$pkgver.gem'
122
+ #package_file = '$pkgname-$pkgver.gem'
123
+ package_file = '$pkgname'
122
124
  source = 'http://gems.rubyforge.org/gems/$pkgname-$pkgver.gem'
123
125
  end
124
126
 
@@ -144,8 +146,20 @@ namespace :archlinux do
144
146
  File.open(build_file, 'w') do |f|
145
147
  f.write generator.run(template, data)
146
148
  end
149
+ end
150
+ end
147
151
 
152
+ desc 'Build package'
153
+ task :build => 'archlinux:prepare' do
154
+ Dir.chdir(archlinux_build_directory) do
148
155
  sh "makepkg -f"
149
156
  end
150
157
  end
158
+
159
+ desc 'Build source package for aur'
160
+ task :build_source => 'archlinux:prepare' do
161
+ Dir.chdir(archlinux_build_directory) do
162
+ sh "makepkg --source"
163
+ end
164
+ end
151
165
  end
@@ -0,0 +1,3 @@
1
+ # Place all the behaviors and hooks related to the matching controller here.
2
+ # All this logic will automatically be available in application.js.
3
+ # You can use CoffeeScript in this file: http://coffeescript.org/
@@ -115,6 +115,11 @@ h4 {
115
115
  @extend .btn-default;
116
116
  }
117
117
 
118
+ .ts-button-upload{
119
+ @extend .btn;
120
+ @extend .btn-default;
121
+ }
122
+
118
123
  .ts-button-clone {
119
124
  @extend .btn;
120
125
  @extend .btn-default;
@@ -148,6 +153,10 @@ a:focus {
148
153
  display: inline-block;
149
154
  }
150
155
 
156
+ .ts-field-file {
157
+ }
158
+
159
+
151
160
  .ts-field-repeat {
152
161
  @extend .checkbox;
153
162
  }
@@ -166,6 +175,10 @@ a:focus {
166
175
  @extend .form-group;
167
176
  }
168
177
 
178
+ .ts-form-group-checkbox {
179
+ @extend .checkbox;
180
+ }
181
+
169
182
  .ts-form {
170
183
  width: 30%;
171
184
  margin: 20px;
@@ -249,6 +262,24 @@ a:focus {
249
262
  @extend .caret;
250
263
  }
251
264
 
265
+ .ts-form-label {
266
+ font-weight: bold;
267
+ margin-bottom: 5px;
268
+ max-width: 100%;
269
+ display: inline-block;
270
+ }
271
+
252
272
  .ts-breadcrumb {
253
273
  @extend .breadcrumb;
254
274
  }
275
+
276
+ .ts-list-element {
277
+ }
278
+
279
+ .ts-list {
280
+ padding-left: 3rem;
281
+ }
282
+
283
+ .ts-result {
284
+ margin: 2rem;
285
+ }
@@ -0,0 +1,3 @@
1
+ // Place all the styles related to the TestServer::FileUploader controller here.
2
+ // They will automatically be included in application.css.
3
+ // You can use Sass (SCSS) here: http://sass-lang.com/
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ module TestServer
3
+ class FileUploaderController < ApplicationController
4
+ include ERB::Util
5
+
6
+ add_breadcrumb I18n.t('views.root.link'), :root_path
7
+ add_breadcrumb I18n.t('views.file_uploader.link'), :file_uploader_path
8
+
9
+ def result
10
+ add_breadcrumb I18n.t('views.file_uploader.upload.link'), :file_uploader_upload_path
11
+
12
+ @file_upload = FileUpload.new(params.fetch(:test_server_file_upload, {}))
13
+
14
+ operations = []
15
+ operations << VirusDetector.new if @file_upload.virus_scan == true
16
+ operations << FiletypeDetector.new if @file_upload.filetype_detection == true
17
+
18
+ if @file_upload.checksum_calculation == true
19
+ operations << Sha256Calculator.new
20
+ operations << MD5Calculator.new
21
+ end
22
+
23
+ operations.each do |d|
24
+ d.use @file_upload.uploaded_file
25
+ end
26
+
27
+ add_breadcrumb I18n.t('views.file_uploader.result.link', file: html_escape(@file_upload.uploaded_file.name))
28
+ end
29
+
30
+ def index
31
+ end
32
+
33
+ def upload
34
+ add_breadcrumb I18n.t('views.file_uploader.upload.link'), :file_uploader_upload_path
35
+
36
+ @file_upload = FileUpload.new
37
+ @file_upload.virus_scan = false
38
+ @file_upload.filetype_detection = false
39
+ @file_upload.checksum_calculation = false
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,2 @@
1
+ module TestServer::FileUploaderHelper
2
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ module TestServer
3
+ class FileUpload
4
+ include ActiveModel::Validations
5
+ include ActiveModel::Conversion
6
+ extend ActiveModel::Naming
7
+
8
+ attr_reader :virus_scan, :checksum_calculation, :filetype_detection
9
+
10
+ def initialize(attributes = {})
11
+ Hash(attributes).each do |name, value|
12
+ send("#{name}=", value)
13
+ end
14
+ end
15
+
16
+ [:virus_scan, :checksum_calculation, :filetype_detection ].each do |m|
17
+ define_method :"#{m}=" do |value|
18
+ instance_variable_set :"@#{m}", case value
19
+ when /1|y|on/
20
+ true
21
+ when /0|n|off/
22
+ false
23
+ else
24
+ false
25
+ end
26
+ end
27
+ end
28
+
29
+ def uploaded_file=(file)
30
+ @uploaded_file = UploadedFile.new(file)
31
+ end
32
+
33
+ def uploaded_file
34
+ @uploaded_file || UploadedFile.new(nil)
35
+ end
36
+
37
+ def persisted?
38
+ false
39
+ end
40
+ end
41
+ end
@@ -61,6 +61,16 @@
61
61
  - [ :client_ip_address ].each do |action|
62
62
  %li
63
63
  = link_to t("views.reflector.#{action}.title"), send("reflector_#{action}_path")
64
+ %li.ts-dropdown
65
+ %a.ts-dropdown-toggle{ href: file_uploader_path, 'data-toggle' => 'dropdown'}
66
+ = t('views.file_uploader.link')
67
+ %b.ts-caret
68
+ %ul.ts-dropdown-menu
69
+ %li
70
+ = link_to t('views.file_uploader.index.link'), file_uploader_path
71
+ - [ :upload ].each do |action|
72
+ %li
73
+ = link_to t("views.file_uploader.#{action}.link"), send("file_uploader_#{action}_path")
64
74
  %ul.ts-breadcrumb
65
75
  = render_breadcrumbs builder: TestServer::BreadcrumbBuilder
66
76
  .ts-container
@@ -6,3 +6,4 @@
6
6
  = render partial: 'test_server/streaming/overview'
7
7
  = render partial: 'test_server/static/overview'
8
8
  = render partial: 'test_server/reflector/overview'
9
+ = render partial: 'test_server/file_uploader/overview'
@@ -0,0 +1,27 @@
1
+ %h1
2
+ = t('views.file_uploader.upload.title')
3
+
4
+ = form_for @file_upload, url: { action: :result }, html: { multipart: true, id: :form, class: :'ts-form' } do |form|
5
+ .ts-form-group
6
+ = form.hidden_field :uploaded_file
7
+ %label{ for: :uploaded_file}
8
+ = t('views.file_uploader.upload.fields.file')
9
+ = form.file_field :uploaded_file, html: { class: 'ts-field-file' }
10
+ .ts-form-group-checkbox
11
+ %label
12
+ = t('views.file_uploader.upload.fields.virus_scan')
13
+ = form.check_box :virus_scan
14
+ .ts-form-group-checkbox
15
+ %label
16
+ = t('views.file_uploader.upload.fields.filetype_detection')
17
+ = form.check_box :filetype_detection
18
+ .ts-form-group-checkbox
19
+ %label
20
+ = t('views.file_uploader.upload.fields.checksum_calculation')
21
+ = form.check_box :checksum_calculation
22
+ = form.submit t('views.application.buttons.upload'), id: :upload, class: 'ts-button-upload', name: :upload
23
+ %a#reset.ts-button-reset{href: '#', name: 'reset'}
24
+ = t('views.application.buttons.reset')
25
+ %span.ts-inline#request-spinner
26
+ = image_tag 'ajax-loader.gif', alt: t('views.file_uploader.upload.spinner.text')
27
+ = t('views.file_uploader.upload.spinner.text')
@@ -0,0 +1 @@
1
+ = render partial: 'shared/overview', locals: { controller_name: 'file_uploader', supported_actions: [:upload], static: false }
@@ -0,0 +1 @@
1
+ = render partial: 'overview'
@@ -0,0 +1,40 @@
1
+ = render 'form'
2
+
3
+ %h3
4
+ = t('views.file_uploader.result.title', file: @file_upload.uploaded_file.name)
5
+
6
+ %section.ts-result
7
+ %div.ts-form-group
8
+ %label.ts-form-label
9
+ = t('views.file_uploader.result.fields.filename')
10
+ %div
11
+ = h(@file_upload.uploaded_file.name)
12
+ - if @file_upload.uploaded_file.contains_virus?
13
+ %div.ts-form-group
14
+ %label.ts-form-label
15
+ = t('views.file_uploader.result.fields.virus')
16
+ %div
17
+ = @file_upload.uploaded_file.virus_id
18
+ - if @file_upload.uploaded_file.has_filetype?
19
+ %div.ts-form-group
20
+ %label.ts-form-label
21
+ = t('views.file_uploader.result.fields.filetype')
22
+ %div
23
+ = @file_upload.uploaded_file.filetype
24
+ - if @file_upload.uploaded_file.has_checksum?
25
+ %div.ts-form-group
26
+ %label.ts-form-label
27
+ = t('views.file_uploader.result.fields.checksum')
28
+ %div.ts-list
29
+ - @file_upload.uploaded_file.checksum.each do |s|
30
+ %li.ts-list-element
31
+ = s.to_s
32
+ %div.ts-form-group
33
+ %label.ts-form-label
34
+ = t('views.file_uploader.result.fields.size')
35
+ %div
36
+ %ul.ts-list
37
+ - @file_upload.uploaded_file.size.values.each do |s|
38
+ %li.ts-list-element
39
+ = s.to_s
40
+
@@ -0,0 +1 @@
1
+ = render 'form'
data/config/routes.rb CHANGED
@@ -1,10 +1,16 @@
1
1
  Rails.application.routes.draw do
2
+
2
3
  scope module: 'test_server' do
3
4
  root 'dashboard#show'
5
+
4
6
  #match '(errors)/:exception', to: 'errors#show', constraints: {exception: /[a-z_]+/}, via: :all
7
+
8
+ get '/file_uploader/upload' , to: 'file_uploader#upload'
9
+ post '/file_uploader/upload' , to: 'file_uploader#result'
10
+ get '/file_uploader' , to: 'file_uploader#index'
5
11
 
6
- get '/reflector/client_ip_address', to: 'reflector#client_ip_address'
7
- get '/reflector', to: 'reflector#index'
12
+ get '/reflector/client_ip_address' , to: 'reflector#client_ip_address'
13
+ get '/reflector' , to: 'reflector#index'
8
14
 
9
15
  get '/dashboard', to: 'dashboard#show'
10
16
 
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module TestServer
3
+ class Checksum
4
+ attr_reader :algorithm, :prefix, :data, :engine
5
+
6
+ def initialize(algorithm: nil, prefix: nil, data: nil, engine: nil)
7
+ @algorithm = algorithm
8
+ @prefix = prefix
9
+ @engine = engine
10
+ @data = data
11
+ end
12
+
13
+ def value
14
+ engine.hexdigest data.to_s
15
+ end
16
+
17
+ def to_s
18
+ "#{prefix} #{value}"
19
+ end
20
+ end
21
+ end