s7n 0.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.
- 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
|