sinatra 1.4.8 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +111 -47
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +41 -49
- data/LICENSE +4 -1
- data/MAINTENANCE.md +42 -0
- data/README.de.md +644 -436
- data/README.es.md +6 -6
- data/README.fr.md +9 -9
- data/README.hu.md +37 -3
- data/README.ja.md +103 -45
- data/README.ko.md +8 -8
- data/README.md +471 -363
- data/README.pt-br.md +3 -3
- data/README.pt-pt.md +2 -2
- data/README.ru.md +42 -64
- data/README.zh.md +8 -8
- data/Rakefile +72 -49
- data/SECURITY.md +35 -0
- data/lib/sinatra/base.rb +137 -195
- data/lib/sinatra/indifferent_hash.rb +150 -0
- data/lib/sinatra/main.rb +1 -0
- data/lib/sinatra/show_exceptions.rb +63 -55
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +19 -7
- metadata +30 -164
- data/lib/sinatra/ext.rb +0 -17
- data/test/asciidoctor_test.rb +0 -72
- data/test/base_test.rb +0 -167
- data/test/builder_test.rb +0 -91
- data/test/coffee_test.rb +0 -96
- data/test/compile_test.rb +0 -183
- data/test/contest.rb +0 -91
- data/test/creole_test.rb +0 -65
- data/test/delegator_test.rb +0 -160
- data/test/encoding_test.rb +0 -20
- data/test/erb_test.rb +0 -116
- data/test/extensions_test.rb +0 -98
- data/test/filter_test.rb +0 -487
- data/test/haml_test.rb +0 -109
- data/test/helper.rb +0 -132
- data/test/helpers_test.rb +0 -1917
- data/test/integration/app.rb +0 -79
- data/test/integration_helper.rb +0 -236
- data/test/integration_test.rb +0 -104
- data/test/less_test.rb +0 -69
- data/test/liquid_test.rb +0 -77
- data/test/mapped_error_test.rb +0 -285
- data/test/markaby_test.rb +0 -80
- data/test/markdown_test.rb +0 -85
- data/test/mediawiki_test.rb +0 -68
- data/test/middleware_test.rb +0 -68
- data/test/nokogiri_test.rb +0 -67
- data/test/public/favicon.ico +0 -0
- data/test/public/hello+world.txt +0 -1
- data/test/rabl_test.rb +0 -89
- data/test/rack_test.rb +0 -45
- data/test/radius_test.rb +0 -59
- data/test/rdoc_test.rb +0 -66
- data/test/readme_test.rb +0 -130
- data/test/request_test.rb +0 -100
- data/test/response_test.rb +0 -63
- data/test/result_test.rb +0 -76
- data/test/route_added_hook_test.rb +0 -59
- data/test/routing_test.rb +0 -1456
- data/test/sass_test.rb +0 -115
- data/test/scss_test.rb +0 -88
- data/test/server_test.rb +0 -56
- data/test/settings_test.rb +0 -582
- data/test/sinatra_test.rb +0 -12
- data/test/slim_test.rb +0 -102
- data/test/static_test.rb +0 -266
- data/test/streaming_test.rb +0 -149
- data/test/stylus_test.rb +0 -90
- data/test/templates_test.rb +0 -382
- data/test/textile_test.rb +0 -65
- data/test/views/a/in_a.str +0 -1
- data/test/views/ascii.erb +0 -2
- data/test/views/b/in_b.str +0 -1
- data/test/views/calc.html.erb +0 -1
- data/test/views/error.builder +0 -3
- data/test/views/error.erb +0 -3
- data/test/views/error.haml +0 -3
- data/test/views/error.sass +0 -2
- data/test/views/explicitly_nested.str +0 -1
- data/test/views/foo/hello.test +0 -1
- data/test/views/hello.asciidoc +0 -1
- data/test/views/hello.builder +0 -1
- data/test/views/hello.coffee +0 -1
- data/test/views/hello.creole +0 -1
- data/test/views/hello.erb +0 -1
- data/test/views/hello.haml +0 -1
- data/test/views/hello.less +0 -5
- data/test/views/hello.liquid +0 -1
- data/test/views/hello.mab +0 -1
- data/test/views/hello.md +0 -1
- data/test/views/hello.mediawiki +0 -1
- data/test/views/hello.nokogiri +0 -1
- data/test/views/hello.rabl +0 -2
- data/test/views/hello.radius +0 -1
- data/test/views/hello.rdoc +0 -1
- data/test/views/hello.sass +0 -2
- data/test/views/hello.scss +0 -3
- data/test/views/hello.slim +0 -1
- data/test/views/hello.str +0 -1
- data/test/views/hello.styl +0 -2
- data/test/views/hello.test +0 -1
- data/test/views/hello.textile +0 -1
- data/test/views/hello.wlang +0 -1
- data/test/views/hello.yajl +0 -1
- data/test/views/layout2.builder +0 -3
- data/test/views/layout2.erb +0 -2
- data/test/views/layout2.haml +0 -2
- data/test/views/layout2.liquid +0 -2
- data/test/views/layout2.mab +0 -2
- data/test/views/layout2.nokogiri +0 -3
- data/test/views/layout2.rabl +0 -3
- data/test/views/layout2.radius +0 -2
- data/test/views/layout2.slim +0 -3
- data/test/views/layout2.str +0 -2
- data/test/views/layout2.test +0 -1
- data/test/views/layout2.wlang +0 -2
- data/test/views/nested.str +0 -1
- data/test/views/utf8.erb +0 -2
- data/test/wlang_test.rb +0 -87
- data/test/yajl_test.rb +0 -86
data/README.pt-br.md
CHANGED
@@ -180,7 +180,7 @@ end
|
|
180
180
|
Rotas podem casar com expressões regulares:
|
181
181
|
|
182
182
|
```ruby
|
183
|
-
get
|
183
|
+
get /\/ola\/([\w]+)/ do
|
184
184
|
"Olá, #{params['captures'].first}!"
|
185
185
|
end
|
186
186
|
```
|
@@ -362,7 +362,7 @@ end
|
|
362
362
|
Ou, usando algo mais denso à frente:
|
363
363
|
|
364
364
|
```ruby
|
365
|
-
get %r{
|
365
|
+
get %r{(?!/index)} do
|
366
366
|
# ...
|
367
367
|
end
|
368
368
|
```
|
@@ -1417,7 +1417,7 @@ configure do
|
|
1417
1417
|
end
|
1418
1418
|
```
|
1419
1419
|
|
1420
|
-
Rodando somente quando o ambiente (`
|
1420
|
+
Rodando somente quando o ambiente (`APP_ENV` environment variável) é
|
1421
1421
|
setado para `:production`:
|
1422
1422
|
|
1423
1423
|
```ruby
|
data/README.pt-pt.md
CHANGED
@@ -88,7 +88,7 @@ end
|
|
88
88
|
Rotas correspondem-se com expressões regulares:
|
89
89
|
|
90
90
|
```ruby
|
91
|
-
get
|
91
|
+
get /\/ola\/([\w]+)/ do
|
92
92
|
"Olá, #{params['captures'].first}!"
|
93
93
|
end
|
94
94
|
```
|
@@ -477,7 +477,7 @@ configure do
|
|
477
477
|
end
|
478
478
|
```
|
479
479
|
|
480
|
-
Correndo somente quando o ambiente (`
|
480
|
+
Correndo somente quando o ambiente (`APP_ENV` environment variável) é
|
481
481
|
definido para `:production`:
|
482
482
|
|
483
483
|
```ruby
|
data/README.ru.md
CHANGED
@@ -42,6 +42,7 @@
|
|
42
42
|
* [Фильтры](#Фильтры)
|
43
43
|
* [Методы-помощники](#Методы-помощники)
|
44
44
|
* [Использование сессий](#Использование-сессий)
|
45
|
+
* [Выбор вашей собственной "прослойки" сессии](#Выбор-вашей-собственной-прослойки-сессий)
|
45
46
|
* [Прерывание](#Прерывание)
|
46
47
|
* [Передача](#Передача)
|
47
48
|
* [Вызов другого маршрута](#Вызов-другого-маршрута)
|
@@ -82,8 +83,6 @@
|
|
82
83
|
* [Системные требования](#Системные-требования)
|
83
84
|
* [На острие](#На-острие)
|
84
85
|
* [С помощью Bundler](#С-помощью-bundler)
|
85
|
-
* [Вручную](#Вручную)
|
86
|
-
* [Установка глобально](#Установка-глобально)
|
87
86
|
* [Версии](#Версии)
|
88
87
|
* [Дальнейшее чтение](#Дальнейшее-чтение)
|
89
88
|
|
@@ -208,7 +207,7 @@ end
|
|
208
207
|
Регулярные выражения в качестве шаблонов маршрутов:
|
209
208
|
|
210
209
|
```ruby
|
211
|
-
get
|
210
|
+
get /\/hello\/([\w]+)/ do
|
212
211
|
"Hello, #{params['captures'].first}!"
|
213
212
|
end
|
214
213
|
```
|
@@ -377,7 +376,7 @@ end
|
|
377
376
|
Или с использованием негативного просмотра вперед:
|
378
377
|
|
379
378
|
```ruby
|
380
|
-
get %r{
|
379
|
+
get %r{(?!/index)} do
|
381
380
|
# ...
|
382
381
|
end
|
383
382
|
```
|
@@ -1341,25 +1340,6 @@ get '/:value' do
|
|
1341
1340
|
end
|
1342
1341
|
```
|
1343
1342
|
|
1344
|
-
Заметьте, что при использовании `enable :sessions` все данные сохраняются в
|
1345
|
-
куках (cookies). Это может быть не совсем то, что вы хотите (например,
|
1346
|
-
сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
|
1347
|
-
можете использовать альтернативную Rack "прослойку" (middleware), реализующую
|
1348
|
-
механизм сессий. Для этого *не надо* вызывать `enable :sessions`, вместо этого
|
1349
|
-
следует подключить ее так же, как и любую другую "прослойку":
|
1350
|
-
|
1351
|
-
```ruby
|
1352
|
-
use Rack::Session::Pool, :expire_after => 2592000
|
1353
|
-
|
1354
|
-
get '/' do
|
1355
|
-
"value = " << session['value'].inspect
|
1356
|
-
end
|
1357
|
-
|
1358
|
-
get '/:value' do
|
1359
|
-
session['value'] = params['value']
|
1360
|
-
end
|
1361
|
-
```
|
1362
|
-
|
1363
1343
|
Для повышения безопасности данные сессии в куках подписываются секретным
|
1364
1344
|
ключом. Секретный ключ генерируется Sinatra. Тем не менее, так как этот ключ
|
1365
1345
|
будет меняться с каждым запуском приложения, вы, возможно, захотите установить
|
@@ -1384,6 +1364,40 @@ foo.com, добавьте *.* перед доменом:
|
|
1384
1364
|
set :sessions, :domain => '.foo.com'
|
1385
1365
|
```
|
1386
1366
|
|
1367
|
+
#### Выбор вашей собственной "прослойки" сессии
|
1368
|
+
|
1369
|
+
Заметьте, что при использовании `enable :sessions` все данные сохраняются в
|
1370
|
+
куках (cookies). Это может быть не совсем то, что вы хотите (например,
|
1371
|
+
сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
|
1372
|
+
можете использовать альтернативную Rack "прослойку" (middleware), реализующую
|
1373
|
+
механизм сессий. Для этого используете один из способов ниже:
|
1374
|
+
|
1375
|
+
```ruby
|
1376
|
+
enable :sessions
|
1377
|
+
set :session_store, Rack::Session::Pool
|
1378
|
+
```
|
1379
|
+
|
1380
|
+
Или установите параметры сессии с помощью хеша опций:
|
1381
|
+
|
1382
|
+
```ruby
|
1383
|
+
set :sessions, :expire_after => 2592000
|
1384
|
+
set :session_store, Rack::Session::Pool
|
1385
|
+
```
|
1386
|
+
|
1387
|
+
Вы так же можете не вызывать `enable :sessions`, а вместо этого вызывать
|
1388
|
+
необходимую вам прослойку так же, как вы это обычно делаете. Очень важно
|
1389
|
+
обратить внимание на то, что когда вы используете этот метод, основной способ
|
1390
|
+
защиты сессии **не будет включен по умолчанию**. Если вы хотите включить защиту,
|
1391
|
+
вам нужно добавить следующие строчки:
|
1392
|
+
|
1393
|
+
```ruby
|
1394
|
+
use Rack::Session::Pool, :expire_after => 2592000
|
1395
|
+
use Rack::Protection::RemoteToken
|
1396
|
+
use Rack::Protection::SessionHijacking
|
1397
|
+
```
|
1398
|
+
|
1399
|
+
Смотрите секцию "Настройка защиты от атак" для более подробной информации.
|
1400
|
+
|
1387
1401
|
### Прерывание
|
1388
1402
|
|
1389
1403
|
Чтобы незамедлительно прервать обработку запроса внутри фильтра или маршрута,
|
@@ -2022,7 +2036,7 @@ configure do
|
|
2022
2036
|
end
|
2023
2037
|
```
|
2024
2038
|
|
2025
|
-
Будет запущено, когда окружение (
|
2039
|
+
Будет запущено, когда окружение (APP_ENV переменная) `:production`:
|
2026
2040
|
|
2027
2041
|
```ruby
|
2028
2042
|
configure :production do
|
@@ -2121,8 +2135,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2121
2135
|
|
2122
2136
|
<dt>environment</dt>
|
2123
2137
|
<dd>
|
2124
|
-
текущее окружение, по умолчанию, значение <tt>ENV['
|
2125
|
-
<tt>"development"</tt>, если <tt>ENV['
|
2138
|
+
текущее окружение, по умолчанию, значение <tt>ENV['APP_ENV']</tt> или
|
2139
|
+
<tt>"development"</tt>, если <tt>ENV['APP_ENV']</tt> недоступна.
|
2126
2140
|
</dd>
|
2127
2141
|
|
2128
2142
|
<dt>logging</dt>
|
@@ -2249,7 +2263,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2249
2263
|
## Режим, окружение
|
2250
2264
|
|
2251
2265
|
Есть 3 предопределенных режима, окружения: `"development"`, `"production"` и
|
2252
|
-
`"test"`. Режим может быть задан через переменную окружения `
|
2266
|
+
`"test"`. Режим может быть задан через переменную окружения `APP_ENV`.
|
2253
2267
|
Значение по умолчанию — `"development"`. В этом режиме работы все шаблоны
|
2254
2268
|
перезагружаются между запросами. А также задаются специальные обработчики
|
2255
2269
|
`not_found` и `error`, чтобы вы могли увидеть стек вызовов. В окружениях
|
@@ -2412,7 +2426,7 @@ class MyAppTest < Minitest::Test
|
|
2412
2426
|
assert_equal 'Hello Frank!', last_response.body
|
2413
2427
|
end
|
2414
2428
|
|
2415
|
-
def
|
2429
|
+
def test_with_user_agent
|
2416
2430
|
get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
|
2417
2431
|
assert_equal "You're using Songbird!", last_response.body
|
2418
2432
|
end
|
@@ -2897,42 +2911,6 @@ Bundler автоматически скачает и добавит.
|
|
2897
2911
|
bundle exec ruby myapp.rb
|
2898
2912
|
```
|
2899
2913
|
|
2900
|
-
### Вручную
|
2901
|
-
|
2902
|
-
Создайте локальный клон репозитория и запускайте свое приложение с
|
2903
|
-
`sinatra/lib` директорией в `$LOAD_PATH`:
|
2904
|
-
|
2905
|
-
```
|
2906
|
-
cd myapp
|
2907
|
-
git clone git://github.com/sinatra/sinatra.git
|
2908
|
-
ruby -Isinatra/lib myapp.rb
|
2909
|
-
```
|
2910
|
-
|
2911
|
-
Чтобы обновить исходники Sinatra:
|
2912
|
-
|
2913
|
-
```
|
2914
|
-
cd myapp/sinatra
|
2915
|
-
git pull
|
2916
|
-
```
|
2917
|
-
|
2918
|
-
### Установка глобально
|
2919
|
-
|
2920
|
-
Вы можете самостоятельно собрать gem:
|
2921
|
-
|
2922
|
-
```
|
2923
|
-
git clone git://github.com/sinatra/sinatra.git
|
2924
|
-
cd sinatra
|
2925
|
-
rake sinatra.gemspec
|
2926
|
-
rake install
|
2927
|
-
```
|
2928
|
-
|
2929
|
-
Если вы устанавливаете пакеты (gem) от пользователя root, то вашим последним
|
2930
|
-
шагом должна быть команда
|
2931
|
-
|
2932
|
-
```
|
2933
|
-
sudo rake install
|
2934
|
-
```
|
2935
|
-
|
2936
2914
|
## Версии
|
2937
2915
|
|
2938
2916
|
Sinatra использует [Semantic Versioning](http://semver.org/), SemVer и
|
data/README.zh.md
CHANGED
@@ -205,7 +205,7 @@ end
|
|
205
205
|
通过正则表达式匹配路由:
|
206
206
|
|
207
207
|
```ruby
|
208
|
-
get
|
208
|
+
get /\/hello\/([\w]+)/ do
|
209
209
|
"Hello, #{params['captures'].first}!"
|
210
210
|
end
|
211
211
|
```
|
@@ -372,7 +372,7 @@ end
|
|
372
372
|
或者,使用消极向前查找:
|
373
373
|
|
374
374
|
```ruby
|
375
|
-
get %r{
|
375
|
+
get %r{(?!/index)} do
|
376
376
|
# ...
|
377
377
|
end
|
378
378
|
```
|
@@ -1933,7 +1933,7 @@ configure do
|
|
1933
1933
|
end
|
1934
1934
|
```
|
1935
1935
|
|
1936
|
-
只有当环境 (`
|
1936
|
+
只有当环境 (`APP_ENV` 环境变量) 被设定为 `:production` 时才运行:
|
1937
1937
|
|
1938
1938
|
```ruby
|
1939
1939
|
configure :production do
|
@@ -2033,8 +2033,8 @@ set :protection, :session => true
|
|
2033
2033
|
|
2034
2034
|
<dt>environment</dt>
|
2035
2035
|
<dd>
|
2036
|
-
当前环境,默认是 <tt>ENV['
|
2037
|
-
或者 <tt>"development"</tt> (如果 ENV['
|
2036
|
+
当前环境,默认是 <tt>ENV['APP_ENV']</tt>,
|
2037
|
+
或者 <tt>"development"</tt> (如果 ENV['APP_ENV'] 不可用)。
|
2038
2038
|
</dd>
|
2039
2039
|
|
2040
2040
|
<dt>logging</dt>
|
@@ -2145,15 +2145,15 @@ set :protection, :session => true
|
|
2145
2145
|
## 环境
|
2146
2146
|
|
2147
2147
|
Sinatra 中有三种预先定义的环境:"development"、"production" 和 "test"。
|
2148
|
-
环境可以通过 `
|
2148
|
+
环境可以通过 `APP_ENV` 环境变量设置。默认值为 "development"。
|
2149
2149
|
在开发环境下,每次请求都会重新加载所有模板,
|
2150
2150
|
特殊的 `not_found` 和 `error` 错误处理器会在浏览器中显示 stack trace。
|
2151
2151
|
在测试和生产环境下,模板默认会缓存。
|
2152
2152
|
|
2153
|
-
在不同的环境下运行,设置 `
|
2153
|
+
在不同的环境下运行,设置 `APP_ENV` 环境变量:
|
2154
2154
|
|
2155
2155
|
```shell
|
2156
|
-
|
2156
|
+
APP_ENV=production ruby my_app.rb
|
2157
2157
|
```
|
2158
2158
|
|
2159
2159
|
可以使用预定义的三种方法: `development?`、`test?` 和 `production?` 来检查当前环境:
|
data/Rakefile
CHANGED
@@ -3,22 +3,13 @@ require 'rake/testtask'
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'date'
|
5
5
|
|
6
|
-
# CI Reporter is only needed for the CI
|
7
|
-
begin
|
8
|
-
require 'ci/reporter/rake/test_unit'
|
9
|
-
rescue LoadError
|
10
|
-
end
|
11
|
-
|
12
6
|
task :default => :test
|
13
7
|
task :spec => :test
|
14
8
|
|
15
9
|
CLEAN.include "**/*.rbc"
|
16
10
|
|
17
11
|
def source_version
|
18
|
-
@source_version ||=
|
19
|
-
load './lib/sinatra/version.rb'
|
20
|
-
Sinatra::VERSION
|
21
|
-
end
|
12
|
+
@source_version ||= File.read(File.expand_path("../VERSION", __FILE__)).strip
|
22
13
|
end
|
23
14
|
|
24
15
|
def prev_feature
|
@@ -61,7 +52,8 @@ namespace :test do
|
|
61
52
|
desc 'Measures test coverage'
|
62
53
|
task :coverage do
|
63
54
|
rm_f "coverage"
|
64
|
-
|
55
|
+
ENV['COVERAGE'] = '1'
|
56
|
+
Rake::Task['test'].invoke
|
65
57
|
end
|
66
58
|
end
|
67
59
|
|
@@ -95,9 +87,9 @@ end
|
|
95
87
|
|
96
88
|
# Thanks in announcement ===============================================
|
97
89
|
|
98
|
-
team = ["Ryan Tomayko", "Blake Mizerany", "Simon Rozet", "Konstantin Haase"]
|
90
|
+
team = ["Ryan Tomayko", "Blake Mizerany", "Simon Rozet", "Konstantin Haase", "Zachary Scott"]
|
99
91
|
desc "list of contributors"
|
100
|
-
task :thanks, [:
|
92
|
+
task :thanks, ['release:all', :backports] do |t, a|
|
101
93
|
a.with_defaults :release => "#{prev_version}..HEAD",
|
102
94
|
:backports => "#{prev_feature}.0..#{prev_feature}.x"
|
103
95
|
included = `git log --format=format:"%aN\t%s" #{a.release}`.lines.map { |l| l.force_encoding('binary') }
|
@@ -146,54 +138,85 @@ end
|
|
146
138
|
# PACKAGING ============================================================
|
147
139
|
|
148
140
|
if defined?(Gem)
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
141
|
+
GEMS_AND_ROOT_DIRECTORIES = {
|
142
|
+
"sinatra" => ".",
|
143
|
+
"sinatra-contrib" => "./sinatra-contrib",
|
144
|
+
"rack-protection" => "./rack-protection"
|
145
|
+
}
|
146
|
+
|
147
|
+
def package(gem, ext='')
|
148
|
+
"pkg/#{gem}-#{source_version}" + ext
|
153
149
|
end
|
154
150
|
|
155
|
-
|
156
|
-
|
157
|
-
end
|
151
|
+
directory 'pkg/'
|
152
|
+
CLOBBER.include('pkg')
|
158
153
|
|
159
|
-
|
160
|
-
|
154
|
+
GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
|
155
|
+
file package(gem, '.gem') => ["pkg/", "#{directory + '/' + gem}.gemspec"] do |f|
|
156
|
+
sh "cd #{directory} && gem build #{gem}.gemspec"
|
157
|
+
mv directory + "/" + File.basename(f.name), f.name
|
158
|
+
end
|
161
159
|
|
162
|
-
|
163
|
-
|
164
|
-
|
160
|
+
file package(gem, '.tar.gz') => ["pkg/"] do |f|
|
161
|
+
sh <<-SH
|
162
|
+
git archive \
|
163
|
+
--prefix=#{gem}-#{source_version}/ \
|
164
|
+
--format=tar \
|
165
|
+
HEAD -- #{directory} | gzip > #{f.name}
|
166
|
+
SH
|
167
|
+
end
|
165
168
|
end
|
166
169
|
|
167
|
-
|
168
|
-
|
170
|
+
namespace :package do
|
171
|
+
GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
|
172
|
+
desc "Build #{gem} packages"
|
173
|
+
task gem => %w[.gem .tar.gz].map { |e| package(gem, e) }
|
174
|
+
end
|
169
175
|
|
170
|
-
|
171
|
-
|
172
|
-
mv File.basename(f.name), f.name
|
176
|
+
desc "Build all packages"
|
177
|
+
task :all => GEMS_AND_ROOT_DIRECTORIES.keys
|
173
178
|
end
|
174
179
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
180
|
+
namespace :install do
|
181
|
+
GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
|
182
|
+
desc "Build and install #{gem} as local gem"
|
183
|
+
task gem => package(gem, '.gem') do
|
184
|
+
sh "gem install #{package(gem, '.gem')}"
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
desc "Build and install all of the gems as local gems"
|
189
|
+
task :all => GEMS_AND_ROOT_DIRECTORIES.keys
|
182
190
|
end
|
183
191
|
|
184
|
-
|
185
|
-
|
186
|
-
|
192
|
+
namespace :release do
|
193
|
+
GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
|
194
|
+
desc "Release #{gem} as a package"
|
195
|
+
task gem => "package:#{gem}" do
|
196
|
+
sh <<-SH
|
197
|
+
gem install #{package(gem, '.gem')} --local &&
|
198
|
+
gem push #{package(gem, '.gem')}
|
199
|
+
SH
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
desc "Commits the version to github repository"
|
204
|
+
task :commit_version do
|
205
|
+
sh <<-SH
|
206
|
+
sed -i "s/.*VERSION.*/ VERSION = '#{source_version}'/" lib/sinatra/version.rb
|
207
|
+
sed -i "s/.*VERSION.*/ VERSION = '#{source_version}'/" sinatra-contrib/lib/sinatra/contrib/version.rb
|
208
|
+
sed -i "s/.*VERSION.*/ VERSION = '#{source_version}'/" rack-protection/lib/rack/protection/version.rb
|
209
|
+
SH
|
210
|
+
|
211
|
+
sh <<-SH
|
212
|
+
git commit --allow-empty -a -m '#{source_version} release' &&
|
213
|
+
git tag -s v#{source_version} -m '#{source_version} release' &&
|
214
|
+
git push && (git push origin || true) &&
|
215
|
+
git push --tags && (git push origin --tags || true)
|
216
|
+
SH
|
187
217
|
end
|
188
218
|
|
189
|
-
|
190
|
-
|
191
|
-
gem push #{package('.gem')} &&
|
192
|
-
git commit --allow-empty -a -m '#{source_version} release' &&
|
193
|
-
git tag -s v#{source_version} -m '#{source_version} release' &&
|
194
|
-
git tag -s #{source_version} -m '#{source_version} release' &&
|
195
|
-
git push && (git push sinatra || true) &&
|
196
|
-
git push --tags && (git push sinatra --tags || true)
|
197
|
-
SH
|
219
|
+
desc "Release all gems as packages"
|
220
|
+
task :all => [:test, :commit_version] + GEMS_AND_ROOT_DIRECTORIES.keys
|
198
221
|
end
|
199
222
|
end
|
data/SECURITY.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Reporting a security bug
|
2
|
+
|
3
|
+
All security bugs in Sinatra should be reported to the core team through our private mailing list [sinatra-security@googlegroups.com](https://groups.google.com/group/sinatra-security). Your report will be acknowledged within 24 hours, and you’ll receive a more detailed response to your email within 48 hours indicating the next steps in handling your report.
|
4
|
+
|
5
|
+
After the initial reply to your report the security team will endeavor to keep you informed of the progress being made towards a fix and full announcement. These updates will be sent at least every five days, in reality this is more likely to be every 24-48 hours.
|
6
|
+
|
7
|
+
If you have not received a reply to your email within 48 hours, or have not heard from the security team for the past five days there are a few steps you can take:
|
8
|
+
|
9
|
+
* Contact the current security coordinator [Zachary Scott](mailto:zzak@ruby-lang.org) directly
|
10
|
+
|
11
|
+
## Disclosure Policy
|
12
|
+
|
13
|
+
Sinatra has a 5 step disclosure policy, that is upheld to the best of our ability.
|
14
|
+
|
15
|
+
1. Security report received and is assigned a primary handler. This person will coordinate the fix and release process.
|
16
|
+
2. Problem is confirmed and, a list of all affected versions is determined. Code is audited to find any potential similar problems.
|
17
|
+
3. Fixes are prepared for all releases which are still supported. These fixes are not committed to the public repository but rather held locally pending the announcement.
|
18
|
+
4. A suggested embargo date for this vulnerability is chosen and distros@openwall is notified. This notification will include patches for all versions still under support and a contact address for packagers who need advice back-porting patches to older versions.
|
19
|
+
5. On the embargo date, the [mailing list][mailing-list] and [security list][security-list] are sent a copy of the announcement. The changes are pushed to the public repository and new gems released to rubygems.
|
20
|
+
|
21
|
+
Typically the embargo date will be set 72 hours from the time vendor-sec is first notified, however this may vary depending on the severity of the bug or difficulty in applying a fix.
|
22
|
+
|
23
|
+
This process can take some time, especially when coordination is required with maintainers of other projects. Every effort will be made to handle the bug in as timely a manner as possible, however it’s important that we follow the release process above to ensure that the disclosure is handled in a consistent manner.
|
24
|
+
|
25
|
+
## Security Updates
|
26
|
+
|
27
|
+
Security updates will be posted on the [mailing list][mailing-list] and [security list][security-list].
|
28
|
+
|
29
|
+
## Comments on this Policy
|
30
|
+
|
31
|
+
If you have any suggestions to improve this policy, please send an email the core team at [sinatrarb@googlegroups.com](https://groups.google.com/group/sinatrarb).
|
32
|
+
|
33
|
+
|
34
|
+
[mailing-list]: http://groups.google.com/group/sinatrarb/topics
|
35
|
+
[security-list]: http://groups.google.com/group/sinatra-security/topics
|