#!/usr/bin/perl -w # Interactive Bookmarks Engine # Release 2.07(27-Nov-99) # (c) - 1999, Eastwright Corporation # http://www.eastwright.com print "Content-type: text/html\n\n"; require "config.pl"; $page_title = "Bookmarks"; $maxnote = 400; $CURFOLDERFONT=""; $FOLDERFONT=""; $DFLTFONT=""; # ============================================================== global vars @user_fld; @user_lnk; @user_dat; $user = $ENV{'REMOTE_USER'}; $cur_fld; $cur_cat; $command; $fldtoedit; $fldcat; $fldref; $fldname; $cur_lnk; $lnkref; $lnkname; $lnkurl; $lnknote; $lnktoedit; @banners; $topbanner; $tmpuser; $mode_public = 0; # ============================================================== main # parsing args @cmds = split(/&/, $ENV{'QUERY_STRING'}); foreach $cmd (@cmds) { ($name, $value) = split(/=/, $cmd); $value =~ tr/+/ /; $value =~ s/%0D%0A/
/g; $value =~ s/%0A%0D/
/g; $value =~ s/
/\n/g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value =~ s/<.*?>//g; if ($name eq 'cmd') { $command = $value; } elsif ($name eq 'fld') { $cur_fld = $value; $fldref = $cur_fld; $fldref =~ s/\+/%2B/g; $fldref =~ s/=/%3D/g; $fldref =~ s/#/%23/g; $fldref =~ tr/ /+/; $fldref =~ s/&/%26/g; $fldref =~ s/\"/%22/g; $fldname = $cur_fld; $fldname =~ s/"/"/g; } elsif ($name eq 'lnk') { $cur_lnk = $value; $lnkref = $cur_lnk; $lnkref =~ s/\+/%2B/g; $lnkref =~ s/=/%3D/g; $lnkref =~ tr/ /+/; $lnkref =~ s/&/%26/g; $lnkref =~ s/\"/%22/g; $lnkref =~ s/#/%23/g; $lnkname = $cur_lnk; $lnkname =~ s/"/"/g; } elsif ($name eq 'url') { $lnkurl = $value; } elsif ($name eq 'note') { $lnknote = substr($value, 0, $maxnote); } elsif ($name eq 'fldtoedit') { $fldtoedit = $value; } elsif ($name eq 'lnktoedit') { $lnktoedit = $value; } elsif ($name eq 'fldcat') { $fldcat = $value; } } if (length($command)) { if ($command eq 'editfld') { &editfld; } elsif ($command eq 'editlnk') { &editlnk; } elsif ($command eq 'editonefld') { &editonefld; } elsif ($command eq 'procfld') { &procfld; } elsif ($command eq 'delfld') { &delfld; } elsif ($command eq 'dodelfld') { &dodelfld; } elsif ($command eq 'editonelnk') { &editonelnk; } elsif ($command eq 'proclnk') { &proclnk; } elsif ($command eq 'dellnk') { &dellnk; } elsif ($command eq 'dodellnk') { &dodellnk; } elsif ($command eq 'pubon') { &pubon; } elsif ($command eq 'puboff') { &puboff; } else { print "
unknown command $command
"; &errexit; } } &header; &loguser; &initfolders; if (!length($tmpuser)) { &savedata; } &bookmarks; &footer; exit; # ============================================================== puboff sub puboff { &header; &loguser; $mode_public=2; for ($i=$[; $i <= $#user_dat; $i++) { @fields=split('\|', $user_dat[$i]); if ($fields[0] eq 'public') { $user_dat[$i] = join('|', 'public', 'off'); $mode_public=0; } } if ($mode_public == 2) { $user_dat[$i] = join('|', 'public', 'off'); $mode_public = 0; } &bookmarks; &savedata; &footer; exit; } # ============================================================== pubon sub pubon { &header; &loguser; $mode_public=2; for ($i=$[; $i <= $#user_dat; $i++) { @fields=split('\|', $user_dat[$i]); if ($fields[0] eq 'public') { $user_dat[$i] = join('|', 'public', 'on'); $mode_public=1; } } if ($mode_public == 2) { $user_dat[$i] = join('|', 'public', 'on'); $mode_public = 1; } &bookmarks; &savedata; &footer; exit; } # ============================================================== dodellnk sub dodellnk { &header; &loguser; for ($i=$[; $i <= $#user_lnk; $i++) { @fields=split('\|', $user_lnk[$i]); if (($fields[0] eq $cur_fld) && ($fields[1] eq $cur_lnk)) { $user_lnk[$i] = '*'; } } @user_lnk = grep($_ ne '*', @user_lnk); &saveuser; &bookmarks; &footer; exit; } # ============================================================== dellnk sub dellnk { $page_title = "Deleting link $lnkname"; &header; print "
Warning: Deleting link $lnkname from folder $fldname, are you sure? "; print "Yes, "; print "No
"; &footer; exit; } # ============================================================== duplnk sub duplnk { print "
Note: Folder $cur_fld already contains link $cur_lnk
\n"; print "
Press your browser BACK button to return to editing
\n"; &footer; } # ============================================================== mislnk sub mislnk { print "
Note: Please enter name for your link
\n"; print "
Press your browser BACK button to return to editing
\n"; &footer; } # ============================================================== misfld sub misfld { print "
Note: Please enter name for your folder
\n"; print "
Press your browser BACK button to return to editing
\n"; &footer; } # ============================================================== misurl sub misurl { print "
Note: Please enter URL (e.g. http://www.company.com) for your link
\n"; print "
Press your browser BACK button to return to editing
\n"; &footer; } # ============================================================== proclnk sub proclnk { $new = 0; &header; if (!length($cur_lnk)) { &mislnk; exit; } if (! length($lnkurl) || ($lnkurl eq 'http://')) { &misurl; exit; } if (! length($lnktoedit)) { $new = 1;} $cur_lnk =~ tr/|/!/; $lnkurl =~ tr/|/!/; $lnknote =~ tr/|/!/; &loguser; $lnknote =~ s/\n/
/g; if ($new) { $i; for ($i=$[; $i <= $#user_lnk; $i++) { @fields=split('\|', $user_lnk[$i]); if (($fields[0] eq $cur_fld) && ($fields[1] eq $cur_lnk)) { &duplnk; exit; } } $user_lnk[$i] = join('|', $cur_fld, $cur_lnk, $lnkurl, $lnknote); } else { $j = (-1); for ($i=$[; $i <= $#user_lnk; $i++) { @fields=split('\|', $user_lnk[$i]); if (($fields[0] eq $cur_fld) && ($fields[1] eq $lnktoedit)) { $j = $i; } } if ($j < 0) { &errexit; } $user_lnk[$j] = join('|', $cur_fld, $cur_lnk, $lnkurl, $lnknote); } &saveuser; &bookmarks; &footer; exit; } # ============================================================== editonelnk sub editonelnk { $new = 0; $lnkname = $cur_lnk; $lnkname =~ s/"/"/g; if (length($cur_lnk)) { $page_title = "Editing link [$lnkname] at folder [$fldname]"; } else { $page_title = "Adding new link into folder [$fldname]"; $new = 1; } &header; &loguser; # if not new link find link to edit if (!$new) { for ($i=$[; $i <= $#user_lnk; $i++) { @fields=split('\|', $user_lnk[$i]); if (($fields[0] eq $cur_fld) && ($fields[1] eq $cur_lnk)) { $lnkurl = $fields[2]; $lnknote = $fields[3]; } } } $urlname = $lnkurl; $urlname =~ s/"/"/g; if (!length($urlname)) { $urlname = 'http://'; } $notename = $lnknote; $notename =~ s/"/"/g; # $notename =~ s/\n/
/g; $notename =~ s/
/\n/g; $notename =~ s/"/"/g; print "

$page_title

"; print "\n"; print "\n"; print "
"; print "
\n"; print "Link name:
"; print "
"; print "URL:"; print "
"; print "Notes:
(up to 200 characters)
"; print "

\n"; print "\n"; print "\n"; print "\n"; print "

\n"; print "
Cancel
"; print "

Note: Do not forget enter correct prefix (http://, https://, ftp:// etc)
"; print "into URL field. To avoid errors cut & paste
address string from your browser window.
\n"; &footer; exit; } # ============================================================== editlnk sub editlnk { &header; &loguser; print "
Edit folder $fldname
\n"; print "
\n"; print "\n"; print ""; for ($i=$[; $i <= $#user_lnk; $i++) { @fields=split('\|', $user_lnk[$i]); if ($fields[0] eq $cur_fld) { print "" } } print "
Links"; print "Action"; print "
"; $lnkref = $fields[1]; $lnkref =~ s/\+/%2B/g; $lnkref =~ s/=/%3D/g; $lnkref =~ tr/ /+/; $lnkref =~ s/&/%26/g; $lnkref =~ s/\"/%22/g; $lnkref =~ s/#/%23/g; print "$fields[1]"; print ""; print "Edit, "; print "Delete
\n"; print "

"; print "
Add new link
"; print "Cancel
\n"; &footer; exit; } # ============================================================== dodelfld sub dodelfld { $new_cur_fld; &header; &loguser; if ($[ eq $#user_fld) { &initfolders; if (!length($tmpuser)) { &savedata; } &bookmarks; &footer; &exit; } for ($i=$[; $i <= $#user_fld; $i++) { @fields=split('\|', $user_fld[$i]); if ($fields[0] eq $cur_fld) { $user_fld[$i] = '*'; } else { $new_cur_fld = $fields[0]; } } @user_fld = grep($_ ne '*', @user_fld); for ($i=$[; $i <= $#user_lnk; $i++) { @fields=split('\|', $user_lnk[$i]); if ($fields[0] eq $cur_fld) { $user_lnk[$i] = '*'; } } @user_lnk = grep($_ ne '*', @user_lnk); $cur_fld = $new_cur_fld; $fldref = $cur_fld; $fldref =~ tr/ /+/; $fldref =~ s/&/%26/g; $fldref =~ s/\"/%22/g; $fldname = $cur_fld; $fldname =~ s/"/"/g; &saveuser; &bookmarks; &footer; exit; } # ============================================================== delfld sub delfld { &loguser; if ($[ eq $#user_fld) { &header; &initfolders; if (!length($tmpuser)) { &savedata; } &bookmarks; &footer; &exit; } $page_title = "Deleting folder $cur_fld"; &header; print "
Deleting folder $cur_fld. Are you sure?: "; print "Yes, "; print "No
"; &footer; exit; } # ============================================================== dupfld sub dupfld { print "
Warning: Folder $fldname already exists
\n"; print "

Press your browser BACK button to continue...
\n"; &footer; } # ============================================================== selcat sub selcat { print "
Warning: Please select category for folder $fldname
\n"; print "

Press your browser BACK button to continue...
\n"; &footer; } # ============================================================== procfld sub procfld { $new = 0; &header; if (! length($fldtoedit)) { $new = 1; } if (!length($cur_fld)) { &misfld; exit; } $cur_fld =~ tr/|/!/; &loguser; if ($new) { $i; if ($fldcat eq '-') { &selcat; exit; } for ($i=$[; $i <= $#user_fld; $i++) { @fields=split('\|', $user_fld[$i]); if ($fields[0] eq $cur_fld) { &dupfld; exit; } } $user_fld[$i] = join('|', $cur_fld, $fldcat); } else { $j = (-1); for ($i=$[; $i <= $#user_fld; $i++) { @fields=split('\|', $user_fld[$i]); if ($fields[0] eq $fldtoedit) { $j = $i; } } if ($j < 0) { &errexit; } $user_fld[$j] = join('|', $cur_fld, $fldcat); # update links for ($i=$[; $i <= $#user_lnk; $i++) { @fields=split('\|', $user_lnk[$i]); if ($fields[0] eq $fldtoedit) { $user_lnk[$i] = join('|', $cur_fld, $fields[1], $fields[2], $fields[3]); } } } &saveuser; &bookmarks; &footer; exit; } # ============================================================== editonefld sub editonefld { $new = 0; @cats; $dfltcat = "-"; if (length($cur_fld)) { $page_title = "Edit folder [$cur_fld]"; } else { $page_title = "Add new folder"; $new = 1; } &header; &loguser; $file=join('/', $bm_cfg_dir, 'categories.txt'); if (!open(CAT, "<$file")) { errexit; } $i=0; if ($new) { $i++; $cats[0] = "-|--- Select category ---"; } while ($line = ) { chop($line); $cats[$i] = $line; $i++; } close(CAT); if (!$new) { for ($i=$[; $i <= $#user_fld; $i++) { @fields=split('\|', $user_fld[$i]); if ($fields[0] eq $cur_fld) { $dfltcat = $fields[1]; } } } print "

$page_title

"; print ""; print "\n"; print "
"; print "
\n"; print "Folder name:
"; print "Category:\n"; print "\n"; print "\n"; print "

\n"; print "\n"; print "
"; print "
Cancel
"; &footer; exit; } # ============================================================== editfld sub editfld { &header; &loguser; print "\n"; print "\n"; print ""; for ($i=$[; $i <= $#user_fld; $i++) { print "" } print "
Folders"; print "Action"; print "
"; @fields=split('\|', $user_fld[$i]); $ref = $fields[0]; $ref =~ s/\+/%2B/g; $ref =~ s/=/%3D/g; $ref =~ s/#/%23/g; $ref =~ tr/ /+/; $ref =~ s/&/%26/g; $ref =~ s/\"/%22/g; print "$fields[0]"; print ""; print "Edit"; if ($[ ne $#user_fld) { print ", Delete
\n"; } print "

"; print "
Add new folder
"; print "Cancel
\n"; &footer; exit; } # ============================================================== savedata sub savedata { for ($i=$[; $i <= $#user_dat; $i++) { @fields=split('\|', $user_dat[$i]); if ($fields[0] eq 'default_folder') { $user_dat[$i] = join('|', 'default_folder', $cur_fld); } } $file=join('.', $user, "dat"); $file=join('/', $bm_user_dir, $file); if (!open(DAT, ">$file")) { &errexit; } for ($i=$[; $i <= $#user_dat; $i++) { print DAT "$user_dat[$i]\n"; } close(DAT); } # ============================================================== bookmarks sub bookmarks { print "\n"; print "
"; print ""; print "\n"; print "\n"; print "
User:$user"; print "
\n"; print "Public mode "; if ($mode_public) { print "ON off
"; } else { print "OFF
on
"; } print "
Access your bookmarks online--anytime, anywhere. Join now!\n"; print "
Members Log In

\n"; print $DFLTFONT; print "\n"; print "\n"; print "
"; print ""; print "\n"; print "\n"; print "
Folders"; print "edit"; print "
"; print ""; print "\n"; print "\n"; print "
Bookmarks - [$cur_fld]edit
"; print ""; print $FOLDERFONT; if ($alpha_sort) { @user_fld = sort {"\U$a" cmp "\U$b"} @user_fld; @user_lnk = sort {"\U$a" cmp "\U$b"} @user_lnk; } for ($i=$[; $i <= $#user_fld; $i++) { @fields=split('\|', $user_fld[$i]); if ($fields[0] eq $cur_fld) { print $CURFOLDERFONT; print @fields[0]; print ""; print $FOLDERFONT; } else { $ref = $fields[0]; $ref =~ s/\+/%2B/g; $ref =~ s/=/%3D/g; $ref =~ s/#/%23/g; $ref =~ tr/ /+/; $ref =~ s/&/%26/g; $ref =~ s/\"/%22/g; print "@fields[0]"; } print "
\n"; } print "
"; &smallads; print "
"; print $FOLDERFONT; for ($i=$[; $i <= $#user_lnk; $i++) { @fields=split('\|', $user_lnk[$i]); if ($fields[0] eq $cur_fld) { print "@fields[1]"; if (length($fields[3])) { print "\n
$fields[3]
\n"; } else { print "

\n"; } } } print "

"; print "
"; print "

\n"; print "

\n"; if ($mode_public) { print "

URL of this page is $viewer_url?fld=$fldref&usr=$user\n"; } } # ============================================================== smallads sub smallads { } # ============================================================== verifyfolder sub verifyfolder { $tmp_fld; for ($j=$[; $j <= $#user_fld; $j++) { @fields=split('\|', $user_fld[$j]); if ($fields[0] eq $cur_fld) { return; } $tmp_fld = $fields[0]; } $cur_fld = $tmp_fld; } # ============================================================== initfolders # Sets cur_fld variable sub initfolders { if (! length($cur_fld)) { for ($i=$[; $i <= $#user_dat; $i++) { @fields=split('\|', $user_dat[$i]); $cur_fld = $fields[1]; $fldref = $cur_fld; $fldref =~ tr/ /+/; $fldref =~ s/&/%26/g; $fldref =~ s/\"/%22/g; $fldname = $cur_fld; $fldname =~ s/"/"/g; if ($fields[0] eq 'default_folder') { &verifyfolder; return; } } } else { for ($i=$[; $i <= $#user_dat; $i++) { @fields=split('\|', $user_dat[$i]); if ($fields[0] eq 'default_folder') { &verifyfolder; $user_dat[$i] = join('|', 'default_folder', $cur_fld); return; } } } } # ============================================================== loguser # Checks whether 'user' variable set, opens or creates user's # files, initializes @user_fld, @user_lnk, @user_dat sub loguser { if (! &loaduser) { $tmpuser = $user; $user = $defaultuser; if (! &loaduser) { &errexit; } $user = $tmpuser; # &saveuser; } else { for ($i=$[; $i <= $#user_dat; $i++) { @fields=split('\|', $user_dat[$i]); if ($fields[0] eq 'public') { if ($fields[1] eq 'on') { $mode_public=1; } else { $mode_public=0; } } } } } # ============================================================== loaduser sub loaduser { $file=join('.', $user, "fld"); $file=join('/', $bm_user_dir, $file); if (!open(FLD, "<$file")) { return 0; } $i=0; while ($line = ) { chop($line); $user_fld[$i] = $line; $i++; } close(FLD); $file=join('.', $user, "lnk"); $file=join('/', $bm_user_dir, $file); if (!open(LNK, "<$file")) { &errexit; } $i=0; while ($line = ) { chop($line); $user_lnk[$i] = $line; $i++; } close(LNK); $file=join('.', $user, "dat"); $file=join('/', $bm_user_dir, $file); if (!open(DAT, "<$file")) { &errexit; } $i=0; while ($line = ) { chop($line); $user_dat[$i] = $line; $i++; } close(DAT); return 1; } # ============================================================== saveuser sub saveuser { $file=join('.', $user, "fld"); $file=join('/', $bm_user_dir, $file); if (!open(FLD, ">$file")) { &errexit; } for ($i=$[; $i <= $#user_fld; $i++) { print FLD "$user_fld[$i]\n"; } close(FLD); $file=join('.', $user, "lnk"); $file=join('/', $bm_user_dir, $file); if (!open(LNK, ">$file")) { &errexit; } for ($i=$[; $i <= $#user_lnk; $i++) {print LNK "$user_lnk[$i]\n"; } close(LNK); &savedata; } # ============================================================== errexit sub errexit { print "
Missing data. Probably you are trying to edit bookmark from already deleted folder. Please try to re-enter Bookmarks
\n"; &footer; exit; } # ============================================================== header sub header { if (length($header_file)) { if (open(HDR, "<$header_file")) { @lines = ; close(HDR); print @lines; return; } } print<\n $page_title\n EOF } # ============================================================== footer sub footer { if (length($footer_file)) { if (open(FTR, "<$footer_file")) { @lines = ; close(FTR); print "

 
"; print @lines; return; } } print "

"; print "

Bookmarks Engine (c) - 1999, Eastwright Corp.
"; print "Support: Bookmarks Support"; print "

\n"; } # ============================================================== setcurcat sub setcurcat { for ($i=$[; $i <= $#user_fld; $i++) { @fields=split('\|', $user_fld[$i]); if ($fields[0] eq $cur_fld) { $cur_cat = $fields[1]; } } } # ============================================================== loadbans sub loadbans { &setcurcat; $file = join('.', $cur_cat, 'txt'); $file = join('/', $bm_ads_dir, $file); if (!open(ADS, "<$file")) { &errexit; } @banners = ; close(ADS); } # ============================================================== topban sub topban { &loadbans; ($ip)=($ENV{"REMOTE_ADDR"}=~s/\.//g); srand($$+$ip); if ($#banners < $[) { return; } $topbanner = int rand($#banners + 1); print $banners[$topbanner]; } # ============================================================== btmban sub btmban { if ($#banners < $[) { return; } $topbanner++; if ($topbanner > $#banners) { $topbanner = 0; } print $banners[$topbanner]; }