diff --git a/src/etc/inc/config.inc b/src/etc/inc/config.inc index f83df3daa..caa1315db 100644 --- a/src/etc/inc/config.inc +++ b/src/etc/inc/config.inc @@ -272,6 +272,24 @@ function legacy_config_get_interfaces($filters = array()) return $interfaces; } +/** + * legacy helper to generate a uuid in a similar fashion as the model code would. + */ +function generate_uuid() +{ + return sprintf( + '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', + mt_rand(0, 0xffff), + mt_rand(0, 0xffff), + mt_rand(0, 0xffff), + mt_rand(0, 0x0fff) | 0x4000, + mt_rand(0, 0x3fff) | 0x8000, + mt_rand(0, 0xffff), + mt_rand(0, 0xffff), + mt_rand(0, 0xffff) + ); +} + /** * parse stored json content, return empty when not found or expired */ diff --git a/src/etc/inc/filter.inc b/src/etc/inc/filter.inc index bd761a5a3..b34e3a5fc 100644 --- a/src/etc/inc/filter.inc +++ b/src/etc/inc/filter.inc @@ -86,9 +86,14 @@ function filter_rules_sort() return strnatcmp($a['interface'], $b['interface']); } }); - /* strip the sequence numbers again */ + /* strip the sequence numbers again, add uuid's where not available */ for ($i = 0; isset($config['filter']['rule'][$i]); $i++) { unset($config['filter']['rule'][$i]['seq']); + if (empty($config['filter']['rule'][$i]['@attributes']) + && empty($config['filter']['rule'][$i]['@attributes']['uuid']) + ) { + $config['filter']['rule'][$i]['@attributes'] = ['uuid' => generate_uuid()]; + } } } diff --git a/src/www/firewall_rules_edit.php b/src/www/firewall_rules_edit.php index 4d9b3ac8c..178c05120 100644 --- a/src/www/firewall_rules_edit.php +++ b/src/www/firewall_rules_edit.php @@ -582,9 +582,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { if ( isset($a_filter[$id]['created']) && is_array($a_filter[$id]['created']) ) { $filterent['created'] = $a_filter[$id]['created']; } + if (!empty($a_filter[$id]['@attributes']) && !empty($a_filter[$id]['@attributes']['uuid'])) { + $filterent['@attributes'] = $a_filter[$id]['@attributes']; + } else { + $filterent['@attributes'] = ['uuid' => generate_uuid()]; + } $a_filter[$id] = $filterent; } else { $filterent['created'] = make_config_revision_entry(); + $filterent['@attributes'] = ['uuid' => generate_uuid()]; if (isset($after)) { array_splice($a_filter, $after+1, 0, array($filterent)); } else {