181 question
Marten Terpstra
Mon Jan 16 13:50:55 CET 1995
* I tried to change an object with an older 'changed' date that the one * currently in the db. The message that was mailed out to the people * specified in that object's 'notify' attribute said that the * object had been _replaced_. However, the object wasn't really replaced. * That is to say, the software realized that I was submitting an object * with an older 'chagned' date and prevented me from making the update. * * So it seems to me that the message sent to the people specified in the * 'notify' should read 'a change was _attempted_', yes? It was indeed a bug. The date check and the notification were done in the wrong order. A date check should come before notification. It was not the notify attribute that caused this, but notification due to a mnt-by attribute. The ordering has been fixed in the version of updatecheck.pl below. Replace src/updatecheck.pl with the one below and run "make" in the top level database directory. Thanks Andy. -Marten # $RCSfile: updatecheck.pl,v $ # $Revision: 1.17 $ # $Author: marten $ # $Date: 1995/01/16 12:45:29 $ require "defines.pl"; require "adderror.pl"; require "notify.pl"; require "maintainer.pl"; # In updatecheck one can do all the checks one wants because one has both # the old and the new object. All checks in here are VERY RIPE database # specific. # It is supposed to be like this: # *cur = empty : addition # *new = empty : deletion # non = empty : update sub updatecheck { local(*cur, *new, *db) = @_; local($email, $date) = ""; local($newdate) = ""; local($curdate) = ""; local($stat) = $OK; local($type) = &entype(*new); # If this is a maintainer object, bounce it of to the human mailbox # configured in the config and sent them a message explaining this. # We use the GENERAL ERROR for this (since that one can add anytext) if ($type eq "mt") { if (!$cur{"mt"} && !$new{"uo"}) { # This is a new maintainer object &adderror(*new, "maintainer objects cannot be created automatically"); &adderror(*new, "This object has been forwarded to <$HUMAILBOX>"); &adderror(*new, "for authorisation"); if (open (TMPMAIL, ">$TMPDIR/mtfw.$$")) { select(TMPMAIL); eval "print \"$MTFWHEADER\n\";"; eval "print \"$MTFWTEXT\";"; print "\n" if &enwrite(*new, 1, 0, 0); select (STDOUT); close(TMPMAIL); system("$MAILCMD < $TMPDIR/mtfw.$$"); unlink("$TMPDIR/mtfw.$$"); } else { &adderror(*new, "!! an error occured, please send object to <$HUMAILBOX> !!"); &syslog("ERRLOG", "updatecheck cannot open file to forward maintainer object $new{\"mt\"}\n"); } return $E_GENERAL; } } # Check update date foreach (split(/\n/, $new{"ch"})) { ($email, $date) = split(/\s+/, $_); if ($date gt $newdate) { $newdate = $date; } } foreach (split(/\n/, $cur{"ch"})) { ($email, $date) = split(/\s+/, $_); if ($date gt $curdate) { $curdate = $date; } } if ($newdate lt $curdate) { return $E_OLDER; } # Check authorisation by maintainer unless override is specified. if (!$new{"uo"} && !&Maintainer(*cur, *new)) { return $E_AUTHFAIL unless !&entype(*new); } # Catch if called from dbdel, then skip all checks, # just do notification. if (!&entype(*new)) { &AddNotify(*cur, *new); &syslog("AUDITLOG", "delete \"$new{\"$type\"}\" - \"$cur{\"ud\"}\""); return; } # Reset guarded values unless it has the "override" attribute &addguard(*new, *cur) unless $new{"uo"}; &AddNotify(*cur, *new); # Log special actions if ($new{"uo"}) { &syslog("AUDITLOG", "override by \"$new{\"uo\"}\" for \"$new{\"$type\"}\""); } if ($new{"ua"}) { &syslog("AUDITLOG", "authorise by \"$new{\"ua\"}\" for \"$new{\"$type\"}\""); } return $stat; } # Resetting guarded values if necessary sub addguard { local(*new, *cur) = @_; local($stat) = $OK; foreach (split(/\s+/, $GRD{$type})) { if ($new{$_} ne $cur{$_}) { &addwarning(*new, "update of guarded attribute \"$ATTL{$_}\" ignored"); $new{$_} = $cur{$_}; } } return; } 1; -------- Logged at Tue Jan 17 17:41:19 MET 1995 ---------
[ rr-impl Archive ]