#!/usr/bin/perl # DBED - COncise, comprehensive, configurable user oriented SQL Database editor. # Created by Andrew Bedno 2001.11.20 Chicago IL USA use DBI; use CGI; use CGI::Carp qw(fatalsToBrowser); # Configuration. $DBINIT = "DBI:mysql:database=database"; $DBLOGIN = "user"; $DBPASSWORD = "password"; # Names of editable tables. @TABLES = ('tablename'); # Configs below are comma separated names in a string hashed on table name. # Columns shown in browse. $COLS_VIEW{'tablename'} = 'fieldname[,...]'; # Columns shown in edit. $COLS_EDIT{'tablename'} = 'fieldname[,...]'; # Columns used as keys for edit/del. All must also be in VIEW field set. $COLS_KEYS{'tablename'} = 'fieldname[,...]'; # Set to C to confirm deletions, or D to delete without confirmation. $CONFIRM_DELETE = 'c'; $MAX_PAGE_RECORDS = 50; if (-e '/autoexec.bat') { $LOCALMSG = " (LOCAL)" } # Constants. %TYPES=(1 => "char", 2 => "numeric", 3 => "decimal", 4 => "integer", 5 => "smallint", 6 => "float", 7 => "real", 8 => "double", 9 => "date", 10=> "time", 11=> "timestamp", 12=> "varchar", -1=> "longvarchar", -2=> "binary", -3=> "varbinary", -4=> "longvarbinary", -5=> "bigint", -6=> "tinyint", -7=> "bit", -8=> "wchar", -9=> "wvarchar", -10=>"wlongvarchar"); $tds = '<font face=Arial size=2 color=black>'; $tde = '</font>'; # Collect parameters. $param = new CGI; $currtable = $param->param('table'); $currkey = &xd($param->param('key')); $password = $param->param('password'); $mode = lc($param->param('mode')); $currpage = $param->param('page'); $exiturl = &xd($param->param('exiturl')); if ($exiturl eq '') { $exiturlarg = ''; $exiturlfield = "<input type=hidden name='exiturl' value=''>"; } else { $exiturlarg = '&exiturl='.&xe($exiturl); $exiturlfield = "<input type=hidden name='exiturl' value=".&xe($exiturl).">"; } $currpage =~ s/[^0-9]//g; if ($currpage eq '') { $currpage = 0; $pagearg = ''; $pagefield = "<input type=hidden name='page' value=''>"; } else { $pagearg = '&page='.$currpage; $pagefield = "<input type=hidden name='page' value=".$currpage.">"; } $currfilter = lc(&xd($param->param('filter'))); $filtermode = 'a'; if ($currfilter =~ / or /i) { $filtermode = 'o' } while ($currfilter =~ / or /) { $currfilter =~ s/ or / /g } while ($currfilter =~ / and /) { $currfilter =~ s/ and / /g } while ($currfilter =~ / /) { $currfilter =~ s/ / /g } while ($currfilter =~ /^ /) { $currfilter =~ s/^ //g } while ($currfilter =~ / $/) { $currfilter =~ s/ $//g } $currfilter_show = $currfilter; if ($currfilter eq '') { $filterarg = ''; $filterfield = ''; $filtermode = ''; } else { if ($filtermode eq 'a') { while ($currfilter_show =~ / /) { $currfilter_show =~ s/ /\+/g } } if ($filtermode eq 'o') { while ($currfilter_show =~ / /) { $currfilter_show =~ s/ /\-/g } } while ($currfilter_show =~ /\+/) { $currfilter_show =~ s/\+/ and /g } while ($currfilter_show =~ /\-/) { $currfilter_show =~ s/\-/ or /g } $filterarg = '&filter='.&xe($currfilter_show); $filterfield = "<input type=hidden name='filter' value=".&xe($currfilter_show).">"; } @currfilters = split(/ /, $currfilter); $currorderarg = &xd($param->param('order')); $currorder = $currorderarg; $orderdesc = ''; if ($currorder) { if (substr($currorder,0,1) eq '-') { $currorder = substr($currorder,1,length($currorder)-1); $orderdesc = ' DESC' } $currordersql = "order by $currorder".$orderdesc } else { if ($COLS_KEYS{$currtable} ne '') { $currordersql = "order by ".$COLS_KEYS{$currtable}." "; $orderdesc = ' DESC' } else { $currordersql = "" } } if ($currorderarg eq '') { $orderarg = ''; $orderfield = "<input type=hidden name='order' value=''>"; } else { $orderarg = '&order='.&xe($currorderarg); $orderfield = "<input type=hidden name='order' value=".&xe($currorderarg).">"; } &GetPasswordCookie(); if ( ($DBPASSWORD eq '') or ($DBPASSWORD ne $password) ) { &DoLogin() } if ($mode eq 'e') { &DoEdit() } if ($mode eq 's') { &DoSave() } if ($mode eq 'n') { &DoNew() } if ($mode eq 'a') { &DoAdd() } if ($mode eq 'c') { &DoDeleteConfirm() } if ($mode eq 'd') { &DoDelete() } print &HTML_Head('Browse'); DoBrowse(); exit; ########################################## # MAJOR MODE HANDLERS # Browse records. sub DoBrowse { if (! $currtable) { print "<font face=Arial color=green size=3><b>Database Editor</b></font>"; if ($exiturl) { print "<font size=2 color=black face=Arial> <a href='".$exiturl."'>EXIT</a></font>"; } print "<br><br>\n"; print "<font size=3>Select a table: "; foreach $tablename (@TABLES) { print ' <a href="dbed.pl?table='.$tablename.$exiturlarg. '"><b>'.$tablename.'</b></a> ' } print "</font>\n"; } else { print "<a name='top'></a>"; print "<table width='100%' border=0><tr>"; print "<td valign=top align=left><font face=Arial color=green size=3><b>Database Editor</b></font>"; if ($exiturl) { print "<font size=2 color=black face=Arial> <a href='".$exiturl."'>EXIT</a></font>"; } print "</td>"; print "<form name='dbedbrowse' action='dbed.pl' method='post'>"; print "<td align=center valign=top><font face=Arial size=2 color=black>"; print "<a href='dbed.pl?table=$currtable' title='Show all records.'>Filter</a>: "; print $pagefield; print $orderfield; print $exiturlfield; print "<input type=hidden name='table' value='".$currtable."'>"; print "<input type=text size=20 name='filter' value='".&xe($currfilter_show)."'>"; print " <input type=submit value='REFRESH'>"; print " <a href='#bottom' title='BOTTOM'><font size=1>BOTTOM</font></a>"; print "</form>"; print "</font></td>"; print "<td align=right valign=top><font face=Arial size=2 color=black>"; print "<a href="dbed.pl?".$exiturlarg."" title="Change table.">".uc($currtable)."</a> "; print "<a href="dbed.pl?mode=n&table=$currtable$filterarg$orderarg$pagearg$exiturlarg" title='Create a new record.'>add</a> "; print "</font></td></tr></table>"; $dbh = DBI->connect("$DBINIT","$DBLOGIN","$DBPASSWORD"); if (! $dbh) { &errexit("The database is not available.") } $select = $COLS_VIEW{$currtable}; if(!$select){$select="*";}; print "<!-- select $select from $currtable $currordersql -->\n"; $sth=$dbh->prepare("select $select from $currtable $currordersql"); $sth->execute || &errexit($dbh->errstr); $fieldcnt=$sth->{NUM_OF_FIELDS}; @fieldnames = @{$sth->{NAME}}; $tabletop = ''; $tabletop .= "<table border='1' width='100%'><tr>"; $tabletop .= "<td bgcolor='#eeeeee' width='20'>$tds $tde</td>"; for ($fldlp=0;$fldlp<$fieldcnt;$fldlp++) { $tabletop .= "<td bgcolor='#eeeeee'>$tds <b><a href='dbed.pl?table=$currtable$filterarg$pagearg$exiturlarg"; if (lc($currorder) eq lc($fieldnames[$fldlp])) { $tabletop .= "&order="; if ($orderdesc eq '') { $tabletop .= '-' } $tabletop .= &xe($fieldnames[$fldlp])."' title='Reverse sort order.'"; } else { $tabletop .= "&order=$fieldnames[$fldlp]' title='Change sort field.'"; } $tabletop .= ">".$fieldnames[$fldlp]."</a></b>$tde</td>\n"; } $tabletop .= "<td bgcolor='#eeeeee' width='20'>$tds $tde</td></tr>\n"; $totalrecs = 0; $validrecs = 0; while (@browserec=$sth->fetchrow_array) { $totalrecs++; $currkey = ""; $recfilter = ''; $row_out = ''; for ($fldlp=0;$fldlp<$fieldcnt;$fldlp++) { if (! $browserec[$fldlp]) { $browserec[$fldlp] = "" } $browserec[$fldlp] = &stripslashes($browserec[$fldlp]); if ($browserec[$fldlp]) { $recfilter .= ' '.lc($browserec[$fldlp]) } if ( ($COLS_KEYS{$currtable} eq '') or ($COLS_KEYS{$currtable} =~ /$fieldnames[$fldlp]/i) ) { $currkey_val = $browserec[$fldlp]; if ($currkey ne '') { $currkey .= " and " } $currkey .= $fieldnames[$fldlp].'="'.$currkey_val.'"'; } $row_out .= "<td valign='top'>$tds ".$browserec[$fldlp].$tde."</td>\n"; } if ($recfilter ne '') { $recfilter .= ' ' } $validrec = 0; if ($currfilter eq '') { $validrec = 1 } else { if ($filtermode eq 'o') { $validrec = 0 } else { $validrec = 1 } foreach $one_filter (@currfilters) { while ($one_filter =~ /\_/) { $one_filter =~ s/\_/ /g } if ($filtermode eq 'o') { if ($recfilter =~ /$one_filter/) { $validrec = 1; last; } } else { if ($recfilter !~ /$one_filter/) { $validrec = 0; last; } } } } if ($validrec > 0) { $currkey = &xe($currkey); $rec_row_out[$validrecs] = "<tr>\n"; $rec_row_out[$validrecs] .= '<td valign="top">'.$tds.'<a href="dbed.pl?mode=e&key='.$currkey. '&table='.$currtable.$filterarg.$orderarg.$pagearg.$exiturlarg.'">edit</a>'.$tde."</td>\n"; $rec_row_out[$validrecs] .= $row_out; $rec_row_out[$validrecs] .= '<td valign="top">'.$tds.'<a href="dbed.pl?mode='.$CONFIRM_DELETE.'&key='.$currkey. '&table='.$currtable.$filterarg.$orderarg.$pagearg.$exiturlarg.'">del</a>'.$tde."</td></tr>\n\n"; $validrecs++; } } print '<table cellspacing=0 cellpadding=0 border=0><tr>'; print '<td valign=bottom><font size=2 face=Arial color=black>'; $start_rec = $currpage * $MAX_PAGE_RECORDS; $end_rec = $start_rec + ($MAX_PAGE_RECORDS - 1); if ($end_rec > ($validrecs - 1)) { $end_rec = $validrecs - 1 } if ($start_rec > $end_rec) { $start_rec = $end_rec - ($MAX_PAGE_RECORDS - 1) } if ($start_rec < 0) { $start_rec = 0 } if ($currfilter) { print $validrecs." out of ".$totalrecs." match filter." } else { print $totalrecs." total records." } if ($validrecs >= $MAX_PAGE_RECORDS) { print " Showing records ".($start_rec+1)." through ".($end_rec+1).'.' } print "</td><td> </td>"; print '<form name="JUMPMENU" method=get align=top>'; print '<td align=left valign=top><font face=Arial size=2 color=black>'; print "Page: <select name="JUMPTO" onChange="if (document.JUMPMENU.JUMPTO.options[document.JUMPMENU.JUMPTO.selectedIndex].value) { window.location = 'dbed.pl?table=".$currtable.$filterarg.$orderarg.$exiturlarg."&page='+document.JUMPMENU.JUMPTO.options[document.JUMPMENU.JUMPTO.selectedIndex].value }">"; for ($pgloop = 0; $pgloop <= ($totalrecs / $MAX_PAGE_RECORDS); $pgloop++ ) { print '<option value="'.$pgloop.'"'; if ($pgloop == $currpage) { print ' selected' } print '>'.($pgloop+1).'</option>' } print '</select>'; print '</td></form></tr></table>'; if ($validrecs < 1) { print "<br>No records found.<br>" } else { print $tabletop; for ($rec_loop = $start_rec; $rec_loop <= $end_rec; $rec_loop++ ) { print $rec_row_out[$rec_loop]; } print "</table>\n"; print "<a name='bottom'></a><br><a href='#top' title='TOP'><font size=2>TOP</font></a><br>"; } if($sth){$sth->finish;} $dbh->disconnect; } print &HTML_Foot(); exit; } # Display form for edit record. sub DoEdit { print &HTML_Head('Edit'); if ( ($currtable) && ($currkey) ) { $dbh = DBI->connect("$DBINIT","$DBLOGIN","$DBPASSWORD"); $select = $COLS_EDIT{$currtable}; if(!$select){$select="*";}; $sth = $dbh->prepare("SELECT ".$select." FROM ".$currtable); $sth->execute || &errexit($dbh->errstr); $fieldcnt=$sth->{NUM_OF_FIELDS}; @fieldnames = @{$sth->{NAME}}; @fieldtype = @{$sth->{TYPE}}; @nullable = @{$sth->{NULLABLE}}; $sth->finish; $sql = "SELECT ".$select." FROM ".$currtable." WHERE ".$currkey; $sth=$dbh->prepare($sql) || &errexit($dbh->errstr); $sth->execute || &errexit($dbh->errstr); @editrec=$sth->fetchrow_array; $currkey=&xe($currkey); print "<font face=Arial color=green size=3><b>Database Editor</b></font> - Edit ".$currtable." Record"; $alt_links = ''; foreach $alt_table (keys(%COLS_KEYS)) { if ($alt_table ne $currtable) { if ($COLS_KEYS{$alt_table} eq $COLS_KEYS{$currtable}) { $alt_links .= ' <a href="dbed.pl?mode=e&key='.$currkey.'&table='.$alt_table.$filterarg.$orderarg.$pagearg.$exiturlarg. '" title="Switch to '.$alt_table.'">'.$alt_table.'</a>'; } } } if ($alt_links) { print "<font size=1> Switch to:".$alt_links."</font>" } if ($exiturl) { print "<font size=1> <a href='".$exiturl."'>EXIT</a></font>" } print "\n"; if ($sth->rows < 1) { &errexitraw("<br>No record found matching key.") } if ($sth->rows > 1) { &errexitraw("<br>More than one record found matching key.") } print qq(<form action="dbed.pl" method="post"> <input type="hidden" name="mode" value="s"> $filterfield $pagefield $orderfield $exiturlfield <input type="hidden" name="table" value="$currtable"> <input type="hidden" name="key" value="$currkey"> ); print qq( <table border="1"> <tr><td bgcolor="#ddddff" align=left>$tds<input type="Submit" name="ok" value="SAVE">$tde</td> <td bgcolor="#ddddff" align=right>$tds<a href="dbed.pl?mode=$CONFIRM_DELETE\&key=$currkey\&table=$currtable$filterarg$orderarg$pagearg$exiturlarg. " title="Delete this record.">DELETE</a> <a href="dbed.pl?table=$currtable$filterarg$orderarg$pagearg$exiturlarg. " title="Return to browse.">CANCEL</a> $tde</td></tr> ); for ($fldlp=0;$fldlp<$fieldcnt;$fldlp++) { if($nullable[$fldlp]){$nulla="null"}else{$nulla="not null"}; print "<tr bgcolor='#eeeeee'><td align=right>$tds<b>"; if (lc($fieldnames[$fldlp]) eq 'email') { print '<a href="mailto:'.$editrec[$fldlp].'">'.$fieldnames[$fldlp].'</a>'; } else { print $fieldnames[$fldlp]; } print "</b>$tde</td>\n"; if (!$editrec[$fldlp]){$editrec[$fldlp]="";} $editrec[$fldlp] = &stripslashes($editrec[$fldlp]); if (($TYPES{$fieldtype[$fldlp]}=~/long/)||($TYPES{$fieldtype[$fldlp]}=~/bin/)&&(!$select)) { $editfield = '<textarea cols="70" rows="4" name="'.$fieldnames[$fldlp].'">'.$editrec[$fldlp]."</textarea>\n"; } else { $editfield = '<input type="text" size="80" name="'.$fieldnames[$fldlp].'" value="'.&addquoteslashes($editrec[$fldlp]).'">'."\n"; } print qq(<td align=left>$tds $editfield$tde</td></tr>\n); } print qq( <tr><td align=left bgcolor="#ddddff">$tds<input type="Submit" name="ok" value="SAVE">$tde</td> <td bgcolor="#ddddff" align=right>$tds<a href="dbed.pl?mode=$CONFIRM_DELETE\&key=$currkey\&table=$currtable$filterarg$orderarg$pagearg$exiturlarg. " title="Delete this record.">DELETE</a> <a href="dbed.pl?table=$currtable$filterarg$orderarg$pagearg$exiturlarg" title="Return to browse." >CANCEL</a> $tde</td></tr> ); print qq( </table> </form> ); $sth->finish; $dbh->disconnect; print &HTML_Foot(); } else { &errexit("Missing table or key."); } exit; } # Save updated record. sub DoSave { print &HTML_Head('Browse'); if ( ($currtable) && ($currkey) ) { $dbh = DBI->connect("$DBINIT","$DBLOGIN","$DBPASSWORD"); $select = $COLS_EDIT{$currtable}; if(!$select){$select="*";}; $sth=$dbh->prepare("SELECT ".$select." FROM ".$currtable); $sth->execute || &errexit($dbh->errstr); @fieldnames = @{$sth->{NAME}}; $sth->finish; $sql_save = "UPDATE ".$currtable." SET "; foreach $fieldname (@fieldnames) { if ($COLS_EDIT{$currtable} =~ /$fieldname/i) { $sql_save .= $fieldname."='".addslashes(&xd($param->param($fieldname)))."',"; } } $sql_save = substr($sql_save,0,length($sql_save)-1); $sql_save .= " WHERE ".$currkey; # &errexit("Query: ".$sql_save); $sth=$dbh->do($sql_save) || &errexit($dbh->errstr); $dbh->disconnect; &DoBrowse(); } else { &errexit("Missing table or key."); } exit; } # Display form for new record. sub DoNew { print &HTML_Head('Add'); if ($currtable) { $dbh = DBI->connect("$DBINIT","$DBLOGIN","$DBPASSWORD"); $select = $COLS_EDIT{$currtable}; if(!$select){$select="*";}; $sth = $dbh->prepare("SELECT ".$select." FROM ".$currtable); $sth->execute || &errexit($dbh->errstr); $fieldcnt=$sth->{NUM_OF_FIELDS}; @fieldnames = @{$sth->{NAME}}; @fieldtype = @{$sth->{TYPE}}; @nullable = @{$sth->{NULLABLE}}; $sth->finish; print "<font face=Arial color=green size=3><b>Database Editor</b></font> - Add New Record<br>\n"; print qq(<form action="dbed.pl" method="post"> <input type="hidden" name="mode" value="a"> $filterfield $pagefield $orderfield $exiturlfield <input type="hidden" name="table" value="$currtable"> ); print qq( <table border="1"> <tr><td bgcolor="#ddddff" align=left>$tds<input type="Submit" name="ok" value="SAVE">$tde</td> <td bgcolor="#ddddff" align=right>$tds<a href="dbed.pl?table=$currtable$filterarg$orderarg$pagearg$exiturlarg. " title="Return to browse.">CANCEL</a> $tde</td></tr> ); for ($fldlp=0;$fldlp<$fieldcnt;$fldlp++) { if($nullable[$fldlp]){$nulla="null"}else{$nulla="not null"}; print qq(<tr bgcolor='#eeeeee'><td align=right>$tds<b> $fieldnames[$fldlp] </b>$tde</td>\n); if (($TYPES{$fieldtype[$fldlp]}=~/long/)||($TYPES{$fieldtype[$fldlp]}=~/bin/)&&(!$select)) { $editfield=qq(<textarea cols="70" rows="4" name="$fieldnames[$fldlp]"></textarea>\n); } else { $editfield=qq(<input type="text" size="80" name="$fieldnames[$fldlp]" value="">\n); } print qq(<td align=left>$tds $editfield$tde</td></tr>\n); } print qq( <tr><td align=left bgcolor="#ddddff">$tds<input type="Submit" name="ok" value="SAVE">$tde</td> <td align=right bgcolor="#ddddff">$tds<a href="dbed.pl?table=$currtable$filterarg$orderarg$pagearg$exiturlarg. " title="Return to browse.">CANCEL</a> $tde</td></tr> ); print qq( </table> </form> ); $sth->finish; $dbh->disconnect; print &HTML_Foot(); } else { &errexit("Missing table."); } exit; } # Save new record. sub DoAdd { print &HTML_Head('Browse'); if ($currtable) { $dbh = DBI->connect("$DBINIT","$DBLOGIN","$DBPASSWORD"); $select = $COLS_EDIT{$currtable}; if(!$select){$select="*";}; $sth=$dbh->prepare("SELECT ".$select." FROM ".$currtable); $sth->execute || &errexit($dbh->errstr); @fieldnames = @{$sth->{NAME}}; @nullable = @{$sth->{NULLABLE}}; $sth->finish; $sql_add = "INSERT INTO ".$currtable." SET "; foreach $fieldname (@fieldnames) { if ($COLS_EDIT{$currtable} =~ /$fieldname/i) { $sql_add .= $fieldname."='".addslashes(&xd($param->param($fieldname)))."',"; } } $sql_add = substr($sql_add,0,length($sql_add)-1); $dbh->do($sql_add) || &errexit($dbh->errstr); $dbh->disconnect; &DoBrowse(); } else { &errexit("Missing table."); } } # Confirm delete of specified record. sub DoDeleteConfirm { print &HTML_Head('Delete'); if ( ($currtable) && ($currkey) ) { print "<font face=Arial color=green size=3><b>Database Editor</b></font> - Confirm Delete<br>\n"; print "<br><font size=3><b>Record key:</b> ".$currkey."<br><br></font>\n"; $dbh = DBI->connect("$DBINIT","$DBLOGIN","$DBPASSWORD"); print "<!-- SELECT ".$COLS_EDIT{$currtable}." FROM ".$currtable." WHERE ".$currkey." -->\n"; $dbs = $dbh->prepare("SELECT ".$COLS_EDIT{$currtable}." FROM ".$currtable." WHERE ".$currkey) || &errexit($dbh->errstr); $dbs->execute; $db_err = $dbh->errstr; if ($db_err ne '') { &errexitraw($dbh->errstr) } @db_cols = $dbs->fetchrow_array; $db_err = $dbh->errstr; if ($db_err ne '') { &errexitraw($dbh->errstr) } if ($dbs->rows != 1) { &errexitraw("Key does not select a single record.") } $dbs->finish; $dbh->disconnect; $currkey = &xe($currkey); print "<a href="dbed.pl?mode=d&key=$currkey&table=$currtable$filterarg$orderarg$pagearg$exiturlarg">DELETE</a> "; print "<a href="dbed.pl?table=$currtable$filterarg$orderarg$pagearg$exiturlarg" title="Return to browse.">CANCEL</a>\n"; print &HTML_Foot(); exit; } else { &errexit("Missing table or key.") } } # Delete specified record. sub DoDelete { print &HTML_Head('Browse'); if ($currkey && $currtable) { $dbh = DBI->connect("$DBINIT","$DBLOGIN","$DBPASSWORD"); $dbs = $dbh->prepare("SELECT ".$COLS_EDIT{$currtable}." FROM ".$currtable." WHERE ".$currkey) || &errexit($dbh->errstr); $dbs->execute; $db_err = $dbh->errstr; if ($db_err ne '') { &errexitraw($dbh->errstr) } @db_cols = $dbs->fetchrow_array; $db_err = $dbh->errstr; if ($db_err ne '') { &errexitraw($dbh->errstr) } if ($dbs->rows != 1) { &errexitraw("Key does not select a single record.") } $dbs->finish; $dbh->do("DELETE FROM ".$currtable." WHERE ".$currkey) || &errexit($dbh->errstr); $dbh->disconnect; } else { &errexit("Missing table or key.") } &DoBrowse(); } # Show login form and exit. sub DoLogin { print "Content-type:text/html\n\n".'<html><head><title>dbed '.$LOCALMSG. ' - Login</title></head> <body bgcolor=white onLoad="document.loginform.password.focus()"><font face=Arial color=black size=2>'."\n"; print "<font face=Arial color=green size=3><b>Database Editor</b></font><br>\n"; print "<form action='dbed.pl' method='post' name='loginform'>\n"; print "<input type=password name='password' size=20>\n"; print $filterfield; print $pagefield; print $orderfield; print $exiturlfield; print "<input type=hidden name='mode' value='".$mode."'>\n"; print "<input type=hidden name='table' value='".$currtable."'>\n"; print "<input type=hidden name='key' value='".&xe($currkey)."'>\n"; print "<input type=submit name='LOGIN' value='LOGIN'>\n"; print "</form>\n"; print &HTML_Foot(); exit; } # Show error message and exit. sub errexitraw { $errmsg = $_[0]; print "<font size=3 color=red><br>Error:</font> <b>$errmsg</b><br><br>\n"; print "<a href='javascript:history.back();'><<< BACK</a>"; print "<br><br><a href='dbed.pl?table=".$currtable.$filterarg.$orderarg.$pagearg.$exiturlarg. "' title='Return to browse.'>CANCEL</a><br>\n"; if ($exiturl) { print "<br><a href='".$exiturl."'>EXIT</a><br>" } print &HTML_Foot(); exit; } sub errexit { $errmsg = $_[0]; print "<font face=Arial color=green size=3><b>Database Editor</b></font><br>\n"; &errexitraw($errmsg); } ######################################## # SUPPORTING ROUTINES # Convert troublesome characters to HEX for passing and storing. sub xe { # heX Encode $safe_str= $_[0]; $safe_out = ''; for ($safe_lp = 0; $safe_lp < length($safe_str); $safe_lp++ ) { $safe_char = substr($safe_str,$safe_lp,1); if ( ($safe_char lt ' ') or ($safe_char gt 'z') or ($safe_char eq '%') or ($safe_char eq '~') or ($safe_char eq '+') or ($safe_char eq "'") or ($safe_char eq '"') or ($safe_char eq '<') or ($safe_char eq '>') or ($safe_char eq '&') or ($safe_char eq '#') or ($safe_char eq '') or ($safe_char eq '/') or ($safe_char eq '?') or ($safe_char eq '@') ) { $safe_char = '%'.sprintf("x", ord($safe_char)) } $safe_out .= $safe_char; } return $safe_out; } # Convert trouble some characters from hex back to string. sub xd { # heX Decode $safe_str = $_[0]; $safe_str =~ s/%(..)/pack("c",hex($1))/ge; $safe_str =~ s/\r//g; return $safe_str; } sub stripslashes { $arg_in = $_[0]; $arg_in =~ s/'/'/g; $arg_in =~ s/"/"/g; return($arg_in); } sub addslashes { $arg_in = $_[0]; $arg_in =~ s/'/'/g; $arg_in =~ s/"/"/g; $arg_in =~ s/'/'/g; $arg_in =~ s/"/"/g; return($arg_in); } sub addquoteslashes { $arg_in = $_[0]; $arg_in =~ s/"/"/g; $arg_in =~ s/"/"/g; return($arg_in); } sub HTML_Head { $head_title = $_[0]; $set_cookie = ""; if ($password ne '') { $set_cookie .= "<SCRIPT LANGUAGE=JAVASCRIPT TYPE="TEXT/JAVASCRIPT">\n"; $set_cookie .= "\n"; $set_cookie .= "<!-- Hide from Old Browsers\n"; $x_time = time + (12 * 60 * 60); @DayNames = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); @MonthNames = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); ($x_Sec, $x_Min, $x_Hr, $x_Da, $x_Mo, $x_Yr, $x_DOW) = localtime($x_time); $x_Mo++; $x_Yr += 1900; $x_date = sprintf("%s, d-%s-d d:d:d CST", substr($DayNames[$x_DOW],0,3), $x_Da, substr($MonthNames[$x_Mo-1],0,3), $x_Yr, $x_Hr, $x_Min, $x_Sec); $cookie_args = "; path=/; expires=".$x_date; $set_cookie .= "document.cookie = "dbedpassword=".$password.$cookie_args.""\n"; $set_cookie .= " // End Hiding Script -->\n"; $set_cookie .= "</SCRIPT>\n"; } return( "Content-type:text/html\n\n"."<html><head><title>dbed ".$LOCALMSG. " - ".$head_title."</title>\n".$set_cookie."</head> <body bgcolor=white><font face=Arial color=black size=2>\n" ); } sub HTML_Foot { return( "</font></body></html>\n" ); } sub GetPasswordCookie { if ($password eq '') { @cookies = split(/;/, $ENV{'HTTP_COOKIE'}); foreach $cookie_pair (@cookies) { ($cookie_name, $cookie_value) = split(/=/, $cookie_pair); $cookie_name =~ s/ //g; if ($cookie_name eq 'dbedpassword') { $password = $cookie_value; } } } }