Class: S7n::File

Inherits:
Object
  • Object
show all
Defined in:
lib/s7n/file.rb

Constant Summary collapse

VERSION =

パスワードコレクションのファイルのバージョン。

"1.1.0"
MAGIC =

パスワードコレクションの先頭記述するマジック文字列。

"GPassFile version #{VERSION}"
IV =

Cipherで使用するIV(Initial Vector)

[5, 23, 1, 123, 12, 3, 54, 94].pack("C8")

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, passphrase) ⇒ File

Returns a new instance of File.



62
63
64
65
66
67
68
# File 'lib/s7n/file.rb', line 62

def initialize(path, passphrase)
  self.path = ::File.expand_path(path)
  self.key = S7n::Key.create_instance("SHA-1", passphrase)
  self.cipher = S7n::Cipher.create_instance("BF-CBC", :key => key,
                                            :iv => S7n::File::IV)
  self.file = nil
end

Instance Attribute Details

#cipherObject

キーとIVから生成したCipher。



57
58
59
# File 'lib/s7n/file.rb', line 57

def cipher
  @cipher
end

#fileObject

操作対象のファイル。



60
61
62
# File 'lib/s7n/file.rb', line 60

def file
  @file
end

#keyObject

パスフレーズから生成したCipher用のキー。



54
55
56
# File 'lib/s7n/file.rb', line 54

def key
  @key
end

#pathObject

パスワードコレクションのパス。



51
52
53
# File 'lib/s7n/file.rb', line 51

def path
  @path
end

Class Method Details

.create(path, passphrase) ⇒ Object

パスワードコレクションを格納するファイルを作成する。

path

作成するファイルのパスを文字列で指定する。

passphrase

ファイルを暗号化するマスターパスフレーズを 文字列で指定する。

すでにファイルが存在した場合、例外を発生させる。



20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/s7n/file.rb', line 20

def self.create(path, passphrase)
  path = ::File.expand_path(path)
  if ::File.exist?(path)
    raise S7n::Exception, "already exist file or directory: #{path}"
  end
  ::File.open(path, "w") do |f|
    key = S7n::Key.create_instance("SHA-1", passphrase)
    cipher =
      S7n::Cipher.create_instance("BF-CBC", :key => key, :iv => S7::File::IV)
    magic = cipher.encrypt(StringIO.new(S7n::File::MAGIC))
    f.write(magic)
  end
end

.open(path, passphrase) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/s7n/file.rb', line 34

def self.open(path, passphrase)
  path = ::File.expand_path(path)
  if !::File.exist?(path)
    raise S7n::Exception, "no such file or directory: #{path}"
  end
  if !block_given?
    raise ArgumentError, "no block given"
  end
  begin
    f = self.new(path, passphrase)
    yield(f)
  ensure
    f.close
  end
end

Instance Method Details

#closeObject

ファイルを閉じる。



71
72
73
74
75
# File 'lib/s7n/file.rb', line 71

def close
  if self.file
    self.file.close
  end
end