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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -3
- data/Gemfile +13 -5
- data/README.md +16 -0
- data/Rakefile +17 -3
- data/app/assets/javascripts/test_server/file_uploader.js.coffee +3 -0
- data/app/assets/stylesheets/application.scss +31 -0
- data/app/assets/stylesheets/test_server/file_uploader.css.scss +3 -0
- data/app/controllers/test_server/file_uploader_controller.rb +42 -0
- data/app/helpers/test_server/file_uploader_helper.rb +2 -0
- data/app/models/test_server/file_upload.rb +41 -0
- data/app/views/layouts/application.html.haml +10 -0
- data/app/views/test_server/dashboard/show.html.haml +1 -0
- data/app/views/test_server/file_uploader/_form.html.haml +27 -0
- data/app/views/test_server/file_uploader/_overview.html.haml +1 -0
- data/app/views/test_server/file_uploader/index.html.haml +1 -0
- data/app/views/test_server/file_uploader/result.html.haml +40 -0
- data/app/views/test_server/file_uploader/upload.html.haml +1 -0
- data/config/routes.rb +8 -2
- data/lib/test_server/checksum.rb +21 -0
- data/lib/test_server/checksum_calculator.rb +27 -0
- data/lib/test_server/command_runner.rb +58 -0
- data/lib/test_server/exceptions.rb +3 -0
- data/lib/test_server/file_size.rb +14 -0
- data/lib/test_server/filetype_detector.rb +21 -0
- data/lib/test_server/locales/en.yml +28 -1
- data/lib/test_server/main.rb +6 -1
- data/lib/test_server/md5_calculator.rb +17 -0
- data/lib/test_server/permitted_params.rb +25 -7
- data/lib/test_server/sha256_calculator.rb +17 -0
- data/lib/test_server/uploaded_file.rb +58 -0
- data/lib/test_server/version.rb +1 -1
- data/lib/test_server/virus_detector.rb +43 -0
- data/lib/test_server.rb +15 -0
- data/public/assets/{manifest-7c069da388f8a976fadfaab958b9feb7.json → manifest-1a3c45fcd482cca628c8cdc72631eb98.json} +0 -0
- data/spec/controllers/test_server/file_uploader_controller_spec.rb +26 -0
- data/spec/encoder_spec.rb +3 -3
- data/spec/features/fetch_data_via_javascript_spec.rb +18 -18
- data/spec/filetype_detector_spec.rb +31 -0
- data/spec/fixtures/file_uploader/file.bin +0 -0
- data/spec/permitted_params_spec.rb +1 -1
- data/spec/sha256_calculator_spec.rb +36 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/commands.rb +15 -0
- data/spec/support/debugging.rb +6 -1
- data/spec/support/eicar.rb +15 -0
- data/spec/support/fixtures.rb +16 -0
- data/spec/support/rails.rb +2 -0
- data/spec/uploaded_file_spec.rb +167 -0
- data/spec/views/errors/not_found.html.haml_spec.rb +1 -1
- data/spec/views/test_server/file_uploader/index.html.haml_spec.rb +32 -0
- data/spec/views/test_server/file_uploader/result.html.haml_spec.rb +58 -0
- data/spec/views/test_server/file_uploader/upload.html.haml_spec.rb +12 -0
- data/spec/views/test_server/reflector/client_ip_address.html.haml_spec.rb +1 -1
- data/spec/virus_detector_spec.rb +45 -0
- data/test_server.gemspec +2 -3
- metadata +48 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0839da7e6f8d02b97d87791f434e1261c44138b
|
4
|
+
data.tar.gz: 84d82d475f288e3cb05354733a2e66b2261fbc54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 '
|
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
|
-
|
57
|
-
|
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/
|
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
|
-
|
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
|
@@ -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,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,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
|
@@ -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
|