MT#21871 setting the allowed_ips via api and panel corrupts the db

+there are different implementations of obtaining a
 fresh id from voip_aig_sequence for panel and api
+api call fails, when there are more than one id's
 in that table. which can happen after concurrently
 using the panel UI for that.

+now modified to always use mysql's autoincrement,
 otherwise api will stop working again, once it
 filled up id gaps coming from panel usage.

Change-Id: I9c699e19f7161e744ae858e75089b333cbc2b128
changes/87/7587/4
Rene Krenn 9 years ago
parent 687588fbec
commit 158ed2c1c2

@ -645,27 +645,23 @@ sub update_item {
/^(man_)?allowed_ips$/ && do { /^(man_)?allowed_ips$/ && do {
my $pref_name = $pref . "_grp"; my $pref_name = $pref . "_grp";
my $aig_rs; my $aig_rs;
my $seq; my $aig_group_id;
my $rs = $self->get_preference_rs($c, $type, $elem, $pref_name); my $rs = $self->get_preference_rs($c, $type, $elem, $pref_name);
if($rs->first) { if($rs->first) {
$aig_group_id = $rs->first->value;
$aig_rs = $c->model('DB')->resultset('voip_allowed_ip_groups')->search({ $aig_rs = $c->model('DB')->resultset('voip_allowed_ip_groups')->search({
group_id => $rs->first->value group_id => $aig_group_id
}); });
$aig_rs->delete; $aig_rs->delete;
} else { } else {
my $aig_seq = $c->model('DB')->resultset('voip_aig_sequence')->search({},{ my $new_group = $c->model('DB')->resultset('voip_aig_sequence')->create({});
for => 'update', $aig_group_id = $new_group->id;
});
unless($aig_seq->first) {
$seq = 1;
$aig_seq->create({ id => $seq });
} else {
$seq = $aig_seq->first->id + 1;
$aig_seq->first->update({ id => $seq });
}
$aig_rs = $c->model('DB')->resultset('voip_allowed_ip_groups')->search({ $aig_rs = $c->model('DB')->resultset('voip_allowed_ip_groups')->search({
group_id => $seq group_id => $aig_group_id
}); });
$c->model('DB')->resultset('voip_aig_sequence')->search_rs({
id => { '<' => $aig_group_id },
})->delete_all;
} }
foreach my $ip(@{ $resource->{$pref} }) { foreach my $ip(@{ $resource->{$pref} }) {
unless($self->validate_ipnet($c, $pref, $ip)) { unless($self->validate_ipnet($c, $pref, $ip)) {
@ -675,8 +671,9 @@ sub update_item {
$aig_rs->create({ ipnet => $ip }); $aig_rs->create({ ipnet => $ip });
} }
unless($rs->first) { unless($rs->first) {
$rs->create({ value => $seq }); $rs->create({ value => $aig_group_id });
} }
# in contrast to panel, it does not drop the allowed_ips_grp pref, if empty ipnets.
last SWITCH; last SWITCH;
}; };
# default # default

Loading…
Cancel
Save