test_server 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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