@@ -119,59 +119,50 @@ function handleEdit(ev) {
119119 return ui . addNotification ( null , E ( 'p' , _ ( 'Invalid input values, unable to save modifications.' ) ) , 'error' ) ;
120120 }
121121 }
122- let sumSubElements = [ ] , exportJson ;
122+ /*
123+ gather all input data
124+ */
125+ let sumSubElements = [ ] ;
123126 const nodeKeys = document . querySelectorAll ( '[id^="widget.cbid.json"][id$="name"]' ) ;
124- for ( let i = 0 ; i < nodeKeys . length ; i ++ ) {
125- let subElements = { } ;
126- const elements = document . querySelectorAll ( '[id^="widget.cbid.json.' + nodeKeys [ i ] . id . split ( '.' ) [ 3 ] + '\."], \
127- [id^="cbid.json.' + nodeKeys [ i ] . id . split ( '.' ) [ 3 ] + '\.rule_4"], \
128- [id^="cbid.json.' + nodeKeys [ i ] . id . split ( '.' ) [ 3 ] + '\.rule_6"]' ) ;
129- for ( const element of elements ) {
130- let key ;
131- const value = element . value || "" ;
132- const parts = element . id . split ( '.' ) ;
133- if ( parts . length === 5 ) {
134- key = element . id . split ( '.' ) [ 4 ] ;
135- } else if ( parts . length === 4 ) {
136- key = element . id . split ( '.' ) [ 3 ] ;
137- }
138- if ( ! key || value === "" ) {
139- continue ;
140- }
141- switch ( key ) {
142- case 'url_4' :
143- subElements . url_4 = value ;
144- break ;
145- case 'rule_4' :
146- subElements . rule_4 = value ;
147- break ;
148- case 'url_6' :
149- subElements . url_6 = value ;
150- break ;
151- case 'rule_6' :
152- subElements . rule_6 = value ;
153- break ;
154- case 'chain' :
155- subElements . chain = value ;
156- break ;
157- case 'descr' :
158- subElements . descr = value ;
159- break ;
160- case 'flag' :
161- subElements . flag = value ;
162- break ;
127+ for ( const keyNode of nodeKeys ) {
128+ const keyValue = keyNode . value ?. trim ( ) ;
129+ if ( ! keyValue ) continue ;
130+ const idParts = keyNode . id . split ( "." ) ;
131+ const ruleId = idParts [ 3 ] ;
132+ if ( ! ruleId ) continue ;
133+ const selector =
134+ `[id^="widget.cbid.json.${ ruleId } ."], ` +
135+ `[id^="cbid.json.${ ruleId } .rule"]` ;
136+ const elements = document . querySelectorAll ( selector ) ;
137+ const sub = { } ;
138+ for ( const el of elements ) {
139+ const parts = el . id . split ( "." ) ;
140+ const key = parts [ parts . length - 1 ] ;
141+ const value = el . value ?. trim ( ) ;
142+ if ( ! value ) continue ;
143+ if ( [ "url_4" , "url_6" , "rule" , "chain" , "descr" , "flag" ] . includes ( key ) ) {
144+ sub [ key ] = value ;
163145 }
164146 }
165- if ( nodeKeys [ i ] . value !== "" && subElements . descr !== "" ) {
166- sumSubElements . push ( nodeKeys [ i ] . value , subElements ) ;
147+ if ( sub . descr ) {
148+ sumSubElements . push ( keyValue , sub ) ;
167149 }
168150 }
169- if ( sumSubElements . length > 0 ) {
170- exportJson = JSON . stringify ( sumSubElements ) . replace ( / ^ \[ / , '{\n' ) . replace ( / \} ] $ / , '\n\t}\n}\n' ) . replace ( / , { " / g, ':{\n\t"' ) . replace ( / " } , " / g, '"\n\t},\n"' ) . replace ( / " , " / g, '",\n\t"' ) ;
151+ /*
152+ construct json object
153+ */
154+ let exportObj = { } ;
155+ for ( let i = 0 ; i < sumSubElements . length ; i += 2 ) {
156+ const key = sumSubElements [ i ] ;
157+ const value = sumSubElements [ i + 1 ] ;
158+ exportObj [ key ] = value ;
171159 }
172- return fs . write ( '/etc/banip/banip.custom.feeds' , exportJson ) . then ( function ( ) {
173- location . reload ( ) ;
174- } ) ;
160+ const exportJson = JSON . stringify ( exportObj , null , 4 ) ;
161+ /*
162+ save to file and reload
163+ */
164+ return fs . write ( '/etc/banip/banip.custom.feeds' , exportJson )
165+ . then ( ( ) => location . reload ( ) ) ;
175166}
176167
177168return view . extend ( {
@@ -186,17 +177,16 @@ return view.extend({
186177 } ,
187178
188179 render : function ( data ) {
189- let m , s , o , feed , url_4 , url_6 , rule_4 , rule_6 , chain , descr , flag ;
180+ let m , s , o , feed , url_4 , url_6 , rule , chain , descr , flag ;
190181
191182 m = new form . JSONMap ( data , null , _ ( 'With this editor you can upload your local custom feed file or fill up an initial one (a 1:1 copy of the version shipped with the package). \
192183 The file is located at \'/etc/banip/banip.custom.feeds\'. \
193184 Then you can edit this file, delete entries, add new ones or make a local backup. To go back to the maintainers version just clear the custom feed file.' ) ) ;
194185 for ( let i = 0 ; i < Object . keys ( m . data . data ) . length ; i ++ ) {
195186 feed = Object . keys ( m . data . data ) [ i ] ;
196187 url_4 = m . data . data [ feed ] . url_4 ;
197- rule_4 = m . data . data [ feed ] . rule_4 ;
198188 url_6 = m . data . data [ feed ] . url_6 ;
199- rule_6 = m . data . data [ feed ] . rule_6 ;
189+ rule = m . data . data [ feed ] . rule ;
200190 chain = m . data . data [ feed ] . chain ;
201191 descr = m . data . data [ feed ] . descr ;
202192 flag = m . data . data [ feed ] . flag ;
@@ -229,20 +219,6 @@ return view.extend({
229219 return true ;
230220 }
231221
232- o = s . option ( form . Value , 'rule_4' , _ ( 'Rulev4' ) ) ;
233- o . value ( '/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)[[:space:]]/{printf \"%s,\\n\",$1}' , _ ( '<IPv4><SPACE>' ) ) ;
234- o . value ( '/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)$/{printf \"%s,\\n\",$1}' , _ ( '<IPv4><END>' ) ) ;
235- o . value ( '/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)[[:space:]]/{printf \"%s/%s,\\n\",$1,$3}' , _ ( '<IPv4><SPACE>, concatinated' ) ) ;
236- o . value ( '/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)$/{if(!seen[$1]++)printf \"%s,\\n\",$1}' , _ ( '<IPv4><END>, nodups' ) ) ;
237- o . value ( '/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)[-[:space:]]?/{printf \"%s,\\n\",$1}' , _ ( '<IPv4>[<SPACE>|<HYPHEN>]' ) ) ;
238- o . value ( '/127\\./{next}/(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)[[:space:]]/{printf \"%s,\\n\",$2}' , _ ( '<DATE><IPv4><SPACE>' ) ) ;
239- o . value ( 'BEGIN{FS=\",\"}/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)/{printf \"%s,\\n\",$1}' , _ ( '<IPv4>, csv' ) ) ;
240- o . value ( 'BEGIN{IGNORECASE=1}/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)([[:space:]]NET)/{printf \"%s,\\n\",$1}' , _ ( '<IPv4><SPACE>NET' ) ) ;
241- o . value ( 'BEGIN{IGNORECASE=1}/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)([[:space:]]YOUR)/{printf \"%s,\\n\",$1}' , _ ( '<IPv4><SPACE>YOUR' ) ) ;
242- o . value ( 'BEGIN{FS=\";\"}/content:\"127\\./{next}/(content:\"([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\")/{printf \"%s,\\n\",substr($10,11,length($10)-11)}' , _ ( '<IPv4>, substring' ) ) ;
243- o . optional = true ;
244- o . rmempty = true ;
245-
246222 o = s . option ( form . Value , 'url_6' , _ ( 'URLv6' ) ) ;
247223 o . validate = function ( section_id , value ) {
248224 if ( ! value ) {
@@ -254,10 +230,11 @@ return view.extend({
254230 return true ;
255231 }
256232
257- o = s . option ( form . Value , 'rule_6' , _ ( 'Rulev6' ) ) ;
258- o . value ( '/^(([0-9A-f]{0,4}:){1,7}[0-9A-f]{0,4}:?(\\/(1?[0-2][0-8]|[0-9][0-9]))?)[[:space:]]/{printf \"%s,\\n\",$1}' , _ ( '<IPv6><SPACE>' ) ) ;
259- o . value ( '/^(([0-9A-f]{0,4}:){1,7}[0-9A-f]{0,4}:?(\\/(1?[0-2][0-8]|[0-9][0-9]))?)$/{printf \"%s,\\n\",$1}' , _ ( '<IPv6><END>' ) ) ;
260- o . value ( 'BEGIN{FS=\",\"}/^(([0-9A-f]{0,4}:){1,7}[0-9A-f]{0,4}:?(\\/(1?[0-2][0-8]|[0-9][0-9]))?)/{printf \"%s,\\n\",$1}' , _ ( '<IPv6>, csv' ) ) ;
233+ o = s . option ( form . Value , 'rule' , _ ( 'Rule' ) ) ;
234+ o . value ( 'feed 1' , _ ( '<IP-Address>' ) ) ;
235+ o . value ( 'feed 1 ,' , _ ( '<IP-Address><CSV-Seperator>' ) ) ;
236+ o . value ( 'feed 13' , _ ( '<IP-Address> <Netmask>' ) ) ;
237+ o . value ( 'suricata 1' , _ ( '<Suricata Syntax>' ) ) ;
261238 o . optional = true ;
262239 o . rmempty = true ;
263240
0 commit comments