Homepage selbermachen 7.852 Themen, 35.619 Beiträge

admin-funktion beim gästebuch streikt

flamingmoe / 8 Antworten / Baumansicht Nickles

Moin,


von sourceforge ein guestbook runtergeladen, das soweit geändert, dass eigentlich alles läuft, und nun noch eine kleine winzigkeit:


Wenn ich mich als admin einlogge, um die einträge zu bearbeiten klappt das ohne probleme, aber die bearbeitung an sich (löschen / verbergen von Einträgen) führt zu folgender Fehlermeldung:


Application Error


An error has occurred in the program


open >/www/htdocs/.../guestbook.html.tmp: Permission denied at /www/htdocs/junkpi/cgi-bin/admin/guestbook-admin.pl line 431.


bei ... habe ich nur meinen username rausgenommen...


Hat jemand nen Tipp, ohne dass ich den ganzen perl-kram schicken muss? vielleicht was mit den zugriffsrechten? obwohl sonst alles klappt, und ich den session-ordner (tmp) auf 777 gesetzt habe....


thx

bei Antwort benachrichtigen
xafford flamingmoe „admin-funktion beim gästebuch streikt“
Optionen

Das mit Zugriffsrechten stimmt, allerdings betrifft es nicht den Session-Ordner, sondern die Datei guestbook.html.tmp. Auf diese hat das Script nicht die ntigen Zugriffsrechte im Ordner:

/www/htdocs/junkpi/guestbook.html.tmp

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
flamingmoe Nachtrag zu: „admin-funktion beim gästebuch streikt“
Optionen

aber die datei gibt's noch gar nicht....?!

bei Antwort benachrichtigen
xafford flamingmoe „aber die datei gibt s noch gar nicht....?!“
Optionen

Dann liegt das Problem bei den Ordnerrechten des übergeordneten Ordners, hier sind die Rechte unzureichend, das Script darf die Datei anscheinend nicht anlegen (Schreibrechte auf den betreffenden Ordner).

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
flamingmoe Nachtrag zu: „admin-funktion beim gästebuch streikt“
Optionen

die guestbook.html.lck wird allerdings problemlos angelegt. auch wenn ich einen neuen ordner für die session-dateien anlege (wie oben gesagt) und alle rechte freigebe, bekomme ich dieselbe Meldung. weißt du dennoch einen rat?

bei Antwort benachrichtigen
xafford flamingmoe „die guestbook.html.lck wird allerdings problemlos angelegt. auch wenn ich einen...“
Optionen

Dann poste doch zumindest einmal die betreffenden Zeilen um die Fehlermeldung herum.
Testweise könntest Du auch mal eine leere Seite mit dem Namen anlegen und auf diese die entsprechenden Rechte setzen.

PS: Bist Du sicher, daß dein FTP-Programm die Rechte auch richtig setzt? WS-FTP tut dies leider nicht immer zuverlässig.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
flamingmoe Nachtrag zu: „admin-funktion beim gästebuch streikt“
Optionen

Folgend die buestbook-admin.pl
Ich gehe davon aus, dass mein ftp-Programm die Rechte richtig setzt, weil alles andere läuft. Gästebuch-Einträge, weiterleitung,...... und auch der Admin-Einblick in das Gästebuch. Ich werde mal versuchen, ob sich eine leere guestbook.html.tmp erzeugen lässt, und was dann passiert..... to be continued...

#!/usr/bin/perl -wT
#
# $Id: guestbook-admin.pl,v 1.3 2004/10/29 08:11:57 gellyfish Exp $
#
# guestbooksadmin.pl - admin script for guestbook.pl, allows for deletion and
# hiding of comments.
#
# originally by Richard Rose - nms@rikrose.net
# donated to the NMS scripts archive for distribtution under whichever licence
# they see fit, and maintainance by them.
#

use strict;
use POSIX qw(locale_h strftime);
use CGI qw(:standard);
use Fcntl qw(:DEFAULT :flock);
use IO::File;

use vars qw($DEBUGGING %inputs $shortdate
$comment_is_hidden $done_headers %actions $password $session_dir
$guestlog $guestbookreal $myURL $short_date_fmt);

# config section - these variables must be defined before any code runs
BEGIN
{
$DEBUGGING = 1;
$password = 'blabla';
$session_dir = '/www/.../.../tmp/';
$guestlog = '/www/.../.../guestlog.html';
$guestbookreal = '/www/.../.../guestbook.html';
$myURL = 'http://www......de/cgi-bin/admin/guestbook-admin.pl';
$short_date_fmt = '%d/%m/%y %T %Z';
}

# Routines that need to be defined before we use them
BEGIN
{

# Error messages should be sent to the users browser
# from guestbook.pl
sub fatalsToBrowser
{
my ($message) = @_;

if ($DEBUGGING)
{
$message =~ s/</g;
$message =~ s/>/>/g;
}
else
{
$message = '';
}

my ( $pack, $file, $line, $sub ) = caller(0);
my ($id) = $file =~ m%([^/]+)$%;

if ( $file =~ /^\(eval/ ) { return undef; }

if ( !$done_headers )
{
print "Content-Type: text/html; charset=iso-8859-1\n\n";
}

print br /> "" target="_blank" rel="nofollow">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">






Application Error



An error has occurred in the program



$message




EOERR
die @_;
}

# from guestbook.pl
sub strip_nonprintable
{
my $text = shift;
return '' unless defined $text;
$text =~ tr#\t\n\040-\176\240-\377# #cs;
return $text;
}

# Log the Entry or Error
# from guestbook.pl

$SIG{__DIE__} = \&fatalsToBrowser;
}

# check for the login cookie sent by the browser as a valid login cookie
sub has_login_cookie
{

# check for existing login cookie
return -f $session_dir . $inputs{cookie};
}

# check whether a given cookie is a valid cookie and > 6 hours old. this is
# used in cleaning up old cookies.
sub is_old_cookie
{
my $filename = shift;
local $_;

my $now = time;

return 0 if $filename =~ /^\./;
return 0 if $filename !~ /\w{40}/;
return 1
if ( stat $session_dir . $filename )[10] }

# print html fragments for admin functions
sub add_admin_html
{
my ($comment_num) = @_;

print
delete comment

EODELETE
print hide/unhide comment (currently
EOHIDE
print 'not ' unless $comment_is_hidden;
print qq%hidden)


\n%;
}

# show the admin view of guestbook.html
sub view_guestbook_as_admin
{
local $_;

die "Not logged in!" if ( !&has_login_cookie );

my $in = new IO::File->new("
print header();
print html_top();

my $comment_num = -1;
my $in_comment = 0;
while ()
{
chomp;
if (/^$/)
{
$comment_num++;
$in_comment = 1;
}
if (/^/ or !$in_comment );
if (/^$/)
{
add_admin_html($comment_num);
print "
\n";
$comment_is_hidden = 0;
$in_comment = 0;
}

}

$in->close;

exit 0;
}

# show a login page before we can get started
sub show_login_page
{
print Content-type: text/html


br /> "" target="_blank" rel="nofollow">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">





Login


You must login before you may administer the guestbook




EOP

exit 0;
}

# check whether the given password is correct, and setup the environment if it
# is. redirect to either the login page or the admin view, accordingly
sub process_login
{
local $_;
my ( @old_files, $file );
my $now = time;

# first, garbage collect sessions over 6 hours old
opendir SESSION_DIR, $session_dir
or die "could not open session directory $session_dir";
@old_files = grep { &is_old_cookie($_) } ( readdir SESSION_DIR );
closedir SESSION_DIR;
foreach $file (@old_files)
{
if ( $file =~ /(\w{40})/ )
{
unlink( $session_dir . $1 );
}
}

if ( $inputs{password} eq 'password' )
{
die "You have not changed the password\n";
}

# now verify password
if ( $password and $password eq $inputs{password} )
{

# Successful login. Things to do.
# generate cookie.
# send cookie to user
# save cookie to disk
# redirect to self, so user can edit

my $cookiename = unpack 'H*', join '',
map { chr int rand 256 } ( 1 .. 20 );

# create cookie file on disk, avoiding exist/create race
sysopen( SAVED,
$session_dir . $cookiename,
O_CREAT | O_WRONLY | O_EXCL
)
or die $session_dir . $cookiename . ": $!";

print SAVED "1";
close SAVED;

# send cookie to user
print CGI::header(
-type => "text/html",
status => "302 Moved",
location => "$myURL?action=view&cookie=$cookiename"
);

exit 0;
}

print CGI::redirect( -URL => $myURL );

}

# toggle an entry's hidden status
# most of this code is a replication of rewrite_file. this could be refactored
# later
sub do_toggle_hidden
{
die "Not logged in!" if ( !&has_login_cookie );

my $lock = IO::File->new(">>$guestbookreal.lck")
or die "open $guestbookreal.lck: $!";
flock $lock, LOCK_EX or die "flock $guestbookreal: $!@";

my $temp = IO::File->new(">$guestbookreal.tmp")
or die "open >$guestbookreal.tmp: $!";

my $in = new IO::File->new("
my $comment_num = 0;
my $hiding = 0;
while ()
{
if ( !$temp->print($_) )
{
my $write_err = $!;
$temp->close;
unlink "$guestbookreal.tmp";
die "write to $guestbookreal.tmp: $write_err";
}
last if /^\n$/;
}
while ()
{
chomp;
if (/^$/)
{
++$comment_num;
if ( !$temp->print( $_ . "\n" ) )
{
my $write_err = $!;
$temp->close;
unlink "$guestbookreal.tmp";
die "write to $guestbookreal.tmp: $write_err";
}
next;
}

if ( $inputs{entry} != $comment_num )
{

# not the comment we're after. save it.
if ( !$temp->print( $_ . "\n" ) )
{
my $write_err = $!;
$temp->close;
unlink "$guestbookreal.tmp";
die "write to $guestbookreal.tmp: $write_err";
}
}
else
{

# comment we're going to do something to.

# first, decide whether we are starting to deal with a hidden
# comment
if (/^ marker, then skip that, then increment the
# comment number, and save the rest of the file.
while ()
{
chomp;
last if /^--\>/;

if ( !$temp->print( $_ . "\n" ) )
{
my $write_err = $!;
$temp->close;
unlink "$guestbookreal.tmp";
die "write to $guestbookreal.tmp: $write_err";
}
}
++$comment_num;
next;
}

# entry is not hidden. hide it by putting the comment hidden
# marker, the current line, then lines until we find the end of
# comment marker, then write the end of hidden text marker, then
# the end of comment marker, then save the rest of the file
if ( !$temp->print("close;
unlink "$guestbookreal.tmp";
die "write to $guestbookreal.tmp: $write_err";
}
while ()
{
chomp;
if (/^/)
{
if ( !$temp->print( "-->\n" . $_ . "\n" ) )
{
my $write_err = $!;
$temp->close;
unlink "$guestbookreal.tmp";
die "write to $guestbookreal.tmp: $write_err";
}
last;
}

if ( !$temp->print( $_ . "\n" ) )
{
my $write_err = $!;
$temp->close;
unlink "$guestbookreal.tmp";
die "write to $guestbookreal.tmp: $write_err";
}
}
++$comment_num;
next;

}

}
if ( !$temp->close )
{
my $close_err = $!;
unlink "$guestbookreal.tmp";
die "close $guestbookreal.tmp: $close_err";
}

$in->close;

rename "$guestbookreal.tmp", $guestbookreal
or die "rename $guestbookreal.tmp -> $guestbookreal: $!";

$lock->close;

&view_guestbook_as_admin;
}

# delete an entry
# most of this code is a replication of rewrite_file. this could be refactored
# later
sub do_delete_entry
{
die "Not logged in!" if ( !&has_login_cookie );

my $lock = IO::File->new(">>$guestbookreal.lck")
or die "open $guestbookreal.lck: $!";
flock $lock, LOCK_EX or die "flock $guestbookreal: $!@";

my $temp = IO::File->new(">$guestbookreal.tmp")
or die "open >$guestbookreal.tmp: $!";

my $in = new IO::File->new("
my $comment_num = -1;
my $in_comment = 0;
while ()
{
chomp;
if (/^$/)
{
$comment_num++;
$in_comment = 1;
}
if ( $inputs{entry} != $comment_num or !$in_comment )
{
if ( !$temp->print( $_ . "\n" ) )
{
my $write_err = $!;
$temp->close;
unlink "$guestbookreal.tmp";
die "write to $guestbookreal.tmp: $write_err";
}
}
if (/^$/)
{
$in_comment = 0;
}

}
if ( !$temp->close )
{
my $close_err = $!;
unlink "$guestbookreal.tmp";
die "close $guestbookreal.tmp: $close_err";
}

$in->close;

rename "$guestbookreal.tmp", $guestbookreal
or die "rename $guestbookreal.tmp -> $guestbookreal: $!";

$lock->close;

&view_guestbook_as_admin;
}

# invalidate the current session
sub do_logout
{
if ( $inputs{cookie} =~ /(\w{40})/ )
{
unlink( $session_dir . $1 );
}

print CGI::redirect( -URL => $myURL );
}

$| = 1;

# sanitize environment
delete @ENV{qw(ENV BASH_ENV IFS PATH)};

# setup our allowed variables
foreach my $input (qw(password action entry cookie))
{
my $t = param($input);
$t = url_param($input) unless defined $t;
$inputs{$input} = strip_nonprintable($t);
}

# setup environment for rest of script.
$shortdate = strftime( $short_date_fmt, localtime );

# allowed set of actions, called by references straight from the action input
%actions = (
'login' => \&process_login,
'' => \&show_login_page,
'hide' => \&do_toggle_hidden,
'delete' => \&do_delete_entry,
'view' => \&view_guestbook_as_admin,
'logout' => \&do_logout
);

# do the action, if we know about it, otherwise, show an error message instead
&{ $actions{ $inputs{action} } }() if defined( $actions{ $inputs{action} } );
die "Unknown action";

sub html_top
{
return br /> "" target="_blank" rel="nofollow">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">






Administer Guestbook entries




EOTOP
}
bei Antwort benachrichtigen
flamingmoe Nachtrag zu: „admin-funktion beim gästebuch streikt“
Optionen

kurzer Nachtrag: auch eine leere neu erstellte guestbook.html.tmp auf 777 bringt keinerlei Veränderung.

bei Antwort benachrichtigen
flamingmoe Nachtrag zu: „admin-funktion beim gästebuch streikt“
Optionen

nun läufts. ich habe sämtliche gästebuchdateien in ein tieferliegendes verzeichnis kopiert. Auch wenn mir noch nicht ganz klar ist, warum es nicht ging, als ich diese dateien im root liegen hatte.

danke für die unterstützung. hast du zufällig noch eine erklärung parat?

bei Antwort benachrichtigen