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.
- 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
|