PurpleWiki
view release on metacpan or search on metacpan
return $result;
}
sub GetRemoteHost {
my ($doMask) = @_;
my ($rhost, $iaddr);
$rhost = $ENV{REMOTE_HOST};
if ($rhost eq "") {
# Catch errors (including bad input) without aborting the script
eval 'use Socket; $iaddr = inet_aton($ENV{REMOTE_ADDR});'
. '$rhost = gethostbyaddr($iaddr, AF_INET)';
}
if ($rhost eq "") {
$rhost = $ENV{REMOTE_ADDR};
$rhost =~ s/\d+$/xxx/ if ($doMask); # Be somewhat anonymous
}
return $rhost;
}
sub FreeToNormal {
my ($id) = @_;
$id =~ s/ /_/g;
$id = ucfirst($id);
if (index($id, '_') > -1) { # Quick check for any space/underscores
$id =~ s/__+/_/g;
$id =~ s/^_//;
$id =~ s/_$//;
if ($config->UseSubpage) {
$id =~ s|_/|/|g;
$id =~ s|/_|/|g;
}
}
if ($config->FreeUpper) {
# Note that letters after ' are *not* capitalized
if ($id =~ m|[-_.,\(\)/][a-z]|) { # Quick check for non-canonical case
$id =~ s|([-_.,\(\)/])([a-z])|$1 . uc($2)|ge;
}
}
return $id;
}
#END_OF_BROWSE_CODE
# == Page-editing and other special-action code ========================
sub DoOtherRequest {
my ($id, $action, $text, $search);
$action = GetParam("action", "");
$id = GetParam("id", "");
my $iname = &GetParam("xri_iname", "");
if ($action ne "") {
$action = lc($action);
if ($action eq "edit") {
DoEdit($id, 0, 0, "", 0) if ValidIdOrDie($id);
} elsif ($action eq "unlock") {
DoUnlock();
} elsif ($action eq "index") {
DoIndex();
} elsif ($action eq "editprefs") {
DoEditPrefs();
} elsif ($config->UseINames && $action eq "getiname") {
if (!$user) {
&DoGetIname();
}
else { # return an error
}
} elsif ($action eq "login") {
DoEnterLogin();
} elsif ($action eq "newlogin") {
$user = undef;
DoEditPrefs(); # Also creates new ID
} elsif ($action eq "logout") {
&DoLogout;
} elsif ($action eq 'rss') {
require PurpleWiki::Syndication::Rss;
my $rss = new PurpleWiki::Syndication::Rss;
print $q->header(-type => 'text/xml') .
$rss->getRSS;
} else {
# Later improve error reporting
$wikiTemplate->vars(&globalTemplateVars,
action => $action);
print GetHttpHeader() . $wikiTemplate->process('errors/actionInvalid');
}
return;
}
elsif ($config->UseINames && $iname) {
my $xsid = &GetParam('xri_xsid', '');
&DoIname($iname, $xsid);
return;
}
$iname = &GetParam("iname", "");
if ($config->UseINames && $iname) {
my $localId = &GetParam("local_id", "");
my $rrsid = &GetParam("rrsid", "");
&DoAssociateIname($iname, $localId, $rrsid);
return;
}
if (&GetParam("edit_prefs", 0)) {
&DoUpdatePrefs();
return;
}
if (GetParam("enter_login", 0)) {
DoLogin();
return;
}
$search = GetParam("search", "");
if (($search ne "") || (GetParam("dosearch", "") ne "")) {
DoSearch($search);
return;
}
# Handle posted pages
if (GetParam("oldtime", "") ne "") {
$id = GetParam("title", "");
DoPost() if ValidIdOrDie($id);
return;
}
# Later improve error message
$wikiTemplate->vars(&globalTemplateVars);
print GetHttpHeader() . $wikiTemplate->process('errors/urlInvalid');
}
sub DoEdit {
my ($id, $isConflict, $oldTime, $newText, $preview) = @_;
my ($header, $editRows, $editCols, $revision, $oldText);
my ($summary, $isEdit, $pageTime);
my $page;
my $section;
my $text;
my $keptRevision;
my $pageName = $id;
if ($config->FreeLinks) {
$pageName =~ s/_/ /g;
}
if (!$acl->canEdit($user, $id)) {
$wikiTemplate->vars(&globalTemplateVars);
print GetHttpHeader() . $wikiTemplate->process('errors/editBlocked');
return;
}
elsif (!$config->EditAllowed || -f $config->DataDir . "/noedit") {
$wikiTemplate->vars(&globalTemplateVars);
print GetHttpHeader() . $wikiTemplate->process('errors/editSiteReadOnly');
return;
}
$page = new PurpleWiki::Database::Page('id' => $id);
if (-f $page->getLockedPageFile()) {
$wikiTemplate->vars(&globalTemplateVars);
print GetHttpHeader() . $wikiTemplate->process('errors/editNotAllowed');
return;
}
$keptRevision = new PurpleWiki::Database::KeptRevision(id => $id);
my ($username, $userId);
if ($user) {
sub logSession {
open FH, ">>$CONFIG_DIR/session_log";
print FH time . "\t" . $session->id . "\t" . $q->request_method . "\t";
print FH $q->query_string if ($q->request_method ne 'POST');
print FH "\t" . $q->remote_host . "\t" . $session->param('userId') . "\t" .
$q->referer . "\n";
close FH;
}
sub updateVisitedPagesCache {
my $id = shift;
my @pages = keys %{$visitedPagesCache};
if (!defined $visitedPagesCache->{$id} &&
(scalar @pages - 1 >= $visitedPagesCacheSize)) {
my @oldestPages = sort {
$visitedPagesCache->{$a} <=> $visitedPagesCache->{$b}
} @pages;
my $remove = scalar @pages - $visitedPagesCacheSize + 1;
for (my $i = 0; $i < $remove; $i++) {
delete $visitedPagesCache->{$oldestPages[$i]};
}
}
$visitedPagesCache->{$id} = time;
$session->param('visitedPagesCache', $visitedPagesCache);
}
sub visitedPages {
my @pages = sort { $visitedPagesCache->{$b} <=> $visitedPagesCache->{$a} }
keys %{$visitedPagesCache};
my $i = 0;
foreach my $id (@pages) {
my $pageName = $id;
$pageName =~ s/_/ /g if ($config->FreeLinks);
$pages[$i] = {
'id' => $id,
'pageName' => $pageName,
};
$i++;
};
return @pages;
}
sub expandPageName {
my $pageName = shift;
if ($pageName !~ / /) {
$pageName =~ s/([a-z])([A-Z])/$1 $2/g;
$pageName =~ s/([0-9])([A-Z])/$1 $2/g;
$pageName =~ s/([a-z])([0-9])/$1 $2/g;
}
return $pageName;
}
sub globalTemplateVars {
return (siteName => $config->SiteName,
baseUrl => $config->ScriptName,
homePage => $config->HomePage,
userName => $user ? $user->username : undef,
preferencesUrl => $config->ScriptName . '?action=editprefs');
}
&DoWikiRequest() if ($config->RunCGI && ($_ ne 'nocgi')); # Do everything.
1; # In case we are loaded from elsewhere
# == End of UseModWiki script. ===========================================
( run in 1.702 second using v1.01-cache-2.11-cpan-98e64b0badf )