s7n 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +28 -0
- data/LICENCE +24 -0
- data/README.rdoc +54 -0
- data/Rakefile +67 -0
- data/bin/s7ncli +23 -0
- data/lib/s7n.rb +12 -0
- data/lib/s7n/action.rb +7 -0
- data/lib/s7n/attribute.rb +226 -0
- data/lib/s7n/cipher.rb +110 -0
- data/lib/s7n/configuration.rb +41 -0
- data/lib/s7n/entry.rb +106 -0
- data/lib/s7n/entry_collection.rb +44 -0
- data/lib/s7n/entry_template.rb +10 -0
- data/lib/s7n/exception.rb +116 -0
- data/lib/s7n/file.rb +77 -0
- data/lib/s7n/gpass_file.rb +203 -0
- data/lib/s7n/key.rb +83 -0
- data/lib/s7n/message_catalog.rb +5 -0
- data/lib/s7n/s7n_file.rb +47 -0
- data/lib/s7n/s7ncli.rb +226 -0
- data/lib/s7n/s7ncli/attribute_command.rb +83 -0
- data/lib/s7n/s7ncli/command.rb +215 -0
- data/lib/s7n/s7ncli/entry_collection_command.rb +63 -0
- data/lib/s7n/s7ncli/entry_command.rb +728 -0
- data/lib/s7n/s7ncli/option.rb +101 -0
- data/lib/s7n/secret_generator.rb +30 -0
- data/lib/s7n/undo_stack.rb +7 -0
- data/lib/s7n/unicode_data.rb +29 -0
- data/lib/s7n/utils.rb +37 -0
- data/lib/s7n/version.rb +3 -0
- data/lib/s7n/world.rb +158 -0
- data/po/ja/s7n.po +533 -0
- data/po/s7n.pot +533 -0
- data/s7n.gemspec +30 -0
- data/test/s7n/attribute_test.rb +50 -0
- data/test/s7n/gpass_file_test.rb +169 -0
- data/test/s7n/gpass_file_test/passwords.gps.empty +1 -0
- data/test/s7n/gpass_file_test/passwords.gps.one_entry +2 -0
- data/test/s7n/gpass_file_test/passwords.gps.three_entries +3 -0
- data/test/s7n/gpass_file_test/passwords.gps.with_folders +0 -0
- data/test/s7n/secret_generator_test.rb +29 -0
- data/test/s7n/unicode_data_test.rb +28 -0
- data/test/s7n/world_test.rb +35 -0
- data/test/test_helper.rb +11 -0
- metadata +153 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
s7n (0.1.0)
|
5
|
+
gettext
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
gettext (2.2.0)
|
11
|
+
locale
|
12
|
+
locale (2.0.5)
|
13
|
+
rr (1.0.4)
|
14
|
+
shoulda (3.0.1)
|
15
|
+
shoulda-context (~> 1.0.0)
|
16
|
+
shoulda-matchers (~> 1.0.0)
|
17
|
+
shoulda-context (1.0.0)
|
18
|
+
shoulda-matchers (1.0.0)
|
19
|
+
test-unit (2.4.8)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
rr
|
26
|
+
s7n!
|
27
|
+
shoulda
|
28
|
+
test-unit
|
data/LICENCE
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
Copyright (c) 2009, TAKAO Kouji <kouji@takao7.net>
|
2
|
+
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
4
|
+
modification, are permitted provided that the following conditions are
|
5
|
+
met:
|
6
|
+
|
7
|
+
1. Redistributions of source code must retain the above copyright
|
8
|
+
notice, this list of conditions and the following disclaimer.
|
9
|
+
2. Redistributions in binary form must reproduce the above
|
10
|
+
copyright notice, this list of conditions and the following
|
11
|
+
disclaimer in the documentation and/or other materials
|
12
|
+
provided with the distribution.
|
13
|
+
|
14
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
15
|
+
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
16
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
17
|
+
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
18
|
+
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
19
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
20
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
21
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
22
|
+
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
23
|
+
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
24
|
+
POSSIBILITY OF SUCH DAMAGE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
== s7n - 機密情報を管理するソフトウェア
|
2
|
+
|
3
|
+
s7n(セブンと読みます)は、あるウェブサイトやリモートサーバのパスフレーズ
|
4
|
+
や、クレジットカードの暗証番号などの機密情報を管理するソフトウェアです。
|
5
|
+
修正 BSD ライセンスに従って公開・配布を行っているオープンソースソフトウェ
|
6
|
+
アです。
|
7
|
+
|
8
|
+
機密情報は、マスターキーと呼ばれるパスフレーズを使って、
|
9
|
+
秘密鍵暗号鍵方式の一つを用いて暗号化します。
|
10
|
+
万が一、機密情報を格納しているファイルが盗まれてしまった場合でも、
|
11
|
+
ちょっとやそっとでは機密情報を覗き見ることはできません。
|
12
|
+
|
13
|
+
== ゴール
|
14
|
+
|
15
|
+
s7n は次の目標に向かって開発を進めています。
|
16
|
+
|
17
|
+
* クリップボードを利用せずにアプリケーションへのパスフレーズの入力ができること
|
18
|
+
* pwgen のようなコマンドラインのパスワードジェネレータと同じくらい簡単に新しいパスフレーズを含むアカウント情報を発行できること
|
19
|
+
* GNOME、ncurses やコマンドラインなど、ユーザの好みに合わせて UI を選択できること
|
20
|
+
* Windows、Mac OS X、Linux、iPhone などのさまざまなプラットフォームで動作すること
|
21
|
+
|
22
|
+
== 機能
|
23
|
+
|
24
|
+
* 秘密鍵暗号鍵方式を用いた強固な暗号化
|
25
|
+
* 多彩な編集機能(コピー&ペースト、UNDO/REDOなど)
|
26
|
+
* 簡単便利な検索機能
|
27
|
+
* 組み込みのセキュアパスワードのジェネレータ
|
28
|
+
|
29
|
+
== 動作環境
|
30
|
+
|
31
|
+
* ruby 1.9.3
|
32
|
+
|
33
|
+
以下のライブラリを有効にしておくこと。
|
34
|
+
* readline
|
35
|
+
* openssl
|
36
|
+
|
37
|
+
== インストール
|
38
|
+
|
39
|
+
まず、ruby 1.9.3 をインストールしてください。このとき、readline、openssl
|
40
|
+
ライブラリを有効にしてください。
|
41
|
+
|
42
|
+
$ gem install s7n
|
43
|
+
|
44
|
+
== 開発者
|
45
|
+
|
46
|
+
* 高尾 宏治 <kouji@takao7.net>
|
47
|
+
|
48
|
+
== 連絡先
|
49
|
+
|
50
|
+
s7n に関するお問い合わせは高尾 宏治 <kouji@takao7.net> までお願いします。
|
51
|
+
|
52
|
+
== ライセンス
|
53
|
+
|
54
|
+
LICENCE ファイルを参照してください。
|
data/Rakefile
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'bundler/gem_helper'
|
2
|
+
Bundler::GemHelper.new(Dir.pwd).instance_eval do
|
3
|
+
desc "Build #{name}-#{version}.gem into the pkg directory"
|
4
|
+
task 'build' => [:makemo] do
|
5
|
+
build_gem
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Build and install #{name}-#{version}.gem into system gems"
|
9
|
+
task 'install' do
|
10
|
+
install_gem
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Create tag #{version_tag} and build and push #{name}-#{version}.gem to Rubygems"
|
14
|
+
task 'release' do
|
15
|
+
release_gem
|
16
|
+
end
|
17
|
+
end
|
18
|
+
require "rake"
|
19
|
+
require "rake/testtask"
|
20
|
+
require "rdoc/task"
|
21
|
+
|
22
|
+
require "rubygems"
|
23
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __FILE__)
|
24
|
+
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
|
25
|
+
|
26
|
+
require File.expand_path("../lib/s7n/version", __FILE__)
|
27
|
+
|
28
|
+
Rake::RDocTask.new do |rd|
|
29
|
+
rd.main = "README.rdoc"
|
30
|
+
rd.rdoc_files.include("README.rdoc", "{lib/**/*.rb,ext/**/*.c}")
|
31
|
+
rd.options = ["--line-numbers", "--inline-source", "--title", "s7n",
|
32
|
+
"--main", "README.rdoc"]
|
33
|
+
rd.rdoc_dir = "doc/rdoc"
|
34
|
+
end
|
35
|
+
|
36
|
+
GETTEXT_TEXT_DOMAIN = "s7n"
|
37
|
+
GETTEXT_TARGETS = Dir.glob("{bin/s7ncli,lib/**/*.rb}")
|
38
|
+
|
39
|
+
desc "Create pot file"
|
40
|
+
task :makepot do
|
41
|
+
require "gettext/tools"
|
42
|
+
GetText::RGetText.run(GETTEXT_TARGETS, "po/s7n.pot")
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "Update pot/po files."
|
46
|
+
task :updatepo do
|
47
|
+
require "gettext/tools"
|
48
|
+
GetText.update_pofiles(GETTEXT_TEXT_DOMAIN,
|
49
|
+
GETTEXT_TARGETS,
|
50
|
+
[GETTEXT_TEXT_DOMAIN, S7n::VERSION].join(" "))
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Create mo-files"
|
54
|
+
task :makemo do
|
55
|
+
require 'gettext/tools'
|
56
|
+
GetText.create_mofiles(verbose: true)
|
57
|
+
end
|
58
|
+
|
59
|
+
Rake::TestTask.new do |t|
|
60
|
+
require "test-unit"
|
61
|
+
|
62
|
+
t.libs << "lib"
|
63
|
+
t.libs << "test"
|
64
|
+
t.test_files = FileList["test/**/*_{helper,test}.rb"]
|
65
|
+
end
|
66
|
+
|
67
|
+
task :default => :test
|
data/bin/s7ncli
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __FILE__)
|
6
|
+
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
|
7
|
+
|
8
|
+
$:.unshift(File.expand_path("../../lib", __FILE__))
|
9
|
+
|
10
|
+
require "gettext"
|
11
|
+
|
12
|
+
require "s7n"
|
13
|
+
require "s7n/s7ncli"
|
14
|
+
|
15
|
+
include S7n
|
16
|
+
|
17
|
+
path = File.expand_path("../data/locale/", File.dirname(__FILE__))
|
18
|
+
GetText.bindtextdomain("s7n", :path => path)
|
19
|
+
S7nCli.run(ARGV)
|
20
|
+
|
21
|
+
# Local Variables:
|
22
|
+
# mode: ruby
|
23
|
+
# End:
|
data/lib/s7n.rb
ADDED
data/lib/s7n/action.rb
ADDED
@@ -0,0 +1,226 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "date"
|
4
|
+
require "gettext"
|
5
|
+
|
6
|
+
module S7n
|
7
|
+
# 属性を表現する。
|
8
|
+
class Attribute
|
9
|
+
include GetText
|
10
|
+
|
11
|
+
# サポートしている属性のクラス。
|
12
|
+
@@attribute_classes = {}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def create_instance(type, options)
|
16
|
+
return @@attribute_classes[type].new(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
# 属性の型名の配列を返す。
|
20
|
+
def types
|
21
|
+
return @@attribute_classes.keys
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def type(name)
|
27
|
+
@@attribute_classes[name] = self
|
28
|
+
self.const_set("TYPE", name)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# 名前。
|
33
|
+
attr_accessor :name
|
34
|
+
|
35
|
+
# 機密情報かどうか。true であれば機密情報、false であればそうでない。
|
36
|
+
attr_accessor :secret
|
37
|
+
|
38
|
+
# 値を編集できるかどうか。true であれば編集でき、false であれ
|
39
|
+
# ばそうでない。
|
40
|
+
attr_accessor :editabled
|
41
|
+
|
42
|
+
# 削除できるかどうか。true であれば削除できず、false であれ
|
43
|
+
# ばそうでない。
|
44
|
+
attr_accessor :protected
|
45
|
+
|
46
|
+
def initialize(options)
|
47
|
+
self.name = options["name"]
|
48
|
+
self.value = options["value"]
|
49
|
+
self.secret = options["secret"] ? true : false
|
50
|
+
if options.key?("editabled")
|
51
|
+
self.editabled = options["editabled"] ? true : false
|
52
|
+
else
|
53
|
+
self.editabled = true
|
54
|
+
end
|
55
|
+
self.protected = options["protected"] ? true : false
|
56
|
+
end
|
57
|
+
|
58
|
+
# value を取得する。
|
59
|
+
def value
|
60
|
+
if @value.nil?
|
61
|
+
return nil
|
62
|
+
else
|
63
|
+
return get_value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# value を設定する。
|
68
|
+
def value=(val)
|
69
|
+
if val.nil?
|
70
|
+
@value = val
|
71
|
+
else
|
72
|
+
set_value(val)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# 属性の型を取得する。
|
77
|
+
def type
|
78
|
+
return self.class.const_get("TYPE")
|
79
|
+
end
|
80
|
+
|
81
|
+
# 機密情報かどうかを取得する。
|
82
|
+
# 機密情報の場合、true を返す。そうでなれば false を返す。
|
83
|
+
def secret?
|
84
|
+
return secret ? true : false
|
85
|
+
end
|
86
|
+
|
87
|
+
# ユーザによる値の編集ができるかどうかを取得する。
|
88
|
+
# 編集できる場合、true を返す。そうでなければ true を返す。
|
89
|
+
def editable?
|
90
|
+
return editabled ? true : false
|
91
|
+
end
|
92
|
+
|
93
|
+
# ユーザによる削除ができるかどうかを取得する。
|
94
|
+
# 削除できる場合、true を返す。そうでなければ true を返す。
|
95
|
+
def protected?
|
96
|
+
return protected ? true : false
|
97
|
+
end
|
98
|
+
|
99
|
+
# value を表示するために文字列に変換する。
|
100
|
+
# このとき、 secret が true であれば「*」でマスクする。
|
101
|
+
def display_value(secret = @secret)
|
102
|
+
if secret
|
103
|
+
return "*" * value.to_s.length
|
104
|
+
else
|
105
|
+
return value.to_s
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def get_value
|
112
|
+
return @value
|
113
|
+
end
|
114
|
+
|
115
|
+
def set_value(val)
|
116
|
+
@value = val
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# 文字列の属性を表現する。
|
121
|
+
class TextAttribute < Attribute
|
122
|
+
type("text")
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def get_value
|
127
|
+
return @value.to_s.force_encoding("utf-8")
|
128
|
+
end
|
129
|
+
|
130
|
+
def set_value(val)
|
131
|
+
@value = val.to_s.dup.force_encoding("utf-8")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# 数値の属性を表現する。
|
136
|
+
class NumericAttribute < Attribute
|
137
|
+
type("numeric")
|
138
|
+
|
139
|
+
private
|
140
|
+
|
141
|
+
def get_value
|
142
|
+
return @value.to_i
|
143
|
+
end
|
144
|
+
|
145
|
+
def set_value(val)
|
146
|
+
@value = val.to_i
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# 真偽値の属性を表現する。
|
151
|
+
class BooleanAttribute < Attribute
|
152
|
+
type("boolean")
|
153
|
+
|
154
|
+
# value を表示するために文字列に変換する。
|
155
|
+
# secret が true であれば「*」を返す。
|
156
|
+
# そうでなければ、Yes か No を返す。
|
157
|
+
def display_value(secret = @secret)
|
158
|
+
if secret
|
159
|
+
return "*"
|
160
|
+
else
|
161
|
+
return value ? _("Yes") : _("No")
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
private
|
166
|
+
|
167
|
+
def get_value
|
168
|
+
return @value ? true : false
|
169
|
+
end
|
170
|
+
|
171
|
+
def set_value(val)
|
172
|
+
@value = val ? true : false
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# 日時の属性を表現する。
|
177
|
+
class DateTimeAttribute < Attribute
|
178
|
+
type("datetime")
|
179
|
+
|
180
|
+
# value を表示するために文字列に変換する。
|
181
|
+
# secret が true であれば「*」を返す。
|
182
|
+
# そうでなければ、「%Y/%m/%d %H:%M:%S」でフォーマットした文字列を返す。
|
183
|
+
# また、時分秒が全て0の場合は「%Y/%m/%d」でフォーマットする。
|
184
|
+
def display_value(secret = @secret)
|
185
|
+
if secret
|
186
|
+
return "*"
|
187
|
+
else
|
188
|
+
format = "%Y/%m/%d"
|
189
|
+
if value.hour != 0 || value.min != 0 || value.sec != 0
|
190
|
+
format << " %H:%M:%S"
|
191
|
+
end
|
192
|
+
return value.strftime(format)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
private
|
197
|
+
|
198
|
+
def get_value
|
199
|
+
return @value.to_datetime
|
200
|
+
end
|
201
|
+
|
202
|
+
def set_value(val)
|
203
|
+
case val
|
204
|
+
when Time, DateTime, Date
|
205
|
+
@value = val.to_datetime
|
206
|
+
else
|
207
|
+
@value = DateTime.parse(val.to_s)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# ファイルの属性を表現する。
|
213
|
+
class FileAttribute < Attribute
|
214
|
+
type("file")
|
215
|
+
end
|
216
|
+
|
217
|
+
# 画像の属性を表現する。
|
218
|
+
class FigureAttribute < FileAttribute
|
219
|
+
type("figure")
|
220
|
+
end
|
221
|
+
|
222
|
+
# 不明な属性を表現する。
|
223
|
+
class UnknownAttribute < Attribute
|
224
|
+
type("unknown")
|
225
|
+
end
|
226
|
+
end
|