#!/usr/bin/perl my $version = "3.11"; my $minisite = "admin"; my $minisite_name = "University Offices"; use lib "/home/httpd/sync-sys/libs"; use USER::camhtml; use USER::timelib; use URI::Escape; use IO::Socket::INET; use CGI; use Net::LDAP; use Net::LDAP::Filter; use CGI::Carp qw( warningsToBrowser fatalsToBrowser ); my $default_tab = "All University"; $script = "\n"; $style = < .localnull {font-size:1px;margin-right:10px;} .tab { background: #336699; color: white; font-weight:bold; border-bottom-width: 0px; border-top-width: 1px; border-left-width: 1px; border-right-width: 10px; border-color: #0099CC; border-style: none; cursor: pointer } .tabon { background: #0099CC; color: white; font-weight:bold; border-bottom-width: 0px; border-top-width: 1px; border-left-width: 1px; border-right-width: 1px; border-color: #336699; border-style: none; cursor: pointer } .tabbar { border-color: black; border-style: solid; border-left-width: 1px; border-right-width: 1px; border-top-width: 0px; border-bottom-width: 1px; } a.searchbar:link {color: white; font-family: Arial, Helvetica, sans-serif;} a.searchbar:visited {color: white; font-family: Arial, Helvetica, sans-serif;} .quicklinks { border: solid #0099cc 1px; margin-top: 5px; padding-left: 2px; padding-right: 2px; padding-top: 2px; padding-bottom: 2px; } legend.ql { font-size: 90%; border: solid #0099cc 1px; } hr.ql { color: #0099cc; background-color: #0099cc; height: 1px; border: 0 } .highlight { font-weight: bold; } STYLE $| = 1; # Allowed referers, first key is the path and limit, second is the tab text my %allowed_referers = ( "offices/personnel/staffdev" => "Staff Development", "offices/personnel" => "Personnel", "offices/academic" => "Academic", "offices/finance" => "Finance", "offices/misd" => "MISD", "offices/safety" => "Health and Safety", "offices/embs" => "EMBS", "offices/secretariat" => "Secretariat", "offices/admissions/athandbook" => "ATHandbook", "http://www.chris.admin.cam.ac.uk/" => "CHRIS", "cam-only/offices/communications/colleges/" => "Colleges", ); my @results = (); my $self = "./index.cgi"; my $restrict_to; my $search; my $offset; my $referer_page; my $AAResponse; my $tabsel; my $got_raven = 0; my $cam_only = 0; my $show_reporter = 1; my $show_uas_staff = 0; my %restrict; my @breadcrumb = ("University of Cambridge:http://www.cam.ac.uk/"); { if( -e "site.info" ) { if( open( INFO, "< site.info" ) ) { $minisite = ; chomp $minisite; $minisite_name = ; chomp $minisite_name; $restrict{$minisite_name} = $minisite; $show_reporter = ; chomp $show_reporter; if( $show_reporter =~ /no reporter/i ) { $show_reporter = 0; } else { $show_reporter = 1; } $show_uas_staff = ; chomp $show_uas_staff; if( $show_uas_staff =~ /show uas staff/i ) { $show_uas_staff = 1; } else { $show_uas_staff = 0; } push @breadcrumb, split /\|/, ; close( INFO ); } } my $remoteUser = ""; my $page = new CGI; $restrict_to = uri_unescape($page->param("rt")); $tabsel = uri_unescape($page->param("ts")); $search = uri_unescape($page->param("search")); $offset = uri_unescape($page->param("offset")); $referer_page = uri_unescape($page->param("referer_page")); $AAResponse = uri_unescape($page->param("WLS-Response")); if( ! length( $referer_page ) ) { if( $ENV{HTTP_REFERER} !~ /\/global\/search\/index.cgi/ ) { $referer_page = $ENV{HTTP_REFERER}; } } if( $restrict_to ne $tabsel ) { $offset = 0; } my $host = `uname -n`; chomp $host; if( $host =~ /webdev/i ) { if( $minisite =~ /admin/i ) { $host = "webdev.main.internal.admin.cam.ac.uk"; } else { $host = "webdev.$minisite.internal.admin.cam.ac.uk"; } } elsif( $host =~ /wilde/i || $host =~ /auden/i ) { $host = "www.$minisite.cam.ac.uk"; } $remoteUser = $page->remote_user(); if( $remoteUser ) { $got_raven = 1; } my $remote_host = $ENV{REMOTE_HOST}; if( $remote_host =~ /\.cam\.ac\.uk/i ) { $cam_only = 1; } if( ! length( $offset ) ) { $offset = 1; } $office = ""; #it is necessary to sort the keys and then reverse the list #in order to allow subdirectories in the allowed_referers hash #to work: i.e. /offices/personnel and /offices/personnel/staffdev #you want it to hit the longer one first, if it's there my $local_restrict_to = ""; foreach my $restricted ( reverse(sort keys %allowed_referers) ) { if( $referer_page =~ /$restricted/i ) { $office = $restricted; $local_restrict_to = $allowed_referers{$restricted}; $default_tab = $local_restrict_to; last; } } if( ! length( $restrict_to ) ) { $restrict_to = "$default_tab"; } if( $restrict_to =~ /go/i ) { if( ! length( $tabsel ) ) { $restrict_to = "$default_tab"; } else { $restrict_to = $tabsel; } } if( defined( $restrict{$restrict_to} ) && length( $restrict{$restrict_to} ) ) { $restrict_to = $restrict{$restrict_to}; } my $meta = ""; print stndheader("Search Results","Search",$style,$script,"onload=\"af()\"",,$meta); if( @breadcrumb ) { print breadcrumb( @breadcrumb ); } print "\n"; print start_content(); if( length( $remoteUser ) ) { print "

You are currently logged in as \"$remoteUser\"

\n"; } if( ! $got_raven ) { my $params = "&rt=".uri_escape("$restrict_to") . "&search=". uri_escape($search) . "&offset=". uri_escape($offset) . "&referer_page=". uri_escape($referer_page) . "&tabsel=". uri_escape($tabsel); print "

If you have a Raven password, please log in to access our full range of services.

\n"; } if( length( $search ) ) { print "

Search results

\n"; } else { print "

Search

\n"; } if( ! length( $search ) ) { $dosearch = 0; $warning = "

Enter search text in the box and either click Go or one of the tabs

\n"; } else { $dosearch = 1; $warning = "

No results were found

\n"; } my $enc_search = uri_escape( $search ); if( $restrict_to =~ /$minisite/is ) { $query = "/saquery.xml?qt=url:$minisite.cam.ac.uk%20-url:/reporter/||$enc_search&st=$offset"; if( $got_raven || $cam_only ) { $searchsite = "int.web-search.cam.ac.uk"; } else { $searchsite = "web-search.cam.ac.uk"; } } elsif( $restrict_to =~ /university lookup/is && $got_raven ) { if( length( $search ) ) { my $ldap = Net::LDAP->new( "ldap.lookup.cam.ac.uk" ); my $mesg = $ldap->bind(); my $filterref = ""; if( $search =~ /^\d*$/ ) { $filterref = Net::LDAP::Filter->new( "(telephonenumber=*$search)" ); } elsif( length( $search ) ) { $filterref = Net::LDAP::Filter->new( "|(displayName=*$search*)(mail=*$search*)(mailalternative=*$search*)" ); } my $filter = $filterref->as_string; $mesg = $ldap->search( base=> "ou=people,o=University of Cambridge,dc=cam,dc=ac,dc=uk", filter=>$filter ); $mesg->code && print $mesg->error; $ref = $mesg->as_struct; @DNs = keys %$ref; foreach $dn ( @DNs ) { my $valref = $$ref{$dn}; my @attr = sort keys %$valref; my %vals = (); foreach $attrname ( @attr ) { @val = @{@$valref{$attrname}}; $vlist = join " ", @val; $vals{$attrname} = $vlist; } push @results, \%vals; } $ldap->disconnect(); } $dosearch = 0; } elsif( $restrict_to =~ /reporter/is ) { $query = "/saquery.xml?qt=url:admin.cam.ac.uk/reporter/||$enc_search&st=$offset"; if( $got_raven || $cam_only ) { $searchsite = "int.web-search.cam.ac.uk"; } else { $searchsite = "web-search.cam.ac.uk"; } } elsif( $restrict_to =~ /all university/is ) { $query = "/saquery.xml?qt=$enc_search&st=$offset"; if( $got_raven || $cam_only ) { $searchsite = "int.web-search.cam.ac.uk"; } else { $searchsite = "web-search.cam.ac.uk"; } } elsif( $restrict_to =~ /uas staff/is && ( $got_raven || $cam_only ) ) { $query = "/global/cgi/searchuas.cgi?search=$enc_search"; $searchsite = "www.admin.cam.ac.uk"; } elsif( $restrict_to ) { $query = "/saquery.xml?qt=url:$office||$enc_search&st=$offset"; if( $got_raven || $cam_only ) { $searchsite = "int.web-search.cam.ac.uk"; } else { $searchsite = "web-search.cam.ac.uk"; } } else { } my $soundex = ""; if( $dosearch ) { print STDERR "query:$query searchsite:$searchsite\n"; $socket = IO::Socket::INET->new(PeerAddr => "$searchsite", PeerPort => "80", Proto => "tcp", Type => SOCK_STREAM ) || die "Couldn't connect"; print $socket "GET $query HTTP/1.0\n\n"; $ans = join "", <$socket>; if( $ans =~ /no matches were found in the database/is ) { $query .= "&soundex=on"; print $socket "GET $query HTTP/1.0\n\n"; $ans = join "", <$socket>; $soundex = "Soundex"; } } else { $ans = ""; } if( $ans =~ /(.*?)<\/ultraseek_query>/is ) { $results = $1; my $quicklinks = get_quicklinks( $results ); $results = process_results( $results, $quicklinks ); } elsif ( $restrict_to =~ /university phone/is && $ans =~ /(.*?)/isg ) { $results = $1; $results =~ s/
//g; $results =~ s///g; $results =~ s/\Q$search\E/ "$search"<\/b>/g; if( $results =~ //is ) { $results =~ s/\Q$&\E//g; } $results =~ s/
//g; } elsif( $ans =~ /.*?<\/table>(.*?)/isg ) { $results = $1; #print STDERR "results:$results\n"; $results =~ s/
/ /g; $results =~ s// /g; if ( $results =~ m|(

Your search returned[a-zA-Z0-9 ]+)

| ) { my $replacementTerm = $1; $results =~ s|$replacementTerm|$replacementTerm
If you do not see your search term in the results, it can be found by clicking the individual's name and checking the job description.

|; #for emacs syntax highlighting' } my %matches = (); while( $results =~ /($search)/ig ) { $matches{$1} = 1; } foreach my $match ( keys %matches ) { #$results =~ s/\Q$match\E/$match<\/strong>/g; } if( $results =~ //is ) { $results =~ s/\Q$&\E//g; } $results =~ s/
//g; } elsif( $restrict_to =~ /University Lookup/ && $got_raven ) { $results = ""; if( @results ) { $results .= "
    \n"; foreach $result ( @results ) { my %reslist = %{$result}; # print join "
    ", keys %reslist; $tel = ""; if( $reslist{telephonenumber} ) { @nums = split /\s+/, $reslist{telephonenumber}; my $list = join ",", @nums; $tel = ", tel: $list"; } $email = ""; if( $reslist{mail} ) { $email = ", email: $reslist{mail}"; } $inst = ""; if( $reslist{ou} ) { $int = ", $reslist{ou}"; } $results .= "
  • $reslist{displayname}$int$tel$email
  • \n"; } $results .= "
\n"; } else { $results = "

No results found

"; } } elsif( $ans =~ /
(
.*<\/dl>)/is ) { $results = "

Results for $surname $initial $soundex

\n$1"; } else { $results = $warning; } $numresults = 0; while( $results =~ //isg ) { $numresults++; } $search =~ s/\"/"/g; #" print "
\n"; print "\n"; print "\n"; print "\n"; print "

Search for: in $restrict_to

\n"; print "\n"; print "\n"; print "\n"; print "
"; # Tabs start here print tab( "All University", $restrict_to ); print tab( $minisite, $restrict_to, $minisite_name ); if( $local_restrict_to ){ print tab( $local_restrict_to, $restrict_to ); } if( $show_reporter ) { print tab( "Reporter", $restrict_to ); } if( $show_uas_staff ) { if( $got_raven || $cam_only ) { print tab( "UAS Staff", $restrict_to ); } } if( $got_raven ) { print tab( "University Lookup", $restrict_to ); } # Tabs end here print "
\"\"/
\n"; print "
\n"; $results =~ s/; close( CLOUD ); print "
\n"; } print end_content(); print stndtrailer("webmaster\@admin.cam.ac.uk"," "); } sub process_results { my( $input, $quicklinks ) = @_; if( $input =~ /(.*?)<\/results>/is ) { $first = $1; $last = $2; $num = $3; $list = $4; } else { $results = "

No matches found

"; return $results; } if( $num == 0 ) { $results = "

No matches found

"; return $results; } if( $list =~ //is ) { $previous = $1; } if( $list =~ //is ) { $next = $1; } $previous = $first - 10; $next = $first + 10; $pagelist = "[ "; $numpages = int( $num / 10.0 ) + 1; $onpage = int($offset/10); if( $onpage*10 >= $num ) { $startpage = $onpage - 10; $endpage = $onpage; } elsif( $onpage > 5 ) { $startpage = $onpage - 5; $endpage = $onpage + 5; } else { $startpage = 0; $endpage = 10; } for( $i = $startpage; $i < $endpage; $i++ ) { if ( $i < 0 ) { next; } $noff = int($i * 10); if( $noff > $num ) { last; } if( $i != $onpage ) { my $param = "rt=".uri_escape($restrict_to) . "&ts=".uri_escape($restrict_to) . "&search=" . uri_escape($search) . "&offset=" . uri_escape($noff) . "&referer_page=".uri_escape($referer_page); $pagelist .= "$i "; } else { $pagelist .= "$i "; } } $pagelist .= "]"; if( $previous >= 0 ) { $param = "rt=".uri_escape($restrict_to) . "&ts=".uri_escape($restrict_to) . "&search=" . uri_escape($search) . "&offset=" . uri_escape($previous) . "&referer_page=".uri_escape($referer_page); $previous = "$self?$param"; } else { $previous = ""; } if( $next <= $num ) { $param = "rt=".uri_escape($restrict_to) . "&ts=".uri_escape($restrict_to) . "&search=" . uri_escape($search) . "&offset=" . uri_escape($next) . "&referer_page=".uri_escape($referer_page); $next = "$self?$param"; } else { $next = ""; } if( $numpages == 1 ) { $pagelist = ""; } if( $got_raven || $cam_only ) { $out = "

Showing results $first to $last out of $num. Including some cam-only results

"; } else { $out = "

Showing results $first to $last out of $num. Including only public results

"; } if( length( $quicklinks ) ) { $out = "$quicklinks$out"; } $out .= ""; $out .= ""; if( length( $previous ) ) { $out .= ""; } else { $out .= ""; } $out .= ""; if( length( $next ) ) { $out .= ""; } else { $out .= ""; } $out .= "
<< Previous $pagelistNext >> 
"; $out .= ""; $count = 0; $list =~ s///g; $list =~ s/<\/highlight>/<\/span>/g; while( $list =~ /(.*?)<\/result>/isg ) { $count++; $link = $1; $item = $2; if( $item =~ /(.*?)<\/summary>/is ) { $summary = $1; } if( $item =~ /(.*?)<\/title>/is ) { $title = $1; } if( $item =~ /<score>(.*?)<\/score>/is ) { $score = $1; } if( $item =~ /<date>(.*?)T(.*?)<\/date>/is ) { my $thisDate = $1; if( $thisDate =~ /(\d{4})-(\d{2})-(\d{2})/is ) { $year = substr($1,-2,2); $month = monthName($2); $day = $3; $date = sprintf("%2.2d %.3s %2.2d",$day,$month,$year); } } $out .= "<tr><td><a href=\"$link\"><strong>$title</strong></a></td><td align=\"right\">$score</td></tr>"; $out .= "<tr><td>$summary</td><td> </td></tr>"; $out .= "<tr><td><small><a href=\"$link\">$link</a></small></td><td align=\"right\">$date</td></tr>"; if( $count+$offset <= $last ) { $out .= "<tr><td colspan=\"2\" bgcolor=\"#0099cc\" class=\"null\"><img src=\"/global/images/pixel.gif\" border=\"0\" height=\"1\" width=\"16\" alt=\"\" /></td></tr>"; } } $out .= "</table>"; $out .= "<table width=\"100%\" cellpadding=\"4\" cellspacing=\"0\" border=\"0\">"; $out .= "<tr bgcolor=\"#0099CC\">"; if( length( $previous ) ) { $out .= "<td width=\"20%\" align=\"left\"><a href=\"$previous&WLS_Response=$AAResonse\" class=\"searchbar\"><< Previous</a></td>"; } else { $out .= "<td width=\"20%\"> </td>"; } $out .= "<td width=\"60%\" align=\"center\">$pagelist</td>"; if( length( $next ) ) { $out .= "<td width=\"20%\" align=\"right\"><a href=\"$next&WLS_Response=$AAResonse\" class=\"searchbar\">Next >></a></td>"; } else { $out .= "<td width=\"20%\"> </td>"; } $out .= "</tr></table>"; $out =~ s/'/'/g; @chars = split //, $out; $out = ""; foreach $char ( @chars ) { if( ord( $char ) >= 32 && ord( $char ) < 128 ) { $out .= $char; } else { $out .= "."; } } return $out; } sub tab { my( $name, $selected, $showtext ) = @_; my $state = "tab"; if( lc $selected eq lc $name ) { $state = "tabon"; } my $show = $name; if( defined( $showtext ) ) { $show = $showtext; } $tab = "<input type=\"submit\" name=\"rt\" value=\"$show\" class=\"$state\" title=\"Search $show\" />  "; return $tab; } sub enc_ref { my( $referer ) = @_; $referer =~ s/\?/%qm;/g; $referer =~ s/\&/%amp;/g; $referer = uri_escape( $referer ); return $referer; } sub unenc_ref { my( $referer ) = @_; $referer = uri_unescape( $referer ); $referer =~ s/%qm;/\?/g; $referer =~ s/%amp;/\&/g; return $referer; } sub logaction { my( $text ) = @_; open( TMP,">> /tmp/search.log" ); print TMP "$text\n"; close( TMP ); } sub get_quicklinks { my( $intext ) = @_; my $quicklinks = ""; if( $intext =~ /<quicklinks>(.*?)<\/quicklinks>/is ) { my $quicklink_block = $1; my $nquicks = 0; while( $quicklink_block =~ /<quicklink/isg ) { $nquicks++; } $quickcount = 0; while( $quicklink_block =~ /<quicklink href=\"(.*?)\">(.*?)<\/quicklink>/isg ) { my $url = $1; my $details = $2; if( $details =~ /<summary>(.*?)<\/summary>/is ) { $summary = $1; } if( $details =~ /<title>(.*?)<\/title>/is ) { $title = $1; } $quicklinks .= "<a href=\"$url\">$title</a><br />$summary<br /><small><a href=\"$url\">$url</a></small>"; $quickcount++; if( $quickcount < $nquicks ) { $quicklinks .= "<hr class=\"ql\" />"; } } } if( length( $quicklinks ) ) { $quicklinks = "<fieldset class=\"quicklinks\"><legend class=\"ql\">Quicklinks</legend>$quicklinks</fieldset>"; } return $quicklinks; }