Class: Netrc
- Inherits:
-
Object
show all
- Defined in:
- lib/netrc.rb
Defined Under Namespace
Classes: Entry, Error, TokenArray
Constant Summary
collapse
- VERSION =
"0.11.0"
- WINDOWS =
RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/
- CYGWIN =
RbConfig::CONFIG["host_os"] =~ /cygwin/
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(path, data) ⇒ Netrc
Returns a new instance of Netrc.
166
167
168
169
170
171
172
173
174
175
176
|
# File 'lib/netrc.rb', line 166
def initialize(path, data)
@new_item_prefix = ''
@path = path
@pre, @data = data
if @data && @data.last && :default == @data.last[0]
@default = @data.pop
else
@default = nil
end
end
|
Instance Attribute Details
#new_item_prefix ⇒ Object
Returns the value of attribute new_item_prefix.
178
179
180
|
# File 'lib/netrc.rb', line 178
def new_item_prefix
@new_item_prefix
end
|
Class Method Details
.check_permissions(path) ⇒ Object
42
43
44
45
46
47
|
# File 'lib/netrc.rb', line 42
def self.check_permissions(path)
perm = File.stat(path).mode & 0777
if perm != 0600 && !(WINDOWS) && !(Netrc.config[:allow_permissive_netrc_file])
raise Error, "Permission bits for '#{path}' should be 0600, but are "+perm.to_s(8)
end
end
|
.config ⇒ Object
33
34
35
|
# File 'lib/netrc.rb', line 33
def self.config
@config ||= {}
end
|
37
38
39
40
|
# File 'lib/netrc.rb', line 37
def self.configure
yield(self.config) if block_given?
self.config
end
|
.default_path ⇒ Object
10
11
12
|
# File 'lib/netrc.rb', line 10
def self.default_path
File.join(ENV['NETRC'] || home_path, netrc_filename)
end
|
.home_path ⇒ Object
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'lib/netrc.rb', line 14
def self.home_path
home = Dir.respond_to?(:home) ? Dir.home : ENV['HOME']
if WINDOWS && !CYGWIN
home ||= File.join(ENV['HOMEDRIVE'], ENV['HOMEPATH']) if ENV['HOMEDRIVE'] && ENV['HOMEPATH']
home ||= ENV['USERPROFILE']
home = home.tr("\\", "/") unless home.nil?
end
(home && File.readable?(home)) ? home : Dir.pwd
rescue ArgumentError
return Dir.pwd
end
|
.lex(lines) ⇒ Object
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
# File 'lib/netrc.rb', line 85
def self.lex(lines)
tokens = TokenArray.new
for line in lines
content, = line.split(/(\s*#.*)/m)
content.each_char do |char|
case char
when /\s/
if tokens.last && tokens.last[-1..-1] =~ /\s/
tokens.last << char
else
tokens << char
end
else
if tokens.last && tokens.last[-1..-1] =~ /\S/
tokens.last << char
else
tokens << char
end
end
end
if
tokens <<
end
end
tokens
end
|
.netrc_filename ⇒ Object
29
30
31
|
# File 'lib/netrc.rb', line 29
def self.netrc_filename
WINDOWS && !CYGWIN ? "_netrc" : ".netrc"
end
|
.parse(ts) ⇒ Object
Returns two values, a header and a list of items. Each item is a tuple, containing some or all of:
-
machine keyword (including trailing whitespace+comments)
-
machine name
-
login keyword (including surrounding whitespace+comments)
-
login
-
password keyword (including surrounding whitespace+comments)
-
password
-
trailing chars
This lets us change individual fields, then write out the file with all its original formatting.
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
# File 'lib/netrc.rb', line 129
def self.parse(ts)
cur, item = [], []
unless ts.is_a?(TokenArray)
ts = TokenArray.new(ts)
end
pre = ts.readto{|t| t == "machine" || t == "default"}
while ts.length > 0
if ts[0] == 'default'
cur << ts.take.to_sym
cur << ''
else
cur << ts.take + ts.readto{|t| ! skip?(t)}
cur << ts.take
end
if ts.include?('login')
cur << ts.readto{|t| t == "login"} + ts.take + ts.readto{|t| ! skip?(t)}
cur << ts.take
end
if ts.include?('password')
cur << ts.readto{|t| t == "password"} + ts.take + ts.readto{|t| ! skip?(t)}
cur << ts.take
end
cur << ts.readto{|t| t == "machine" || t == "default"}
item << cur
cur = []
end
[pre, item]
end
|
.read(path = default_path) ⇒ Object
Reads path and parses it as a .netrc file. If path doesn’t exist, returns an empty object. Decrypt paths ending in .gpg.
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# File 'lib/netrc.rb', line 51
def self.read(path=default_path)
check_permissions(path)
data = if path =~ /\.gpg$/
decrypted = `gpg --batch --quiet --decrypt #{path}`
if $?.success?
decrypted
else
raise Error.new("Decrypting #{path} failed.") unless $?.success?
end
else
File.read(path)
end
new(path, parse(lex(data.lines.to_a)))
rescue Errno::ENOENT
new(path, parse(lex([])))
end
|
.skip?(s) ⇒ Boolean
112
113
114
|
# File 'lib/netrc.rb', line 112
def self.skip?(s)
s =~ /^\s/
end
|
Instance Method Details
#[](k) ⇒ Object
180
181
182
183
184
185
186
|
# File 'lib/netrc.rb', line 180
def [](k)
if item = @data.detect {|datum| datum[1] == k}
Entry.new(item[3], item[5])
elsif @default
Entry.new(@default[3], @default[5])
end
end
|
#[]=(k, info) ⇒ Object
188
189
190
191
192
193
194
|
# File 'lib/netrc.rb', line 188
def []=(k, info)
if item = @data.detect {|datum| datum[1] == k}
item[3], item[5] = info
else
@data << new_item(k, info[0], info[1])
end
end
|
#delete(key) ⇒ Object
200
201
202
203
204
205
206
207
208
209
|
# File 'lib/netrc.rb', line 200
def delete(key)
datum = nil
for value in @data
if value[1] == key
datum = value
break
end
end
@data.delete(datum)
end
|
#each(&block) ⇒ Object
211
212
213
|
# File 'lib/netrc.rb', line 211
def each(&block)
@data.each(&block)
end
|
#length ⇒ Object
196
197
198
|
# File 'lib/netrc.rb', line 196
def length
@data.length
end
|
#new_item(m, l, p) ⇒ Object
215
216
217
|
# File 'lib/netrc.rb', line 215
def new_item(m, l, p)
[new_item_prefix+"machine ", m, "\n login ", l, "\n password ", p, "\n"]
end
|
#save ⇒ Object
219
220
221
222
223
224
225
226
227
228
229
230
231
|
# File 'lib/netrc.rb', line 219
def save
if @path =~ /\.gpg$/
e = IO.popen("gpg -a --batch --default-recipient-self -e", "r+") do |gpg|
gpg.puts(unparse)
gpg.close_write
gpg.read
end
raise Error.new("Encrypting #{@path} failed.") unless $?.success?
File.open(@path, 'w', 0600) {|file| file.print(e)}
else
File.open(@path, 'w', 0600) {|file| file.print(unparse)}
end
end
|
#unparse ⇒ Object
233
234
235
236
237
238
239
240
241
242
|
# File 'lib/netrc.rb', line 233
def unparse
@pre + @data.map do |datum|
datum = datum.join
unless datum[-1..-1] == "\n"
datum << "\n"
else
datum
end
end.join
end
|