Project

General

Profile

« Previous | Next » 

Revision 2783

Added by sgarg almost 19 years ago

New functions in the dataset registry to support moderation feature needed for ESA

View differences:

src/perl/register-dataset.cgi
35 35
use Template;
36 36
use Net::SMTP;
37 37
use CGI qw/:standard :html3/;
38
use CGI::Session;
38 39
use strict;
39 40

  
40 41
# Global configuration paramters
......
84 85
$config->define("hasMethod", { DEFAULT => 'true'} );
85 86
$config->define("temporalRequired", { DEFAULT => 'true'} );
86 87
$config->define("spatialRequired", { DEFAULT => 'true'} );
88
$config->define("contactEmailAddressRequired", { DEFAULT => 'false'} );
87 89
$config->define("publicReadable", { DEFAULT => 'true'} );
88
$config->define("accessPrincipals", { DEFAULT => ''} );
89
$config->define("accessType", { DEFAULT => ''} );
90
$config->define("moderators", { DEFAULT => ''} );
91
$config->define("moderatorPermission", { DEFAULT => ''} );
90 92
$config->define("mailhost");
91 93
$config->define("sender");
92 94
$config->define("recipient");
......
99 101
$config->define("responseTemplate", { DEFAULT => 'crap.tmpl'} );
100 102
$config->define("entryFormTemplate", { DEFAULT => 'crap.tmpl'} );
101 103
$config->define("guideTemplate", { DEFAULT => 'crap.tmpl'} );
104
$config->define("loginFormTemplate", { DEFAULT => 'crap.tmpl'} );
102 105
$config->define("confirmDataTemplate", { DEFAULT => 'crap.tmpl'} );
103 106
$config->define("deleteDataTemplate", { DEFAULT => 'crap.tmpl'} );
107
$config->define("modNotificationTemplate", { DEFAULT => 'crap.tmpl'} );
104 108
$config->define("debug", { DEFAULT => '0'} );
105 109
$config->define("lat", { ARGCOUNT => ARGCOUNT_HASH} );
106 110
$config->define("lon", { ARGCOUNT => ARGCOUNT_HASH} );
......
127 131
my $entryFormTemplate = $config->entryFormTemplate();
128 132
my $deleteDataTemplate = $config->deleteDataTemplate();
129 133
my $guideTemplate = $config->guideTemplate();
134
my $loginFormTemplate = $config->loginFormTemplate();
130 135
my $confirmDataTemplate = $config->confirmDataTemplate();
136
my $modNotificationTemplate = $config->modNotificationTemplate();
131 137
my $accesspubid = $config->accesspubid();
132 138
my $accesssysid = $config->accesssysid();
133 139
my $datasetpubid = $config->datasetpubid();
......
144 150
my $hasMethod = $config->hasMethod();
145 151
my $temporalRequired = $config->temporalRequired();
146 152
my $spatialRequired = $config->spatialRequired();
153
my $contactEmailAddressRequired = $config->contactEmailAddressRequired();
147 154
my $publicReadable = $config->publicReadable();
148
my $accessPrincipals = $config->accessPrincipals();
149
my $accessType = $config->accessType();
155
my $moderators = $config->moderators();
156
my $moderatorPermission = $config->moderatorPermission();
150 157
my $mailhost = $config->mailhost();
151 158
my $sender = $config->sender();
152 159
my $recipient = $config->recipient();
......
162 169
my $debug = $config->debug();
163 170
my $lat = $config->get('lat');
164 171
my $lon = $config->get('lon');
165

  
172
$debug = 1;
166 173
# Convert the lat and lon configs into usable data structures
167 174
my @sitelist;
168 175
my %siteLatDMS;
......
185 192
# create an instance of the template processor
186 193
my $template = Template->new($ttConfig) || die $Template::ERROR, "\n";
187 194

  
188
print "Content-type: text/html\n\n";
189

  
190 195
# Set up the template information that is common to all forms
191 196
$$templateVars{'cfg'} = $FORM::cfg;
192 197
$$templateVars{'recipient'} = $recipient;
......
198 203

  
199 204
debug("Registry: Initialized");
200 205
# Process the form based on stage parameter. 
206
if ($FORM::stage =~ "loginform") {
207
    print "Content-type: text/html\n\n";
208
    # Send back the login form.....
209
    my $session = CGI::Session->load() or die CGI::Session->errstr();
210
    if ( $session->is_empty ) {
211
		# no session found ... redirect to login page template
212
        $template->process( $loginFormTemplate, $templateVars);
213
    } else {
214
		# session found ... delete the session....
215
	    $session->delete();
216
		$template->process( $loginFormTemplate, $templateVars);
217
    }
218
	exit(0);
219
} elsif ($FORM::stage =~ "logout") {
220
	handleLogoutRequest();
221
  	exit(0);
222
} elsif ($FORM::stage =~ "login") {
223
	handleLoginRequest();
224
  	exit(0);
225
} elsif ($FORM::stage =~ "mod_accept") {
226
	handleModAccept();
227
  	exit(0);
228
} elsif ($FORM::stage =~ "mod_decline") {
229
	handleModDecline();
230
  	exit(0);
231
} elsif ($FORM::stage =~ "mod_revise") {
232
	handleModRevise();
233
  	exit(0);
234
} 
235

  
236
print "Content-type: text/html\n\n";
237

  
201 238
if ($FORM::stage =~ "guide") {
202 239
    # Send back the information on how to fill the form
203 240
    $$templateVars{'section'} = "Guide on How to Complete Registry Entries";
......
277 314
    $$templateVars{'hasMethod'} = $hasMethod;
278 315
    $$templateVars{'temporalRequired'} = $temporalRequired;
279 316
    $$templateVars{'spatialRequired'} = $spatialRequired;
317
    $$templateVars{'contactEmailAddressRequired'} = $contactEmailAddressRequired;
280 318

  
281 319
    $$templateVars{'siteList'} = \@sortedSites;
282 320
    $$templateVars{'section'} = "Entry Form";
......
516 554
  my $xmldoc = shift;
517 555
  my $docid = shift;
518 556

  
557
  debug("Trying to insert the following document");
519 558
  my $notunique = "SUCCESS";
520 559
  debug("Registry: Starting insert (D1)");
521 560
  my $response = $metacat->insert($docid, $xmldoc);
......
751 790
    push(@invalidParams, "Last name of data set contact is missing.")
752 791
    unless (hasContent($FORM::origNamelastContact) || 
753 792
        $FORM::useOrigAddress);
793
    push(@invalidParams, "Email address of data set contact is missing.")
794
    unless (hasContent($FORM::origEmailContact) || $FORM::contactEmailAddressRequired ne 'true' );
754 795
    push(@invalidParams, "Data medium is missing.")
755 796
    unless (hasContent($FORM::dataMedium) || $FORM::dataMedium =~ /elect/);
756 797
    push(@invalidParams, "Usage rights are missing.")
......
1425 1466
    $doc .= "<principal>$username</principal>\n";
1426 1467
    $doc .= "<permission>all</permission>\n";
1427 1468
    $doc .= "</allow>\n";
1428
    $doc .= "<allow>\n";
1429
    $doc .= "<principal>uid=$FORM::username,o=$FORM::organization,dc=ecoinformatics,dc=org</principal>\n";
1430
    $doc .= "<permission>all</permission>\n";
1431
    $doc .= "</allow>\n";
1469

  
1470
    if($moderators eq ''){
1471
    	$doc .= "<allow>\n";
1472
    	$doc .= "<principal>uid=$FORM::username,o=$FORM::organization,dc=ecoinformatics,dc=org</principal>\n";
1473
    	$doc .= "<permission>all</permission>\n";
1474
    	$doc .= "</allow>\n";
1475
    } else {
1476
    	foreach(split(":",$moderators)){
1477
    	    $doc .= "<allow>\n";
1478
    	    $doc .= "<principal>".$_."</principal>\n";
1479
    	    $doc .= "<permission>".$moderatorPermission."</permission>\n";
1480
    	    $doc .= "</allow>\n";
1481
        }
1482
	
1483
   		$doc .= "<allow>\n";
1484
   		$doc .= "<principal>uid=$FORM::username,o=$FORM::organization,dc=ecoinformatics,dc=org</principal>\n";
1485
   		$doc .= "<permission>read</permission>\n";
1486
   		$doc .= "<permission>write</permission>\n";
1487
   		$doc .= "</allow>\n";
1488
    }
1489

  
1432 1490
    if($publicReadable eq "true"){
1433 1491
    	$doc .= "<allow>\n";
1434 1492
    	$doc .= "<principal>public</principal>\n";
1435 1493
    	$doc .= "<permission>read</permission>\n";
1436 1494
    	$doc .= "</allow>\n";
1437 1495
    }
1438
    foreach(split(":",$accessPrincipals)){
1439
    	$doc .= "<allow>\n";
1440
    	$doc .= "<principal>".$_."</principal>\n";
1441
    	$doc .= "<permission>".$accessType."</permission>\n";
1442
    	$doc .= "</allow>\n";
1443
    }
1444 1496
    $doc .= "</access>\n";
1445 1497
    
1446 1498
    $doc .= "</dataset>\n</eml:eml>\n";
......
1449 1501
}
1450 1502

  
1451 1503

  
1452
################################################################################
1453
# 
1454
# send an email message notifying the moderator of a new submission 
1455
#
1456
################################################################################
1457
sub sendNotification {
1458
    my $identifier = shift;
1459
    my $mailhost = shift;
1460
    my $sender = shift;
1461
    my $recipient = shift;
1504
sub readDocumentFromMetacat(){
1462 1505

  
1463
    my $smtp = Net::SMTP->new($mailhost);
1464
    $smtp->mail($sender);
1465
    $smtp->to($recipient);
1466

  
1467
    my $message = <<"    ENDOFMESSAGE";
1468
    To: $recipient
1469
    From: $sender
1470
    Subject: New data submission
1471
    
1472
    Data was submitted to the data registry.  
1473
    The identifying information for the new data set is:
1474

  
1475
    Identifier: $identifier
1476
    Title: $FORM::title
1477
    Submitter: $FORM::providerGivenName $FORM::providerSurName
1478

  
1479
    Please review the submmission and grant public read access if appropriate.
1480
    Thanks
1481
    
1482
    ENDOFMESSAGE
1483
    $message =~ s/^[ \t\r\f]+//gm;
1484

  
1485
    $smtp->data($message);
1486
    $smtp->quit;
1487
}
1488

  
1489

  
1490
################################################################################
1491
# 
1492
# read the eml document and send back a form with values filled in. 
1493
#
1494
################################################################################
1495
sub modifyData {
1496
    
1506
    my $docid = $FORM::docid;
1497 1507
    # create metacat instance
1498 1508
    my $metacat;
1499
    my $docid = $FORM::docid;
1500 1509
    my $httpMessage;
1501 1510
    my $doc;
1502 1511
    my $xmldoc;
......
1602 1611
            #open (TFILE,">$tempfile") || die ("Cant open xml file...\n");
1603 1612
            #print TFILE $stylesheet->output_string($resultsheet);
1604 1613
            #close(TFILE);
1605

  
1606
            getFormValuesFromEml2($resultsheet);
1607 1614
            
1608 1615
            # Delete the files written earlier. 
1609 1616
            unlink @fileArray;
1610 1617

  
1611
        } else {
1612
            getFormValuesFromEml2($xmldoc);
1618
            return $resultsheet;
1619

  
1613 1620
        }
1614
    }   
1621
    }
1622
    return $xmldoc;
1623
}   
1624

  
1615 1625
    
1626
################################################################################
1627
# 
1628
# read the eml document and send back a form with values filled in. 
1629
#
1630
################################################################################
1631
sub modifyData {
1632

  
1633
    my $xmldoc = readDocumentFromMetacat();    	
1634
    getFormValuesFromEml2($xmldoc);
1635

  
1616 1636
    if (scalar(@errorMessages)) {
1617 1637
        # if any errors, print them in the response template 
1618 1638
        $$templateVars{'status'} = 'failure_no_resubmit';
......
1656 1676
    $$templateVars{'hasTaxonomic'} = $hasTaxonomic;
1657 1677
    $$templateVars{'hasMethod'} = $hasMethod;
1658 1678
    $$templateVars{'spatialRequired'} = $spatialRequired;
1679
    $$templateVars{'contactEmailAddressRequired'} = $contactEmailAddressRequired;
1659 1680
    $$templateVars{'temporalRequired'} = $temporalRequired;
1660 1681

  
1661 1682
    # find out the tag <alternateIdentifier>. 
......
2395 2416
    }
2396 2417
}
2397 2418

  
2419
################################################################################
2420
# 
2421
# function to handle login request  
2422
#
2423
################################################################################
2424
sub handleLoginRequest(){
2425
    # Check if a session already exists
2426
    my $session = CGI::Session->load() or die CGI::Session->errstr();
2427
    if ( $session->is_empty ) {
2428
        # no session found ... check if the login is correct
2429
		my $username = $FORM::username;
2430
		my $password = $FORM::password;
2398 2431

  
2432
		debug($username);
2433
		debug($password);
2434
		my $metacat = Metacat->new();
2435
		if ($metacat) {
2436
        	$metacat->set_options( metacatUrl => $metacatUrl );
2437
    	} else {
2438
        	#die "failed during metacat creation\n";
2439
        	push(@errorMessages, "Failed during metacat creation.");
2440
    	}
2441
		my $returnVal = $metacat->login($username,$password);
2442
		debug($returnVal);
2443
        if($returnVal > 0){
2444
		# valid username and passwd
2445
		# create a new session and store username and passswd
2446
		$session = new CGI::Session();
2447

  
2448
		$session->param('username', $username);
2449
		$session->param('password', $password);
2450
		
2451
		if($returnVal == 2 || $returnVal == 4){
2452
			# is a moderator. store this information in the session
2453
			$session->param('moderator', 'true');	
2454
		}
2455

  
2456
		# send redirect to metacat and action = login
2457
		my $html = "<html><head>";
2458
    		$html .= "</head><body onload=\"document.loginForm.submit()\">";
2459
		$html .= "<form name=\"loginForm\" method=\"post\" action=\"@systemidserver@@servlet-path@\">";
2460
		$html .= "<input type=\"hidden\" name=\"action\" value=\"login\" />";
2461
		$html .= "<input type=\"hidden\" name=\"username\" value=\"".$FORM::username."\" />";
2462
		$html .= "<input type=\"hidden\" name=\"password\" value=\"".$FORM::password."\" />";
2463
		$html .= "<input type=\"hidden\" name=\"qformat\" value=\"".$FORM::cfg."\" />";
2464
		$html .= "</form></body></html>";
2465
		debug($html); 
2466
		debug($session->header());
2467
		print $session->header();
2468
		print $html;
2469
	} else {
2470
		# send back the error template with error message as wrong username password
2471
		# push(@errorMessages, $metacat->getMessage());
2472
		print "Content-type: text/html\n\n";
2473
        	push(@errorMessages, "Failed during login.\n");
2474
        	$$templateVars{'status'} = 'login_failure';
2475
        	$$templateVars{'errorMessages'} = \@errorMessages;
2476
        	$$templateVars{'cfg'} = $FORM::cfg;
2477
        	$$templateVars{'section'} = "Login Status";
2478
        	$template->process( $responseTemplate, $templateVars);
2479
	}
2480

  
2481
        exit(0);
2482
    } else {
2483
        # session found ... redirect to index page
2484
        my $url = "@systemidserver@@style-skins-path@/".$FORM::cfg."/index.html";
2485
	redirect($url);
2486
	exit(0);
2487
   }
2488
}
2489

  
2399 2490
################################################################################
2400 2491
# 
2492
# function to handle logout request  
2493
#
2494
################################################################################
2495
sub handleLogoutRequest(){
2496
    print "Content-type: text/html\n\n";
2497
	# Check if the session exists
2498
	debug("Stage is logout");
2499
    my $session = CGI::Session->load();
2500
    if ( $session->is_empty || $session->is_expired) {
2501
        # no session found ... send back to index.html page ... 
2502
	    debug("Session empty or not found");
2503
  	    my $url = "@systemidserver@@style-skins-path@/".$FORM::cfg."/index.html";
2504
	    redirect($url);
2505
        # should logout request be sent to metacat??? 
2506
	} else {
2507
	    # get the user name and delete the session
2508
	    debug("Session found");
2509
  	    my $uname = $session->param("username");
2510
	    $session->delete();
2511
	    # send redirect to metacat and action = login
2512
 	    my $html = "<html><head>";
2513
   	    $html .= "</head><body onload=\"document.loginForm.submit()\">";
2514
 	    $html .= "<form name=\"loginForm\" method=\"post\" action=\"@systemidserver@@servlet-path@\">";
2515
	    $html .= "<input type=\"hidden\" name=\"action\" value=\"logout\" />";
2516
	    $html .= "<input type=\"hidden\" name=\"username\" value=\"".$uname."\" />";
2517
	    $html .= "<input type=\"hidden\" name=\"qformat\" value=\"".$FORM::cfg."\" />";
2518
	    $html .= "</form></body></html>";
2519
	    debug($html); 
2520
	    print($html);
2521
	}
2522
}
2523

  
2524
################################################################################
2525
# 
2526
# function to handle accept request for moderator  
2527
#
2528
################################################################################
2529
sub handleModAccept(){
2530

  
2531
	my $metacat;
2532
    $metacat = Metacat->new();
2533
    if ($metacat) {
2534
        $metacat->set_options( metacatUrl => $metacatUrl );
2535
    } else {
2536
        #die "failed during metacat creation\n";
2537
        push(@errorMessages, "Failed during metacat creation.");
2538
    }
2539

  
2540
    print "Content-type: text/html\n\n";
2541

  
2542
    # Check if the session exists
2543
    debug("Stage is mod_accept");
2544

  
2545
    my $session = CGI::Session->load();
2546
    if ( $session->is_empty || $session->is_expired) {
2547
        # no session found ... send back to index.html page ... 
2548
		push(@errorMessages, "Failed during login.\n");    
2549
		processErrorTemplate('login_failure', 'loginform', 'Login Status');
2550
		return;
2551
    } 
2552

  
2553
    # check if logged in user is moderator
2554
	my $moderator = $session->param("moderator");
2555
    if ( $moderator ne 'true') {
2556
        # no session found ... send back to index.html page ... 
2557
	    debug("Logged in user is not moderator");
2558
		push(@errorMessages, "Logged in user is not moderator. Please login again as moderator\n");    
2559
		processErrorTemplate('login_failure', 'loginform', 'Login Status');
2560
		return;
2561
    } 
2562

  
2563
    # change the access rules
2564
	
2565
    ## create the access block
2566
    my $accessblock = '';
2567
    $accessblock .= "<access authSystem=\"knb\" order=\"denyFirst\">\n";
2568
    $accessblock .= "<allow>\n";
2569
    $accessblock .= "<principal>$username</principal>\n";
2570
    $accessblock .= "<permission>all</permission>\n";
2571
    $accessblock .= "</allow>\n";
2572

  
2573
    foreach(split(":",$moderators)){
2574
   	$accessblock .= "<allow>\n";
2575
   	$accessblock .= "<principal>".$_."</principal>\n";
2576
   	$accessblock .= "<permission>".$moderatorPermission."</permission>\n";
2577
   	$accessblock .= "</allow>\n";
2578
    }
2579
	
2580
    $accessblock .= "<allow>\n";
2581
    $accessblock .= "<principal>public</principal>\n";
2582
    $accessblock .= "<permission>read</permission>\n";
2583
    $accessblock .= "</allow>\n";
2584
    $accessblock .= "</access>\n";
2585

  
2586
    ## read the document from 
2587
    my $docFromMetacat = readDocumentFromMetacat();
2588
    my ($emldoc, $temp) = split('<access authSystem=', $docFromMetacat);
2589

  
2590
    $emldoc .= $accessblock;
2591
    $emldoc .= "</dataset>\n</eml:eml>\n";
2592

  
2593
    debug("Document created by handleModAccept is " . $emldoc);
2594

  
2595
    # update the document
2596
    my $docid = $FORM::docid;
2597
    
2598
    my $x;
2599
    my $y;
2600
    my $z;
2601
        
2602
    ($x, $y, $z) = split(/\./, $docid); 
2603
    $z++;
2604
    $docid = "$x.$y.$z";
2605
    
2606
    $emldoc =~ s/packageId=\"docid\"/packageId=\"$docid\"/;
2607
        
2608
    my $response = $metacat->update($docid, $emldoc);
2609

  
2610
    if (! $response) {
2611
        debug("Error while updating in handleModAccept.");
2612

  
2613
    	push(@errorMessages, $metacat->getMessage());
2614
        push(@errorMessages, "Failed while updating.\n");  
2615

  
2616
		############ TODO: need for proper error message
2617
	}
2618

  
2619
	# get the contact email address from the 
2620
    my $parser = XML::LibXML->new();
2621
   	my $xmldoc = $parser->parse_string($emldoc);
2622

  
2623
   	if ($xmldoc eq "" || $doc=~ /<error/) {
2624
		# not able to parse
2625
       	push(@errorMessages, "Error in reading the docid:".$docid."\n");
2626
	} else {
2627
	    my $findNodes = $xmldoc->findnodes('//dataset/contact');
2628
	    if($findNodes->size() > 0){
2629
			# found contact email address
2630
			my $node = '';
2631
			foreach $node ($findNodes->get_nodelist) {
2632
				$contactEmailAddress = findValue($node,'electronicMailAddress');
2633
				my $surName = findValue($node,'individualName/surName');
2634
				my $givenName = findValue($node,'individualName/givenName');
2635
				my $organizationName = findValue($node,'organizaitionName');
2636
	
2637
				if($surName ne ''){
2638
					$contactName = $givenName.' '.$surName;
2639
				} else {
2640
					$contactName = $organizationName;
2641
				}
2642
			}
2643
		} else {
2644
			$contactEmailAddress = '';
2645
		}
2646
    	$findNodes = $xmldoc->findnodes('//dataset/title');
2647
		if($findNodes->size() > 0){
2648
			# found title
2649
			my $node = '';
2650
			foreach $node ($findNodes->get_nodelist) {
2651
				$title = findValue($node,'../title');
2652
			}
2653
		} else {
2654
			$title = '';
2655
		}
2656
	}	
2657

  
2658
    # send notification to the user and the moderator
2659
    if (!scalar(@errorMessages)) {
2660
		# send notifications
2661
		mod_sendNotification($title, $contactEmailAddress, $contactName, 'Document '.$FORM::docid.' Accepted');
2662

  
2663
	    $$templateVars{'function'} = "deleted";
2664
	    $$templateVars{'section'} = "Deletion Status";
2665
	    $template->process( $responseTemplate, $templateVars);
2666
    } else {
2667
		############ TODO: need for proper error message
2668
		processErrorTemplate('failure', '', 'Unable to delete the document');		
2669
	}
2670
}
2671

  
2672
################################################################################
2673
# 
2674
# function to handle decline request for moderator  
2675
#
2676
################################################################################
2677
sub handleModDecline(){
2678

  
2679
	my $metacat;
2680
    $metacat = Metacat->new();
2681
    if ($metacat) {
2682
        $metacat->set_options( metacatUrl => $metacatUrl );
2683
    } else {
2684
        #die "failed during metacat creation\n";
2685
        push(@errorMessages, "Failed during metacat creation.");
2686
    }
2687

  
2688
    print "Content-type: text/html\n\n";
2689

  
2690
    # Check if the session exists
2691
    debug("Stage is mod_decline");
2692

  
2693
    my $session = CGI::Session->load();
2694
    if ( $session->is_empty || $session->is_expired) {
2695
        # no session found ... send back to index.html page ... 
2696
		push(@errorMessages, "Failed during login.\n");    
2697
		processErrorTemplate('login_failure', 'loginform', 'Login Status');
2698
		return;
2699
    } 
2700

  
2701
    # check if logged in user is moderator
2702
	my $moderator = $session->param("moderator");
2703
    if ( $moderator ne 'true') {
2704
        # no session found ... send back to index.html page ... 
2705
	    debug("Logged in user is not moderator");
2706
		push(@errorMessages, "Logged in user is not moderator. Please login again as moderator\n");    
2707
		processErrorTemplate('login_failure', 'loginform', 'Login Status');
2708
		return;
2709
    } 
2710
	
2711
	# variables for contact information
2712
	my $contactEmailAddress;
2713
	my $contactName;
2714
	my $title;
2715

  
2716
	# Log into metacat
2717
    my $username = $session->param("username");
2718
    my $password = $session->param("password");
2719
    my $response = $metacat->login($username, $password);
2720
    
2721
	if (! $response) {
2722
    # Could not login
2723
        push(@errorMessages, $metacat->getMessage());
2724
        push(@errorMessages, "Failed during login.\n");
2725

  
2726
    } else {
2727
		# read the document and get the contact name and address
2728
	    my $parser = XML::LibXML->new();
2729
    	my $docid = $FORM::docid;
2730

  
2731
		$response = $metacat->read($docid);
2732
 		my $doc = $response->content();
2733
    	my $xmldoc = $parser->parse_string($doc);
2734

  
2735
    	if ($xmldoc eq "" || $doc=~ /<error/) {
2736
			# not able to parse
2737
	       	push(@errorMessages, "Error in reading the docid:".$docid."\n");
2738
		} else {
2739
		    my $findNodes = $xmldoc->findnodes('//dataset/contact');
2740
		    if($findNodes->size() > 0){
2741
				# found contact email address
2742
				my $node = '';
2743
				foreach $node ($findNodes->get_nodelist) {
2744
					$contactEmailAddress = findValue($node,'electronicMailAddress');
2745

  
2746
					my $surName = findValue($node,'individualName/surName');
2747
					my $givenName = findValue($node,'individualName/givenName');
2748
					my $organizationName = findValue($node,'organizaitionName');
2749
		
2750
					if($surName ne ''){
2751
						$contactName = $givenName.' '.$surName;
2752
					} else {
2753
						$contactName = $organizationName;
2754
					}
2755
				}
2756
			} else {
2757
				$contactEmailAddress = '';
2758
			}
2759
	    	$findNodes = $xmldoc->findnodes('//dataset/title');
2760
			if($findNodes->size() > 0){
2761
				# found title
2762
				my $node = '';
2763
				foreach $node ($findNodes->get_nodelist) {
2764
					$title = findValue($node,'../title');
2765
				}
2766
			} else {
2767
				$title = '';
2768
			}
2769

  
2770
		}
2771

  
2772
	    #$response = $metacat->delete($docid);
2773
	   	if (!$response) {
2774
	       	debug("Error while deleting document in handleModDecline.");
2775
	    	push(@errorMessages, $metacat->getMessage());
2776
	       	push(@errorMessages, "Failed during deleting $docid. Please check if you are authorized to delete this document.\n"); 
2777
	    } else {
2778
			debug("Document deleted by handleModDecline is " . $docid);	
2779
		}
2780
	}
2781

  
2782
    if (!scalar(@errorMessages)) {
2783
		# send notifications
2784
		mod_sendNotification($title, $contactEmailAddress, $contactName, 'Document '.$FORM::docid.' Rejected');
2785

  
2786
	    $$templateVars{'function'} = "deleted";
2787
	    $$templateVars{'section'} = "Deletion Status";
2788
	    $template->process( $responseTemplate, $templateVars);
2789
    } else {
2790
		############ TODO: need for proper error message
2791
		processErrorTemplate('failure', '', 'Unable to delete the document');		
2792
	}
2793
}
2794

  
2795
################################################################################
2796
# 
2797
# function to handle revise request for moderator  
2798
#
2799
################################################################################
2800
sub handleModRevise(){
2801

  
2802
	my $metacat;
2803
    $metacat = Metacat->new();
2804
    if ($metacat) {
2805
        $metacat->set_options( metacatUrl => $metacatUrl );
2806
    } else {
2807
        #die "failed during metacat creation\n";
2808
        push(@errorMessages, "Failed during metacat creation.");
2809
    }
2810

  
2811
    print "Content-type: text/html\n\n";
2812

  
2813
    # Check if the session exists
2814
    debug("Stage is mod_revise");
2815

  
2816
    my $session = CGI::Session->load();
2817
    if ( $session->is_empty || $session->is_expired) {
2818
        # no session found ... send back to index.html page ... 
2819
		push(@errorMessages, "Failed during login.\n");    
2820
		processErrorTemplate('login_failure', 'loginform', 'Login Status');
2821
		return;
2822
    } 
2823

  
2824
    # check if logged in user is moderator
2825
	my $moderator = $session->param("moderator");
2826
    if ( $moderator ne 'true') {
2827
        # no session found ... send back to index.html page ... 
2828
	    debug("Logged in user is not moderator");
2829
		push(@errorMessages, "Logged in user is not moderator. Please login again as moderator\n");    
2830
		processErrorTemplate('login_failure', 'loginform', 'Login Status');
2831
		return;
2832
    } 
2833

  
2834
	# variables for contact information
2835
	my $contactEmailAddress;
2836
	my $contactName;
2837
	my $title;
2838

  
2839
	# Log into metacat
2840
    my $username = $session->param("username");
2841
    my $password = $session->param("password");
2842
    my $response = $metacat->login($username, $password);
2843
    
2844
	if (! $response) {
2845
    # Could not login
2846
        push(@errorMessages, $metacat->getMessage());
2847
        push(@errorMessages, "Failed during login.\n");
2848

  
2849
    } else {
2850
		# read the document and get the contact name and address
2851
	    my $parser = XML::LibXML->new();
2852
    	my $docid = $FORM::docid;
2853

  
2854
		$response = $metacat->read($docid);
2855
 		my $doc = $response->content();
2856
    	my $xmldoc = $parser->parse_string($doc);
2857

  
2858
    	if ($xmldoc eq "" || $doc=~ /<error/) {
2859
			# not able to parse
2860
	       	push(@errorMessages, "Error in reading the docid:".$docid."\n");
2861
		} else {
2862
		    my $findNodes = $xmldoc->findnodes('//dataset/contact');
2863
		    if($findNodes->size() > 0){
2864
				# found contact email address
2865
				my $node = '';
2866
				foreach $node ($findNodes->get_nodelist) {
2867
					$contactEmailAddress = findValue($node,'electronicMailAddress');
2868

  
2869
					my $surName = findValue($node,'individualName/surName');
2870
					my $givenName = findValue($node,'individualName/givenName');
2871
					my $organizationName = findValue($node,'organizaitionName');
2872
		
2873
					if($surName ne ''){
2874
						$contactName = $givenName.' '.$surName;
2875
					} else {
2876
						$contactName = $organizationName;
2877
					}
2878
				}
2879
			} else {
2880
				$contactEmailAddress = '';
2881
			}
2882
	    	$findNodes = $xmldoc->findnodes('//dataset/title');
2883
			if($findNodes->size() > 0){
2884
				# found title
2885
				my $node = '';
2886
				foreach $node ($findNodes->get_nodelist) {
2887
					$title = findValue($node,'../title');
2888
				}
2889
			} else {
2890
				$title = '';
2891
			}
2892

  
2893
		}
2894
	}
2895

  
2896
	# send notifications
2897
	mod_sendNotification($title, $contactEmailAddress, $contactName, "Revise document: ".$FORM::docid);
2898

  
2899
    $$templateVars{'function'} = "deleted";
2900
    $$templateVars{'section'} = "Deletion Status";
2901
    $template->process( $responseTemplate, $templateVars);
2902
}
2903

  
2904

  
2905

  
2906
################################################################################
2907
# 
2908
# send an email message to the moderator and the contact 
2909
#
2910
################################################################################
2911
sub mod_sendNotification {
2912
	my $title = shift;
2913
	my $contactEmailAddress = shift;
2914
	my $contactName = shift;
2915
	my $subject = shift;
2916

  
2917
	debug($subject);
2918
    # send notification to the user and the moderator
2919
	my $templateVars = { 'stage' => $FORM::stage };
2920
	$$templateVars{'recipient'} = $recipient;
2921
	$$templateVars{'sender'} = $sender;
2922
	$$templateVars{'docid'} = $FORM::docid;
2923
	$$templateVars{'comment'} = $FORM::comment;
2924
	$$templateVars{'contactName'} = $contactName;
2925
	$$templateVars{'dpTitle'} = $title;
2926

  
2927
	$$templateVars{'recipient_status'} = 'moderator';
2928
	sendNotification($mailhost, $sender, $recipient, $subject, 
2929
							$modNotificationTemplate, $templateVars);
2930
	if($contactEmailAddress ne ''){
2931
		# send notification to contact email address specified in cfg   
2932
		$$templateVars{'recipient'} = $contactEmailAddress;
2933
		$$templateVars{'recipient_status'} = 'user';
2934
		sendNotification($mailhost, $sender, $contactEmailAddress, 
2935
				$subject, $modNotificationTemplate, $templateVars);
2936
	}
2937
}
2938

  
2939
################################################################################
2940
# 
2941
# send an email message notifying the moderator of a new submission 
2942
#
2943
################################################################################
2944
sub sendNotification {
2945
    my $mailhost = shift;
2946
    my $sender = shift;
2947
    my $recipient = shift;
2948
	my $subject = shift;
2949
    my $templateForm = shift;
2950
    my $templateVars = shift;
2951

  
2952
	debug($mailhost);
2953
	debug($sender);
2954
	debug($recipient);
2955
	debug($subject);
2956

  
2957
    my $smtp = Net::SMTP->new($mailhost);
2958
    $smtp->mail($sender);
2959
    $smtp->to($recipient);
2960

  
2961
	$smtp->data;
2962
	$smtp->datasend("From: $sender\n");
2963
	$smtp->datasend("To: <$recipient>\n");
2964
	$smtp->datasend("Subject: $subject\n");
2965
	$smtp->datasend("\n");
2966

  
2967
    my $message;
2968
	$template->process($templateForm, $templateVars,\$message);
2969

  
2970
    $smtp->datasend($message);
2971
	$smtp->dataend();
2972
    $smtp->quit;
2973
}
2974

  
2975
sub processErrorTemplate(){
2976
	my $status = shift;
2977
	my $function = shift;
2978
	my $section = shift;
2979

  
2980
	$$templateVars{'status'} = $status;
2981
    $$templateVars{'function'} = $function;
2982
	$$templateVars{'errorMessages'} = \@errorMessages;
2983
    $$templateVars{'cfg'} = $FORM::cfg;
2984
    $$templateVars{'section'} = $section;
2985
    $template->process( $responseTemplate, $templateVars);
2986
}
2987

  
2988

  
2989
################################################################################
2990
# 
2401 2991
# Do data validation and send the data to confirm data template.
2402 2992
#
2403 2993
################################################################################
......
2594 3184
    $$templateVars{'hasTaxonomic'} = $FORM::hasTaxonomic;
2595 3185
    $$templateVars{'hasMethod'} = $FORM::hasMethod;
2596 3186
    $$templateVars{'spatialRequired'} = $FORM::spatialRequired;
3187
    $$templateVars{'contactEmailAddressRequired'} = $FORM::contactEmailAddressRequired;
2597 3188
    $$templateVars{'temporalRequired'} = $FORM::temporalRequired;
2598 3189

  
2599 3190
    $$templateVars{'docid'} = $FORM::docid;
......
2791 3382
    $$templateVars{'hasTaxonomic'} = $FORM::hasTaxonomic;
2792 3383
    $$templateVars{'hasMethod'} = $FORM::hasMethod;
2793 3384
    $$templateVars{'spatialRequired'} = $FORM::spatialRequired;
3385
    $$templateVars{'contactEmailAddressRequired'} = $FORM::contactEmailAddressRequired;
2794 3386
    $$templateVars{'temporalRequired'} = $FORM::temporalRequired;
2795 3387
}
2796 3388

  
......
2911 3503

  
2912 3504
################################################################################
2913 3505
# 
3506
# print redirect html code
3507
#
3508
################################################################################
3509
sub redirect(){
3510
    my $url = shift;
3511

  
3512
    print "<head>";
3513
    print "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=".$url."\">";
3514
    print "</head><body></body></html>"; 
3515
}
3516

  
3517

  
3518
################################################################################
3519
# 
2914 3520
# print debugging messages to stderr
2915 3521
#
2916 3522
################################################################################

Also available in: Unified diff