<<< Chronological >>> Author Index    Subject Index <<< Threads >>>

Re: 181 question

  • To: Andrew Adams < >
  • From: Marten Terpstra < >
  • Date: Mon, 16 Jan 1995 13:50:55 +0100
  • Cc:

 * 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;



  • Post To The List:
<<< Chronological >>> Author    Subject <<< Threads >>>