icfs 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/icfs_demo_fcgi.rb +2 -0
- data/{bin/icfs_demo_ssl_gen.rb → devel/demo/ssl_gen.rb} +25 -13
- data/devel/demo/ssl_gen.yml +14 -0
- data/devel/icfs-wrk/Dockerfile +1 -1
- data/devel/run/base.rb +92 -0
- data/devel/run/copy-s3.rb +2 -0
- data/devel/run/email.rb +36 -0
- data/devel/run/email_imap.rb +43 -0
- data/devel/run/email_smime.rb +47 -0
- data/devel/run/init-icfs.rb +2 -0
- data/devel/run/webrick.rb +5 -57
- data/lib/icfs/api.rb +101 -90
- data/lib/icfs/cache.rb +2 -0
- data/lib/icfs/cache_elastic.rb +127 -125
- data/lib/icfs/{web/config.rb → config.rb} +3 -3
- data/lib/icfs/{web/config_redis.rb → config_redis.rb} +8 -8
- data/lib/icfs/{web/config_s3.rb → config_s3.rb} +8 -8
- data/lib/icfs/demo/auth.rb +5 -7
- data/lib/icfs/demo/static.rb +2 -0
- data/lib/icfs/elastic.rb +10 -8
- data/lib/icfs/email/basic.rb +242 -0
- data/lib/icfs/email/core.rb +293 -0
- data/lib/icfs/email/from.rb +52 -0
- data/lib/icfs/email/imap.rb +148 -0
- data/lib/icfs/email/smime.rb +139 -0
- data/lib/icfs/items.rb +5 -3
- data/lib/icfs/store.rb +20 -18
- data/lib/icfs/store_fs.rb +7 -5
- data/lib/icfs/store_s3.rb +4 -2
- data/lib/icfs/users.rb +5 -3
- data/lib/icfs/users_fs.rb +8 -6
- data/lib/icfs/users_redis.rb +12 -10
- data/lib/icfs/users_s3.rb +6 -4
- data/lib/icfs/utils/backup.rb +30 -29
- data/lib/icfs/utils/check.rb +36 -34
- data/lib/icfs/validate.rb +24 -15
- data/lib/icfs/web/auth_ssl.rb +7 -9
- data/lib/icfs/web/client.rb +671 -679
- data/lib/icfs.rb +174 -10
- metadata +16 -7
- data/devel/devel-webrick.yml +0 -49
data/lib/icfs/users_s3.rb
CHANGED
@@ -9,6 +9,8 @@
|
|
9
9
|
# This program is distributed WITHOUT ANY WARRANTY; without even the
|
10
10
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
11
11
|
|
12
|
+
# frozen_string_literal: true
|
13
|
+
|
12
14
|
require 'aws-sdk-s3'
|
13
15
|
|
14
16
|
module ICFS
|
@@ -28,7 +30,7 @@ class UsersS3 < Users
|
|
28
30
|
def initialize(s3, bucket, prefix=nil)
|
29
31
|
@s3 = s3
|
30
32
|
@bck = bucket
|
31
|
-
@pre = prefix || ''
|
33
|
+
@pre = prefix || ''
|
32
34
|
end
|
33
35
|
|
34
36
|
|
@@ -36,7 +38,7 @@ class UsersS3 < Users
|
|
36
38
|
# Where to store user
|
37
39
|
#
|
38
40
|
def _path(user)
|
39
|
-
@pre + user + '.json'
|
41
|
+
@pre + user + '.json'
|
40
42
|
end # def _path()
|
41
43
|
private :_path
|
42
44
|
|
@@ -51,7 +53,7 @@ class UsersS3 < Users
|
|
51
53
|
# (see Users#read)
|
52
54
|
#
|
53
55
|
def read(urg)
|
54
|
-
Items.validate(urg, 'User/Role/Group name'
|
56
|
+
Items.validate(urg, 'User/Role/Group name', Items::FieldUsergrp)
|
55
57
|
json = @s3.get_object( bucket: @bck, key: _path(urg) ).body.read
|
56
58
|
return JSON.parse(json)
|
57
59
|
rescue
|
@@ -63,7 +65,7 @@ class UsersS3 < Users
|
|
63
65
|
# (see Users#write)
|
64
66
|
#
|
65
67
|
def write(obj)
|
66
|
-
Items.validate(obj, 'User/Role/Group'
|
68
|
+
Items.validate(obj, 'User/Role/Group', Users::ValUser)
|
67
69
|
json = JSON.pretty_generate(obj)
|
68
70
|
@s3.put_object( bucket: @bck, key: _path(obj['name']), body: json )
|
69
71
|
end # def write()
|
data/lib/icfs/utils/backup.rb
CHANGED
@@ -9,9 +9,10 @@
|
|
9
9
|
# This program is distributed WITHOUT ANY WARRANTY; without even the
|
10
10
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
11
11
|
|
12
|
+
# frozen_string_literal: true
|
13
|
+
|
12
14
|
require_relative '../store_fs'
|
13
15
|
|
14
|
-
#
|
15
16
|
module ICFS
|
16
17
|
|
17
18
|
module Utils
|
@@ -40,12 +41,12 @@ class Backup
|
|
40
41
|
# Copy an item
|
41
42
|
#
|
42
43
|
def _copy_item(dest, title, read, write, args, val=nil)
|
43
|
-
@log.debug('ICFS copy: %s'
|
44
|
+
@log.debug('ICFS copy: %s' % title)
|
44
45
|
|
45
46
|
# read the item
|
46
47
|
json = @store.send(read, *args)
|
47
48
|
if !json
|
48
|
-
@log.warn('ICFS copy: %s is missing'
|
49
|
+
@log.warn('ICFS copy: %s is missing' % title)
|
49
50
|
return nil
|
50
51
|
end
|
51
52
|
|
@@ -54,7 +55,7 @@ class Backup
|
|
54
55
|
obj = JSON.parse(json)
|
55
56
|
err = Validate.check(obj, val)
|
56
57
|
if err
|
57
|
-
@log.error('ICFS copy: %s bad format'
|
58
|
+
@log.error('ICFS copy: %s bad format' % title)
|
58
59
|
return nil
|
59
60
|
end
|
60
61
|
end
|
@@ -64,7 +65,7 @@ class Backup
|
|
64
65
|
return obj
|
65
66
|
|
66
67
|
rescue JSON::ParserError
|
67
|
-
@log.error('ICFS copy: %s bad JSON'
|
68
|
+
@log.error('ICFS copy: %s bad JSON' % title)
|
68
69
|
return nil
|
69
70
|
end # def _item
|
70
71
|
private :_copy_item
|
@@ -79,17 +80,17 @@ class Backup
|
|
79
80
|
# @param lnum_min [Integer] The lowest log
|
80
81
|
#
|
81
82
|
def copy(cid, dest, lnum_min=1, lnum_max=0)
|
82
|
-
@log.info('ICFS copy: %s %d-%d'
|
83
|
+
@log.info('ICFS copy: %s %d-%d' % [cid, lnum_min, lnum_max])
|
83
84
|
|
84
85
|
# if no max specified, pull from current
|
85
86
|
if lnum_max == 0
|
86
87
|
json = @cache.current_read(cid)
|
87
|
-
cur = Items.parse(json, 'current'
|
88
|
+
cur = Items.parse(json, 'current', Items::ItemCurrent)
|
88
89
|
lnum_max = cur['log']
|
89
90
|
end
|
90
91
|
|
91
92
|
if lnum_min > lnum_max
|
92
|
-
raise ArgumentError, 'ICFS copy, log num min is larger than max'
|
93
|
+
raise ArgumentError, 'ICFS copy, log num min is larger than max'
|
93
94
|
end
|
94
95
|
|
95
96
|
# each log
|
@@ -98,7 +99,7 @@ class Backup
|
|
98
99
|
|
99
100
|
# copy the log
|
100
101
|
log = _copy_item(dest,
|
101
|
-
'log %d'
|
102
|
+
'log %d' % lnum,
|
102
103
|
:log_read,
|
103
104
|
:log_write,
|
104
105
|
[cid, lnum],
|
@@ -112,7 +113,7 @@ class Backup
|
|
112
113
|
# entry
|
113
114
|
enum = log['entry']['num']
|
114
115
|
_copy_item(dest,
|
115
|
-
'entry %d-%d'
|
116
|
+
'entry %d-%d' % [enum, lnum],
|
116
117
|
:entry_read,
|
117
118
|
:entry_write,
|
118
119
|
[cid, enum, lnum]
|
@@ -122,7 +123,7 @@ class Backup
|
|
122
123
|
if log['index']
|
123
124
|
xnum = log['index']['num']
|
124
125
|
_copy_item(dest,
|
125
|
-
'index %d-%d'
|
126
|
+
'index %d-%d' % [xnum, lnum],
|
126
127
|
:index_read,
|
127
128
|
:index_write,
|
128
129
|
[cid, xnum, lnum]
|
@@ -133,7 +134,7 @@ class Backup
|
|
133
134
|
if log['action']
|
134
135
|
anum = log['action']['num']
|
135
136
|
_copy_item(dest,
|
136
|
-
'action %d-%d'
|
137
|
+
'action %d-%d' % [anum, lnum],
|
137
138
|
:action_read,
|
138
139
|
:action_write,
|
139
140
|
[cid, anum, lnum]
|
@@ -143,7 +144,7 @@ class Backup
|
|
143
144
|
# case
|
144
145
|
if log['case_hash']
|
145
146
|
_copy_item(dest,
|
146
|
-
'case %d'
|
147
|
+
'case %d' % lnum,
|
147
148
|
:case_read,
|
148
149
|
:case_write,
|
149
150
|
[cid, lnum]
|
@@ -155,12 +156,12 @@ class Backup
|
|
155
156
|
log['files_hash'].each_index do |fraw|
|
156
157
|
fnum = fraw + 1
|
157
158
|
|
158
|
-
@log.debug('ICFS copy: file %d-%d-%d'
|
159
|
+
@log.debug('ICFS copy: file %d-%d-%d' % [enum, lnum, fnum])
|
159
160
|
|
160
161
|
# read
|
161
162
|
fi = @store.file_read(cid, enum, lnum, fnum)
|
162
163
|
if !fi
|
163
|
-
@log.warn('ICFS copy: file %d-%d-%d missing'
|
164
|
+
@log.warn('ICFS copy: file %d-%d-%d missing' %
|
164
165
|
[enum, lnum, fnum])
|
165
166
|
next
|
166
167
|
end
|
@@ -185,12 +186,12 @@ class Backup
|
|
185
186
|
# Restore an item
|
186
187
|
#
|
187
188
|
def _restore_item(src, title, read, write, args_st, args_ca, val=nil)
|
188
|
-
@log.debug('ICFS restore: %s'
|
189
|
+
@log.debug('ICFS restore: %s' % title)
|
189
190
|
|
190
191
|
# read the item
|
191
192
|
json = src.send(read, *args_st)
|
192
193
|
if !json
|
193
|
-
@log.warn('ICFS restore: %s is missing'
|
194
|
+
@log.warn('ICFS restore: %s is missing' % title)
|
194
195
|
return nil
|
195
196
|
end
|
196
197
|
|
@@ -199,7 +200,7 @@ class Backup
|
|
199
200
|
obj = JSON.parse(json)
|
200
201
|
err = Validate.check(obj, val)
|
201
202
|
if err
|
202
|
-
@log.error('ICFS restore: %s bad format'
|
203
|
+
@log.error('ICFS restore: %s bad format' % title)
|
203
204
|
return nil
|
204
205
|
end
|
205
206
|
end
|
@@ -222,7 +223,7 @@ class Backup
|
|
222
223
|
# @param lnum_min [Integer] The lowest log
|
223
224
|
#
|
224
225
|
def restore(cid, src, lnum_min=0, lnum_max=0)
|
225
|
-
@log.info('ICFS restore: %s %d-%d'
|
226
|
+
@log.info('ICFS restore: %s %d-%d' % [cid, lnum_min, lnum_max])
|
226
227
|
|
227
228
|
# take lock
|
228
229
|
@cache.lock_take(cid)
|
@@ -231,7 +232,7 @@ class Backup
|
|
231
232
|
# read current
|
232
233
|
json = @cache.current_read(cid)
|
233
234
|
if json
|
234
|
-
cur = Items.parse(json, 'current'
|
235
|
+
cur = Items.parse(json, 'current', Items::ItemCurrent)
|
235
236
|
else
|
236
237
|
cur = {
|
237
238
|
'icfs' => 1,
|
@@ -248,7 +249,7 @@ class Backup
|
|
248
249
|
|
249
250
|
# sanity check min & max
|
250
251
|
if (lnum_min > lnum_max) && (lnum_max != 0)
|
251
|
-
raise ArgumentError: 'ICFS restore, log min is larger than max'
|
252
|
+
raise ArgumentError: 'ICFS restore, log min is larger than max'
|
252
253
|
end
|
253
254
|
|
254
255
|
# max entry, action, index
|
@@ -263,7 +264,7 @@ class Backup
|
|
263
264
|
|
264
265
|
# copy the log
|
265
266
|
log, litem = _restore_item(src,
|
266
|
-
'log %d'
|
267
|
+
'log %d' % lnum,
|
267
268
|
:log_read,
|
268
269
|
:log_write,
|
269
270
|
[cid, lnum],
|
@@ -281,7 +282,7 @@ class Backup
|
|
281
282
|
# entry
|
282
283
|
enum = log['entry']['num']
|
283
284
|
_restore_item(src,
|
284
|
-
'entry %d-%d'
|
285
|
+
'entry %d-%d' % [enum, lnum],
|
285
286
|
:entry_read,
|
286
287
|
:entry_write,
|
287
288
|
[cid, enum, lnum],
|
@@ -293,7 +294,7 @@ class Backup
|
|
293
294
|
if log['index']
|
294
295
|
xnum = log['index']['num']
|
295
296
|
_restore_item(src,
|
296
|
-
'index %d-%d'
|
297
|
+
'index %d-%d' % [xnum, lnum],
|
297
298
|
:index_read,
|
298
299
|
:index_write,
|
299
300
|
[cid, xnum, lnum],
|
@@ -306,7 +307,7 @@ class Backup
|
|
306
307
|
if log['action']
|
307
308
|
anum = log['action']['num']
|
308
309
|
_restore_item(src,
|
309
|
-
'action %d-%d'
|
310
|
+
'action %d-%d' % [anum, lnum],
|
310
311
|
:action_read,
|
311
312
|
:action_write,
|
312
313
|
[cid, anum, lnum],
|
@@ -318,7 +319,7 @@ class Backup
|
|
318
319
|
# case
|
319
320
|
if log['case_hash']
|
320
321
|
_restore_item(src,
|
321
|
-
'case %d'
|
322
|
+
'case %d' % lnum,
|
322
323
|
:case_read,
|
323
324
|
:case_write,
|
324
325
|
[cid, lnum],
|
@@ -331,12 +332,12 @@ class Backup
|
|
331
332
|
log['files_hash'].each_index do |fraw|
|
332
333
|
fnum = fraw + 1
|
333
334
|
|
334
|
-
@log.debug('ICFS restore: file %d-%d-%d'
|
335
|
+
@log.debug('ICFS restore: file %d-%d-%d' % [enum, lnum, fnum])
|
335
336
|
|
336
337
|
# read
|
337
338
|
fi = src.file_read(cid, enum, lnum, fnum)
|
338
339
|
if !fi
|
339
|
-
@log.warn('ICFS restore: file %d-%d-%d missing'
|
340
|
+
@log.warn('ICFS restore: file %d-%d-%d missing' %
|
340
341
|
[enum, lnum, fnum])
|
341
342
|
next
|
342
343
|
end
|
@@ -364,7 +365,7 @@ class Backup
|
|
364
365
|
'index' => imax,
|
365
366
|
'hash' => ICFS.hash(llast)
|
366
367
|
}
|
367
|
-
nitem = Items.generate(cur, 'current'
|
368
|
+
nitem = Items.generate(cur, 'current', Items::ItemCurrent)
|
368
369
|
@cache.current_write(cid, nitem)
|
369
370
|
|
370
371
|
ensure
|
data/lib/icfs/utils/check.rb
CHANGED
@@ -9,6 +9,8 @@
|
|
9
9
|
# This program is distributed WITHOUT ANY WARRANTY; without even the
|
10
10
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
11
11
|
|
12
|
+
# frozen_string_literal: true
|
13
|
+
|
12
14
|
#
|
13
15
|
module ICFS
|
14
16
|
|
@@ -42,15 +44,15 @@ class Check
|
|
42
44
|
#
|
43
45
|
def _item(title, read, read_args, hist, hash, val, con)
|
44
46
|
|
45
|
-
@log.debug('ICFS check: %s'
|
47
|
+
@log.debug('ICFS check: %s' % title)
|
46
48
|
|
47
49
|
# read
|
48
50
|
json = @store.send(read, *read_args)
|
49
51
|
if !json
|
50
52
|
if hist
|
51
|
-
@log.warn('ICFS check: %s is missing and historical'
|
53
|
+
@log.warn('ICFS check: %s is missing and historical' % title)
|
52
54
|
else
|
53
|
-
@log.error('ICFS check: %s is missing and current'
|
55
|
+
@log.error('ICFS check: %s is missing and current' % title)
|
54
56
|
end
|
55
57
|
return nil
|
56
58
|
end
|
@@ -58,24 +60,24 @@ class Check
|
|
58
60
|
# hash
|
59
61
|
if hash
|
60
62
|
if hash != ICFS.hash(json)
|
61
|
-
@log.error('ICFS check: %s hash bad'
|
63
|
+
@log.error('ICFS check: %s hash bad' % title)
|
62
64
|
end
|
63
65
|
else
|
64
|
-
@log.warn('ICFS check: %s hash unverified'
|
66
|
+
@log.warn('ICFS check: %s hash unverified' % title)
|
65
67
|
end
|
66
68
|
|
67
69
|
# parse
|
68
70
|
obj = JSON.parse(json)
|
69
71
|
err = Validate.check(obj, val)
|
70
72
|
if err
|
71
|
-
@log.error('ICFS check: %s bad format'
|
73
|
+
@log.error('ICFS check: %s bad format' % title)
|
72
74
|
return nil
|
73
75
|
end
|
74
76
|
|
75
77
|
# inconsistent
|
76
78
|
con.each do |name, num|
|
77
79
|
if obj[name] != read_args[num]
|
78
|
-
@log.error('ICFS check: %s inconsistent'
|
80
|
+
@log.error('ICFS check: %s inconsistent' % title)
|
79
81
|
return nil
|
80
82
|
end
|
81
83
|
end
|
@@ -83,7 +85,7 @@ class Check
|
|
83
85
|
return obj
|
84
86
|
|
85
87
|
rescue JSON::ParserError
|
86
|
-
@log.error('ICFS check: %s bad JSON'
|
88
|
+
@log.error('ICFS check: %s bad JSON' % title)
|
87
89
|
return nil
|
88
90
|
end # def _item()
|
89
91
|
private :_item
|
@@ -96,7 +98,7 @@ class Check
|
|
96
98
|
# @param cur_hash [String] The hash of the last log
|
97
99
|
#
|
98
100
|
def check(cid, cur_log, cur_hash, opts={})
|
99
|
-
@log.info('ICFS check: case %s'
|
101
|
+
@log.info('ICFS check: case %s' % cid)
|
100
102
|
|
101
103
|
ent_cur = Set.new
|
102
104
|
cse_cur = false
|
@@ -113,15 +115,15 @@ class Check
|
|
113
115
|
|
114
116
|
# log
|
115
117
|
log = _item(
|
116
|
-
'log %d'
|
118
|
+
'log %d' % lnum,
|
117
119
|
:log_read,
|
118
120
|
[cid, lnum],
|
119
121
|
false,
|
120
122
|
hash_log,
|
121
123
|
Items::ItemLog,
|
122
124
|
[
|
123
|
-
['caseid'
|
124
|
-
['log'
|
125
|
+
['caseid', 0].freeze,
|
126
|
+
['log', 1].freeze
|
125
127
|
].freeze,
|
126
128
|
)
|
127
129
|
if !log
|
@@ -132,7 +134,7 @@ class Check
|
|
132
134
|
|
133
135
|
# check that time decreases
|
134
136
|
if log['time'] > time_log
|
135
|
-
@log.warn('ICFS check: log %d time inconsistent'
|
137
|
+
@log.warn('ICFS check: log %d time inconsistent' % lnum)
|
136
138
|
end
|
137
139
|
|
138
140
|
# entry
|
@@ -145,9 +147,9 @@ class Check
|
|
145
147
|
log['entry']['hash'],
|
146
148
|
Items::ItemEntry,
|
147
149
|
[
|
148
|
-
['caseid'
|
149
|
-
['entry'
|
150
|
-
['log'
|
150
|
+
['caseid', 0].freeze,
|
151
|
+
['entry', 1].freeze,
|
152
|
+
['log', 2].freeze
|
151
153
|
].freeze,
|
152
154
|
)
|
153
155
|
|
@@ -156,7 +158,7 @@ class Check
|
|
156
158
|
ent_cur.add(enum)
|
157
159
|
if ent['files']
|
158
160
|
ent['files'].each do |fd|
|
159
|
-
file_cur.add( '%d-%d-%d'
|
161
|
+
file_cur.add( '%d-%d-%d' % [enum, fd['num'], fd['log']] )
|
160
162
|
end
|
161
163
|
end
|
162
164
|
end
|
@@ -172,9 +174,9 @@ class Check
|
|
172
174
|
log['index']['hash'],
|
173
175
|
Items::ItemIndex,
|
174
176
|
[
|
175
|
-
['caseid'
|
176
|
-
['index'
|
177
|
-
['log'
|
177
|
+
['caseid', 0].freeze,
|
178
|
+
['index', 1].freeze,
|
179
|
+
['log', 2].freeze
|
178
180
|
]
|
179
181
|
)
|
180
182
|
idx_cur.add(xnum)
|
@@ -184,16 +186,16 @@ class Check
|
|
184
186
|
if log['action']
|
185
187
|
anum = log['action']['num']
|
186
188
|
act = _item(
|
187
|
-
'action %d-%d'
|
189
|
+
'action %d-%d' % [anum, lnum],
|
188
190
|
:action_read,
|
189
191
|
[cid, anum, lnum],
|
190
192
|
act_cur.include?(anum),
|
191
193
|
log['action']['hash'],
|
192
194
|
Items::ItemAction,
|
193
195
|
[
|
194
|
-
['caseid'
|
195
|
-
['action'
|
196
|
-
['log'
|
196
|
+
['caseid', 0].freeze,
|
197
|
+
['action', 1].freeze,
|
198
|
+
['log', 2].freeze
|
197
199
|
]
|
198
200
|
)
|
199
201
|
act_cur.add(anum)
|
@@ -202,15 +204,15 @@ class Check
|
|
202
204
|
# case
|
203
205
|
if log['case_hash']
|
204
206
|
cse = _item(
|
205
|
-
'case %d'
|
207
|
+
'case %d' % lnum,
|
206
208
|
:case_read,
|
207
209
|
[cid, lnum],
|
208
210
|
cse_cur,
|
209
211
|
log['case_hash'],
|
210
212
|
Items::ItemCase,
|
211
213
|
[
|
212
|
-
['caseid'
|
213
|
-
['log'
|
214
|
+
['caseid', 0].freeze,
|
215
|
+
['log', 1].freeze
|
214
216
|
]
|
215
217
|
)
|
216
218
|
cse_cur = true
|
@@ -221,11 +223,11 @@ class Check
|
|
221
223
|
fnum = 0
|
222
224
|
log['files_hash'].each do |hash|
|
223
225
|
fnum = fnum + 1
|
224
|
-
fn = '%d-%d-%d'
|
226
|
+
fn = '%d-%d-%d' % [enum, fnum, lnum]
|
225
227
|
cur = file_cur.include?(fn)
|
226
228
|
file_cur.delete(fn) if cur
|
227
229
|
|
228
|
-
@log.debug('ICFS check: file %s'
|
230
|
+
@log.debug('ICFS check: file %s' % fn)
|
229
231
|
|
230
232
|
# read/size
|
231
233
|
if opts[:hash_all] || (cur && opts[:hash_current])
|
@@ -239,10 +241,10 @@ class Check
|
|
239
241
|
# missing
|
240
242
|
if !fi
|
241
243
|
if cur
|
242
|
-
@log.error('ICFS check: file %s missing and current'
|
244
|
+
@log.error('ICFS check: file %s missing and current' %
|
243
245
|
fn)
|
244
246
|
else
|
245
|
-
@log.warn('ICFS check: file %s missing and historical'
|
247
|
+
@log.warn('ICFS check: file %s missing and historical' %
|
246
248
|
fn)
|
247
249
|
end
|
248
250
|
end
|
@@ -251,7 +253,7 @@ class Check
|
|
251
253
|
if fi.is_a?(File)
|
252
254
|
# check
|
253
255
|
if hash != ICFS.hash_temp(fi)
|
254
|
-
@log.error('ICFS check: file %s hash bad'
|
256
|
+
@log.error('ICFS check: file %s hash bad' % fn)
|
255
257
|
end
|
256
258
|
|
257
259
|
# close
|
@@ -272,11 +274,11 @@ class Check
|
|
272
274
|
# check for any non-existant current files
|
273
275
|
unless file_cur.empty?
|
274
276
|
file_cur.each do |fn|
|
275
|
-
@log.error('ICFS check: file %s current but not logged'
|
277
|
+
@log.error('ICFS check: file %s current but not logged' % fn)
|
276
278
|
end
|
277
279
|
end
|
278
280
|
|
279
|
-
@log.debug('ICFS check: case %s complete'
|
281
|
+
@log.debug('ICFS check: case %s complete' % cid)
|
280
282
|
end # def check()
|
281
283
|
|
282
284
|
|
data/lib/icfs/validate.rb
CHANGED
@@ -9,6 +9,8 @@
|
|
9
9
|
# This program is distributed WITHOUT ANY WARRANTY; without even the
|
10
10
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
11
11
|
|
12
|
+
# frozen_string_literal: true
|
13
|
+
|
12
14
|
require 'set'
|
13
15
|
require 'tempfile'
|
14
16
|
|
@@ -107,7 +109,7 @@ module Validate
|
|
107
109
|
if val[:check] == obj
|
108
110
|
return nil
|
109
111
|
else
|
110
|
-
return 'not equal'
|
112
|
+
return 'not equal'
|
111
113
|
end
|
112
114
|
end # def self.equals()
|
113
115
|
|
@@ -123,14 +125,14 @@ module Validate
|
|
123
125
|
#
|
124
126
|
#
|
125
127
|
def self.integer(obj, val)
|
126
|
-
return 'not an Integer'
|
128
|
+
return 'not an Integer' unless obj.is_a?(Integer)
|
127
129
|
|
128
130
|
if val[:min] && obj < val[:min]
|
129
|
-
return 'too small: %d < %d'
|
131
|
+
return 'too small: %d < %d' % [obj, val[:min]]
|
130
132
|
end
|
131
133
|
|
132
134
|
if val[:max] && obj > val[:max]
|
133
|
-
return 'too large: %d > %d '
|
135
|
+
return 'too large: %d > %d ' % [obj, val[:max]]
|
134
136
|
end
|
135
137
|
|
136
138
|
return nil
|
@@ -147,14 +149,14 @@ module Validate
|
|
147
149
|
# @return [String,NilClass] error descriptions
|
148
150
|
#
|
149
151
|
def self.float(obj, val)
|
150
|
-
return 'not a Float'
|
152
|
+
return 'not a Float' unless obj.is_a?(Float)
|
151
153
|
|
152
154
|
if val[:min] && obj < val[:min]
|
153
|
-
return 'too small: %f < %f'
|
155
|
+
return 'too small: %f < %f' % [obj, val[:min]]
|
154
156
|
end
|
155
157
|
|
156
158
|
if val[:max] && obj > val[:max]
|
157
|
-
return 'too large: %f > %f'
|
159
|
+
return 'too large: %f > %f' % [obj, val[:max]]
|
158
160
|
end
|
159
161
|
|
160
162
|
return nil
|
@@ -173,10 +175,10 @@ module Validate
|
|
173
175
|
if val[:type]
|
174
176
|
if val[:type].is_a?(Array)
|
175
177
|
val[:type].each{|cl| return nil if obj.is_a?(cl) }
|
176
|
-
return 'not a listed type'
|
178
|
+
return 'not a listed type'
|
177
179
|
else
|
178
180
|
if !obj.is_a?(val[:type])
|
179
|
-
return 'not a %s'
|
181
|
+
return 'not a %s' % val[:type].name
|
180
182
|
end
|
181
183
|
end
|
182
184
|
end
|
@@ -200,7 +202,7 @@ module Validate
|
|
200
202
|
def self.string(obj, val)
|
201
203
|
|
202
204
|
# type
|
203
|
-
return 'not a String'
|
205
|
+
return 'not a String' unless obj.is_a?(String)
|
204
206
|
|
205
207
|
errors = {}
|
206
208
|
|
@@ -212,7 +214,7 @@ module Validate
|
|
212
214
|
|
213
215
|
# if whitelisting
|
214
216
|
if val[:whitelist]
|
215
|
-
errors[:whitelist] = 'Value was not whitelisted'
|
217
|
+
errors[:whitelist] = 'Value was not whitelisted'
|
216
218
|
end
|
217
219
|
|
218
220
|
# min length
|
@@ -250,7 +252,7 @@ module Validate
|
|
250
252
|
def self.array(obj, val)
|
251
253
|
|
252
254
|
# type
|
253
|
-
return 'not an Array'
|
255
|
+
return 'not an Array' unless obj.is_a?(Array)
|
254
256
|
|
255
257
|
errors = {}
|
256
258
|
|
@@ -316,7 +318,7 @@ module Validate
|
|
316
318
|
def self.hash(obj, val)
|
317
319
|
|
318
320
|
# type
|
319
|
-
return 'not a Hash'
|
321
|
+
return 'not a Hash' unless obj.is_a?(Hash)
|
320
322
|
|
321
323
|
ary = obj.to_a
|
322
324
|
chk = Array.new(ary.size)
|
@@ -331,7 +333,7 @@ module Validate
|
|
331
333
|
|
332
334
|
# missing required key
|
333
335
|
if ix.nil?
|
334
|
-
errors[key] = 'missing'
|
336
|
+
errors[key] = 'missing'
|
335
337
|
next
|
336
338
|
end
|
337
339
|
|
@@ -361,7 +363,7 @@ module Validate
|
|
361
363
|
if !val[:others]
|
362
364
|
chk.each_index do |ix|
|
363
365
|
next if chk[ix]
|
364
|
-
errors[ary[ix][0]] = 'not allowed'
|
366
|
+
errors[ary[ix][0]] = 'not allowed'
|
365
367
|
end
|
366
368
|
end
|
367
369
|
|
@@ -411,6 +413,13 @@ module Validate
|
|
411
413
|
}.freeze
|
412
414
|
|
413
415
|
|
416
|
+
# String
|
417
|
+
IsString = {
|
418
|
+
method: :type,
|
419
|
+
type: String,
|
420
|
+
}.freeze
|
421
|
+
|
422
|
+
|
414
423
|
end # module ICFS::Validate
|
415
424
|
|
416
425
|
end # module ICFS
|
data/lib/icfs/web/auth_ssl.rb
CHANGED
@@ -9,6 +9,8 @@
|
|
9
9
|
# This program is distributed WITHOUT ANY WARRANTY; without even the
|
10
10
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
11
11
|
|
12
|
+
# frozen_string_literal: true
|
13
|
+
|
12
14
|
#
|
13
15
|
module ICFS
|
14
16
|
module Web
|
@@ -24,13 +26,11 @@ class AuthSsl
|
|
24
26
|
# @param app [Object] The rack app
|
25
27
|
# @param map [Object] Maps DN to user name
|
26
28
|
# @param api [ICFS::Api] the Api
|
27
|
-
# @param cfg [ICFS::Web::Config] the config settings
|
28
29
|
#
|
29
|
-
def initialize(app, map, api
|
30
|
+
def initialize(app, map, api)
|
30
31
|
@app = app
|
31
32
|
@map = map
|
32
33
|
@api = api
|
33
|
-
@cfg = cfg
|
34
34
|
end
|
35
35
|
|
36
36
|
|
@@ -46,8 +46,8 @@ class AuthSsl
|
|
46
46
|
unless env['SSL_CLIENT_VERIFY'] == 'SUCCESS'
|
47
47
|
return [
|
48
48
|
400,
|
49
|
-
{'Content-Type' => 'text/plain'
|
50
|
-
['Client certificate required.'
|
49
|
+
{'Content-Type' => 'text/plain'},
|
50
|
+
['Client certificate required.']
|
51
51
|
]
|
52
52
|
end
|
53
53
|
|
@@ -56,7 +56,7 @@ class AuthSsl
|
|
56
56
|
if user.nil?
|
57
57
|
return [
|
58
58
|
400,
|
59
|
-
{'Content-Type' => 'text/plain'
|
59
|
+
{'Content-Type' => 'text/plain'},
|
60
60
|
['%s: No User' % env['SSL_CLIENT_S_DN']]
|
61
61
|
]
|
62
62
|
end
|
@@ -67,13 +67,11 @@ class AuthSsl
|
|
67
67
|
rescue Error::NotFound, Error::Value => err
|
68
68
|
return [
|
69
69
|
400,
|
70
|
-
{'Content-Type' => 'text/plain'
|
70
|
+
{'Content-Type' => 'text/plain'},
|
71
71
|
['%s: %s' % [err.message, env['SSL_CLIENT_S_DN']]]
|
72
72
|
]
|
73
73
|
end
|
74
74
|
env['icfs'] = @api
|
75
|
-
@cfg.load(user)
|
76
|
-
env['icfs.config'] = @cfg
|
77
75
|
return @app.call(env)
|
78
76
|
end # def call()
|
79
77
|
|