ibg 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Dockerfile +2 -1
- data/bin/iceberg-sync +5 -3
- data/ibg.gemspec +2 -0
- data/lib/ibg.rb +20 -2
- data/lib/ibg/storage.rb +2 -2
- data/lib/ibg/version.rb +1 -1
- data/lib/ibg/web.rb +116 -5
- data/locales/en.yml +40 -0
- data/locales/ja.yml +40 -0
- data/public/show.js +20 -0
- data/views/_navbar.haml +13 -4
- data/views/container.haml +4 -1
- data/views/index.haml +75 -53
- data/views/shorten.haml +35 -0
- data/views/show.haml +30 -11
- metadata +52 -35
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c7a42ae549580fa53bc5595d620cf05438673e5c
|
4
|
+
data.tar.gz: 2bf79c3f8e52b2ccd3f53ccf09b67a2a40ca6baa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 220bb544b16e09be77167e755ec70ea2c41157fa13982058b52ed92f93e4773849cd2bbd257a22698ac8ffa21f8370da5b9303eda97d337d61e79f0f3771aa05
|
7
|
+
data.tar.gz: 4a91f1bd881076a67a1e21a6c0669d32b399589e5a6c552f92028a38308f8c393d7f27657c79e36d12ea2298e488ec5e0403d226307ab3123381360de9bf0116
|
data/Dockerfile
CHANGED
@@ -9,6 +9,7 @@ RUN gem install sinatra
|
|
9
9
|
RUN gem install haml
|
10
10
|
RUN apt-get install -y make ruby-dev g++
|
11
11
|
RUN gem install aws-sdk thin
|
12
|
+
RUN gem install bundler rake
|
12
13
|
RUN git clone https://github.com/ohac/iceberg.git
|
13
14
|
RUN \
|
14
15
|
mkdir -p /iceberg/public/css && \
|
@@ -24,7 +25,7 @@ RUN \
|
|
24
25
|
curl -sO https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/fonts/glyphicons-halflings-regular.ttf
|
25
26
|
EXPOSE 4567
|
26
27
|
WORKDIR /iceberg
|
27
|
-
CMD rackup -p 4567 -o 0.0.0.0
|
28
|
+
CMD bundle exec rackup -p 4567 -o 0.0.0.0
|
28
29
|
|
29
30
|
# Build:
|
30
31
|
# docker build -t ohac/iceberg .
|
data/bin/iceberg-sync
CHANGED
@@ -16,14 +16,14 @@ class MultiReader
|
|
16
16
|
@readers << reader
|
17
17
|
end
|
18
18
|
|
19
|
-
def read(size = nil)
|
19
|
+
def read(size = nil, outbuf = '')
|
20
20
|
rv = ''
|
21
21
|
loop do
|
22
22
|
reader = @readers[@cur]
|
23
23
|
break unless reader
|
24
|
-
s = reader.read(size) # TODO S3
|
24
|
+
s = reader.read(size, outbuf) # TODO S3
|
25
25
|
if s
|
26
|
-
rv
|
26
|
+
rv << s
|
27
27
|
if size
|
28
28
|
size -= s.size
|
29
29
|
break if size <= 0
|
@@ -32,6 +32,8 @@ class MultiReader
|
|
32
32
|
@cur += 1
|
33
33
|
end
|
34
34
|
end
|
35
|
+
outbuf.clear
|
36
|
+
outbuf << rv
|
35
37
|
rv.size > 0 ? rv : nil
|
36
38
|
end
|
37
39
|
|
data/ibg.gemspec
CHANGED
@@ -21,7 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_dependency 'sinatra'
|
24
|
+
spec.add_dependency 'thin'
|
24
25
|
spec.add_dependency 'haml'
|
25
26
|
spec.add_dependency 'redis'
|
26
27
|
spec.add_dependency 'aws-sdk'
|
28
|
+
spec.add_dependency 'i18n'
|
27
29
|
end
|
data/lib/ibg.rb
CHANGED
@@ -43,6 +43,7 @@ module Iceberg
|
|
43
43
|
IBDB_TRIPCODE_FUND = 'iceberg:tripcode:fund:'
|
44
44
|
IBDB_RECENT_PEERS = 'iceberg:recentpeers'
|
45
45
|
IBDB_PEERS = 'iceberg:peers'
|
46
|
+
IBDB_SHORT_URL = 'iceberg:shorturl:'
|
46
47
|
|
47
48
|
ALGORITHM = 'AES-128-CBC'
|
48
49
|
REDIS = if ENV['DB_PORT_6379_TCP_PORT']
|
@@ -143,13 +144,15 @@ module Iceberg
|
|
143
144
|
end
|
144
145
|
|
145
146
|
def self.download(name, filename, hexdigest)
|
146
|
-
ctype, disp = case filename
|
147
|
+
ctype, disp = case filename ? filename.downcase : nil
|
147
148
|
when /\.jpg$/ ; ['image/jpeg', 'inline']
|
148
149
|
when /\.png$/ ; ['image/png', 'inline']
|
149
150
|
when /\.gif$/ ; ['image/gif', 'inline']
|
150
151
|
when /\.mp3$/ ; ['audio/mpeg', 'inline']
|
152
|
+
when /\.m4a$/ ; ['audio/mpeg', 'inline']
|
151
153
|
when /\.ogg$/ ; ['audio/ogg', 'inline']
|
152
|
-
when /\.flac$/ ; ['audio/flac', 'inline']
|
154
|
+
when /\.flac$/ ; ['audio/x-flac', 'inline']
|
155
|
+
when /\.alac$/ ; ['audio/alac', 'inline']
|
153
156
|
when /\.webm$/ ; ['video/webm', 'inline']
|
154
157
|
when /\.txt$/ ; ['text/plain', 'inline']
|
155
158
|
else ['application/octet-stream', 'attachment']
|
@@ -182,4 +185,19 @@ module Iceberg
|
|
182
185
|
end
|
183
186
|
end
|
184
187
|
|
188
|
+
def self.url2key(url, seconds)
|
189
|
+
key = "%010d" % rand(10000000000)
|
190
|
+
dbkey = IBDB_SHORT_URL + key
|
191
|
+
unless REDIS.exists(dbkey) # TODO retry
|
192
|
+
REDIS.set(dbkey, url)
|
193
|
+
REDIS.expire(dbkey, seconds)
|
194
|
+
key
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def self.key2url(key)
|
199
|
+
dbkey = IBDB_SHORT_URL + key
|
200
|
+
REDIS.get(dbkey)
|
201
|
+
end
|
202
|
+
|
185
203
|
end
|
data/lib/ibg/storage.rb
CHANGED
@@ -65,7 +65,7 @@ module Iceberg
|
|
65
65
|
end
|
66
66
|
|
67
67
|
# TODO S3 bin/icebergsync.rb
|
68
|
-
def read(size = nil)
|
68
|
+
def read(size = nil, outbuf = '')
|
69
69
|
if block_given?
|
70
70
|
close
|
71
71
|
File.open(@path, 'rb') do |fd|
|
@@ -77,7 +77,7 @@ module Iceberg
|
|
77
77
|
end
|
78
78
|
else
|
79
79
|
@fd = File.open(@path, 'rb') unless @fd
|
80
|
-
@fd.read(size)
|
80
|
+
@fd.read(size, outbuf)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
data/lib/ibg/version.rb
CHANGED
data/lib/ibg/web.rb
CHANGED
@@ -6,6 +6,8 @@ require 'nkf'
|
|
6
6
|
require 'fileutils'
|
7
7
|
require 'base64'
|
8
8
|
require 'json'
|
9
|
+
require 'i18n'
|
10
|
+
require 'i18n/backend/fallbacks'
|
9
11
|
|
10
12
|
module Iceberg
|
11
13
|
|
@@ -19,6 +21,14 @@ module Iceberg
|
|
19
21
|
FORBIDDEN_CHARS = " #<>:\\/*?\"|&',;`"
|
20
22
|
|
21
23
|
enable :sessions
|
24
|
+
enable :logging
|
25
|
+
|
26
|
+
configure do
|
27
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
|
28
|
+
locales = Dir[File.join(ICEBERG_HOME, 'locales', '*.yml')]
|
29
|
+
I18n.load_path = locales
|
30
|
+
I18n.backend.load_translations
|
31
|
+
end
|
22
32
|
|
23
33
|
helpers do
|
24
34
|
|
@@ -29,6 +39,10 @@ module Iceberg
|
|
29
39
|
haml(template, options)
|
30
40
|
end
|
31
41
|
|
42
|
+
def t(text)
|
43
|
+
I18n.t(text)
|
44
|
+
end
|
45
|
+
|
32
46
|
end
|
33
47
|
|
34
48
|
CONTENT_TYPES = {
|
@@ -47,9 +61,15 @@ module Iceberg
|
|
47
61
|
end
|
48
62
|
content_type CONTENT_TYPES[request_uri], :charset => 'utf-8'
|
49
63
|
response.headers['Cache-Control'] = 'no-cache'
|
64
|
+
I18n.locale = session[:locale] || 'ja'
|
50
65
|
end
|
51
66
|
|
52
67
|
get '/' do
|
68
|
+
locale = params[:locale]
|
69
|
+
if locale
|
70
|
+
I18n.locale = locale
|
71
|
+
session[:locale] = locale
|
72
|
+
end
|
53
73
|
filemax = SETTING['local']['filemax']
|
54
74
|
recentfiles = REDIS.lrange(IBDB_RECENT, 0, filemax)
|
55
75
|
tripcodelist = REDIS.smembers(IBDB_TRIPCODE_SET)
|
@@ -95,7 +115,7 @@ module Iceberg
|
|
95
115
|
rv[:name] = origname
|
96
116
|
session[:uploaded] = rv
|
97
117
|
rescue => x
|
98
|
-
|
118
|
+
p x
|
99
119
|
end
|
100
120
|
redirect '/'
|
101
121
|
end
|
@@ -162,15 +182,37 @@ p x
|
|
162
182
|
:exists => o.exists?}
|
163
183
|
end
|
164
184
|
|
185
|
+
post '/shorten' do
|
186
|
+
name = params[:name]
|
187
|
+
filename = params[:filename]
|
188
|
+
hexdigest = params[:digest]
|
189
|
+
seconds = params[:seconds]
|
190
|
+
params = hexdigest ? "?digest=#{hexdigest}&filename=#{filename}" : ''
|
191
|
+
url = "/show/#{name}#{params}"
|
192
|
+
key = Iceberg.url2key(url, seconds)
|
193
|
+
haml :shorten, :locals => {:key => key}
|
194
|
+
end
|
195
|
+
|
196
|
+
get '/s/:key' do
|
197
|
+
key = params[:key]
|
198
|
+
url = Iceberg.key2url(key)
|
199
|
+
redirect url if url
|
200
|
+
sleep 1 # TODO bruteforce attack
|
201
|
+
raise
|
202
|
+
end
|
203
|
+
|
165
204
|
get '/container/:name' do
|
166
205
|
name = params[:name]
|
167
206
|
hexdigest = params[:digest]
|
168
|
-
|
207
|
+
filename = params[:filename]
|
208
|
+
haml :container, :locals => { :name => name, :hexdigest => hexdigest,
|
209
|
+
:filename => filename }
|
169
210
|
end
|
170
211
|
|
171
212
|
['/download/:name', '/api/v1/download/:name'].each do |path|
|
172
213
|
get path do
|
173
214
|
name = params[:name]
|
215
|
+
name = name.split('.')[0] if name.index('.')
|
174
216
|
filename = params[:filename]
|
175
217
|
hexdigest = params[:digest]
|
176
218
|
ctype, disp, file, cipher = Iceberg.download(name, filename, hexdigest)
|
@@ -184,18 +226,87 @@ p x
|
|
184
226
|
response.headers['Content-Disposition'] =
|
185
227
|
"#{disp}; filename=\"#{filename}\""
|
186
228
|
end
|
187
|
-
|
229
|
+
range = request.env['HTTP_RANGE']
|
230
|
+
skip = 0
|
231
|
+
size = nil
|
232
|
+
if range
|
233
|
+
range = range.split('=')[1].split('-').map(&:to_i)
|
234
|
+
size = range[1]
|
235
|
+
if size
|
236
|
+
skip = range[0]
|
237
|
+
size = size + 1 - skip
|
238
|
+
status 206
|
239
|
+
end
|
240
|
+
end
|
241
|
+
if size && size < 4 * 1024 * 1024 # TODO under 4 MiB
|
242
|
+
out = ''
|
188
243
|
begin
|
189
244
|
file.read do |data|
|
190
245
|
data = cipher.update(data) if cipher
|
191
246
|
out << data
|
192
|
-
sleep 0.1 # TODO
|
193
247
|
end
|
194
|
-
|
248
|
+
if cipher
|
249
|
+
data = cipher.final
|
250
|
+
out << data
|
251
|
+
end
|
195
252
|
rescue => x
|
196
253
|
p x
|
197
254
|
end
|
198
255
|
Iceberg.recordip(request.ip)
|
256
|
+
response.headers['Content-Range'] = "bytes #{range.join('-')}/#{out.size}"
|
257
|
+
out[skip, size]
|
258
|
+
else
|
259
|
+
stream do |out|
|
260
|
+
begin
|
261
|
+
file.read do |data|
|
262
|
+
data = cipher.update(data) if cipher
|
263
|
+
if skip <= 0
|
264
|
+
if size
|
265
|
+
if size > 0
|
266
|
+
out << data[0, size]
|
267
|
+
size -= data.size
|
268
|
+
end
|
269
|
+
else
|
270
|
+
out << data
|
271
|
+
end
|
272
|
+
else
|
273
|
+
if skip >= data.size
|
274
|
+
skip -= data.size
|
275
|
+
else
|
276
|
+
if size
|
277
|
+
out << data[skip, size]
|
278
|
+
size -= data.size - skip
|
279
|
+
else
|
280
|
+
out << data[(skip)..-1]
|
281
|
+
end
|
282
|
+
skip = 0
|
283
|
+
end
|
284
|
+
end
|
285
|
+
sleep 0.1 # TODO
|
286
|
+
end
|
287
|
+
if cipher
|
288
|
+
data = cipher.final
|
289
|
+
if skip <= 0
|
290
|
+
if size
|
291
|
+
if size > 0
|
292
|
+
out << data[0, size]
|
293
|
+
end
|
294
|
+
else
|
295
|
+
out << data
|
296
|
+
end
|
297
|
+
else
|
298
|
+
if size
|
299
|
+
out << data[skip, size]
|
300
|
+
else
|
301
|
+
out << data[(skip)..-1]
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
rescue => x
|
306
|
+
p x
|
307
|
+
end
|
308
|
+
Iceberg.recordip(request.ip)
|
309
|
+
end
|
199
310
|
end
|
200
311
|
end
|
201
312
|
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
en:
|
2
|
+
online_storage: Oneline Storage - Iceberg
|
3
|
+
home: Home
|
4
|
+
source: Source
|
5
|
+
roadmap: Roadmap
|
6
|
+
upload: Upload
|
7
|
+
download: Download
|
8
|
+
recent_peers: Recent Peers
|
9
|
+
cryptographic_keys: Cryptographic Keys
|
10
|
+
cryptographic_keys_note1: "All keys are stored on your browser's storage."
|
11
|
+
cryptographic_keys_note2: "It is important to backup keys."
|
12
|
+
file: File
|
13
|
+
text: Text
|
14
|
+
step1: STEP 1
|
15
|
+
step2: STEP 2
|
16
|
+
tripcode_tag: Tripcode Tag (Option)aaa
|
17
|
+
tripcode: 'Tripcode:'
|
18
|
+
up_to_size: 'Up to %s MiB.'
|
19
|
+
trip_key: Trip Key
|
20
|
+
files: Files
|
21
|
+
tags: Tags
|
22
|
+
show_keys: Show Keys
|
23
|
+
import_keys: Import Keys
|
24
|
+
forget_all_keys: Forget All Keys
|
25
|
+
files_in_fifo: '%s / %s files in FIFO.'
|
26
|
+
carousel11: 'Your stuff, anywhere'
|
27
|
+
carousel12: 'You can share pictures, recordings, videos – anything.'
|
28
|
+
carousel13: 'You can quickly share URL to view, download, and collaborate on all the files you want - no email attachment needed.'
|
29
|
+
demo: Demo
|
30
|
+
carousel21: 'Safe and secure'
|
31
|
+
carousel22: 'Full SSL communication. Use Amazon S3.'
|
32
|
+
carousel23: "Everything's automatically private, so you control who sees what."
|
33
|
+
carousel24: 'Server does not store your AES encryption key.'
|
34
|
+
carousel25: "Storing it into your browser's local storage."
|
35
|
+
carousel31: 'Open source'
|
36
|
+
carousel32: 'Iceberg is open source software.'
|
37
|
+
carousel33: 'You can improve this software. Run anywhere.'
|
38
|
+
carousel41: 'Decentralized'
|
39
|
+
carousel42: 'It is possible to download and upload encrypted files via API.'
|
40
|
+
carousel43: 'Anybody can duplicate and re-upload files.'
|
data/locales/ja.yml
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
ja:
|
2
|
+
online_storage: オンラインストレージ - Iceberg
|
3
|
+
home: ホーム
|
4
|
+
source: ソースコード
|
5
|
+
roadmap: ロードマップ
|
6
|
+
upload: アップロード
|
7
|
+
download: ダウンロード
|
8
|
+
recent_peers: 最近のピア
|
9
|
+
cryptographic_keys: 暗号化鍵
|
10
|
+
cryptographic_keys_note1: すべての鍵はあなたのブラウザに保存されています。
|
11
|
+
cryptographic_keys_note2: 鍵をバックアップしておくことをおすすめします。
|
12
|
+
file: ファイル
|
13
|
+
text: テキスト
|
14
|
+
step1: ステップ1
|
15
|
+
step2: ステップ2
|
16
|
+
tripcode_tag: トリップタグ(オプション)
|
17
|
+
tripcode: 'トリップ:'
|
18
|
+
up_to_size: '最大 %s MiBまで'
|
19
|
+
trip_key: トリップ鍵
|
20
|
+
files: ファイル
|
21
|
+
tags: タグ
|
22
|
+
show_keys: 鍵を見る
|
23
|
+
import_keys: 鍵を取り込む
|
24
|
+
forget_all_keys: すべての鍵を削除
|
25
|
+
files_in_fifo: '%s / %s ファイルがFIFOに存在'
|
26
|
+
carousel11: 'すべてのファイルをどこからでも'
|
27
|
+
carousel12: '写真、音楽、動画など、何でも保管しておけます。'
|
28
|
+
carousel13: 'メール添付不要。アドレス共有で閲覧やダウンロードが可能に。'
|
29
|
+
demo: サンプルファイル
|
30
|
+
carousel21: '安全で安心'
|
31
|
+
carousel22: '通信経路はSSLで暗号化。ファイルはAmazon S3に冗長保存。'
|
32
|
+
carousel23: "ファイルは共有なしで保存され、後で選択できます。"
|
33
|
+
carousel24: 'AES暗号化鍵はサーバには保存しません。'
|
34
|
+
carousel25: "ブラウザの内部ストレージに保存されます。"
|
35
|
+
carousel31: 'オープンソース'
|
36
|
+
carousel32: 'Icebergはオープンソースソフトウェアです。'
|
37
|
+
carousel33: '誰でもこのソフトを改良することができ、どこでも動かせます。'
|
38
|
+
carousel41: '分散システム'
|
39
|
+
carousel42: '暗号化ファイルはAPIでダウンロード・アップロードが可能です。'
|
40
|
+
carousel43: '誰でもファイルの冗長化に参加することができます。'
|
data/public/show.js
CHANGED
@@ -6,4 +6,24 @@ $(function(){
|
|
6
6
|
localStorage.setItem(encdigest + ':name', name);
|
7
7
|
localStorage.setItem(encdigest + ':digest', digest);
|
8
8
|
}
|
9
|
+
$('#apply').click(function () {
|
10
|
+
var textdata = $('#textdata');
|
11
|
+
if (textdata) {
|
12
|
+
//var metadata = textdata.contents()[0].body.innerHTML;
|
13
|
+
var metadata = $('pre', textdata.contents()).text(); // TODO Chrome only?
|
14
|
+
$(metadata.split('\n')).each(function (i, x) {
|
15
|
+
var kv = x.split('=');
|
16
|
+
var k = kv[0];
|
17
|
+
var v = kv[1];
|
18
|
+
if (v) {
|
19
|
+
if (v.length == 0) {
|
20
|
+
localStorage.removeItem(k);
|
21
|
+
}
|
22
|
+
else {
|
23
|
+
localStorage.setItem(k, v);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
});
|
27
|
+
}
|
28
|
+
});
|
9
29
|
});
|
data/views/_navbar.haml
CHANGED
@@ -1,9 +1,18 @@
|
|
1
1
|
%li.active
|
2
|
-
%a{:href => "#"}
|
2
|
+
%a{:href => "#"}= t 'home'
|
3
3
|
%li
|
4
4
|
- demourl = Iceberg::SETTING['local']['demourl'] || '#'
|
5
|
-
%a{:href => demourl}
|
5
|
+
%a{:href => demourl}= t 'demo'
|
6
6
|
%li
|
7
|
-
%a{:href => 'https://github.com/ohac/iceberg'}
|
7
|
+
%a{:href => 'https://github.com/ohac/iceberg'}= t 'source'
|
8
8
|
%li
|
9
|
-
%a{:href => 'https://github.com/ohac/iceberg/wiki'}
|
9
|
+
%a{:href => 'https://github.com/ohac/iceberg/wiki'}= t 'roadmap'
|
10
|
+
%li{:class => 'dropdown'}
|
11
|
+
%a{:href => '#', :class => 'dropdown-toggle', 'data-toggle' => 'dropdown', :role => 'button', 'aria-expanded' => false}
|
12
|
+
Locale
|
13
|
+
%span{:class => 'caret'}
|
14
|
+
%ul{:class => 'dropdown-menu', :role => 'menu', 'aria-labelledby' => 'dropdownMenu1'}
|
15
|
+
%li{:role => 'presentation'}
|
16
|
+
%a{:role => 'menuitem', :tabindex => -1, :href => '/?locale=en'} English
|
17
|
+
%li{:role => 'presentation'}
|
18
|
+
%a{:role => 'menuitem', :tabindex => -1, :href => '/?locale=ja'} 日本語
|
data/views/container.haml
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
!!! 5
|
1
2
|
%html
|
2
3
|
%body
|
4
|
+
%br
|
3
5
|
- params = "?digest=#{hexdigest}"
|
6
|
+
- name += ".#{filename}" if filename
|
4
7
|
- url = "#{name}#{params}"
|
5
8
|
- dllink = "/download/#{url}"
|
6
9
|
%audio{:controls => :controls}
|
7
|
-
%source{:src => dllink, :type => 'audio/
|
10
|
+
%source{:src => dllink, :type => 'audio/mpeg'}
|
8
11
|
Your browser does not support audio
|
data/views/index.haml
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
!!! 5
|
2
|
+
- title = Time.now.strftime('%Y-%m-%d %H:%M ')
|
2
3
|
%html
|
3
4
|
%head
|
4
|
-
%title
|
5
|
+
%title= t 'online_storage'
|
5
6
|
%meta{:property => 'twitter:card', :content => 'summary'}
|
6
7
|
%meta{:name => 'twitter:title', :content => 'Online Storage - Iceberg'}
|
7
8
|
%meta{:name => 'twitter:description',
|
@@ -24,7 +25,7 @@
|
|
24
25
|
%span.icon-bar
|
25
26
|
%span.icon-bar
|
26
27
|
%span.icon-bar
|
27
|
-
%a.navbar-brand{:href => "#"}
|
28
|
+
%a.navbar-brand{:href => "#"}= t 'online_storage'
|
28
29
|
%div#navbar{:class => "collapse navbar-collapse"}
|
29
30
|
%ul{:class => "nav navbar-nav"}= partial :navbar
|
30
31
|
%div.container
|
@@ -50,7 +51,7 @@
|
|
50
51
|
= name
|
51
52
|
- if tripcode
|
52
53
|
%br
|
53
|
-
|
54
|
+
= t 'tripcode'
|
54
55
|
%a{:href => "/tripcode/#{tripcode}"}= tripcode
|
55
56
|
%input#tripcode{:type => :hidden, :value => tripcode}
|
56
57
|
|
@@ -65,37 +66,37 @@
|
|
65
66
|
%img{:src => "data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", :alt => "First slide"}
|
66
67
|
%div{:class => "container"}
|
67
68
|
%div{:class => "carousel-caption"}
|
68
|
-
%h1
|
69
|
-
%p
|
70
|
-
%p
|
69
|
+
%h1= t 'carousel11'
|
70
|
+
%p= t 'carousel12'
|
71
|
+
%p= t 'carousel13'
|
71
72
|
%p
|
72
73
|
- demourl = Iceberg::SETTING['local']['demourl'] || '#'
|
73
|
-
%a{:class => "btn btn-lg btn-primary", :href => demourl}
|
74
|
+
%a{:class => "btn btn-lg btn-primary", :href => demourl}= t 'demo'
|
74
75
|
%div{:class => "item"}
|
75
76
|
%img{:src => "data:image/gif;base64,R0lGODlhAQABAIAAAGZmZgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", :alt => "Second slide"}
|
76
77
|
%div{:class => "container"}
|
77
78
|
%div{:class => "carousel-caption"}
|
78
|
-
%h1
|
79
|
-
%p
|
80
|
-
%p
|
81
|
-
%p
|
82
|
-
%p
|
79
|
+
%h1= t 'carousel21'
|
80
|
+
%p= t 'carousel22'
|
81
|
+
%p= t 'carousel23'
|
82
|
+
%p= t 'carousel24'
|
83
|
+
%p= t 'carousel25'
|
83
84
|
%div{:class => "item"}
|
84
85
|
%img{:src => "data:image/gif;base64,R0lGODlhAQABAIAAAFVVVQAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", :alt => "Third slide"}
|
85
86
|
%div{:class => "container"}
|
86
87
|
%div{:class => "carousel-caption"}
|
87
|
-
%h1
|
88
|
-
%p
|
89
|
-
%p
|
88
|
+
%h1= t 'carousel31'
|
89
|
+
%p= t 'carousel32'
|
90
|
+
%p= t 'carousel33'
|
90
91
|
%p
|
91
92
|
%a{:class => "btn btn-lg btn-primary", :href => 'https://github.com/ohac/iceberg'} GitHub
|
92
93
|
%div{:class => "item"}
|
93
94
|
%img{:src => "data:image/gif;base64,R0lGODlhAQABAIAAAFVVVQAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", :alt => "slide 4"}
|
94
95
|
%div{:class => "container"}
|
95
96
|
%div{:class => "carousel-caption"}
|
96
|
-
%h1
|
97
|
-
%p
|
98
|
-
%p
|
97
|
+
%h1= t 'carousel41'
|
98
|
+
%p= t 'carousel42'
|
99
|
+
%p= t 'carousel43'
|
99
100
|
%p
|
100
101
|
%a{:class => "btn btn-lg btn-primary", :href => 'https://github.com/ohac/iceberg'} GitHub
|
101
102
|
%a{:class => "left carousel-control", :href => "#myCarousel", :role => "button", 'data-slide' => "prev"}
|
@@ -105,42 +106,42 @@
|
|
105
106
|
%span{:class => "glyphicon glyphicon-chevron-right", 'aria-hidden' => true}
|
106
107
|
%span{:class => "sr-only"} Next
|
107
108
|
|
108
|
-
%h1
|
109
|
+
%h1= t 'upload'
|
109
110
|
%ul#uploadtabs{:class => 'nav nav-tabs'}
|
110
111
|
%li.active{:role => 'presentation'}
|
111
112
|
%a{:href => '#filetab', 'aria-controls' => 'filetab', :role => :tab,
|
112
113
|
'data-toggle' => 'tab'}
|
113
114
|
%span{:class => 'glyphicon glyphicon-paperclip',
|
114
115
|
'aria-hidden' => true}
|
115
|
-
|
116
|
+
= t 'file'
|
116
117
|
%li{:role => 'presentation'}
|
117
118
|
%a{:href => '#texttab', 'aria-controls' => 'texttab', :role => :tab,
|
118
119
|
'data-toggle' => 'tab'}
|
119
120
|
%span{:class => 'glyphicon glyphicon-pencil',
|
120
121
|
'aria-hidden' => true}
|
121
|
-
|
122
|
+
= t 'text'
|
122
123
|
%div{:class => 'tab-content'}
|
123
124
|
%div#filetab{:role => :tabpanel, :class => 'tab-pane active'}
|
124
125
|
|
125
126
|
%form{:action => '/upload', :method => 'post',
|
126
127
|
:enctype => 'multipart/form-data'}
|
127
128
|
%br
|
128
|
-
%label
|
129
|
+
%label= t 'step1'
|
129
130
|
%br
|
130
131
|
%input{:type => 'file', :name => 'file'}
|
131
|
-
|
132
|
+
= (t 'up_to_size') % (maxfilesize / (1024 * 1024))
|
132
133
|
%br
|
133
134
|
%br
|
134
|
-
%label
|
135
|
+
%label= t 'step2'
|
135
136
|
%br
|
136
137
|
%button{:type => 'submit',
|
137
138
|
:class => 'btn btn-lg btn-default'}
|
138
139
|
%span{:class => 'glyphicon glyphicon-cloud-upload',
|
139
140
|
'aria-hidden' => true}
|
140
|
-
|
141
|
+
= t 'upload'
|
141
142
|
%br
|
142
143
|
%br
|
143
|
-
%label
|
144
|
+
%label= t 'tripcode_tag'
|
144
145
|
%br
|
145
146
|
%div{:class => 'input-group'}
|
146
147
|
%span{:class => 'input-group-addon', :id => 'basic-addon1'}
|
@@ -148,32 +149,31 @@
|
|
148
149
|
'aria-hidden' => true}
|
149
150
|
\#
|
150
151
|
%input{:type => :text, :class => 'form-control',
|
151
|
-
:placeholder =>
|
152
|
+
:placeholder => (t 'trip_key'),
|
152
153
|
'aria-describedby' => 'basic-addon1', :name => 'tripkey'}
|
153
154
|
|
154
155
|
%div#texttab{:role => :tabpanel, :class => 'tab-pane'}
|
155
156
|
%form{:action => '/uploadtext', :method => 'post',
|
156
157
|
:enctype => 'multipart/form-data'}
|
157
158
|
%br
|
158
|
-
%label
|
159
|
+
%label= t 'step1'
|
159
160
|
%br
|
160
|
-
- title = Time.now.strftime('%Y-%m-%d %H:%M ')
|
161
161
|
%input{:type => 'input', :name => 'title', :value => title,
|
162
162
|
:class => 'form-control'}
|
163
163
|
%br
|
164
164
|
%textarea{:rows => 10, :cols => 40, :name => 'text',
|
165
165
|
:class => 'form-control'}
|
166
166
|
%br
|
167
|
-
%label
|
167
|
+
%label= t 'step2'
|
168
168
|
%br
|
169
169
|
%button{:type => 'submit',
|
170
170
|
:class => 'btn btn-lg btn-default'}
|
171
171
|
%span{:class => 'glyphicon glyphicon-cloud-upload',
|
172
172
|
'aria-hidden' => true}
|
173
|
-
|
173
|
+
= t 'upload'
|
174
174
|
%br
|
175
175
|
%br
|
176
|
-
%label
|
176
|
+
%label= t 'tripcode_tag'
|
177
177
|
%br
|
178
178
|
%div{:class => 'input-group'}
|
179
179
|
%span{:class => 'input-group-addon', :id => 'basic-addon2'}
|
@@ -181,24 +181,24 @@
|
|
181
181
|
'aria-hidden' => true}
|
182
182
|
\#
|
183
183
|
%input{:type => :text, :class => 'form-control',
|
184
|
-
:placeholder =>
|
184
|
+
:placeholder => (t 'trip_key'),
|
185
185
|
'aria-describedby' => 'basic-addon2', :name => 'tripkey'}
|
186
186
|
|
187
187
|
%hr
|
188
|
-
%h1
|
188
|
+
%h1= t 'download'
|
189
189
|
%ul#downloadtabs{:class => 'nav nav-tabs'}
|
190
190
|
%li.active{:role => 'presentation'}
|
191
191
|
%a{:href => '#dltab', 'aria-controls' => 'dltab', :role => :tab,
|
192
192
|
'data-toggle' => 'tab'}
|
193
193
|
%span{:class => 'glyphicon glyphicon-file',
|
194
194
|
'aria-hidden' => true}
|
195
|
-
|
195
|
+
= t 'files'
|
196
196
|
%li{:role => 'presentation'}
|
197
197
|
%a{:href => '#tagtab', 'aria-controls' => 'tagtab', :role => :tab,
|
198
198
|
'data-toggle' => 'tab'}
|
199
|
-
%span{:class => 'glyphicon glyphicon-
|
199
|
+
%span{:class => 'glyphicon glyphicon-tags',
|
200
200
|
'aria-hidden' => true}
|
201
|
-
|
201
|
+
= t 'tags'
|
202
202
|
%br
|
203
203
|
%div{:class => 'tab-content'}
|
204
204
|
%div#dltab{:role => :tabpanel, :class => 'tab-pane active'}
|
@@ -207,39 +207,61 @@
|
|
207
207
|
%div
|
208
208
|
%a.files{:href => "/show/#{file}", :id => file}= filename
|
209
209
|
%br
|
210
|
-
|
210
|
+
= (t 'files_in_fifo') % [recentfiles.size, filemax]
|
211
211
|
%div#tagtab{:role => :tabpanel, :class => 'tab-pane'}
|
212
212
|
- tripcodelist.each do |tripcode|
|
213
213
|
%div
|
214
214
|
%a.tripcodelist{:href => "/tripcode/#{tripcode}",
|
215
215
|
:id => tripcode}= tripcode
|
216
216
|
%hr
|
217
|
-
%h1
|
217
|
+
%h1= t 'recent_peers'
|
218
218
|
- salt = Iceberg::SETTING['local']['salt'] || ''
|
219
219
|
- recentpeers.each do |digest, info|
|
220
220
|
%p #{digest} (#{info})
|
221
221
|
%hr
|
222
|
-
%h1
|
223
|
-
|
224
|
-
%br
|
225
|
-
It is important to backup keys.
|
222
|
+
%h1= t 'cryptographic_keys'
|
223
|
+
= t 'cryptographic_keys_note1'
|
226
224
|
%br
|
227
|
-
|
225
|
+
= t 'cryptographic_keys_note2'
|
228
226
|
%br
|
229
|
-
%
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
%
|
235
|
-
|
236
|
-
|
227
|
+
%form{:action => '/uploadtext', :method => 'post',
|
228
|
+
:enctype => 'multipart/form-data'}
|
229
|
+
%textarea#metadata{:class => 'form-control', :rows => 10,
|
230
|
+
:name => 'text'}
|
231
|
+
%br
|
232
|
+
%button#showkeys{:type => 'button', :class => 'btn btn-lg btn-default'}
|
233
|
+
%span{:class => 'glyphicon glyphicon-open',
|
234
|
+
'aria-hidden' => true}
|
235
|
+
= t 'show_keys'
|
236
|
+
%button#apply{:type => 'button', :class => 'btn btn-lg btn-default'}
|
237
|
+
%span{:class => 'glyphicon glyphicon-save',
|
238
|
+
'aria-hidden' => true}
|
239
|
+
= t 'import_keys'
|
240
|
+
%input{:type => :hidden, :name => 'title', :value => "#{title}Keys",
|
241
|
+
:class => 'form-control'}
|
242
|
+
%button{:type => 'submit',
|
243
|
+
:class => 'btn btn-lg btn-default'}
|
244
|
+
%span{:class => 'glyphicon glyphicon-cloud-upload',
|
245
|
+
'aria-hidden' => true}
|
246
|
+
= t 'upload'
|
247
|
+
%br
|
248
|
+
%br
|
249
|
+
%label= t 'tripcode_tag'
|
250
|
+
%br
|
251
|
+
%div{:class => 'input-group'}
|
252
|
+
%span{:class => 'input-group-addon', :id => 'basic-addon2'}
|
253
|
+
%span{:class => 'glyphicon glyphicon-tag',
|
254
|
+
'aria-hidden' => true}
|
255
|
+
\#
|
256
|
+
%input{:type => :text, :class => 'form-control',
|
257
|
+
:placeholder => (t 'trip_key'),
|
258
|
+
'aria-describedby' => 'basic-addon2', :name => 'tripkey'}
|
237
259
|
%br
|
238
260
|
%br
|
239
261
|
%button#deleteall{:type => 'button',
|
240
262
|
:class => 'btn btn-sm btn-default'}
|
241
263
|
%span{:class => 'glyphicon glyphicon-trash', 'aria-hidden' => true}
|
242
|
-
|
264
|
+
= t 'forget_all_keys'
|
243
265
|
%script{:type => 'text/javascript', :src => '/jquery-2.1.3.min.js'}
|
244
266
|
%script{:type => 'text/javascript', :src => "#{cdn}/js/bootstrap.min.js"}
|
245
267
|
%script{:type => 'text/javascript', :src => '/bootstrap-filestyle.min.js'}
|
data/views/shorten.haml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title #{key} - Online Storage - Iceberg
|
5
|
+
%link{:href => "/style.css", :rel => "stylesheet", :type => "text/css",
|
6
|
+
:media => "screen"}
|
7
|
+
- cdn = Iceberg::SETTING['local']['cdn'] || ''
|
8
|
+
%link{:href => "#{cdn}/css/bootstrap.min.css", :rel => "stylesheet"}
|
9
|
+
%link{:href => "#{cdn}/css/bootstrap-theme.min.css", :rel => "stylesheet"}
|
10
|
+
%link{:href => "/starter-template.css", :rel => "stylesheet"}
|
11
|
+
%body
|
12
|
+
%nav{:class => "navbar navbar-inverse navbar-fixed-top"}
|
13
|
+
%div.container
|
14
|
+
%div.navbar-header
|
15
|
+
%button{:type => "button", :class => "navbar-toggle collapsed",
|
16
|
+
"data-toggle" => "collapse", "data-target" => "#navbar",
|
17
|
+
"aria-expanded" => "false", "aria-controls" => "navbar"}
|
18
|
+
%span.sr-only Toggle navigation
|
19
|
+
%span.icon-bar
|
20
|
+
%span.icon-bar
|
21
|
+
%span.icon-bar
|
22
|
+
%a.navbar-brand{:href => "/"} Online Storage - Iceberg
|
23
|
+
%div#navbar{:class => "collapse navbar-collapse"}
|
24
|
+
%ul{:class => "nav navbar-nav"}= partial :navbar
|
25
|
+
%div.container
|
26
|
+
%div.starter-template
|
27
|
+
- hostport = 'https://' + request.host
|
28
|
+
- shortlink = "/s/#{key}"
|
29
|
+
- url = "#{hostport}#{shortlink}"
|
30
|
+
%div{:class => 'input-group input-group-lg'}
|
31
|
+
%input{:type => :text, :class => 'form-control', :value => url}
|
32
|
+
%span{:class => "input-group-btn"}
|
33
|
+
%a{:href => shortlink, :class => 'btn btn-default'} Go!
|
34
|
+
%script{:type => 'text/javascript', :src => '/jquery-2.1.3.min.js'}
|
35
|
+
%script{:type => 'text/javascript', :src => "#{cdn}/js/bootstrap.min.js"}
|
data/views/show.haml
CHANGED
@@ -7,7 +7,10 @@
|
|
7
7
|
-# hostport = request.scheme + '://' + request.host
|
8
8
|
- hostport = 'https://' + request.host
|
9
9
|
- params = hexdigest ? "?digest=#{hexdigest}&filename=#{filename}" : ''
|
10
|
-
-
|
10
|
+
- url1 = "#{name}#{params}"
|
11
|
+
- dllink1 = "/download/#{url1}"
|
12
|
+
- name2 = filename ? name + ".#{filename}" : name
|
13
|
+
- url = "#{name2}#{params}"
|
11
14
|
- dllink = "/download/#{url}"
|
12
15
|
- ctlink = "/container/#{url}"
|
13
16
|
%head
|
@@ -15,14 +18,14 @@
|
|
15
18
|
- if exists
|
16
19
|
%meta{:name => 'twitter:title', :content => filename}
|
17
20
|
- summary = true
|
18
|
-
- case filename
|
21
|
+
- case filename.downcase
|
19
22
|
- when /\.jpg$/, /\.gif$/, /\.png$/
|
20
23
|
- if filesize < 1024 * 1024
|
21
24
|
%meta{:property => 'twitter:card', :content => 'photo'}
|
22
25
|
%meta{:name => 'twitter:image', :content => "#{hostport}#{dllink}"}
|
23
26
|
%meta{:name => 'twitter:url', :content => request.url}
|
24
27
|
- summary = false
|
25
|
-
- when /\.mp3$/
|
28
|
+
- when /\.mp3$/, /\.m4a$/
|
26
29
|
%meta{:property => 'twitter:card', :content => 'player'}
|
27
30
|
%meta{:name => 'twitter:player', :content => "#{hostport}#{ctlink}"}
|
28
31
|
%meta{:name => 'twitter:player:width', :content => 300}
|
@@ -62,9 +65,9 @@
|
|
62
65
|
%input#digest{:type => :hidden, :value => hexdigest}
|
63
66
|
%input#encdigest{:type => :hidden, :value => encdigest}
|
64
67
|
- if exists
|
65
|
-
- case filename
|
68
|
+
- case filename.downcase
|
66
69
|
- when /\.txt$/
|
67
|
-
%iframe{:src => dllink}
|
70
|
+
%iframe#textdata{:src => dllink, :width => 1024, :height => 360}
|
68
71
|
%hr
|
69
72
|
- when /\.webm$/
|
70
73
|
%video{:width => 640, :height => 360, :controls => :controls}
|
@@ -73,21 +76,37 @@
|
|
73
76
|
- when /\.jpg$/, /\.gif$/, /\.png$/
|
74
77
|
%img{:src => dllink}
|
75
78
|
%hr
|
76
|
-
- when /\.mp3$/, /\.ogg$/, /\.flac$/
|
77
|
-
%audio{:
|
79
|
+
- when /\.mp3$/, /\.ogg$/, /\.flac$/, /\.m4a$/
|
80
|
+
%audio{:controls => :controls}
|
81
|
+
%source{:src => dllink, :type => 'audio/mpeg'}
|
78
82
|
%hr
|
79
|
-
%
|
80
|
-
%
|
83
|
+
%form{:action => '/shorten', :method => 'post'}
|
84
|
+
%a{:href => dllink, :class => 'btn btn-default btn-lg'}
|
85
|
+
%span{:class => 'glyphicon glyphicon-cloud-download'} Download
|
86
|
+
%input{:type => :hidden, :name => :name, :value => name}
|
87
|
+
%input{:type => :hidden, :name => :filename, :value => filename}
|
88
|
+
%input{:type => :hidden, :name => :digest, :value => hexdigest}
|
89
|
+
%input{:type => :hidden, :name => :seconds, :value => 60}= # TODO
|
90
|
+
%button{:type => :submit, :class => 'btn btn-lg btn-default'}
|
91
|
+
%span{:class => 'glyphicon glyphicon-share',
|
92
|
+
'aria-hidden' => true}
|
93
|
+
Shorten URL (60 seconds)
|
94
|
+
- if /_Keys\.txt$/ === filename
|
95
|
+
%button#apply{:type => 'button',
|
96
|
+
:class => 'btn btn-lg btn-default'}
|
97
|
+
%span{:class => 'glyphicon glyphicon-save',
|
98
|
+
'aria-hidden' => true}
|
99
|
+
Import Keys
|
81
100
|
- else
|
82
101
|
%p File not found
|
83
102
|
%hr
|
84
103
|
%label Share URL:
|
85
104
|
%textarea{:rows => 2, :class => 'form-control'}
|
86
|
-
#{hostport}/show/#{
|
105
|
+
#{hostport}/show/#{url1}
|
87
106
|
%br
|
88
107
|
%label Direct URL:
|
89
108
|
%textarea{:rows => 2, :class => 'form-control'}
|
90
|
-
#{hostport}#{
|
109
|
+
#{hostport}#{dllink1}
|
91
110
|
%script{:type => 'text/javascript', :src => '/jquery-2.1.3.min.js'}
|
92
111
|
%script{:type => 'text/javascript', :src => "#{cdn}/js/bootstrap.min.js"}
|
93
112
|
%script{:type => 'text/javascript', :src => '/show.js'}
|
metadata
CHANGED
@@ -1,110 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ibg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- OHASHI Hideya
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2015-
|
11
|
+
date: 2015-04-05 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bundler
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '1.7'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '1.7'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '10.0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '10.0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: sinatra
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: thin
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: '0'
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: haml
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
|
-
- -
|
73
|
+
- - ">="
|
68
74
|
- !ruby/object:Gem::Version
|
69
75
|
version: '0'
|
70
76
|
type: :runtime
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
|
-
- -
|
80
|
+
- - ">="
|
76
81
|
- !ruby/object:Gem::Version
|
77
82
|
version: '0'
|
78
83
|
- !ruby/object:Gem::Dependency
|
79
84
|
name: redis
|
80
85
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
|
-
- -
|
87
|
+
- - ">="
|
84
88
|
- !ruby/object:Gem::Version
|
85
89
|
version: '0'
|
86
90
|
type: :runtime
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
|
-
- -
|
94
|
+
- - ">="
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '0'
|
94
97
|
- !ruby/object:Gem::Dependency
|
95
98
|
name: aws-sdk
|
96
99
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
100
|
requirements:
|
99
|
-
- -
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: i18n
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
100
116
|
- !ruby/object:Gem::Version
|
101
117
|
version: '0'
|
102
118
|
type: :runtime
|
103
119
|
prerelease: false
|
104
120
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
121
|
requirements:
|
107
|
-
- -
|
122
|
+
- - ">="
|
108
123
|
- !ruby/object:Gem::Version
|
109
124
|
version: '0'
|
110
125
|
description: Decenterized file storage
|
@@ -116,8 +131,8 @@ executables:
|
|
116
131
|
extensions: []
|
117
132
|
extra_rdoc_files: []
|
118
133
|
files:
|
119
|
-
- .gitignore
|
120
|
-
- .travis.yml
|
134
|
+
- ".gitignore"
|
135
|
+
- ".travis.yml"
|
121
136
|
- Dockerfile
|
122
137
|
- Gemfile
|
123
138
|
- LICENSE.txt
|
@@ -133,6 +148,8 @@ files:
|
|
133
148
|
- lib/ibg/storage.rb
|
134
149
|
- lib/ibg/version.rb
|
135
150
|
- lib/ibg/web.rb
|
151
|
+
- locales/en.yml
|
152
|
+
- locales/ja.yml
|
136
153
|
- public/bootstrap-filestyle.min.js
|
137
154
|
- public/carousel.css
|
138
155
|
- public/favicon.ico
|
@@ -149,32 +166,32 @@ files:
|
|
149
166
|
- views/_navbar.haml
|
150
167
|
- views/container.haml
|
151
168
|
- views/index.haml
|
169
|
+
- views/shorten.haml
|
152
170
|
- views/show.haml
|
153
171
|
- views/tripcode.haml
|
154
172
|
homepage: https://box.sighash.info/
|
155
173
|
licenses:
|
156
174
|
- MIT
|
175
|
+
metadata: {}
|
157
176
|
post_install_message:
|
158
177
|
rdoc_options: []
|
159
178
|
require_paths:
|
160
179
|
- lib
|
161
180
|
required_ruby_version: !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
181
|
requirements:
|
164
|
-
- -
|
182
|
+
- - ">="
|
165
183
|
- !ruby/object:Gem::Version
|
166
184
|
version: '0'
|
167
185
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
-
none: false
|
169
186
|
requirements:
|
170
|
-
- -
|
187
|
+
- - ">="
|
171
188
|
- !ruby/object:Gem::Version
|
172
189
|
version: '0'
|
173
190
|
requirements: []
|
174
191
|
rubyforge_project:
|
175
|
-
rubygems_version:
|
192
|
+
rubygems_version: 2.2.2
|
176
193
|
signing_key:
|
177
|
-
specification_version:
|
194
|
+
specification_version: 4
|
178
195
|
summary: Decenterized file storage
|
179
196
|
test_files:
|
180
197
|
- test/test_entry.rb
|