lorj 1.0.12 → 1.0.13

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 794f05ad532df448906a4c02b3a8037b3633ead3
4
- data.tar.gz: b5f2c8e2dcd69cee39b5ed7931765878581b6e20
3
+ metadata.gz: 2b033bdd31601389a91bf2772c3960307fdb7e2b
4
+ data.tar.gz: 73451dacdb51d7c898d43f3f4752ed4dd340cfad
5
5
  SHA512:
6
- metadata.gz: 0d9610ee767426066b0507f791c6fbc52764bb42cebdf9479bdd9923a7e7080107dcc0294db7d420e8b287104d1cd290eb316464287669845ec78b6cfaf684b4
7
- data.tar.gz: 113d5adb2e583a57ca190a7c9b41c78328beb41f357974cb1db8d6bf0a20522030719978e332bb44c01f392c5d54c5968f4f17b2c523248b8e604cebb0bdfbf3
6
+ metadata.gz: c0807c1c536cf7bbccb7fc2fe224e7f136e29721bc3fe691339c3aad337f68ea6eeeef8728ce1b070cbe4483bf5e3d99f18361f6114ddd3e8831aa9db2a80c9a
7
+ data.tar.gz: bd5b1c98d312503272591359658e86b3a9a3fd280a0ca6623bfc86398273351afe50d332a269fb75f55bbd19371cd97772f0c9dd3549122aa881bcc430a1c23b
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ # This script works in ruby 1.8
19
+
20
+ require 'lorj'
21
+
22
+ # require 'ruby-debug'
23
+ # Debugger.start
24
+
25
+ if ARGV.length <= 3
26
+ puts "Syntax is 'ruby #{__FILE__}' <LorjRef> <key> <CloudDataFile> "\
27
+ "[<AccountName[@provider]>]\n"\
28
+ "where:\n"\
29
+ "LorjRef : Lorj application struture to use. \n"\
30
+ " Format: <datapath>=<process>[@<libToLoad]\n"\
31
+ " datapath : Path where Lorj store data.\n"\
32
+ " process : Lorj process name to load. It can be a path to a\n"\
33
+ ' process file.'\
34
+ " libToLoad : Optional. Ruby library containing The Lorj process.\n"\
35
+ " If missing, it will try to load a lib named \n"\
36
+ ' lorj_<process>'\
37
+ 'key : Base64 encoded key. Used to decrypt the <CloudDataFi'\
38
+ "le>\n"\
39
+ "CloudDataFile : File containing the Lorj cloud data to import.\n"\
40
+ "AccountName : Account name to import. Usually the CloudDataFile\n"\
41
+ " have the name embedded and may use that one except\n"\
42
+ ' if you force it.'
43
+ exit
44
+ end
45
+
46
+ ref, key_encoded, data_file, account = ARGV
47
+
48
+ ref_found = ref.match(/^(.*)=(.*?)(@(.*))?$/)
49
+
50
+ unless ref_found
51
+ puts 'LorjRef must be formatted as : <datapath>=<process>[@<libToLoad]'
52
+ exit 1
53
+ end
54
+
55
+ datapath = ref_found[1]
56
+ process = ref_found[2]
57
+
58
+ if ref_found[3].nil?
59
+ lib_name = "lorj_#{process}"
60
+ else
61
+ lib_name = ref_found[4]
62
+ end
63
+
64
+ unless File.exist?(data_file)
65
+ puts "#{data_file} doesn't exist. Please check and retry."
66
+ exit 1
67
+ end
68
+
69
+ if key_encoded == ''
70
+ puts 'The key provided is empty. Please check and retry.'
71
+ exit 1
72
+ end
73
+
74
+ begin
75
+ require lib_name
76
+ rescue => e
77
+ puts "Warning! Unable to load RubyGem '#{lib_name}'.\n#{e}"
78
+ end
79
+
80
+ if key_encoded.length % 4 > 0
81
+ key_encoded += '=' * (4 - (key_encoded.length % 4))
82
+ end
83
+
84
+ begin
85
+ key_yaml = Base64.strict_decode64(key_encoded)
86
+ rescue => e
87
+ puts "Reading Base64 Key: '#{key_encoded}' is not a valid encoded Base64"\
88
+ " data.\n#{e}\nPlease check and retry."
89
+ exit 1
90
+ end
91
+
92
+ begin
93
+ entr = YAML.load(key_yaml)
94
+ rescue => e
95
+ puts "Reading Base64 Key: '#{key_yaml}' is not a valid YAML data.\n#{e}\n"\
96
+ 'Please check and retry.'
97
+ exit 1
98
+ else
99
+ unless entr.key?(:iv) && entr.key?(:key) && entr.key?(:salt)
100
+ puts 'Reading Base64 Key: Invalid key. Missing entropy data.'
101
+ exit 1
102
+ end
103
+ end
104
+
105
+ name, controller = account.split('@') unless account.nil?
106
+
107
+ PrcLib.data_path = datapath
108
+
109
+ keypath = Lorj::KeyPath.new(process)
110
+
111
+ processes = [{ :process_module => keypath.key_tree }]
112
+
113
+ core = Lorj::Core.new(Lorj::Account.new, processes)
114
+
115
+ data = File.read(data_file).strip
116
+
117
+ # debugger # rubocop: disable Lint/Debugger
118
+
119
+ core.account_import(entr, data, name, controller)
120
+
121
+ puts 'Import done.'
122
+
123
+ if core.config.ac_save
124
+ puts "Config imported and saved in #{core.config['account#name']}"
125
+ exit 0
126
+ end
127
+ puts 'Issue during configuration saved.'
128
+ exit 1
@@ -37,7 +37,7 @@ fi
37
37
  if [ "$http_proxy" = "" ]
38
38
  then
39
39
  echo "Currently, no proxy is set. Running docker without proxy"
40
- docker build $TAG
40
+ docker build $TAG .
41
41
  exit
42
42
  fi
43
43
 
data/lib/core/core.rb CHANGED
@@ -310,11 +310,46 @@ module Lorj
310
310
  #
311
311
  # * *Raises* :
312
312
  # No exceptions
313
- def register(oObject, sObjectType = nil) #:doc:
313
+ def register(oObject, sObjectType = nil)
314
314
  return nil if !oObject || !@core_object
315
315
  @core_object.register(oObject, sObjectType)
316
316
  end
317
317
 
318
+ # Function to import an encrypted Hash as a Lorj Account.
319
+ #
320
+ # For details about this functions, see #Lorj::BaseDefinition.account_import
321
+ #
322
+ # * *Args* :
323
+ # - +key+ : key to use to decrypt the 'enc_hash'.
324
+ # - +enc_hash+ : Encrypted Hash.
325
+ #
326
+ # * *Raises* :
327
+ # No exceptions
328
+ def account_import(key, enc_hash, name = nil, controller = nil)
329
+ return nil if @core_object.nil?
330
+ @core_object.account_import(key, enc_hash, name, controller)
331
+ end
332
+
333
+ # Function to export a Lorj Account in an encrypted Hash.
334
+ #
335
+ # For details about this functions, see #Lorj::BaseDefinition.account_export
336
+ #
337
+ # * *Args* :
338
+ # - +map+ : Hash map of fields to extract. if map is nil, the
339
+ # export function will loop in the list of keys in the 'account' layer.
340
+ # - +with_name+ : True to extract :name and :provider as well.
341
+ # True by default.
342
+ #
343
+ # * *returns* :
344
+ # - key: String. Key used to encrypt.
345
+ # - env_hash: String. Base64 encrypted Hash.
346
+ # OR
347
+ # - nil if issues.
348
+ def account_export(map = nil, with_name = true)
349
+ return nil if @core_object.nil?
350
+ @core_object.account_export(map, with_name)
351
+ end
352
+
318
353
  # Core parameters are:
319
354
  # the_config : Optional. An instance of a configuration system which *HAVE*
320
355
  # to provide get/set/exist?/[]/[]=
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ #
19
+ module Lorj
20
+ # Implements account_import and account_export
21
+ # exposed by core.
22
+ class BaseDefinition
23
+ # Function to import an encrypted Hash as a Lorj Account.
24
+ #
25
+ # The encrypted Hash will be decrypted by the key provided.
26
+ # The content of the hash will be stored in the 'account' layer
27
+ # of config.
28
+ #
29
+ # The 'account' layer is not cleaned before. If you need to
30
+ # clean it up, do:
31
+ # config.ac_new(account_name, controller_name)
32
+ #
33
+ # or if the Hash data contains :name and :provider
34
+ # config.ac_erase
35
+ #
36
+ # To save it in a file, you will need to call
37
+ # config.ac_save(filename)
38
+ #
39
+ # If you pass 'name' and 'controller', ac_update will be used to update the
40
+ # account data
41
+ # If the imported data contains name and controller data, by default, it
42
+ # will call ac_update except if name is an empty string.
43
+ #
44
+ # The location used comes from PrcLib.data_path
45
+ # Passwords will be encrypted by the internal .key file stored in
46
+ # PrcLib.pdata_path
47
+ #
48
+ # The imported Hash will follow the process data model. But it won't
49
+ # verify if some data are missed for any object action (create/delete/...)
50
+ #
51
+ # * *Args* :
52
+ # - +key+ : key to use to decrypt the 'enc_hash'.
53
+ # - +enc_hash+ : Encrypted Hash.
54
+ # - +name+ : Optional. Name of the account.
55
+ # - +controller+ : Optional. Name of the controller.
56
+ #
57
+ # * *Raises* :
58
+ # No exceptions
59
+ def account_import(key, enc_hash, name = nil, controller = nil)
60
+ hash = _get_encrypted_value(enc_hash, key, 'Encrypted account data')
61
+
62
+ data = YAML.load(hash)
63
+
64
+ _update_account_meta(data, name, controller)
65
+
66
+ entr = _get_encrypt_key
67
+
68
+ data.each do |s, sh|
69
+ sh.each do |k, v|
70
+ key = "#{s}##{k}"
71
+ data_def = Lorj.data.auto_section_data(key)
72
+ if data_def && data_def[:encrypted].is_a?(TrueClass)
73
+ v = _encrypt_value(v, entr)
74
+ end
75
+ config.set(key, v, :name => 'account')
76
+ end
77
+ end
78
+ end
79
+
80
+ # Function to export a Lorj Account in an encrypted Hash.
81
+ #
82
+ # The encrypted Hash will be encrypted by a new key returned.
83
+ # The content of the hash will built thanks to a Hash mapping
84
+ # or the list of data list in the config 'account' layer.
85
+ #
86
+ # * *Args* :
87
+ # - +map+ : Hash map of fields to extract. if map is nil, the
88
+ # export function will loop in the list of keys in the 'account' layer.
89
+ # if map is provided, following data are expected:
90
+ # - <key> : Data key to extract from config.
91
+ # - :keys: Array. SubHash tree of keys to create. If :keys is missing,
92
+ # the Data key will define the SubHash tree to use.
93
+ #
94
+ # Ex:
95
+ # map = {
96
+ # # like :keys => [credentials, auth_uri]
97
+ # 'credentials#auth_uri' => {},
98
+ # # extract from maestro but export under :server
99
+ # 'maestro#image_name' => {:keys => [:server, image_name]}
100
+ # }
101
+ # - +with_name+ : True to extract :name and :provider as well.
102
+ # True by default.
103
+ # - +account_only+ : True data extracted must come exclusively from the
104
+ # config 'account' layer.
105
+ #
106
+ # * *returns* :
107
+ # - key: String. Key used to encrypt.
108
+ # - env_hash: String. Base64 encrypted Hash.
109
+ # OR
110
+ # - nil if issues.
111
+ def account_export(map = nil, with_name = true, account_only = true)
112
+ map = _account_map if map.nil?
113
+
114
+ map.merge!('account#name' => {}, 'account#provider' => {}) if with_name
115
+
116
+ entr = _get_encrypt_key
117
+ rhash = {}
118
+ map.each do |k, v|
119
+ data_def = Lorj.data.auto_section_data(k)
120
+
121
+ if account_only
122
+ data = config.get(k, nil, :name => 'account')
123
+ else
124
+ data = config[k]
125
+ end
126
+
127
+ rhash_tree = Lorj.data.first_section(k)
128
+ rhash_tree = v[:keys] if v.key?(:keys)
129
+ if !data_def.nil? && data_def[:encrypted].is_a?(TrueClass)
130
+ data = _get_encrypted_value(data, entr, data_def[:desc])
131
+ end
132
+ rhash.rh_set(data, *rhash_tree)
133
+ end
134
+
135
+ entr = _new_encrypt_key
136
+ [entr, _encrypt_value(rhash.to_yaml, entr)]
137
+ end
138
+
139
+ private
140
+
141
+ def _update_account_meta(data, name, controller)
142
+ if name.nil? && data.rh_exist?(:account, :name)
143
+ name = data.rh_get(:account, :name)
144
+ end
145
+ if controller.nil? && data.rh_exist?(:account, :provider)
146
+ controller = data.rh_get(:account, :provider)
147
+ end
148
+
149
+ name = nil if name == ''
150
+
151
+ config.ac_update(name, controller) unless name.nil? || controller.nil?
152
+ end
153
+
154
+ def _account_map
155
+ map = {}
156
+
157
+ config.each(:name => 'account') do |s, v|
158
+ next unless v.is_a?(Hash)
159
+ v.keys.each do |k|
160
+ unless s == :account && [:name, :provider].include?(k)
161
+ map["#{s}##{k}"] = {}
162
+ end
163
+ end
164
+ end
165
+ map
166
+ end
167
+ end
168
+ end
@@ -14,6 +14,7 @@
14
14
 
15
15
  require 'highline/import'
16
16
  require 'encryptor'
17
+ require 'base64'
17
18
 
18
19
  # Module Lorj which contains several classes.
19
20
  #
@@ -27,16 +28,37 @@ require 'encryptor'
27
28
  module Lorj
28
29
  # Adding encrypt core functions.
29
30
  class BaseDefinition
31
+ private
32
+
33
+ # internal runtime function to create a new key
34
+ # *parameters*:
35
+ # - +new+ : true to create a new key.
36
+ #
37
+ # *return*:
38
+ # - entropy: Hash. Entropy data used as key to encrypt values.
39
+ # Details from encryptor's gem.
40
+ # - :key: password
41
+ # - :salt : String current time number
42
+ # - :iv: Base64 random iv
43
+ def _new_encrypt_key(key = rand(36**10).to_s(36))
44
+ random_iv = OpenSSL::Cipher::Cipher.new('aes-256-cbc').random_iv
45
+ {
46
+ :key => key,
47
+ :salt => Time.now.to_i.to_s,
48
+ :iv => Base64.strict_encode64(random_iv)
49
+ }
50
+ end
51
+
30
52
  # internal runtime function for process call
31
53
  # Get encrypted value hidden by *
32
54
  #
55
+ # Use PrcLib.pdata_path to store/read a '.key' file
56
+ #
33
57
  # *parameters*:
34
- # - +sDesc+ : data description
35
- # - +default+ : encrypted default value
36
- # - +entropy+ : Entropy Hash
58
+ # - +new+ : true to create a new key.
37
59
  #
38
60
  # *return*:
39
- # - value : encrypted value.
61
+ # - value : encrypted key value.
40
62
  #
41
63
  # *raise*:
42
64
  #
@@ -45,17 +67,12 @@ module Lorj
45
67
  key_file = File.join(PrcLib.pdata_path, '.key')
46
68
  if !File.exist?(key_file)
47
69
  # Need to create a random key.
48
- random_iv = OpenSSL::Cipher::Cipher.new('aes-256-cbc').random_iv
49
- entr = {
50
- :key => rand(36**10).to_s(36),
51
- :salt => Time.now.to_i.to_s,
52
- :iv => Base64.strict_encode64(random_iv)
53
- }
70
+ entr = _new_encrypt_key
54
71
 
55
72
  Lorj.debug(2, "Writing '%s' key file", key_file)
56
- PrcLib.ensure_dir_exists(
57
- PrcLib.pdata_path
58
- ) unless PrcLib.dir_exists?(PrcLib.pdata_path)
73
+ unless PrcLib.dir_exists?(PrcLib.pdata_path)
74
+ PrcLib.ensure_dir_exists(PrcLib.pdata_path)
75
+ end
59
76
  File.open(key_file, 'w+') do |out|
60
77
  out.write(Base64.encode64(entr.to_yaml))
61
78
  end
@@ -118,12 +135,29 @@ module Lorj
118
135
  :iv => Base64.strict_decode64(entr[:iv]),
119
136
  :salt => entr[:salt]
120
137
  )
121
- rescue
122
- PrcLib.error('Unable to decrypt your %s. You will need to re-enter it.',
123
- sDesc)
138
+ rescue => e
139
+ PrcLib.error("Unable to decrypt your %s.\n"\
140
+ "%s\n"\
141
+ ' You will need to re-enter it.',
142
+ sDesc, e)
124
143
  end
125
144
  end
126
145
 
146
+ # Function to encrypt a data with a entr key.
147
+ #
148
+ # *return*:
149
+ # - value : encrypted value in Base64 encoded data.
150
+ def _encrypt_value(value, entr)
151
+ Base64.strict_encode64(
152
+ Encryptor.encrypt(
153
+ :value => value,
154
+ :key => entr[:key],
155
+ :iv => Base64.strict_decode64(entr[:iv]),
156
+ :salt => entr[:salt]
157
+ )
158
+ )
159
+ end
160
+
127
161
  # internal runtime function for process call
128
162
  # Ask encrypted function executed by _ask
129
163
  #
@@ -132,7 +166,7 @@ module Lorj
132
166
  # - +default+ : encrypted default value
133
167
  #
134
168
  # *return*:
135
- # - value : encrypted value.
169
+ # - value : encrypted value in Base64.
136
170
  #
137
171
  # *raise*:
138
172
  #
@@ -160,14 +194,7 @@ module Lorj
160
194
  PrcLib.message('%s cannot be empty.', sDesc) if value_free == ''
161
195
  end
162
196
  end
163
- Base64.strict_encode64(
164
- Encryptor.encrypt(
165
- :value => value_free,
166
- :key => entr[:key],
167
- :iv => Base64.strict_decode64(entr[:iv]),
168
- :salt => entr[:salt]
169
- )
170
- )
197
+ _encrypt_value(value_free, entr)
171
198
  end
172
199
  end
173
200
  end
@@ -104,5 +104,159 @@ module Lorj
104
104
  end
105
105
  controller_error '%s is not set.', key
106
106
  end
107
+
108
+ private
109
+
110
+ # controller helper function:
111
+ # This helper controller function helps to query and object list
112
+ # from a Lorj query Hash. See query Hash details in #ctrl_query_match.
113
+ #
114
+ # * *args*:
115
+ # - +objects+ : Collection of object which respond to each
116
+ # - +query+ : Hash. Containing a list of attributes to test
117
+ # See #ctrl_do_query_match for details
118
+ # - +&block+ : block to extract the object data from a key.
119
+ def ctrl_query_each(objects, query) # :doc:
120
+ results = []
121
+ Lorj.debug(4, "Filtering with '%s'", query)
122
+ unless objects.class.method_defined?(:each)
123
+ controller_error "'%s' do not have 'each' function.", objects.class
124
+ end
125
+ objects.each do |o|
126
+ if block_given?
127
+ selected = ctrl_do_query_match(o, query) { |d, k| yield d, k }
128
+ else
129
+ selected = ctrl_do_query_match(o, query)
130
+ end
131
+ results.push o if selected
132
+ end
133
+ Lorj.debug(4, '%d records selected', results.length)
134
+ results
135
+ end
136
+
137
+ # controller helper function:
138
+ # Function to return match status
139
+ # from a list of attributes regarding a query attribute list
140
+ #
141
+ # * *args*:
142
+ # - +object+ : Object to query.
143
+ # - +query+ : Hash containing a list of attributes to test
144
+ # The query value support several cases:
145
+ # - Regexp : must Regexp.match
146
+ # - default equality : must match ==
147
+ # - +&block+ : block to extract the object data from a key.
148
+ #
149
+ # * *returns*:
150
+ # - true if this object is selected by the query.
151
+ # OR
152
+ # - false otherwise
153
+ #
154
+ # * *exception*:
155
+ # - No exception
156
+ #
157
+ # by default, this function will extract data from the object
158
+ # with followinf functions: If one fails, it will try the next one.
159
+ # :[], or :key or &block.
160
+ # The optional &block is a third way defined by the controller to extract
161
+ # data.
162
+ # The &block is defined as followed:
163
+ # * *args*:
164
+ # - +object+ : The object to get data from
165
+ # - +key+ : The key used to extract data
166
+ # * *returns*:
167
+ # - value extracted.
168
+ # * *exception*:
169
+ # - Any object exception during data extraction.
170
+ #
171
+ def ctrl_do_query_match(object, query)
172
+ selected = true
173
+ query.each do |key, match_value|
174
+ if block_given?
175
+ found, v = _get_from(object, key) { |d, k| yield d, k }
176
+ else
177
+ found, v = _get_from(object, key)
178
+ end
179
+
180
+ Lorj.debug(4, "'%s.%s' = '%s'", object.class, key, v) if found
181
+
182
+ selected = lorj_filter_regexp(v, match_value)
183
+ selected |= lorj_filter_default(v, match_value)
184
+ break unless selected
185
+ end
186
+ Lorj.debug(4, 'object selected.') if selected
187
+ selected
188
+ end
189
+
190
+ def ctrl_query_select(query, *limit)
191
+ return {} if limit.length == 0
192
+ query.select { |_k, v| limit.include?(v.class) }
193
+ end
194
+
195
+ def _get_from(data, key)
196
+ ret = nil
197
+ found = nil
198
+
199
+ [:[], key].each do |f|
200
+ found, ret = _get_from_func(data, key, f)
201
+ break if found
202
+ end
203
+ return [found, ret] if found || !block_given?
204
+
205
+ begin
206
+ Lorj.debug(4, "yield extract '%s' from '%s'", key, object.class)
207
+ return [true, yield(data, key)]
208
+ rescue
209
+ PrcLib.error("yield extract '%s' from '%s' error \n%s",
210
+ key, object.class, e)
211
+ end
212
+ [false, nil]
213
+ end
214
+
215
+ def _get_from_func(data, key, func = nil)
216
+ func = key if func.nil?
217
+ v = nil
218
+ if data.class.method_defined?(func)
219
+ begin
220
+ found = true
221
+ if key == func
222
+ Lorj.debug(5, "extract try with '%s.%s'", data.class, func)
223
+ v = data.send(func)
224
+ else
225
+ Lorj.debug(5, "extract try with '%s.%s(%s)'",
226
+ data.class, func, key)
227
+ v = data.send(func, key)
228
+ end
229
+ rescue => e
230
+ Lorj.debug(5, "'%s': error reported by '%s.%s(%s)'\n%s",
231
+ __method__, data.class, func, key, e)
232
+ found = false
233
+ end
234
+ end
235
+ [found, v]
236
+ end
237
+ # Function to check if a value match a regexp
238
+ #
239
+ # * *returns*:
240
+ # - true if the match is not a regexp, or if regexp match
241
+ # OR
242
+ # - false otherwise
243
+ #
244
+ def lorj_filter_regexp(value, match_value)
245
+ return false unless match_value.is_a?(Regexp)
246
+
247
+ return true if match_value.match(value)
248
+ false
249
+ end
250
+
251
+ # Function to check if a value match a filter value.
252
+ #
253
+ # * *returns*:
254
+ # - true if match
255
+ # OR
256
+ # - false otherwise
257
+ #
258
+ def lorj_filter_default(value, match_value)
259
+ (value == match_value)
260
+ end
107
261
  end
108
262
  end
@@ -111,6 +111,16 @@ module Lorj
111
111
  class BaseProcess
112
112
  private
113
113
 
114
+ def account_export(map = nil, with_name = true, account_only = false) #:doc:
115
+ fail Lorj::PrcError.new, 'No Base object loaded.' unless @base_object
116
+ @base_object.account_export(map, with_name, account_only)
117
+ end
118
+
119
+ def account_import(key, enc_hash, name = nil, controller = nil) #:doc:
120
+ fail Lorj::PrcError.new, 'No Base object loaded.' unless @base_object
121
+ @base_object.account_export(key, enc_hash, name, controller)
122
+ end
123
+
114
124
  def query_cache_cleanup(sObjectType) #:doc:
115
125
  fail Lorj::PrcError.new, 'No Base object loaded.' unless @base_object
116
126
  @base_object.query_cleanup(sObjectType)
@@ -340,6 +350,8 @@ module Lorj
340
350
  end
341
351
  end
342
352
 
353
+ # rubocop: disable Metrics/CyclomaticComplexity
354
+ # rubocop: disable Metrics/PerceivedComplexity
343
355
  def _qs_check_query_valid?(elem, key, value)
344
356
  if value.is_a?(Array)
345
357
  path = value.clone
@@ -348,11 +360,15 @@ module Lorj
348
360
  where = elem[key].rh_get(path)
349
361
  return true if where.is_a?(Array) && where.flatten.include?(v)
350
362
  return true if where == v
363
+ elsif value.is_a?(Regexp)
364
+ return true if value.match(elem[key])
351
365
  else
352
366
  return true if elem[key] == value
353
367
  end
354
368
  false
355
369
  end
370
+ # rubocop : enable Metrics/CyclomaticComplexity
371
+ # rubocop : enable Metrics/PerceivedComplexity
356
372
 
357
373
  def _qs_info_init(sInfoMsg)
358
374
  info = {