Browse Source

Initial commit

master
Nicolas Vinot 4 years ago
commit
97c46bea93
76 changed files with 2098 additions and 0 deletions
  1. 12
    0
      .gitignore
  2. 41
    0
      Gemfile
  3. 8
    0
      Guardfile
  4. 661
    0
      LICENSE
  5. 28
    0
      README.rdoc
  6. 6
    0
      Rakefile
  7. 0
    0
      app/assets/images/.keep
  8. 4
    0
      app/assets/javascripts/application.coffee
  9. 5
    0
      app/assets/javascripts/site.coffee.erb
  10. 46
    0
      app/assets/stylesheets/application.scss
  11. 3
    0
      app/assets/stylesheets/site.scss
  12. 5
    0
      app/controllers/application_controller.rb
  13. 0
    0
      app/controllers/concerns/.keep
  14. 42
    0
      app/controllers/site_controller.rb
  15. 2
    0
      app/helpers/application_helper.rb
  16. 91
    0
      app/helpers/site_helper.rb
  17. 0
    0
      app/mailers/.keep
  18. 0
    0
      app/models/.keep
  19. 0
    0
      app/models/concerns/.keep
  20. 18
    0
      app/views/application/_flash.erb
  21. 28
    0
      app/views/application/_headers.erb
  22. 15
    0
      app/views/layouts/application.html.erb
  23. 17
    0
      app/views/site/index.html.erb
  24. 9
    0
      app/views/site/no_tls.html
  25. 20
    0
      app/views/site/processing.html.erb
  26. 104
    0
      app/views/site/result.html.erb
  27. 42
    0
      app/workers/https_worker.rb
  28. 3
    0
      bin/bundle
  29. 9
    0
      bin/enqueue
  30. 8
    0
      bin/rails
  31. 8
    0
      bin/rake
  32. 29
    0
      bin/setup
  33. 20
    0
      bin/sidekiq
  34. 4
    0
      config.ru
  35. 34
    0
      config/application.rb
  36. 3
    0
      config/boot.rb
  37. 25
    0
      config/database.yml
  38. 5
    0
      config/environment.rb
  39. 43
    0
      config/environments/development.rb
  40. 79
    0
      config/environments/production.rb
  41. 42
    0
      config/environments/test.rb
  42. 11
    0
      config/initializers/assets.rb
  43. 7
    0
      config/initializers/backtrace_silencers.rb
  44. 3
    0
      config/initializers/cookies_serializer.rb
  45. 4
    0
      config/initializers/filter_parameter_logging.rb
  46. 16
    0
      config/initializers/inflections.rb
  47. 4
    0
      config/initializers/mime_types.rb
  48. 3
    0
      config/initializers/session_store.rb
  49. 7
    0
      config/initializers/sidekiq.rb
  50. 25
    0
      config/initializers/sprocket_helpers.rb
  51. 14
    0
      config/initializers/wrap_parameters.rb
  52. 1
    0
      config/locales/en.yml
  53. 205
    0
      config/locales/fr.yml
  54. 5
    0
      config/routes.rb
  55. 22
    0
      config/secrets.yml
  56. 1
    0
      config/sidekiq.yml
  57. 7
    0
      db/seeds.rb
  58. 0
    0
      lib/assets/.keep
  59. 20
    0
      lib/datastore.rb
  60. 0
    0
      lib/tasks/.keep
  61. 0
    0
      log/.keep
  62. 67
    0
      public/404.html
  63. 67
    0
      public/422.html
  64. 66
    0
      public/500.html
  65. 0
    0
      public/favicon.ico
  66. 5
    0
      public/robots.txt
  67. 0
    0
      test/controllers/.keep
  68. 9
    0
      test/controllers/site_controller_test.rb
  69. 0
    0
      test/fixtures/.keep
  70. 0
    0
      test/helpers/.keep
  71. 0
    0
      test/integration/.keep
  72. 0
    0
      test/mailers/.keep
  73. 0
    0
      test/models/.keep
  74. 10
    0
      test/test_helper.rb
  75. 0
    0
      vendor/assets/javascripts/.keep
  76. 0
    0
      vendor/assets/stylesheets/.keep

+ 12
- 0
.gitignore View File

@@ -0,0 +1,12 @@
1
+/.bundle/
2
+/db/*.sqlite3
3
+/db/*.sqlite3-journal
4
+/log/*
5
+!/log/.keep
6
+/tmp
7
+/public/assets/
8
+*.iml
9
+Gemfile.lock
10
+.generators
11
+.rakeTasks
12
+

+ 41
- 0
Gemfile View File

@@ -0,0 +1,41 @@
1
+source 'https://rubygems.org'
2
+
3
+gem 'rails', '4.2.1'
4
+
5
+gem 'sqlite3'
6
+gem 'cryptcheck', '~> 1.0.0', path: File.expand_path(File.join File.dirname(__FILE__), '../cryptcheck')
7
+gem 'sidekiq', '~> 3.4.2'
8
+gem 'stretcher', '~> 1.21.1'
9
+#gem 'mongo', '~> 2.0.6'
10
+gem 'faraday', '~> 0.8.9' # For stretcher compatibility
11
+gem 'simpleidn', '~> 0.0.5'
12
+
13
+group :assets do
14
+	gem 'therubyracer', platforms: :ruby
15
+	gem 'uglifier'
16
+
17
+	gem 'sass-rails', '~> 5.0.3'
18
+	gem 'coffee-rails', '~> 4.1.0'
19
+	gem 'jquery-rails', '~> 4.0.4'
20
+	gem 'bootstrap-sass', '~> 3.3.5'
21
+	gem 'font-awesome-sass', '~> 4.4.0'
22
+end
23
+
24
+group :development, :test do
25
+	gem 'puma'
26
+	gem 'byebug'
27
+	gem 'web-console'
28
+	gem 'spring'
29
+
30
+	gem 'debase'
31
+	gem 'ruby-debug-ide'
32
+	gem 'pry-rails'
33
+
34
+	gem 'better_errors'
35
+	gem 'binding_of_caller'
36
+	gem 'quiet_assets'
37
+
38
+	gem 'guard-livereload', require: false
39
+	gem 'rack-livereload'
40
+end
41
+

+ 8
- 0
Guardfile View File

@@ -0,0 +1,8 @@
1
+guard 'livereload' do
2
+	watch(%r{app/views/.+\.(erb|haml|slim)$})
3
+	watch(%r{app/helpers/.+\.rb})
4
+	watch(%r{public/.+\.(css|js|html)})
5
+	watch(%r{config/locales/.+\.yml})
6
+	# Rails Assets Pipeline
7
+	watch(%r{(app|vendor)(/assets/\w+/(.+\.(css|js|html|png|jpg|coffee|scss))).*}) { |m| "/assets/#{m[3]}" }
8
+end

+ 661
- 0
LICENSE View File

@@ -0,0 +1,661 @@
1
+                    GNU AFFERO GENERAL PUBLIC LICENSE
2
+                       Version 3, 19 November 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+                            Preamble
9
+
10
+  The GNU Affero General Public License is a free, copyleft license for
11
+software and other kinds of works, specifically designed to ensure
12
+cooperation with the community in the case of network server software.
13
+
14
+  The licenses for most software and other practical works are designed
15
+to take away your freedom to share and change the works.  By contrast,
16
+our General Public Licenses are intended to guarantee your freedom to
17
+share and change all versions of a program--to make sure it remains free
18
+software for all its users.
19
+
20
+  When we speak of free software, we are referring to freedom, not
21
+price.  Our General Public Licenses are designed to make sure that you
22
+have the freedom to distribute copies of free software (and charge for
23
+them if you wish), that you receive source code or can get it if you
24
+want it, that you can change the software or use pieces of it in new
25
+free programs, and that you know you can do these things.
26
+
27
+  Developers that use our General Public Licenses protect your rights
28
+with two steps: (1) assert copyright on the software, and (2) offer
29
+you this License which gives you legal permission to copy, distribute
30
+and/or modify the software.
31
+
32
+  A secondary benefit of defending all users' freedom is that
33
+improvements made in alternate versions of the program, if they
34
+receive widespread use, become available for other developers to
35
+incorporate.  Many developers of free software are heartened and
36
+encouraged by the resulting cooperation.  However, in the case of
37
+software used on network servers, this result may fail to come about.
38
+The GNU General Public License permits making a modified version and
39
+letting the public access it on a server without ever releasing its
40
+source code to the public.
41
+
42
+  The GNU Affero General Public License is designed specifically to
43
+ensure that, in such cases, the modified source code becomes available
44
+to the community.  It requires the operator of a network server to
45
+provide the source code of the modified version running there to the
46
+users of that server.  Therefore, public use of a modified version, on
47
+a publicly accessible server, gives the public access to the source
48
+code of the modified version.
49
+
50
+  An older license, called the Affero General Public License and
51
+published by Affero, was designed to accomplish similar goals.  This is
52
+a different license, not a version of the Affero GPL, but Affero has
53
+released a new version of the Affero GPL which permits relicensing under
54
+this license.
55
+
56
+  The precise terms and conditions for copying, distribution and
57
+modification follow.
58
+
59
+                       TERMS AND CONDITIONS
60
+
61
+  0. Definitions.
62
+
63
+  "This License" refers to version 3 of the GNU Affero General Public License.
64
+
65
+  "Copyright" also means copyright-like laws that apply to other kinds of
66
+works, such as semiconductor masks.
67
+
68
+  "The Program" refers to any copyrightable work licensed under this
69
+License.  Each licensee is addressed as "you".  "Licensees" and
70
+"recipients" may be individuals or organizations.
71
+
72
+  To "modify" a work means to copy from or adapt all or part of the work
73
+in a fashion requiring copyright permission, other than the making of an
74
+exact copy.  The resulting work is called a "modified version" of the
75
+earlier work or a work "based on" the earlier work.
76
+
77
+  A "covered work" means either the unmodified Program or a work based
78
+on the Program.
79
+
80
+  To "propagate" a work means to do anything with it that, without
81
+permission, would make you directly or secondarily liable for
82
+infringement under applicable copyright law, except executing it on a
83
+computer or modifying a private copy.  Propagation includes copying,
84
+distribution (with or without modification), making available to the
85
+public, and in some countries other activities as well.
86
+
87
+  To "convey" a work means any kind of propagation that enables other
88
+parties to make or receive copies.  Mere interaction with a user through
89
+a computer network, with no transfer of a copy, is not conveying.
90
+
91
+  An interactive user interface displays "Appropriate Legal Notices"
92
+to the extent that it includes a convenient and prominently visible
93
+feature that (1) displays an appropriate copyright notice, and (2)
94
+tells the user that there is no warranty for the work (except to the
95
+extent that warranties are provided), that licensees may convey the
96
+work under this License, and how to view a copy of this License.  If
97
+the interface presents a list of user commands or options, such as a
98
+menu, a prominent item in the list meets this criterion.
99
+
100
+  1. Source Code.
101
+
102
+  The "source code" for a work means the preferred form of the work
103
+for making modifications to it.  "Object code" means any non-source
104
+form of a work.
105
+
106
+  A "Standard Interface" means an interface that either is an official
107
+standard defined by a recognized standards body, or, in the case of
108
+interfaces specified for a particular programming language, one that
109
+is widely used among developers working in that language.
110
+
111
+  The "System Libraries" of an executable work include anything, other
112
+than the work as a whole, that (a) is included in the normal form of
113
+packaging a Major Component, but which is not part of that Major
114
+Component, and (b) serves only to enable use of the work with that
115
+Major Component, or to implement a Standard Interface for which an
116
+implementation is available to the public in source code form.  A
117
+"Major Component", in this context, means a major essential component
118
+(kernel, window system, and so on) of the specific operating system
119
+(if any) on which the executable work runs, or a compiler used to
120
+produce the work, or an object code interpreter used to run it.
121
+
122
+  The "Corresponding Source" for a work in object code form means all
123
+the source code needed to generate, install, and (for an executable
124
+work) run the object code and to modify the work, including scripts to
125
+control those activities.  However, it does not include the work's
126
+System Libraries, or general-purpose tools or generally available free
127
+programs which are used unmodified in performing those activities but
128
+which are not part of the work.  For example, Corresponding Source
129
+includes interface definition files associated with source files for
130
+the work, and the source code for shared libraries and dynamically
131
+linked subprograms that the work is specifically designed to require,
132
+such as by intimate data communication or control flow between those
133
+subprograms and other parts of the work.
134
+
135
+  The Corresponding Source need not include anything that users
136
+can regenerate automatically from other parts of the Corresponding
137
+Source.
138
+
139
+  The Corresponding Source for a work in source code form is that
140
+same work.
141
+
142
+  2. Basic Permissions.
143
+
144
+  All rights granted under this License are granted for the term of
145
+copyright on the Program, and are irrevocable provided the stated
146
+conditions are met.  This License explicitly affirms your unlimited
147
+permission to run the unmodified Program.  The output from running a
148
+covered work is covered by this License only if the output, given its
149
+content, constitutes a covered work.  This License acknowledges your
150
+rights of fair use or other equivalent, as provided by copyright law.
151
+
152
+  You may make, run and propagate covered works that you do not
153
+convey, without conditions so long as your license otherwise remains
154
+in force.  You may convey covered works to others for the sole purpose
155
+of having them make modifications exclusively for you, or provide you
156
+with facilities for running those works, provided that you comply with
157
+the terms of this License in conveying all material for which you do
158
+not control copyright.  Those thus making or running the covered works
159
+for you must do so exclusively on your behalf, under your direction
160
+and control, on terms that prohibit them from making any copies of
161
+your copyrighted material outside their relationship with you.
162
+
163
+  Conveying under any other circumstances is permitted solely under
164
+the conditions stated below.  Sublicensing is not allowed; section 10
165
+makes it unnecessary.
166
+
167
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
168
+
169
+  No covered work shall be deemed part of an effective technological
170
+measure under any applicable law fulfilling obligations under article
171
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
172
+similar laws prohibiting or restricting circumvention of such
173
+measures.
174
+
175
+  When you convey a covered work, you waive any legal power to forbid
176
+circumvention of technological measures to the extent such circumvention
177
+is effected by exercising rights under this License with respect to
178
+the covered work, and you disclaim any intention to limit operation or
179
+modification of the work as a means of enforcing, against the work's
180
+users, your or third parties' legal rights to forbid circumvention of
181
+technological measures.
182
+
183
+  4. Conveying Verbatim Copies.
184
+
185
+  You may convey verbatim copies of the Program's source code as you
186
+receive it, in any medium, provided that you conspicuously and
187
+appropriately publish on each copy an appropriate copyright notice;
188
+keep intact all notices stating that this License and any
189
+non-permissive terms added in accord with section 7 apply to the code;
190
+keep intact all notices of the absence of any warranty; and give all
191
+recipients a copy of this License along with the Program.
192
+
193
+  You may charge any price or no price for each copy that you convey,
194
+and you may offer support or warranty protection for a fee.
195
+
196
+  5. Conveying Modified Source Versions.
197
+
198
+  You may convey a work based on the Program, or the modifications to
199
+produce it from the Program, in the form of source code under the
200
+terms of section 4, provided that you also meet all of these conditions:
201
+
202
+    a) The work must carry prominent notices stating that you modified
203
+    it, and giving a relevant date.
204
+
205
+    b) The work must carry prominent notices stating that it is
206
+    released under this License and any conditions added under section
207
+    7.  This requirement modifies the requirement in section 4 to
208
+    "keep intact all notices".
209
+
210
+    c) You must license the entire work, as a whole, under this
211
+    License to anyone who comes into possession of a copy.  This
212
+    License will therefore apply, along with any applicable section 7
213
+    additional terms, to the whole of the work, and all its parts,
214
+    regardless of how they are packaged.  This License gives no
215
+    permission to license the work in any other way, but it does not
216
+    invalidate such permission if you have separately received it.
217
+
218
+    d) If the work has interactive user interfaces, each must display
219
+    Appropriate Legal Notices; however, if the Program has interactive
220
+    interfaces that do not display Appropriate Legal Notices, your
221
+    work need not make them do so.
222
+
223
+  A compilation of a covered work with other separate and independent
224
+works, which are not by their nature extensions of the covered work,
225
+and which are not combined with it such as to form a larger program,
226
+in or on a volume of a storage or distribution medium, is called an
227
+"aggregate" if the compilation and its resulting copyright are not
228
+used to limit the access or legal rights of the compilation's users
229
+beyond what the individual works permit.  Inclusion of a covered work
230
+in an aggregate does not cause this License to apply to the other
231
+parts of the aggregate.
232
+
233
+  6. Conveying Non-Source Forms.
234
+
235
+  You may convey a covered work in object code form under the terms
236
+of sections 4 and 5, provided that you also convey the
237
+machine-readable Corresponding Source under the terms of this License,
238
+in one of these ways:
239
+
240
+    a) Convey the object code in, or embodied in, a physical product
241
+    (including a physical distribution medium), accompanied by the
242
+    Corresponding Source fixed on a durable physical medium
243
+    customarily used for software interchange.
244
+
245
+    b) Convey the object code in, or embodied in, a physical product
246
+    (including a physical distribution medium), accompanied by a
247
+    written offer, valid for at least three years and valid for as
248
+    long as you offer spare parts or customer support for that product
249
+    model, to give anyone who possesses the object code either (1) a
250
+    copy of the Corresponding Source for all the software in the
251
+    product that is covered by this License, on a durable physical
252
+    medium customarily used for software interchange, for a price no
253
+    more than your reasonable cost of physically performing this
254
+    conveying of source, or (2) access to copy the
255
+    Corresponding Source from a network server at no charge.
256
+
257
+    c) Convey individual copies of the object code with a copy of the
258
+    written offer to provide the Corresponding Source.  This
259
+    alternative is allowed only occasionally and noncommercially, and
260
+    only if you received the object code with such an offer, in accord
261
+    with subsection 6b.
262
+
263
+    d) Convey the object code by offering access from a designated
264
+    place (gratis or for a charge), and offer equivalent access to the
265
+    Corresponding Source in the same way through the same place at no
266
+    further charge.  You need not require recipients to copy the
267
+    Corresponding Source along with the object code.  If the place to
268
+    copy the object code is a network server, the Corresponding Source
269
+    may be on a different server (operated by you or a third party)
270
+    that supports equivalent copying facilities, provided you maintain
271
+    clear directions next to the object code saying where to find the
272
+    Corresponding Source.  Regardless of what server hosts the
273
+    Corresponding Source, you remain obligated to ensure that it is
274
+    available for as long as needed to satisfy these requirements.
275
+
276
+    e) Convey the object code using peer-to-peer transmission, provided
277
+    you inform other peers where the object code and Corresponding
278
+    Source of the work are being offered to the general public at no
279
+    charge under subsection 6d.
280
+
281
+  A separable portion of the object code, whose source code is excluded
282
+from the Corresponding Source as a System Library, need not be
283
+included in conveying the object code work.
284
+
285
+  A "User Product" is either (1) a "consumer product", which means any
286
+tangible personal property which is normally used for personal, family,
287
+or household purposes, or (2) anything designed or sold for incorporation
288
+into a dwelling.  In determining whether a product is a consumer product,
289
+doubtful cases shall be resolved in favor of coverage.  For a particular
290
+product received by a particular user, "normally used" refers to a
291
+typical or common use of that class of product, regardless of the status
292
+of the particular user or of the way in which the particular user
293
+actually uses, or expects or is expected to use, the product.  A product
294
+is a consumer product regardless of whether the product has substantial
295
+commercial, industrial or non-consumer uses, unless such uses represent
296
+the only significant mode of use of the product.
297
+
298
+  "Installation Information" for a User Product means any methods,
299
+procedures, authorization keys, or other information required to install
300
+and execute modified versions of a covered work in that User Product from
301
+a modified version of its Corresponding Source.  The information must
302
+suffice to ensure that the continued functioning of the modified object
303
+code is in no case prevented or interfered with solely because
304
+modification has been made.
305
+
306
+  If you convey an object code work under this section in, or with, or
307
+specifically for use in, a User Product, and the conveying occurs as
308
+part of a transaction in which the right of possession and use of the
309
+User Product is transferred to the recipient in perpetuity or for a
310
+fixed term (regardless of how the transaction is characterized), the
311
+Corresponding Source conveyed under this section must be accompanied
312
+by the Installation Information.  But this requirement does not apply
313
+if neither you nor any third party retains the ability to install
314
+modified object code on the User Product (for example, the work has
315
+been installed in ROM).
316
+
317
+  The requirement to provide Installation Information does not include a
318
+requirement to continue to provide support service, warranty, or updates
319
+for a work that has been modified or installed by the recipient, or for
320
+the User Product in which it has been modified or installed.  Access to a
321
+network may be denied when the modification itself materially and
322
+adversely affects the operation of the network or violates the rules and
323
+protocols for communication across the network.
324
+
325
+  Corresponding Source conveyed, and Installation Information provided,
326
+in accord with this section must be in a format that is publicly
327
+documented (and with an implementation available to the public in
328
+source code form), and must require no special password or key for
329
+unpacking, reading or copying.
330
+
331
+  7. Additional Terms.
332
+
333
+  "Additional permissions" are terms that supplement the terms of this
334
+License by making exceptions from one or more of its conditions.
335
+Additional permissions that are applicable to the entire Program shall
336
+be treated as though they were included in this License, to the extent
337
+that they are valid under applicable law.  If additional permissions
338
+apply only to part of the Program, that part may be used separately
339
+under those permissions, but the entire Program remains governed by
340
+this License without regard to the additional permissions.
341
+
342
+  When you convey a copy of a covered work, you may at your option
343
+remove any additional permissions from that copy, or from any part of
344
+it.  (Additional permissions may be written to require their own
345
+removal in certain cases when you modify the work.)  You may place
346
+additional permissions on material, added by you to a covered work,
347
+for which you have or can give appropriate copyright permission.
348
+
349
+  Notwithstanding any other provision of this License, for material you
350
+add to a covered work, you may (if authorized by the copyright holders of
351
+that material) supplement the terms of this License with terms:
352
+
353
+    a) Disclaiming warranty or limiting liability differently from the
354
+    terms of sections 15 and 16 of this License; or
355
+
356
+    b) Requiring preservation of specified reasonable legal notices or
357
+    author attributions in that material or in the Appropriate Legal
358
+    Notices displayed by works containing it; or
359
+
360
+    c) Prohibiting misrepresentation of the origin of that material, or
361
+    requiring that modified versions of such material be marked in
362
+    reasonable ways as different from the original version; or
363
+
364
+    d) Limiting the use for publicity purposes of names of licensors or
365
+    authors of the material; or
366
+
367
+    e) Declining to grant rights under trademark law for use of some
368
+    trade names, trademarks, or service marks; or
369
+
370
+    f) Requiring indemnification of licensors and authors of that
371
+    material by anyone who conveys the material (or modified versions of
372
+    it) with contractual assumptions of liability to the recipient, for
373
+    any liability that these contractual assumptions directly impose on
374
+    those licensors and authors.
375
+
376
+  All other non-permissive additional terms are considered "further
377
+restrictions" within the meaning of section 10.  If the Program as you
378
+received it, or any part of it, contains a notice stating that it is
379
+governed by this License along with a term that is a further
380
+restriction, you may remove that term.  If a license document contains
381
+a further restriction but permits relicensing or conveying under this
382
+License, you may add to a covered work material governed by the terms
383
+of that license document, provided that the further restriction does
384
+not survive such relicensing or conveying.
385
+
386
+  If you add terms to a covered work in accord with this section, you
387
+must place, in the relevant source files, a statement of the
388
+additional terms that apply to those files, or a notice indicating
389
+where to find the applicable terms.
390
+
391
+  Additional terms, permissive or non-permissive, may be stated in the
392
+form of a separately written license, or stated as exceptions;
393
+the above requirements apply either way.
394
+
395
+  8. Termination.
396
+
397
+  You may not propagate or modify a covered work except as expressly
398
+provided under this License.  Any attempt otherwise to propagate or
399
+modify it is void, and will automatically terminate your rights under
400
+this License (including any patent licenses granted under the third
401
+paragraph of section 11).
402
+
403
+  However, if you cease all violation of this License, then your
404
+license from a particular copyright holder is reinstated (a)
405
+provisionally, unless and until the copyright holder explicitly and
406
+finally terminates your license, and (b) permanently, if the copyright
407
+holder fails to notify you of the violation by some reasonable means
408
+prior to 60 days after the cessation.
409
+
410
+  Moreover, your license from a particular copyright holder is
411
+reinstated permanently if the copyright holder notifies you of the
412
+violation by some reasonable means, this is the first time you have
413
+received notice of violation of this License (for any work) from that
414
+copyright holder, and you cure the violation prior to 30 days after
415
+your receipt of the notice.
416
+
417
+  Termination of your rights under this section does not terminate the
418
+licenses of parties who have received copies or rights from you under
419
+this License.  If your rights have been terminated and not permanently
420
+reinstated, you do not qualify to receive new licenses for the same
421
+material under section 10.
422
+
423
+  9. Acceptance Not Required for Having Copies.
424
+
425
+  You are not required to accept this License in order to receive or
426
+run a copy of the Program.  Ancillary propagation of a covered work
427
+occurring solely as a consequence of using peer-to-peer transmission
428
+to receive a copy likewise does not require acceptance.  However,
429
+nothing other than this License grants you permission to propagate or
430
+modify any covered work.  These actions infringe copyright if you do
431
+not accept this License.  Therefore, by modifying or propagating a
432
+covered work, you indicate your acceptance of this License to do so.
433
+
434
+  10. Automatic Licensing of Downstream Recipients.
435
+
436
+  Each time you convey a covered work, the recipient automatically
437
+receives a license from the original licensors, to run, modify and
438
+propagate that work, subject to this License.  You are not responsible
439
+for enforcing compliance by third parties with this License.
440
+
441
+  An "entity transaction" is a transaction transferring control of an
442
+organization, or substantially all assets of one, or subdividing an
443
+organization, or merging organizations.  If propagation of a covered
444
+work results from an entity transaction, each party to that
445
+transaction who receives a copy of the work also receives whatever
446
+licenses to the work the party's predecessor in interest had or could
447
+give under the previous paragraph, plus a right to possession of the
448
+Corresponding Source of the work from the predecessor in interest, if
449
+the predecessor has it or can get it with reasonable efforts.
450
+
451
+  You may not impose any further restrictions on the exercise of the
452
+rights granted or affirmed under this License.  For example, you may
453
+not impose a license fee, royalty, or other charge for exercise of
454
+rights granted under this License, and you may not initiate litigation
455
+(including a cross-claim or counterclaim in a lawsuit) alleging that
456
+any patent claim is infringed by making, using, selling, offering for
457
+sale, or importing the Program or any portion of it.
458
+
459
+  11. Patents.
460
+
461
+  A "contributor" is a copyright holder who authorizes use under this
462
+License of the Program or a work on which the Program is based.  The
463
+work thus licensed is called the contributor's "contributor version".
464
+
465
+  A contributor's "essential patent claims" are all patent claims
466
+owned or controlled by the contributor, whether already acquired or
467
+hereafter acquired, that would be infringed by some manner, permitted
468
+by this License, of making, using, or selling its contributor version,
469
+but do not include claims that would be infringed only as a
470
+consequence of further modification of the contributor version.  For
471
+purposes of this definition, "control" includes the right to grant
472
+patent sublicenses in a manner consistent with the requirements of
473
+this License.
474
+
475
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
476
+patent license under the contributor's essential patent claims, to
477
+make, use, sell, offer for sale, import and otherwise run, modify and
478
+propagate the contents of its contributor version.
479
+
480
+  In the following three paragraphs, a "patent license" is any express
481
+agreement or commitment, however denominated, not to enforce a patent
482
+(such as an express permission to practice a patent or covenant not to
483
+sue for patent infringement).  To "grant" such a patent license to a
484
+party means to make such an agreement or commitment not to enforce a
485
+patent against the party.
486
+
487
+  If you convey a covered work, knowingly relying on a patent license,
488
+and the Corresponding Source of the work is not available for anyone
489
+to copy, free of charge and under the terms of this License, through a
490
+publicly available network server or other readily accessible means,
491
+then you must either (1) cause the Corresponding Source to be so
492
+available, or (2) arrange to deprive yourself of the benefit of the
493
+patent license for this particular work, or (3) arrange, in a manner
494
+consistent with the requirements of this License, to extend the patent
495
+license to downstream recipients.  "Knowingly relying" means you have
496
+actual knowledge that, but for the patent license, your conveying the
497
+covered work in a country, or your recipient's use of the covered work
498
+in a country, would infringe one or more identifiable patents in that
499
+country that you have reason to believe are valid.
500
+
501
+  If, pursuant to or in connection with a single transaction or
502
+arrangement, you convey, or propagate by procuring conveyance of, a
503
+covered work, and grant a patent license to some of the parties
504
+receiving the covered work authorizing them to use, propagate, modify
505
+or convey a specific copy of the covered work, then the patent license
506
+you grant is automatically extended to all recipients of the covered
507
+work and works based on it.
508
+
509
+  A patent license is "discriminatory" if it does not include within
510
+the scope of its coverage, prohibits the exercise of, or is
511
+conditioned on the non-exercise of one or more of the rights that are
512
+specifically granted under this License.  You may not convey a covered
513
+work if you are a party to an arrangement with a third party that is
514
+in the business of distributing software, under which you make payment
515
+to the third party based on the extent of your activity of conveying
516
+the work, and under which the third party grants, to any of the
517
+parties who would receive the covered work from you, a discriminatory
518
+patent license (a) in connection with copies of the covered work
519
+conveyed by you (or copies made from those copies), or (b) primarily
520
+for and in connection with specific products or compilations that
521
+contain the covered work, unless you entered into that arrangement,
522
+or that patent license was granted, prior to 28 March 2007.
523
+
524
+  Nothing in this License shall be construed as excluding or limiting
525
+any implied license or other defenses to infringement that may
526
+otherwise be available to you under applicable patent law.
527
+
528
+  12. No Surrender of Others' Freedom.
529
+
530
+  If conditions are imposed on you (whether by court order, agreement or
531
+otherwise) that contradict the conditions of this License, they do not
532
+excuse you from the conditions of this License.  If you cannot convey a
533
+covered work so as to satisfy simultaneously your obligations under this
534
+License and any other pertinent obligations, then as a consequence you may
535
+not convey it at all.  For example, if you agree to terms that obligate you
536
+to collect a royalty for further conveying from those to whom you convey
537
+the Program, the only way you could satisfy both those terms and this
538
+License would be to refrain entirely from conveying the Program.
539
+
540
+  13. Remote Network Interaction; Use with the GNU General Public License.
541
+
542
+  Notwithstanding any other provision of this License, if you modify the
543
+Program, your modified version must prominently offer all users
544
+interacting with it remotely through a computer network (if your version
545
+supports such interaction) an opportunity to receive the Corresponding
546
+Source of your version by providing access to the Corresponding Source
547
+from a network server at no charge, through some standard or customary
548
+means of facilitating copying of software.  This Corresponding Source
549
+shall include the Corresponding Source for any work covered by version 3
550
+of the GNU General Public License that is incorporated pursuant to the
551
+following paragraph.
552
+
553
+  Notwithstanding any other provision of this License, you have
554
+permission to link or combine any covered work with a work licensed
555
+under version 3 of the GNU General Public License into a single
556
+combined work, and to convey the resulting work.  The terms of this
557
+License will continue to apply to the part which is the covered work,
558
+but the work with which it is combined will remain governed by version
559
+3 of the GNU General Public License.
560
+
561
+  14. Revised Versions of this License.
562
+
563
+  The Free Software Foundation may publish revised and/or new versions of
564
+the GNU Affero General Public License from time to time.  Such new versions
565
+will be similar in spirit to the present version, but may differ in detail to
566
+address new problems or concerns.
567
+
568
+  Each version is given a distinguishing version number.  If the
569
+Program specifies that a certain numbered version of the GNU Affero General
570
+Public License "or any later version" applies to it, you have the
571
+option of following the terms and conditions either of that numbered
572
+version or of any later version published by the Free Software
573
+Foundation.  If the Program does not specify a version number of the
574
+GNU Affero General Public License, you may choose any version ever published
575
+by the Free Software Foundation.
576
+
577
+  If the Program specifies that a proxy can decide which future
578
+versions of the GNU Affero General Public License can be used, that proxy's
579
+public statement of acceptance of a version permanently authorizes you
580
+to choose that version for the Program.
581
+
582
+  Later license versions may give you additional or different
583
+permissions.  However, no additional obligations are imposed on any
584
+author or copyright holder as a result of your choosing to follow a
585
+later version.
586
+
587
+  15. Disclaimer of Warranty.
588
+
589
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
590
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
591
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
592
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
593
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
594
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
595
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
596
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
597
+
598
+  16. Limitation of Liability.
599
+
600
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
601
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
602
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
603
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
604
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
605
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
606
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
607
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
608
+SUCH DAMAGES.
609
+
610
+  17. Interpretation of Sections 15 and 16.
611
+
612
+  If the disclaimer of warranty and limitation of liability provided
613
+above cannot be given local legal effect according to their terms,
614
+reviewing courts shall apply local law that most closely approximates
615
+an absolute waiver of all civil liability in connection with the
616
+Program, unless a warranty or assumption of liability accompanies a
617
+copy of the Program in return for a fee.
618
+
619
+                     END OF TERMS AND CONDITIONS
620
+
621
+            How to Apply These Terms to Your New Programs
622
+
623
+  If you develop a new program, and you want it to be of the greatest
624
+possible use to the public, the best way to achieve this is to make it
625
+free software which everyone can redistribute and change under these terms.
626
+
627
+  To do so, attach the following notices to the program.  It is safest
628
+to attach them to the start of each source file to most effectively
629
+state the exclusion of warranty; and each file should have at least
630
+the "copyright" line and a pointer to where the full notice is found.
631
+
632
+    <one line to give the program's name and a brief idea of what it does.>
633
+    Copyright (C) <year>  <name of author>
634
+
635
+    This program is free software: you can redistribute it and/or modify
636
+    it under the terms of the GNU Affero General Public License as published by
637
+    the Free Software Foundation, either version 3 of the License, or
638
+    (at your option) any later version.
639
+
640
+    This program is distributed in the hope that it will be useful,
641
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
642
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
643
+    GNU Affero General Public License for more details.
644
+
645
+    You should have received a copy of the GNU Affero General Public License
646
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
647
+
648
+Also add information on how to contact you by electronic and paper mail.
649
+
650
+  If your software can interact with users remotely through a computer
651
+network, you should also make sure that it provides a way for users to
652
+get its source.  For example, if your program is a web application, its
653
+interface could display a "Source" link that leads users to an archive
654
+of the code.  There are many ways you could offer source, and different
655
+solutions will be better for different programs; see section 13 for the
656
+specific requirements.
657
+
658
+  You should also get your employer (if you work as a programmer) or school,
659
+if any, to sign a "copyright disclaimer" for the program, if necessary.
660
+For more information on this, and how to apply and follow the GNU AGPL, see
661
+<http://www.gnu.org/licenses/>.

+ 28
- 0
README.rdoc View File

@@ -0,0 +1,28 @@
1
+== README
2
+
3
+This README would normally document whatever steps are necessary to get the
4
+application up and running.
5
+
6
+Things you may want to cover:
7
+
8
+* Ruby version
9
+
10
+* System dependencies
11
+
12
+* Configuration
13
+
14
+* Database creation
15
+
16
+* Database initialization
17
+
18
+* How to run the test suite
19
+
20
+* Services (job queues, cache servers, search engines, etc.)
21
+
22
+* Deployment instructions
23
+
24
+* ...
25
+
26
+
27
+Please feel free to use a different markup language if you do not plan to run
28
+<tt>rake doc:app</tt>.

+ 6
- 0
Rakefile View File

@@ -0,0 +1,6 @@
1
+# Add your own tasks in files placed in lib/tasks ending in .rake,
2
+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+require File.expand_path('../config/application', __FILE__)
5
+
6
+Rails.application.load_tasks

+ 0
- 0
app/assets/images/.keep View File


+ 4
- 0
app/assets/javascripts/application.coffee View File

@@ -0,0 +1,4 @@
1
+##= require jquery2
2
+##= require jquery_ujs
3
+##= require bootstrap/dropdown
4
+##= require_tree .

+ 5
- 0
app/assets/javascripts/site.coffee.erb View File

@@ -0,0 +1,5 @@
1
+$ ->
2
+	$('#check_form').submit ->
3
+		host = $('#check_host').val()
4
+		window.location.href = "<%= path :result, %i(host) %>"
5
+		false

+ 46
- 0
app/assets/stylesheets/application.scss View File

@@ -0,0 +1,46 @@
1
+//= require_tree .
2
+//= require_self
3
+
4
+@import 'bootstrap-sprockets';
5
+@import 'bootstrap';
6
+@import 'bootstrap/variables';
7
+@import 'bootstrap/mixins';
8
+@import 'bootstrap/normalize';
9
+@import 'bootstrap/scaffolding';
10
+@import 'bootstrap/type';
11
+@import 'bootstrap/grid';
12
+@import 'bootstrap/tables';
13
+@import 'bootstrap/forms';
14
+@import 'bootstrap/buttons';
15
+@import 'bootstrap/dropdowns';
16
+@import 'bootstrap/navs';
17
+@import 'bootstrap/navbar';
18
+@import 'bootstrap/progress-bars';
19
+@import 'bootstrap/labels';
20
+@import 'bootstrap/badges';
21
+@import 'bootstrap/alerts';
22
+@import 'bootstrap/utilities';
23
+@import 'bootstrap/responsive-utilities';
24
+
25
+@import 'font-awesome-sprockets';
26
+@import 'font-awesome';
27
+
28
+* {
29
+	box-sizing: border-box;
30
+}
31
+
32
+body {
33
+	padding-top: $navbar-height + 10px;
34
+}
35
+
36
+.label-error, .progress-bar-error {
37
+	background-color: #000;
38
+}
39
+
40
+.progress-bar-default {
41
+	background-color: $label-default-bg;
42
+}
43
+
44
+.progress {
45
+	margin: 0;
46
+}

+ 3
- 0
app/assets/stylesheets/site.scss View File

@@ -0,0 +1,3 @@
1
+#check {
2
+	margin-top: 100px;
3
+}

+ 5
- 0
app/controllers/application_controller.rb View File

@@ -0,0 +1,5 @@
1
+class ApplicationController < ActionController::Base
2
+	# Prevent CSRF attacks by raising an exception.
3
+	# For APIs, you may want to use :null_session instead.
4
+	protect_from_forgery with: :exception
5
+end

+ 0
- 0
app/controllers/concerns/.keep View File


+ 42
- 0
app/controllers/site_controller.rb View File

@@ -0,0 +1,42 @@
1
+class SiteController < ApplicationController
2
+	before_action :check_host, only: %i(result refresh)
3
+
4
+	def check_host
5
+		@host = params[:id]
6
+		@idn  = SimpleIDN.to_ascii @host
7
+		if /[^a-zA-Z0-9.-]/.match @idn
8
+			flash[:danger] = "Hôte #{@host} invalide"
9
+			redirect_to :root
10
+			return false
11
+		end
12
+		@result = Datastore.host :https, @idn
13
+	end
14
+
15
+	def index
16
+	end
17
+
18
+	def result
19
+		enqueue_host unless @result
20
+		return render :processing if @result.pending
21
+		return render :no_tls if @result.no_tls
22
+	end
23
+
24
+	def refresh
25
+		unless @result.pending
26
+			refresh_allowed = @result.date + Rails.configuration.refresh_delay
27
+			if Time.now < refresh_allowed
28
+				flash[:warning] = "Merci d’attendre au moins #{l refresh_allowed} pour rafraîchir"
29
+				return redirect_to result_path @host
30
+			end
31
+			enqueue_host
32
+		end
33
+		redirect_to :result
34
+	end
35
+
36
+	private
37
+	def enqueue_host
38
+		Datastore.pending :https, @host
39
+		HTTPSWorker.perform_async @idn
40
+		@result = OpenStruct.new pending: true , date: Time.now
41
+	end
42
+end

+ 2
- 0
app/helpers/application_helper.rb View File

@@ -0,0 +1,2 @@
1
+module ApplicationHelper
2
+end

+ 91
- 0
app/helpers/site_helper.rb View File

@@ -0,0 +1,91 @@
1
+module SiteHelper
2
+	def rank_color(rank)
3
+		case rank
4
+			when 'A+' then :primary
5
+			when 'A' then :success
6
+			when 'B' then :default
7
+			when 'C', 'D' then :warning
8
+			when 'E', 'F' then :danger
9
+			else :error
10
+		end
11
+	end
12
+
13
+	def rank_label(rank)
14
+		"<span class=\"label label-#{rank_color rank}\">#{rank}</span>".html_safe
15
+	end
16
+
17
+	def progress_color(percentage)
18
+		case percentage
19
+			when 0...20 then :error
20
+			when 20...40 then :danger
21
+			when 40...60 then :warning
22
+			when 60...80 then :default
23
+			when 80...90 then :success
24
+			else :primary
25
+		end
26
+	end
27
+
28
+	def score_progress(score)
29
+		%Q(<div class="progress">
30
+			 <div class="progress-bar progress-bar-striped progress-bar-#{progress_color score}"
31
+						style="width: #{score}%">
32
+				#{score} / 100
33
+			</div>
34
+		</div>).html_safe
35
+	end
36
+
37
+	def protocol_label(protocol)
38
+		color = case protocol
39
+			when 'TLSv1_2' then :success
40
+			when 'SSLv3', 'SSLv2' then :danger
41
+			else :default
42
+		end
43
+		"<span class=\"label label-#{color}\">#{protocol}</span>".html_safe
44
+	end
45
+
46
+	def protocol_labels(protocols)
47
+		protocols.collect { |p| protocol_label p }.join("\n").html_safe
48
+	end
49
+
50
+	def key_label(key)
51
+		return '<span class="label label-error">Aucune</span>'.html_safe unless key
52
+		"<span class=\"label label-#{color_key key}\">#{key.type.upcase} #{key[:size]} bits</span>".html_safe
53
+	end
54
+
55
+	def key_labels(keys)
56
+		return '<span class="label label-error">Aucune</span>'.html_safe if keys.empty?
57
+		keys.sort { |a, b| -1 * (a.rsa_size <=> b.rsa_size)} .collect { |k| key_label k }.join("\n").html_safe
58
+	end
59
+
60
+	def cipher_label(cipher)
61
+		"<span class=\"label label-#{cipher_color cipher['size']} %>\">#{cipher['size']} bits</span>".html_safe
62
+	end
63
+
64
+	def color_key(key)
65
+		case key.rsa_size
66
+			when 0...1024 then :error
67
+			when 1024...2048 then :danger
68
+			when 2048...4096 then :warning
69
+			else :success
70
+		end
71
+	end
72
+
73
+	def cipher_color(key)
74
+		case key
75
+			when 0...112 then :error
76
+			when 112...128 then :warning
77
+			when 128...256 then :success
78
+			else :primary
79
+		end
80
+	end
81
+
82
+	def cipher_labels(cipher)
83
+		{ success: %i(pfs),
84
+		  warning: %i(des3 sha1),
85
+		  danger: %i(md5 psk srp anonymous null export des rc2 rc4)
86
+		}.collect do |color, types|
87
+			types.select { |t| CryptCheck::Tls::Cipher.send "#{t}?", cipher.name }
88
+					.collect { |t| "<span class=\"label label-#{color}\">#{t.upcase}</span>" }
89
+		end.flatten(1).join("\n").html_safe
90
+	end
91
+end

+ 0
- 0
app/mailers/.keep View File


+ 0
- 0
app/models/.keep View File


+ 0
- 0
app/models/concerns/.keep View File


+ 18
- 0
app/views/application/_flash.erb View File

@@ -0,0 +1,18 @@
1
+<div id="flash" class="container">
2
+	<% [:danger, :warning, :success, :info].each do |level|
3
+		message = flash[level]
4
+		unless message.nil? %>
5
+			<%= content_tag :div, class: %(alert alert-#{level}) do %>
6
+				<% if message.is_a? Enumerable %>
7
+					<ul>
8
+						<% message.each do |m| %>
9
+							<li><%= m %></li>
10
+						<% end %>
11
+					</ul>
12
+				<% else %>
13
+					<%= message %>
14
+				<% end %>
15
+			<% end
16
+			   end
17
+			   end %>
18
+</div>

+ 28
- 0
app/views/application/_headers.erb View File

@@ -0,0 +1,28 @@
1
+<header>
2
+	<nav class="navbar navbar-inverse navbar-fixed-top">
3
+		<div class="container">
4
+			<div class="navbar-header">
5
+				<%= link_to 'CryptCheck', root_path, class: %i(navbar-brand) %>
6
+			</div>
7
+			<!--
8
+			<ul class="nav navbar-nav navbar-right">
9
+				<li class="dropdown">
10
+					<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
11
+						Hall of f/sh·ame
12
+						<span class="caret"></span>
13
+					</a>
14
+					<ul class="dropdown-menu">
15
+						<li><a href="#">Misc</a></li>
16
+						<li><a href="#">Syndicats</a></li>
17
+						<li><a href="#">SecureDrop</a></li>
18
+						<li><a href="#">Presse</a></li>
19
+						<li><a href="#">Top 500 Alexa</a></li>
20
+						<li><a href="#">Porn</a></li>
21
+						<li><a href="#">US gov</a></li>
22
+					</ul>
23
+				</li>
24
+			</ul>
25
+			-->
26
+		</div>
27
+	</nav>
28
+</header>

+ 15
- 0
app/views/layouts/application.html.erb View File

@@ -0,0 +1,15 @@
1
+<!DOCTYPE html>
2
+<html>
3
+	<head>
4
+		<title>CryptcheckRails</title>
5
+		<%= stylesheet_link_tag 'application', media: 'all' %>
6
+		<%= javascript_include_tag 'application' %>
7
+		<%= csrf_meta_tags %>
8
+		<%= yield :head %>
9
+	</head>
10
+	<body>
11
+		<%= render partial: 'headers' %>
12
+		<%= render partial: 'flash' %>
13
+		<%= yield %>
14
+	</body>
15
+</html>

+ 17
- 0
app/views/site/index.html.erb View File

@@ -0,0 +1,17 @@
1
+<div id="check" class="container">
2
+	<div class="row">
3
+		<div class="col-sm-8 col-sm-offset-2">
4
+			<h1>Vérifier votre domaine</h1>
5
+			<form id="check_form" class="form form-horizontal">
6
+				<div class="form-group">
7
+					<div class="col-sm-9">
8
+						<%= text_field_tag :check_host, nil, class: %i(form-control input-lg), placeholder: 'your-site.com' %>
9
+					</div>
10
+					<div class="col-sm-3">
11
+						<%= submit_tag 'Test-moi !', class: %i(form-control btn btn-primary input-lg pull-right) %>
12
+					</div>
13
+				</div>
14
+			</form>
15
+		</div>
16
+	</div>
17
+</div>

+ 9
- 0
app/views/site/no_tls.html View File

@@ -0,0 +1,9 @@
1
+<div id="check" class="container">
2
+	<div class="row">
3
+		<div class="col-sm-8 col-sm-offset-2">
4
+			<h1>
5
+				<%= @host %> ne supporte pas HTTPS
6
+			</h1>
7
+		</div>
8
+	</div>
9
+</div>

+ 20
- 0
app/views/site/processing.html.erb View File

@@ -0,0 +1,20 @@
1
+<% content_for :head do %>
2
+	<meta http-equiv="refresh" content="60">
3
+<% end %>
4
+<div id="check" class="container">
5
+	<div class="row">
6
+		<div class="col-sm-8 col-sm-offset-2">
7
+			<h1>
8
+				<i class="fa fa-spinner fa-pulse"></i>
9
+				Analyse en cours de <%= @host %>
10
+			</h1>
11
+			<p class="small">
12
+				Début de l’analyse : <%= l @result.date %>
13
+			</p>
14
+			<p class="pull-right">
15
+				Merci de patienter…
16
+				<span class="small">(Cette page se rafraîchit automatiquement toutes les minutes)</span>
17
+			</p>
18
+		</div>
19
+	</div>
20
+</div>

+ 104
- 0
app/views/site/result.html.erb View File

@@ -0,0 +1,104 @@
1
+<div class="container">
2
+	<div class="row">
3
+		<div class="col-sm-11">
4
+			<h1>
5
+				Résultats pour <%= @host %> <span class="small">(<%= l @result.date %>)</span>
6
+				<%= rank_label @result.score.rank %>
7
+			</h1>
8
+		</div>
9
+		<% if Time.now - @result.date >= Rails.configuration.refresh_delay %>
10
+		<div class="col-sm-1">
11
+			<%= link_to 'Rafraîchir', refresh_path, class: %i(btn btn-default) %>
12
+		</div>
13
+		<% end %>
14
+	</div>
15
+	<br/>
16
+	<div class="row">
17
+		<div class="col-sm-6">
18
+			<% scores = @result.score.details %>
19
+			<table class="table table-bordered table-condensed table-striped">
20
+				<thead>
21
+					<tr>
22
+						<th colspan="2">
23
+							Scores
24
+							<%= rank_label @result.score.rank %>
25
+						</th>
26
+					</tr>
27
+				</thead>
28
+				<tbody>
29
+					<%
30
+					   { 'Protocole' => 'protocol',
31
+						 'Échange de clef' => 'key_exchange',
32
+						 'Chiffrement' => 'cipher_strengths',
33
+						 'Total' => 'score'}.each do |name, v| %>
34
+					<tr>
35
+						<th class="col-sm-4"><%= name %></th>
36
+						<td class="col-sm-8"><%= score_progress scores[v] %></td>
37
+					</tr>
38
+					<% end %>
39
+				</tbody>
40
+			</table>
41
+		</div>
42
+		<div class="col-sm-6">
43
+			<table class="table table-bordered table-condensed table-striped">
44
+				<tbody>
45
+					<tr>
46
+						<th class="col-sm-4">Protocoles</th>
47
+						<td class="col-sm-8"><%= protocol_labels @result.protocols %></td>
48
+					</tr>
49
+					<tr>
50
+						<th>Clefs</th>
51
+						<td>
52
+							<p>Certificat : <%= key_label @result[:key] %></p>
53
+							<p>Diffie Hellman : <%= key_labels @result.dh %></p>
54
+						</td>
55
+					</tr>
56
+					<% { 'Bonnes pratiques' => ['success', 'success'],
57
+					 'Alertes' => ['warning', 'warning'],
58
+					 'Erreurs' => ['error', 'danger'] }.each do |name, v| %>
59
+					<tr>
60
+						<th><%= name %></th>
61
+						<td>
62
+							<% item, color = v
63
+							(@result.score[item] || []).each do |item| %>
64
+							<span class="label label-<%= color %>"><%= item.upcase %></span>
65
+							<% end %>
66
+						</td>
67
+					</tr>
68
+				<% end %>
69
+				</tbody>
70
+			</table>
71
+		</div>
72
+	</div>
73
+	<div class="row">
74
+		<div class="col-sm-12">
75
+			<table class="table table-bordered table-condensed table-striped">
76
+				<thead>
77
+					<tr>
78
+						<th class="col-sm-3">Algorithme</th>
79
+						<th class="col-sm-1">Clef</th>
80
+						<th class="col-sm-1">DH</th>
81
+						<th></th>
82
+					</tr>
83
+				</thead>
84
+				<tbody>
85
+					<% %w(TLSv1_2 TLSv1_1 TLSv1 SSLv3 SSLv2).each do |protocol|
86
+						ciphers = @result.ciphers.select { |c| c.protocol == protocol }
87
+								.sort { |a, b| -1 * (a['size'] <=> b['size']) }
88
+						unless ciphers.empty? %>
89
+					<tr>
90
+						<th colspan="3"><%= protocol_label protocol %></th>
91
+					</tr>
92
+							<% ciphers.each do |cipher| %>
93
+					<tr>
94
+						<td><%= cipher.name %></td>
95
+						<td><%= cipher_label cipher %></td>
96
+						<td><%= key_label cipher.dh if cipher.dh %></td>
97
+						<td><%= cipher_labels cipher %></td>
98
+					</tr>
99
+					<% 	end end end %>
100
+				</tbody>
101
+			</table>
102
+		</div>
103
+	</div>
104
+</div>

+ 42
- 0
app/workers/https_worker.rb View File

@@ -0,0 +1,42 @@
1
+require 'simpleidn'
2
+require 'cryptcheck'
3
+
4
+class HTTPSWorker
5
+	include Sidekiq::Worker
6
+	sidekiq_options retry: false
7
+
8
+	def key_to_json(key)
9
+		key.nil? ? nil : { type: key.type, size: key.size, rsa_size: key.rsa_equivalent_size }
10
+	end
11
+
12
+	def perform(host)
13
+		idn    = SimpleIDN.to_ascii host
14
+		result = begin
15
+			server = CryptCheck::Tls::Https::Server.new idn
16
+			grade  = CryptCheck::Tls::Https::Grade.new server
17
+
18
+			{
19
+					key:       key_to_json(server.key),
20
+					dh:        server.dh.collect { |k| key_to_json k },
21
+					protocols: server.supported_protocols,
22
+					ciphers:   server.supported_ciphers.collect { |c| { protocol: c.protocol, name: c.name, size: c.size, dh: key_to_json(c.dh) } },
23
+					hsts:      server.hsts,
24
+					score:     {
25
+							rank:    grade.grade,
26
+							details: {
27
+									score:            grade.score,
28
+									protocol:         grade.protocol_score,
29
+									key_exchange:     grade.key_exchange_score,
30
+									cipher_strengths: grade.cipher_strengths_score
31
+							},
32
+							error:   grade.error,
33
+							warning: grade.warning,
34
+							success: grade.success
35
+					}
36
+			}
37
+		rescue CryptCheck::Tls::Server::TLSNotAvailableException
38
+			{ no_tls: true }
39
+		end
40
+		Datastore.post :https, host, result
41
+	end
42
+end

+ 3
- 0
bin/bundle View File

@@ -0,0 +1,3 @@
1
+#!/usr/bin/env ruby
2
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
+load Gem.bin_path('bundler', 'bundle')

+ 9
- 0
bin/enqueue View File

@@ -0,0 +1,9 @@
1
+#!/usr/bin/env ruby
2
+require 'sidekiq'
3
+options      = {
4
+		url:       ENV['REDIS_URL'],
5
+		namespace: :cryptcheck
6
+}
7
+client       = Sidekiq::Client.new Sidekiq::RedisConnection.create options
8
+clazz, *args = ARGV
9
+client.push({ 'class' => clazz, 'args' => args })

+ 8
- 0
bin/rails View File

@@ -0,0 +1,8 @@
1
+#!/usr/bin/env ruby
2
+begin
3
+  load File.expand_path("../spring", __FILE__)
4
+rescue LoadError
5
+end
6
+APP_PATH = File.expand_path('../../config/application', __FILE__)
7
+require_relative '../config/boot'
8
+require 'rails/commands'

+ 8
- 0
bin/rake View File

@@ -0,0 +1,8 @@
1
+#!/usr/bin/env ruby
2
+begin
3
+  load File.expand_path("../spring", __FILE__)
4
+rescue LoadError
5
+end
6
+require_relative '../config/boot'
7
+require 'rake'
8
+Rake.application.run

+ 29
- 0
bin/setup View File

@@ -0,0 +1,29 @@
1
+#!/usr/bin/env ruby
2
+require 'pathname'
3
+
4
+# path to your application root.
5
+APP_ROOT = Pathname.new File.expand_path('../../',  __FILE__)
6
+
7
+Dir.chdir APP_ROOT do
8
+  # This script is a starting point to setup your application.
9
+  # Add necessary setup steps to this file:
10
+
11
+  puts "== Installing dependencies =="
12
+  system "gem install bundler --conservative"
13
+  system "bundle check || bundle install"
14
+
15
+  # puts "\n== Copying sample files =="
16
+  # unless File.exist?("config/database.yml")
17
+  #   system "cp config/database.yml.sample config/database.yml"
18
+  # end
19
+
20
+  puts "\n== Preparing database =="
21
+  system "bin/rake db:setup"
22
+
23
+  puts "\n== Removing old logs and tempfiles =="
24
+  system "rm -f log/*"
25
+  system "rm -rf tmp/cache"
26
+
27
+  puts "\n== Restarting application server =="
28
+  system "touch tmp/restart.txt"
29
+end

+ 20
- 0
bin/sidekiq View File

@@ -0,0 +1,20 @@
1
+#!/usr/bin/env ruby
2
+$:.unshift File.expand_path File.join File.dirname(__FILE__), '../../cryptcheck/lib'
3
+require 'rubygems'
4
+require 'bundler/setup'
5
+
6
+$TESTING = false
7
+$CELLULOID_DEBUG = false
8
+
9
+require 'sidekiq/cli'
10
+
11
+begin
12
+	cli = Sidekiq::CLI.instance
13
+	cli.parse
14
+	cli.run
15
+rescue => e
16
+	raise e if $DEBUG
17
+	STDERR.puts e.message
18
+	STDERR.puts e.backtrace.join("\n")
19
+	exit 1
20
+end

+ 4
- 0
config.ru View File

@@ -0,0 +1,4 @@
1
+# This file is used by Rack-based servers to start the application.
2
+
3
+require ::File.expand_path('../config/environment', __FILE__)
4
+run Rails.application

+ 34
- 0
config/application.rb View File

@@ -0,0 +1,34 @@
1
+require File.expand_path('../boot', __FILE__)
2
+
3
+require 'rails/all'
4
+
5
+# Require the gems listed in Gemfile, including any gems
6
+# you've limited to :test, :development, or :production.
7
+groups = Rails.groups
8
+unless Rails.env == 'production'
9
+	groups << :assets
10
+	Rails.env = 'production' if Rails.env == 'staging'
11
+end
12
+Bundler.require(*groups)
13
+
14
+module CryptcheckRails
15
+	class Application < Rails::Application
16
+		# Settings in config/environments/* take precedence over those specified here.
17
+		# Application configuration should go into files in config/initializers
18
+		# -- all .rb files in that directory are automatically loaded.
19
+		config.autoload_paths += %W(#{config.root}/lib)
20
+
21
+		# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
22
+		# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
23
+		# config.time_zone = 'Central Time (US & Canada)'
24
+
25
+		# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
26
+		# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
27
+		config.i18n.default_locale = :fr
28
+
29
+		# Do not swallow errors in after_commit/after_rollback callbacks.
30
+		config.active_record.raise_in_transactional_callbacks = true
31
+
32
+		config.refresh_delay = 1.hour
33
+	end
34
+end

+ 3
- 0
config/boot.rb View File

@@ -0,0 +1,3 @@
1
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
2
+
3
+require 'bundler/setup' # Set up gems listed in the Gemfile.

+ 25
- 0
config/database.yml View File

@@ -0,0 +1,25 @@
1
+# SQLite version 3.x
2
+#   gem install sqlite3
3
+#
4
+#   Ensure the SQLite 3 gem is defined in your Gemfile
5
+#   gem 'sqlite3'
6
+#
7
+default: &default
8
+  adapter: sqlite3
9
+  pool: 5
10
+  timeout: 5000
11
+
12
+development:
13
+  <<: *default
14
+  database: db/development.sqlite3
15
+
16
+# Warning: The database defined as "test" will be erased and
17
+# re-generated from your development database when you run "rake".
18
+# Do not set this db to the same as development or production.
19
+test:
20
+  <<: *default
21
+  database: db/test.sqlite3
22
+
23
+production:
24
+  <<: *default
25
+  database: db/production.sqlite3

+ 5
- 0
config/environment.rb View File

@@ -0,0 +1,5 @@
1
+# Load the Rails application.
2
+require File.expand_path('../application', __FILE__)
3
+
4
+# Initialize the Rails application.
5
+Rails.application.initialize!

+ 43
- 0
config/environments/development.rb View File

@@ -0,0 +1,43 @@
1
+Rails.application.configure do
2
+	# Settings specified here will take precedence over those in config/application.rb.
3
+
4
+	# In the development environment your application's code is reloaded on
5
+	# every request. This slows down response time but is perfect for development
6
+	# since you don't have to restart the web server when you make code changes.
7
+	config.cache_classes                       = false
8
+
9
+	# Do not eager load code on boot.
10
+	config.eager_load                          = false
11
+
12
+	# Show full error reports and disable caching.
13
+	config.consider_all_requests_local         = true
14
+	config.action_controller.perform_caching   = false
15
+
16
+	# Don't care if the mailer can't send.
17
+	config.action_mailer.raise_delivery_errors = false
18
+
19
+	# Print deprecation notices to the Rails logger.
20
+	config.active_support.deprecation          = :log
21
+
22
+	# Raise an error on page load if there are pending migrations.
23
+	config.active_record.migration_error       = :page_load
24
+
25
+	# Debug mode disables concatenation and preprocessing of assets.
26
+	# This option may cause significant delays in view rendering with a large
27
+	# number of complex assets.
28
+	config.assets.debug                        = true
29
+
30
+	# Asset digests allow you to set far-future HTTP expiration dates on all assets,
31
+	# yet still be able to expire them through the digest params.
32
+	config.assets.digest                       = true
33
+
34
+	# Adds additional error checking when serving assets at runtime.
35
+	# Checks for improperly declared sprockets dependencies.
36
+	# Raises helpful error messages.
37
+	config.assets.raise_runtime_errors         = true
38
+
39
+	# Raises error for missing translations
40
+	# config.action_view.raise_on_missing_translations = true
41
+
42
+	config.middleware.insert_after ActionDispatch::Static, Rack::LiveReload
43
+end

+ 79
- 0
config/environments/production.rb View File

@@ -0,0 +1,79 @@
1
+Rails.application.configure do
2
+  # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+  # Code is not reloaded between requests.
5
+  config.cache_classes = true
6
+
7
+  # Eager load code on boot. This eager loads most of Rails and
8
+  # your application in memory, allowing both threaded web servers
9
+  # and those relying on copy on write to perform better.
10
+  # Rake tasks automatically ignore this option for performance.
11
+  config.eager_load = true
12
+
13
+  # Full error reports are disabled and caching is turned on.
14
+  config.consider_all_requests_local       = false
15
+  config.action_controller.perform_caching = true
16
+
17
+  # Enable Rack::Cache to put a simple HTTP cache in front of your application
18
+  # Add `rack-cache` to your Gemfile before enabling this.
19
+  # For large-scale production use, consider using a caching reverse proxy like
20
+  # NGINX, varnish or squid.
21
+  # config.action_dispatch.rack_cache = true
22
+
23
+  # Disable serving static files from the `/public` folder by default since
24
+  # Apache or NGINX already handles this.
25
+  config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
26
+
27
+  # Compress JavaScripts and CSS.
28
+  config.assets.js_compressor = :uglifier
29
+  # config.assets.css_compressor = :sass
30
+
31
+  # Do not fallback to assets pipeline if a precompiled asset is missed.
32
+  config.assets.compile = false
33
+
34
+  # Asset digests allow you to set far-future HTTP expiration dates on all assets,
35
+  # yet still be able to expire them through the digest params.
36
+  config.assets.digest = true
37
+
38
+  # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
39
+
40
+  # Specifies the header that your server uses for sending files.
41
+  # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
42
+  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
43
+
44
+  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
45
+  # config.force_ssl = true
46
+
47
+  # Use the lowest log level to ensure availability of diagnostic information
48
+  # when problems arise.
49
+  config.log_level = :debug
50
+
51
+  # Prepend all log lines with the following tags.
52
+  # config.log_tags = [ :subdomain, :uuid ]
53
+
54
+  # Use a different logger for distributed setups.
55
+  # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
56
+
57
+  # Use a different cache store in production.
58
+  # config.cache_store = :mem_cache_store
59
+
60
+  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
61
+  # config.action_controller.asset_host = 'http://assets.example.com'
62
+
63
+  # Ignore bad email addresses and do not raise email delivery errors.
64
+  # Set this to true and configure the email server for immediate delivery to raise delivery errors.
65
+  # config.action_mailer.raise_delivery_errors = false
66
+
67
+  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
68
+  # the I18n.default_locale when a translation cannot be found).
69
+  config.i18n.fallbacks = true
70
+
71
+  # Send deprecation notices to registered listeners.
72
+  config.active_support.deprecation = :notify
73
+
74
+  # Use default logging formatter so that PID and timestamp are not suppressed.
75
+  config.log_formatter = ::Logger::Formatter.new
76
+
77
+  # Do not dump schema after migrations.
78
+  config.active_record.dump_schema_after_migration = false
79
+end

+ 42
- 0
config/environments/test.rb View File

@@ -0,0 +1,42 @@
1
+Rails.application.configure do
2
+  # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+  # The test environment is used exclusively to run your application's
5
+  # test suite. You never need to work with it otherwise. Remember that
6
+  # your test database is "scratch space" for the test suite and is wiped
7
+  # and recreated between test runs. Don't rely on the data there!
8
+  config.cache_classes = true
9
+
10
+  # Do not eager load code on boot. This avoids loading your whole application
11
+  # just for the purpose of running a single test. If you are using a tool that
12
+  # preloads Rails for running tests, you may have to set it to true.
13
+  config.eager_load = false
14
+
15
+  # Configure static file server for tests with Cache-Control for performance.
16
+  config.serve_static_files   = true
17
+  config.static_cache_control = 'public, max-age=3600'
18
+
19
+  # Show full error reports and disable caching.
20
+  config.consider_all_requests_local       = true
21
+  config.action_controller.perform_caching = false
22
+
23
+  # Raise exceptions instead of rendering exception templates.
24
+  config.action_dispatch.show_exceptions = false
25
+
26
+  # Disable request forgery protection in test environment.
27
+  config.action_controller.allow_forgery_protection = false
28
+
29
+  # Tell Action Mailer not to deliver emails to the real world.
30
+  # The :test delivery method accumulates sent emails in the
31
+  # ActionMailer::Base.deliveries array.
32
+  config.action_mailer.delivery_method = :test
33
+
34
+  # Randomize the order test cases are executed.
35
+  config.active_support.test_order = :random
36
+
37
+  # Print deprecation notices to the stderr.
38
+  config.active_support.deprecation = :stderr
39
+
40
+  # Raises error for missing translations
41
+  # config.action_view.raise_on_missing_translations = true
42
+end

+ 11
- 0
config/initializers/assets.rb View File

@@ -0,0 +1,11 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+# Version of your assets, change this if you want to expire all your assets.
4
+Rails.application.config.assets.version = '1.0'
5
+
6
+# Add additional assets to the asset load path
7
+# Rails.application.config.assets.paths << Emoji.images_path
8
+
9
+# Precompile additional assets.
10
+# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
11
+# Rails.application.config.assets.precompile += %w( search.js )

+ 7
- 0
config/initializers/backtrace_silencers.rb View File

@@ -0,0 +1,7 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+# Rails.backtrace_cleaner.remove_silencers!

+ 3
- 0
config/initializers/cookies_serializer.rb View File

@@ -0,0 +1,3 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+Rails.application.config.action_dispatch.cookies_serializer = :json

+ 4
- 0
config/initializers/filter_parameter_logging.rb View File

@@ -0,0 +1,4 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+# Configure sensitive parameters which will be filtered from the log file.
4
+Rails.application.config.filter_parameters += [:password]

+ 16
- 0
config/initializers/inflections.rb View File

@@ -0,0 +1,16 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+# Add new inflection rules using the following format. Inflections
4
+# are locale specific, and you may define rules for as many different
5
+# locales as you wish. All of these examples are active by default:
6
+# ActiveSupport::Inflector.inflections(:en) do |inflect|
7
+#   inflect.plural /^(ox)$/i, '\1en'
8
+#   inflect.singular /^(ox)en/i, '\1'
9
+#   inflect.irregular 'person', 'people'
10
+#   inflect.uncountable %w( fish sheep )
11
+# end
12
+
13
+# These inflection rules are supported but not enabled by default:
14
+# ActiveSupport::Inflector.inflections(:en) do |inflect|
15
+#   inflect.acronym 'RESTful'
16
+# end

+ 4
- 0
config/initializers/mime_types.rb View File

@@ -0,0 +1,4 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+# Add new mime types for use in respond_to blocks:
4
+# Mime::Type.register "text/richtext", :rtf

+ 3
- 0
config/initializers/session_store.rb View File

@@ -0,0 +1,3 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+Rails.application.config.session_store :cookie_store, key: '_cryptcheck-rails_session'

+ 7
- 0
config/initializers/sidekiq.rb View File

@@ -0,0 +1,7 @@
1
+Sidekiq.configure_server do |config|
2
+	config.redis = { namespace: :cryptcheck }
3
+end
4
+
5
+Sidekiq.configure_client do |config|
6
+	config.redis = { namespace: :cryptcheck }
7
+end

+ 25
- 0
config/initializers/sprocket_helpers.rb View File

@@ -0,0 +1,25 @@
1
+Rails.application.assets.context_class.class_eval do
2
+	def path(name, params=[], **options)
3
+		helper = "#{name}_path"
4
+		names = []
5
+		replace = []
6
+		params.each_with_index do |n, p|
7
+			arg = "__p#{p}__"
8
+			names << arg
9
+			replace << [arg, "\#{#{n}}"]
10
+		end
11
+		query_params = options.delete :params
12
+		unless query_params.nil?
13
+			query_params.each_with_index do |n, p|
14
+				arg = "__q#{p}__"
15
+				names << arg
16
+				replace << [arg, "\#{#{n}}"]
17
+				options[n] = arg
18
+			end
19
+		end
20
+
21
+		path = Rails.application.routes.url_helpers.send helper, *names, **options
22
+		replace.each { |p, n| path.sub! p, n }
23
+		"#{config.relative_url_root}#{path}"
24
+	end
25
+end

+ 14
- 0
config/initializers/wrap_parameters.rb View File

@@ -0,0 +1,14 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+# This file contains settings for ActionController::ParamsWrapper which
4
+# is enabled by default.
5
+
6
+# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7
+ActiveSupport.on_load(:action_controller) do
8
+  wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
9
+end
10
+
11
+# To enable root element in JSON for ActiveRecord objects.
12
+# ActiveSupport.on_load(:active_record) do
13
+#  self.include_root_in_json = true
14
+# end

+ 1
- 0
config/locales/en.yml View File

@@ -0,0 +1 @@
1
+en:

+ 205
- 0
config/locales/fr.yml View File

@@ -0,0 +1,205 @@
1
+fr:
2
+  date:
3
+    abbr_day_names:
4
+    - dim
5
+    - lun
6
+    - mar
7
+    - mer
8
+    - jeu
9
+    - ven
10
+    - sam
11
+    abbr_month_names:
12
+    -
13
+    - jan.
14
+    - fév.
15
+    - mar.
16
+    - avr.
17
+    - mai
18
+    - juin
19
+    - juil.
20
+    - août
21
+    - sept.
22
+    - oct.
23
+    - nov.
24
+    - déc.
25
+    day_names:
26
+    - dimanche
27
+    - lundi
28
+    - mardi
29
+    - mercredi
30
+    - jeudi
31
+    - vendredi
32
+    - samedi
33
+    formats:
34
+      default: "%d/%m/%Y"
35
+      short: "%e %b"
36
+      long: "%e %B %Y"
37
+    month_names:
38
+    -
39
+    - janvier
40
+    - février
41
+    - mars
42
+    - avril
43
+    - mai
44
+    - juin
45
+    - juillet
46
+    - août
47
+    - septembre
48
+    - octobre
49
+    - novembre
50
+    - décembre
51
+    order:
52
+    - :day
53
+    - :month
54
+    - :year
55
+  datetime:
56
+    distance_in_words:
57
+      about_x_hours:
58
+        one: environ une heure
59
+        other: environ %{count} heures
60
+      about_x_months:
61
+        one: environ un mois
62
+        other: environ %{count} mois
63
+      about_x_years:
64
+        one: environ un an
65
+        other: environ %{count} ans
66
+      almost_x_years:
67
+        one: presqu'un an
68
+        other: presque %{count} ans
69
+      half_a_minute: une demi-minute
70
+      less_than_x_minutes:
71
+        zero: moins d'une minute
72
+        one: moins d'une minute
73
+        other: moins de %{count} minutes
74
+      less_than_x_seconds:
75
+        zero: moins d'une seconde
76
+        one: moins d'une seconde
77
+        other: moins de %{count} secondes
78
+      over_x_years:
79
+        one: plus d'un an
80
+        other: plus de %{count} ans
81
+      x_days:
82
+        one: 1 jour
83
+        other: "%{count} jours"
84
+      x_minutes:
85
+        one: 1 minute
86
+        other: "%{count} minutes"
87
+      x_months:
88
+        one: 1 mois
89
+        other: "%{count} mois"
90
+      x_seconds:
91
+        one: 1 seconde
92
+        other: "%{count} secondes"
93
+    prompts:
94
+      day: Jour
95
+      hour: Heure
96
+      minute: Minute
97
+      month: Mois
98
+      second: Seconde
99
+      year: Année
100
+  errors:
101
+    format: "%{attribute} %{message}"
102
+    messages:
103
+      accepted: doit être accepté(e)
104
+      blank: doit être rempli(e)
105
+      present: doit être vide
106
+      confirmation: ne concorde pas avec %{attribute}
107
+      empty: doit être rempli(e)
108
+      equal_to: doit être égal à %{count}
109
+      even: doit être pair
110
+      exclusion: n'est pas disponible
111
+      greater_than: doit être supérieur à %{count}
112
+      greater_than_or_equal_to: doit être supérieur ou égal à %{count}
113
+      inclusion: n'est pas inclus(e) dans la liste
114
+      invalid: n'est pas valide
115
+      less_than: doit être inférieur à %{count}
116
+      less_than_or_equal_to: doit être inférieur ou égal à %{count}
117
+      not_a_number: n'est pas un nombre
118
+      not_an_integer: doit être un nombre entier
119
+      odd: doit être impair
120
+      record_invalid: 'La validation a échoué : %{errors}'
121
+      restrict_dependent_destroy:
122
+        one: 'Suppression impossible: un autre enregistrement est lié'
123
+        many: 'Suppression impossible: d''autres enregistrements sont liés'
124
+      taken: n'est pas disponible
125
+      too_long:
126
+        one: est trop long (pas plus d'un caractère)
127
+        other: est trop long (pas plus de %{count} caractères)
128
+      too_short:
129
+        one: est trop court (au moins un caractère)
130
+        other: est trop court (au moins %{count} caractères)
131
+      wrong_length:
132
+        one: ne fait pas la bonne longueur (doit comporter un seul caractère)
133
+        other: ne fait pas la bonne longueur (doit comporter %{count} caractères)
134
+      other_than: doit être différent de %{count}
135
+    template:
136
+      body: 'Veuillez vérifier les champs suivants : '
137
+      header:
138
+        one: 'Impossible d''enregistrer ce(tte) %{model} : 1 erreur'
139
+        other: 'Impossible d''enregistrer ce(tte) %{model} : %{count} erreurs'
140
+  helpers:
141
+    select:
142
+      prompt: Veuillez sélectionner
143
+    submit:
144
+      create: Créer un(e) %{model}
145
+      submit: Enregistrer ce(tte) %{model}
146
+      update: Modifier ce(tte) %{model}
147
+  number:
148
+    currency:
149
+      format:
150
+        delimiter: " "
151
+        format: "%n %u"
152
+        precision: 2
153
+        separator: ","
154
+        significant: false
155
+        strip_insignificant_zeros: false
156
+        unit: "€"
157
+    format:
158
+      delimiter: " "
159
+      precision: 3
160
+      separator: ","
161
+      significant: false
162
+      strip_insignificant_zeros: false
163
+    human:
164
+      decimal_units:
165
+        format: "%n %u"
166
+        units:
167
+          billion: milliard
168
+          million: million
169
+          quadrillion: million de milliards
170
+          thousand: millier
171
+          trillion: billion
172
+          unit: ''
173
+      format:
174
+        delimiter: ''
175
+        precision: 2
176
+        significant: true
177
+        strip_insignificant_zeros: true
178
+      storage_units:
179
+        format: "%n %u"
180
+        units:
181
+          byte:
182
+            one: octet
183
+            other: octets
184
+          gb: Go
185
+          kb: ko
186
+          mb: Mo
187
+          tb: To
188
+    percentage:
189
+      format:
190
+        delimiter: ''
191
+        format: "%n%"
192
+    precision:
193
+      format:
194
+        delimiter: ''
195
+  support:
196
+    array:
197
+      last_word_connector: " et "
198
+      two_words_connector: " et "
199
+      words_connector: ", "
200
+  time:
201
+    am: am
202
+    formats:
203
+      default: "%d/%m/%Y %H:%M:%S"
204
+      short: "%d %b %Hh%M"
205
+    pm: pm

+ 5
- 0
config/routes.rb View File

@@ -0,0 +1,5 @@
1
+Rails.application.routes.draw do
2
+	root 'site#index'
3
+	get '/:id/refresh' => 'site#refresh', as: :refresh, id: /.*/
4
+	get '/:id' => 'site#result', as: :result, id: /.*/
5
+end

+ 22
- 0
config/secrets.yml View File

@@ -0,0 +1,22 @@
1
+# Be sure to restart your server when you modify this file.
2
+
3
+# Your secret key is used for verifying the integrity of signed cookies.
4
+# If you change this key, all old signed cookies will become invalid!
5
+
6
+# Make sure the secret is at least 30 characters and all random,
7
+# no regular words or you'll be exposed to dictionary attacks.
8
+# You can use `rake secret` to generate a secure secret key.
9
+
10
+# Make sure the secrets in this file are kept private
11
+# if you're sharing your code publicly.
12
+
13
+development:
14
+  secret_key_base: 8869d950d3865a4ceefee463676930da376c957af33892815885c03080183db3ec6be3318d961246abd29d8a151f196cd77084c1475957d54a63452777fd6986
15
+
16
+test:
17
+  secret_key_base: bc2a16c8ddae19eddc2a8844077626f7c588ed091f777d9fbd9b5a6996406b42f65f82742edcc0fc44ca3f492c6d43386a52c4653684e491cc8ae2917caa172d
18
+
19
+# Do not keep production secrets in the repository,
20
+# instead read values from the environment.
21
+production:
22
+  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

+ 1
- 0
config/sidekiq.yml View File

@@ -0,0 +1 @@
1
+

+ 7
- 0
db/seeds.rb View File

@@ -0,0 +1,7 @@
1
+# This file should contain all the record creation needed to seed the database with its default values.
2
+# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3
+#
4
+# Examples:
5
+#
6
+#   cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
7
+#   Mayor.create(name: 'Emanuel', city: cities.first)

+ 0
- 0
lib/assets/.keep View File


+ 20
- 0
lib/datastore.rb View File

@@ -0,0 +1,20 @@
1
+class Datastore
2
+	@@index = Stretcher::Server.new(ENV['ES_URL']).index :cryptcheck
3
+	@@index.create unless @@index.exists?
4
+
5
+	def self.host(type, name)
6
+		result = @@index.type(type).get name
7
+		result.date = Time.parse result.date
8
+		result
9
+	rescue Stretcher::RequestError::NotFound
10
+	end
11
+
12
+	def self.pending(type, name)
13
+		self.post type, name, { pending: true }
14
+	end
15
+
16
+	def self.post(type, name, data)
17
+		data[:date] = DateTime.now
18
+		@@index.type(type).put name, data
19
+	end
20
+end

+ 0
- 0
lib/tasks/.keep View File


+ 0
- 0
log/.keep View File


+ 67
- 0
public/404.html View File

@@ -0,0 +1,67 @@
1
+<!DOCTYPE html>
2
+<html>
3
+<head>
4
+  <title>The page you were looking for doesn't exist (404)</title>
5
+  <meta name="viewport" content="width=device-width,initial-scale=1">
6
+  <style>
7
+  body {
8
+    background-color: #EFEFEF;
9
+    color: #2E2F30;
10
+    text-align: center;
11
+    font-family: arial, sans-serif;
12
+    margin: 0;
13
+  }
14
+
15
+  div.dialog {
16
+    width: 95%;
17
+    max-width: 33em;
18
+    margin: 4em auto 0;
19
+  }
20
+
21
+  div.dialog > div {
22
+    border: 1px solid #CCC;
23
+    border-right-color: #999;
24
+    border-left-color: #999;
25
+    border-bottom-color: #BBB;
26
+    border-top: #B00100 solid 4px;
27
+    border-top-left-radius: 9px;
28
+    border-top-right-radius: 9px;
29
+    background-color: white;
30
+    padding: 7px 12% 0;
31
+    box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+  }
33
+
34
+  h1 {
35
+    font-size: 100%;
36
+    color: #730E15;
37
+    line-height: 1.5em;
38
+  }
39
+
40
+  div.dialog > p {
41
+    margin: 0 0 1em;
42
+    padding: 1em;
43
+    background-color: #F7F7F7;
44
+    border: 1px solid #CCC;
45
+    border-right-color: #999;
46
+    border-left-color: #999;
47
+    border-bottom-color: #999;
48
+    border-bottom-left-radius: 4px;
49
+    border-bottom-right-radius: 4px;
50
+    border-top-color: #DADADA;
51
+    color: #666;
52
+    box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+  }
54
+  </style>
55
+</head>
56
+
57
+<body>
58
+  <!-- This file lives in public/404.html -->
59
+  <div class="dialog">
60
+    <div>
61
+      <h1>The page you were looking for doesn't exist.</h1>
62
+      <p>You may have mistyped the address or the page may have moved.</p>
63
+    </div>
64
+    <p>If you are the application owner check the logs for more information.</p>
65
+  </div>
66
+</body>
67
+</html>

+ 67
- 0
public/422.html View File

@@ -0,0 +1,67 @@
1
+<!DOCTYPE html>
2
+<html>
3
+<head>
4
+  <title>The change you wanted was rejected (422)</title>
5
+  <meta name="viewport" content="width=device-width,initial-scale=1">
6
+  <style>
7
+  body {
8
+    background-color: #EFEFEF;
9
+    color: #2E2F30;
10
+    text-align: center;
11
+    font-family: arial, sans-serif;
12
+    margin: 0;
13
+  }
14
+
15
+  div.dialog {
16
+    width: 95%;
17
+    max-width: 33em;
18
+    margin: 4em auto 0;
19
+  }
20
+
21
+  div.dialog > div {
22
+    border: 1px solid #CCC;
23
+    border-right-color: #999;
24
+    border-left-color: #999;
25
+    border-bottom-color: #BBB;
26
+    border-top: #B00100 solid 4px;
27
+    border-top-left-radius: 9px;
28
+    border-top-right-radius: 9px;
29
+    background-color: white;
30
+    padding: 7px 12% 0;
31
+    box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+  }
33
+
34
+  h1 {
35
+    font-size: 100%;
36
+    color: #730E15;
37
+    line-height: 1.5em;
38
+  }
39
+
40
+  div.dialog > p {
41
+    margin: 0 0 1em;
42
+    padding: 1em;
43
+    background-color: #F7F7F7;
44
+    border: 1px solid #CCC;
45
+    border-right-color: #999;
46
+    border-left-color: #999;
47
+    border-bottom-color: #999;
48
+    border-bottom-left-radius: 4px;
49
+    border-bottom-right-radius: 4px;
50
+    border-top-color: #DADADA;
51
+    color: #666;
52
+    box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+  }
54
+  </style>
55
+</head>
56
+
57
+<body>
58
+  <!-- This file lives in public/422.html -->
59
+  <div class="dialog">
60
+    <div>
61
+      <h1>The change you wanted was rejected.</h1>
62
+      <p>Maybe you tried to change something you didn't have access to.</p>
63
+    </div>
64
+    <p>If you are the application owner check the logs for more information.</p>
65
+  </div>
66
+</body>
67
+</html>

+ 66
- 0
public/500.html View File

@@ -0,0 +1,66 @@
1
+<!DOCTYPE html>
2
+<html>
3
+<head>
4
+  <title>We're sorry, but something went wrong (500)</title>
5
+  <meta name="viewport" content="width=device-width,initial-scale=1">
6
+  <style>
7
+  body {
8
+    background-color: #EFEFEF;
9
+    color: #2E2F30;
10
+    text-align: center;
11
+    font-family: arial, sans-serif;
12
+    margin: 0;
13
+  }
14
+
15
+  div.dialog {
16
+    width: 95%;
17
+    max-width: 33em;
18
+    margin: 4em auto 0;
19
+  }
20
+
21
+  div.dialog > div {
22
+    border: 1px solid #CCC;
23
+    border-right-color: #999;
24
+    border-left-color: #999;
25
+    border-bottom-color: #BBB;
26
+    border-top: #B00100 solid 4px;
27
+    border-top-left-radius: 9px;
28
+    border-top-right-radius: 9px;
29
+    background-color: white;
30
+    padding: 7px 12% 0;
31
+    box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+  }
33
+
34
+  h1 {
35
+    font-size: 100%;
36
+    color: #730E15;
37
+    line-height: 1.5em;
38
+  }
39
+
40
+  div.dialog > p {
41
+    margin: 0 0 1em;
42
+    padding: 1em;
43
+    background-color: #F7F7F7;
44
+    border: 1px solid #CCC;
45
+    border-right-color: #999;
46
+    border-left-color: #999;
47
+    border-bottom-color: #999;
48
+    border-bottom-left-radius: 4px;
49
+    border-bottom-right-radius: 4px;
50
+    border-top-color: #DADADA;
51
+    color: #666;
52
+    box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+  }
54
+  </style>
55
+</head>
56
+
57
+<body>
58
+  <!-- This file lives in public/500.html -->
59
+  <div class="dialog">
60
+    <div>
61
+      <h1>We're sorry, but something went wrong.</h1>
62
+    </div>
63
+    <p>If you are the application owner check the logs for more information.</p>
64
+  </div>
65
+</body>
66
+</html>

+ 0
- 0
public/favicon.ico View File


+ 5
- 0
public/robots.txt View File

@@ -0,0 +1,5 @@
1
+# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
2
+#
3
+# To ban all spiders from the entire site uncomment the next two lines:
4
+# User-agent: *
5
+# Disallow: /

+ 0
- 0
test/controllers/.keep View File


+ 9
- 0
test/controllers/site_controller_test.rb View File

@@ -0,0 +1,9 @@
1
+require 'test_helper'
2
+
3
+class SiteControllerTest < ActionController::TestCase
4
+  test "should get index" do
5
+    get :index
6
+    assert_response :success
7
+  end
8
+
9
+end

+ 0
- 0
test/fixtures/.keep View File


+ 0
- 0
test/helpers/.keep View File


+ 0
- 0
test/integration/.keep View File


+ 0
- 0
test/mailers/.keep View File


+ 0
- 0
test/models/.keep View File


+ 10
- 0
test/test_helper.rb View File

@@ -0,0 +1,10 @@
1
+ENV['RAILS_ENV'] ||= 'test'
2
+require File.expand_path('../../config/environment', __FILE__)
3
+require 'rails/test_help'
4
+
5
+class ActiveSupport::TestCase
6
+  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
7
+  fixtures :all
8
+
9
+  # Add more helper methods to be used by all tests here...
10
+end

+ 0
- 0
vendor/assets/javascripts/.keep View File


+ 0
- 0
vendor/assets/stylesheets/.keep View File


Loading…
Cancel
Save