yopass 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f8d26d2cb03549b70d5acdc9ce6acd7b6db3c9a
4
- data.tar.gz: b095963eb8be973a7829a65838739b34e266c68b
3
+ metadata.gz: d7545346b162a46c0382fd35e5e52c474a47e78f
4
+ data.tar.gz: 3511540e87a17f20d6e06427ca159311a9962250
5
5
  SHA512:
6
- metadata.gz: 2b6f02e6ddf3fab9fd67d5cf39f784f7d59e735bbf2224832fc991f1cf0e9aa2eb769676d48ce6420b0da2c75c23ab5110d75eff4838077c8b20e4f20a47454e
7
- data.tar.gz: b87e77bf5afe05a3a189f85a0d133298849086fb8a03f8e730a568fcfc41a572b52226293a32be61450d63d431c85e61bb99325f722fd8aefc128669c15afab7
6
+ metadata.gz: 22e7328dcc0241299bf3fdb4dc39a84d4cc52b645cb217f2fa06becd198d66fd80d68303b4c7fb8a78217410d981d2b04d9d23d73a7dc4a1115fc96689da15a7
7
+ data.tar.gz: d21e8abb4d6cef79d30c4e3cb6ff1309b885fd3da2087a7f3ffdf2bb511bf36bd84e9f36a3c6b9b6d8f529b0a96554fd3e5b2741ed72f76342480d679473ad3f
data/.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
  Gem::Specification.new do |s|
3
3
  # Metadata
4
4
  s.name = 'yopass'
5
- s.version = '2.0.0'
5
+ s.version = '2.1.0'
6
6
  s.author = 'Johan Haals'
7
7
  s.email = ['jhaals@spotify.com']
8
8
  s.homepage = 'https://github.com/jhaals/yopass'
@@ -16,9 +16,9 @@ Gem::Specification.new do |s|
16
16
  s.require_paths = ['lib', 'conf']
17
17
 
18
18
  # Dependencies
19
- s.required_ruby_version = '>= 1.8.7'
20
- s.add_runtime_dependency 'encryptor', '~> 1.3.0'
21
- s.add_runtime_dependency 'memcached' , '~> 1.7.2'
22
- s.add_runtime_dependency 'sinatra', '~> 1.4.4'
19
+ s.required_ruby_version = '>= 1.9.3'
20
+ s.add_runtime_dependency 'encryptor'
21
+ s.add_runtime_dependency 'memcached'
22
+ s.add_runtime_dependency 'sinatra'
23
23
  end
24
24
 
@@ -1,5 +1,4 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
3
  - 1.9.3
5
4
  - 2.0.0
@@ -1,11 +1,17 @@
1
1
  # Yopass changelog
2
2
 
3
+ ### 2.1.0
4
+
5
+ * remove /get part from URLs
6
+ * copy to clipboard for URLs
7
+
3
8
  ### 2.0.0
4
9
 
5
10
  * Rename `http_base_url` to base_url
6
11
  * Move configuration settings to environment variables
7
12
  * Use thin as webserver
8
13
  * Bump rspec version
14
+ * Drop ruby 1.8.7 support
9
15
 
10
16
  ### 1.1.5
11
17
  * Ability to configure secret_max_length in yopass.yaml
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- yopass (1.1.5)
5
- encryptor (~> 1.3.0)
6
- memcached (~> 1.7.2)
7
- sinatra (~> 1.4.4)
4
+ yopass (2.1.0)
5
+ encryptor
6
+ memcached
7
+ sinatra
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
@@ -14,7 +14,7 @@ GEM
14
14
  diff-lcs (1.2.5)
15
15
  encryptor (1.3.0)
16
16
  eventmachine (1.0.3)
17
- memcached (1.7.2)
17
+ memcached (1.8.0)
18
18
  multi_json (1.10.1)
19
19
  rack (1.5.2)
20
20
  rack-protection (1.5.3)
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # YoPass - Share Secrets Securely
2
- [![Build Status](https://travis-ci.org/JHaals/yopass.png?branch=master)](https://travis-ci.org/JHaals/yopass)
2
+ [![Build Status](https://travis-ci.org/jhaals/yopass.png?branch=master)](https://travis-ci.org/jhaals/yopass)
3
3
 
4
4
  YoPass is a website for sharing secrets in a quick and secure manner.
5
5
  This project is created to minimize the amount of passwords floating around in ticket management systems, IRC logs and emails. YoPass generates a one-time URL with an expiration date so you don't have to worry about passwords being visible forever
@@ -11,18 +11,7 @@ This project is created to minimize the amount of passwords floating around in t
11
11
  * Secrets self destruct after X hours
12
12
  * Decryption key can be sent over SMS
13
13
 
14
- #### Workflow
15
- * Generate secret/password
16
- * Paste into the yopass website
17
- * Receive URL with or without the decryption key(can be transfered over other channel such as SMS)
18
- * Share with the intended person
19
- * Secret is automatically removed once viewed
20
- * Feel safe
21
-
22
14
  ### Installation / Configuration
23
- YoPass Docker container available [here](https://hub.docker.com/u/jhaals/yopass)
24
-
25
- Otherwise:
26
15
 
27
16
  gem install yopass
28
17
 
@@ -36,6 +25,14 @@ Most settings can be configured with environment variables.
36
25
  YOPASS_BASE_URL='https://yopass.mydomain.com'
37
26
  YOPASS_MEMCACHED_URL='memcached_address'
38
27
 
28
+
29
+ ### Run in docker container
30
+ YoPass Docker container available [here](https://hub.docker.com/u/jhaals/yopass)
31
+
32
+ make sure to change `YOPASS_BASE_URL`
33
+
34
+ docker run -e "RACK_ENV=production" -e "YOPASS_BASE_URL=http://192.168.59.105:4567" -p 4567:4567 -d jhaals/yopass
35
+
39
36
  ### SMS providers
40
37
 
41
38
  Lacking your SMS provider? Just fork the repo and submit a pull request.
@@ -1,23 +1,31 @@
1
1
  <%= erb :header %>
2
- <form role="form" method="get" autocomplete="off">
3
2
  <p>This secret require a decryption key. Please enter it in the field below</p>
4
3
  <div class="ui form segment">
5
4
  <div class="field">
6
5
  <label>Decryption key</label>
7
6
  <div class="ui left labeled icon input">
8
- <input type="password" name="p">
7
+ <input type="text" name="p" id="p">
9
8
  <i class="lock icon"></i>
10
9
  <div class="ui corner label">
11
10
  <i class="icon asterisk"></i>
12
11
  </div>
13
12
  </div>
14
13
  </div>
15
- <input type="hidden" name="k" value="<%=key%>" hidden="true">
14
+ <input type="hidden" id="k" name="k" value="<%=key%>" hidden="true">
16
15
  <div class="ui error message">
17
16
  <div class="header">We noticed some issues</div>
18
17
  </div>
19
- <button type="submit" class="ui blue submit button">Decrypt Secret</button>
18
+ <button id="redirect" type="submit" class="ui blue submit button">Decrypt Secret</button>
20
19
  </div>
21
- </form>
22
-
23
- <%= erb :footer %>
20
+ <script>
21
+ $(document).ready(function() {
22
+ $("#redirect").click(function() {
23
+ var key = $("#k").val()
24
+ var decryption_key = $("#p").val()
25
+ if(key && decryption_key) {
26
+ window.location.href = key + '/' + decryption_key;
27
+ };
28
+ });
29
+ })
30
+ </script>
31
+ <%= erb :footer %>
@@ -1,6 +1,9 @@
1
1
  <%= erb :header %>
2
2
 
3
3
  <div class="ui form segment">
4
+ <% if !error.nil? %>
5
+ <div class="ui red message"><%=error%></div>
6
+ <% end %>
4
7
  <div class="ui error message"></div>
5
8
  <p>Submit your secret and receive a one time view url</p>
6
9
  <form role="form" method="post">
@@ -1,8 +1,87 @@
1
1
  <%= erb :header %>
2
2
  <h2>URL for your secret</h2>
3
- <p><b><%=url%></b></p>
4
- <p>Your secret can only be viewed ONCE, do not open the URL yourself</p>
3
+ Your secret can only be viewed ONCE, do not open the URL yourself
4
+ <table class="ui basic table">
5
+ <tbody>
6
+ <tr>
7
+ <td>URL with decryption key</td>
8
+ <td><%=full_url%></td>
9
+ <td>
10
+ <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
11
+ width="110"
12
+ height="14"
13
+ id="clippy" >
14
+ <param name="movie" value="/flash/clippy.swf"/>
15
+ <param name="allowScriptAccess" value="always" />
16
+ <param name="quality" value="high" />
17
+ <param name="scale" value="noscale" />
18
+ <param NAME="FlashVars" value="text=<%=full_url%>">
19
+ <embed src="/flash/clippy.swf"
20
+ width="110"
21
+ height="15"
22
+ name="clippy"
23
+ quality="high"
24
+ allowScriptAccess="always"
25
+ type="application/x-shockwave-flash"
26
+ pluginspage="http://www.macromedia.com/go/getflashplayer"
27
+ FlashVars="text=<%=full_url%>"/>
28
+ </object>
29
+ </td>
30
+ </tr>
31
+ <tr>
32
+ <td>URL without decryption key</td>
33
+ <td><%=short_url%></td>
34
+ <td>
35
+ <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
36
+ width="110"
37
+ height="14"
38
+ id="clippy" >
39
+ <param name="movie" value="/flash/clippy.swf"/>
40
+ <param name="allowScriptAccess" value="always" />
41
+ <param name="quality" value="high" />
42
+ <param name="scale" value="noscale" />
43
+ <param NAME="FlashVars" value="text=<%=short_url%>">
44
+ <embed src="/flash/clippy.swf"
45
+ width="110"
46
+ height="15"
47
+ name="clippy"
48
+ quality="high"
49
+ allowScriptAccess="always"
50
+ type="application/x-shockwave-flash"
51
+ pluginspage="http://www.macromedia.com/go/getflashplayer"
52
+ FlashVars="text=<%=short_url%>"/>
53
+ </object>
54
+ </td>
55
+ </tr>
56
+ <tr>
57
+ <td>Decryption key</td>
58
+ <td><%=decryption_key%></td>
59
+ <td>
60
+ <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
61
+ width="110"
62
+ height="14"
63
+ id="clippy" >
64
+ <param name="movie" value="/flash/clippy.swf"/>
65
+ <param name="allowScriptAccess" value="always" />
66
+ <param name="quality" value="high" />
67
+ <param name="scale" value="noscale" />
68
+ <param NAME="FlashVars" value="text=<%=decryption_key%>">
69
+ <embed src="/flash/clippy.swf"
70
+ width="110"
71
+ height="15"
72
+ name="clippy"
73
+ quality="high"
74
+ allowScriptAccess="always"
75
+ type="application/x-shockwave-flash"
76
+ pluginspage="http://www.macromedia.com/go/getflashplayer"
77
+ FlashVars="text=<%=decryption_key%>"/>
78
+ </object>
79
+ </td>
80
+ </tr>
81
+ </tbody>
82
+ </table>
83
+
5
84
  <% if key_sent_to_mobile %>
6
- <p>The decryption key is sent to the receiver via sms, dont forget to provide the URL via another channel</p>
85
+ <p>The decryption key is sent to the receiver via SMS, don't forget to provide the URL via another channel</p>
7
86
  <% end %>
8
87
  <%= erb :footer %>
@@ -6,6 +6,7 @@ require 'yaml'
6
6
  require 'uri'
7
7
  require 'yopass/sms_provider'
8
8
 
9
+ # Share your secrets securely
9
10
  class Yopass < Sinatra::Base
10
11
  configure :development do
11
12
  require 'sinatra/reloader'
@@ -23,7 +24,33 @@ class Yopass < Sinatra::Base
23
24
 
24
25
  get '/' do
25
26
  # display mobile number field if send_sms is true
26
- erb :index, :locals => { :send_sms => settings.config['send_sms'] }
27
+ erb :index, locals: { send_sms: settings.config['send_sms'], error: nil }
28
+ end
29
+
30
+ get '/:key' do
31
+ erb :get_secret, locals: { key: params[:key] }
32
+ end
33
+
34
+ get '/:key/:password' do
35
+ # Disable all caching
36
+ headers 'Cache-Control' => 'no-cache, no-store, must-revalidate'
37
+ headers 'Pragma' => 'no-cache'
38
+ headers 'Expires' => '0'
39
+
40
+ begin
41
+ result = settings.mc.get params[:key]
42
+ rescue Memcached::NotFound
43
+ return erb :'404'
44
+ end
45
+ content_type 'text/plain'
46
+
47
+ begin
48
+ result = Encryptor.decrypt(value: result, key: params[:password])
49
+ rescue OpenSSL::Cipher::CipherError
50
+ return 'Invalid decryption key'
51
+ end
52
+ settings.mc.delete params[:key]
53
+ result
27
54
  end
28
55
 
29
56
  post '/' do
@@ -35,28 +62,32 @@ class Yopass < Sinatra::Base
35
62
  # calculate lifetime in secounds
36
63
  lifetime_options = { '1w' => 3600 * 24 * 7,
37
64
  '1d' => 3600 * 24,
38
- '1h' => 3600
39
- }
65
+ '1h' => 3600 }
66
+
40
67
  # Verify that user has posted a valid lifetime
41
68
  return 'Invalid lifetime' unless lifetime_options.include? lifetime
42
69
  return 'No secret submitted' if params[:secret].empty?
43
70
 
44
71
  if params[:secret].length >= settings.config['secret_max_length']
45
- return 'This site is meant to store secrets not novels'
72
+ return erb :index, locals: {
73
+ send_sms: settings.config['send_sms'],
74
+ error: 'This site is meant to store secrets not novels' }
46
75
  end
47
76
 
48
77
  # goes in URL
49
78
  key = SecureRandom.hex
50
- # password goes in URL or via SMS if provider is configured
51
- password = SecureRandom.hex[0..8]
52
- # encrypt secret with generated password
53
- data = Encryptor.encrypt(params[:secret], :key => password)
79
+ # decryption_key goes in URL or via SMS if provider is configured
80
+ decryption_key = SecureRandom.hex[0..8]
81
+ # encrypt secret with generated decryption_key
82
+ data = Encryptor.encrypt(params[:secret], key: decryption_key)
54
83
 
55
84
  # store secret in memcached
56
85
  begin
57
86
  settings.mc.set key, data, lifetime_options[lifetime]
58
87
  rescue Memcached::ServerIsMarkedDead
59
- return "Can't contact memcached"
88
+ return erb :index, locals: {
89
+ send_sms: settings.config['send_sms'],
90
+ error: 'Error: Unable to contact memcached' }
60
91
  end
61
92
 
62
93
  if settings.config['send_sms'] == true && !params[:mobile_number].nil?
@@ -67,44 +98,20 @@ class Yopass < Sinatra::Base
67
98
  settings.config['sms::settings'])
68
99
 
69
100
  unless params[:mobile_number].empty?
70
- # TODO verification
71
- sms.send(mobile_number, password)
72
- return erb :secret_url, :locals => {
73
- :url => URI.join(settings.base_url, "get?k=#{key}"),
74
- :key_sent_to_mobile => true }
101
+ sms.send(mobile_number, decryption_key)
102
+ return erb :secret_url, locals: {
103
+ full_url: URI.join(settings.base_url, key, decryption_key),
104
+ short_url: URI.join(settings.base_url, "get?k=#{key}"),
105
+ decryption_key: decryption_key,
106
+ key_sent_to_mobile: true }
75
107
  end
76
108
  end
77
109
 
78
- erb :secret_url, :locals => {
79
- :url => URI.join(settings.base_url,"get?k=#{key}&p=#{password}"),
80
- :key_sent_to_mobile => false }
110
+ erb :secret_url, locals: {
111
+ full_url: URI.join(settings.base_url, key + '/' + decryption_key),
112
+ short_url: URI.join(settings.base_url, key),
113
+ decryption_key: decryption_key,
114
+ key_sent_to_mobile: false }
81
115
  end
82
-
83
- get '/get' do
84
- # No password added
85
- return erb :get_secret, :locals => {
86
- :key => params[:k] } if params[:p].nil? || params[:p].empty?
87
-
88
- # Disable all caching
89
- headers 'Cache-Control' => 'no-cache, no-store, must-revalidate'
90
- headers 'Pragma' => 'no-cache'
91
- headers 'Expires' => '0'
92
-
93
- begin
94
- result = settings.mc.get params[:k]
95
- rescue Memcached::NotFound
96
- return erb :'404'
97
- end
98
- content_type 'text/plain'
99
-
100
- begin
101
- result = Encryptor.decrypt(:value => result, :key => params[:p])
102
- rescue OpenSSL::Cipher::CipherError
103
- return 'Invalid decryption key'
104
- end
105
- settings.mc.delete params[:k]
106
- result
107
- end
108
-
109
- run! if app_file == $0
116
+ run! if app_file == $PROGRAM_NAME
110
117
  end
@@ -8,7 +8,7 @@ describe 'bulksms' do
8
8
  'username' => 'foobar',
9
9
  'password' => '123',
10
10
  'sender' => 'YoPass')
11
- Bulksms.any_instance.stub(:send).and_return(true)
12
- sms.send('467022123', 'decryption_key').should == true
11
+ allow_any_instance_of(Bulksms).to receive(:send).and_return true
12
+ expect(sms.send('467022123', 'decryption_key')).to be true
13
13
  end
14
14
  end
@@ -1,58 +1,55 @@
1
- #ENV['RACK_ENV'] = 'test'
2
1
  require 'spec_helper'
3
2
 
4
3
  describe 'yopass' do
5
4
 
6
- it 'should give the website' do
5
+ it 'expect give the website' do
7
6
  get '/'
8
- last_response.body.should match /Share Secrets Securely/
7
+ expect(last_response.body).to match(/Share Secrets Securely/)
9
8
  end
10
9
 
11
- it 'should complain about invalid lifetime' do
12
- post '/', params={'lifetime' => 'foo'}
13
- last_response.body.should match /Invalid lifetime/
10
+ it 'expect complain about invalid lifetime' do
11
+ post '/', 'lifetime' => 'foo'
12
+ expect(last_response.body).to match(/Invalid lifetime/)
14
13
  end
15
14
 
16
- it 'should complain about missing secret' do
17
- post '/', params={'lifetime' => '1h', 'secret' => ''}
18
- last_response.body.should match /No secret submitted/
15
+ it 'expect complain about missing secret' do
16
+ post '/', 'lifetime' => '1h', 'secret' => ''
17
+ expect(last_response.body).to match(/No secret submitted/)
19
18
  end
20
19
 
21
- it 'should complain about secret being to long' do
22
- post '/', params={'lifetime' => '1h', 'secret' => "0" * 1000000}
23
- last_response.body.should match /This site is meant to store secrets not novels/
20
+ it 'expect complain about secret being to long' do
21
+ post '/', 'lifetime' => '1h', 'secret' => '0' * 1000000
22
+ expect(last_response.body).to match(/This site is meant to store secrets not novels/)
24
23
  end
25
24
 
26
- it 'should complain about not being able to connect to memcached' do
27
- Memcached.any_instance.stub(:set).and_raise(Memcached::ServerIsMarkedDead)
28
- post '/', params={'lifetime' => '1h', 'secret' => "0" * 100}
29
- last_response.body.should match /Can't contact memcached/
25
+ it 'expect complain about not being able to connect to memcached' do
26
+ allow_any_instance_of(Memcached).to receive(:set).and_raise(Memcached::ServerIsMarkedDead)
27
+ post '/', 'lifetime' => '1h', 'secret' => '0' * 100
28
+ expect(last_response.body).to match(/Unable to contact memcached/)
30
29
  end
31
30
 
32
- it 'should store secret' do
33
- Memcached.any_instance.stub(:set)
34
- post '/', params={'lifetime' => '1h', 'secret' => "0" * 100}
35
- last_response.body.should match /http:\/\/127.0.0.1:4567\/get\?k=/
31
+ it 'expect store secret' do
32
+ allow_any_instance_of(Memcached).to receive(:set).and_return true
33
+ post '/', 'lifetime' => '1h', 'secret' => '0' * 100
34
+ expect(last_response.body).to match(/http:\/\/127.0.0.1:4567/)
36
35
  end
37
36
 
38
- it 'should receive secret' do
39
- Memcached.any_instance.stub(:get).and_return("\xCD\xB6\xA8\xAD\x9A\x9A\xE6\xB2\xB1\\\x8EMULf\xAC")
40
- Memcached.any_instance.stub(:delete)
41
- get '/get?p=mykey&k=123'
42
- last_response.body.should match /hello world/
37
+ it 'expect receive secret' do
38
+ allow_any_instance_of(Memcached).to receive(:get).and_return("\xD5\x9E\xF7\xB1\xA0\xEC\xD6\xBD\xCA\x00nW\xAD\xB3\xF4\xDA")
39
+ allow_any_instance_of(Memcached).to receive(:delete).and_return true
40
+ get '/8937c6de9fb7b0ba9b7652b769743b4e/3af71378a'
41
+ expect(last_response.body).to match(/hello world/)
43
42
  end
44
43
 
45
- it 'should raise Memcached::NotFound' do
46
- Memcached.any_instance.stub(:get).and_raise(Memcached::NotFound)
47
- get '/get?p=mykey&k=123'
48
- last_response.body.should match /Secret does not exist/
44
+ it 'expect raise Memcached::NotFound' do
45
+ allow_any_instance_of(Memcached).to receive(:get).and_raise(Memcached::NotFound)
46
+ get '/mykey/123'
47
+ expect(last_response.body).to match(/Secret does not exist/)
49
48
  end
50
49
 
51
- it 'should complain about invalid decryption key' do
52
- Memcached.any_instance.stub(:get).and_return("\xCD\xB6\xA8\xAD\x9A\x9A\xE6\xB2\xB1\\\x8EMULf\xAC")
53
- Memcached.any_instance.stub(:delete)
54
- get '/get?p=invalid&k=123'
55
- last_response.body.should match /Invalid decryption key/
50
+ it 'expect complain about invalid decryption key' do
51
+ allow_any_instance_of(Memcached).to receive(:get).and_return 'data'
52
+ get '/invalid/123'
53
+ expect(last_response.body).to match(/Invalid decryption key/)
56
54
  end
57
-
58
55
  end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yopass
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johan Haals
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-22 00:00:00.000000000 Z
11
+ date: 2014-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: encryptor
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: 1.3.0
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: 1.3.0
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: memcached
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 1.7.2
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: 1.7.2
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sinatra
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
- version: 1.4.4
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
- version: 1.4.4
54
+ version: '0'
55
55
  description: Web service for sharing secrets more securely
56
56
  email:
57
57
  - jhaals@spotify.com
@@ -73,6 +73,7 @@ files:
73
73
  - conf/config.ru
74
74
  - conf/yopass.yaml
75
75
  - config.ru
76
+ - lib/static/flash/clippy.swf
76
77
  - lib/static/js/jquery.address.js
77
78
  - lib/static/js/jquery.js
78
79
  - lib/static/packaged/css/font.css
@@ -132,7 +133,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
133
  requirements:
133
134
  - - '>='
134
135
  - !ruby/object:Gem::Version
135
- version: 1.8.7
136
+ version: 1.9.3
136
137
  required_rubygems_version: !ruby/object:Gem::Requirement
137
138
  requirements:
138
139
  - - '>='