0.11_10 commit
authorTony Cook <tony@develop-help.com>
Tue, 5 Mar 2002 04:04:23 +0000 (04:04 +0000)
committertony <tony@45cb6cf1-00bc-42d2-bb5a-07f51df49f94>
Tue, 5 Mar 2002 04:04:23 +0000 (04:04 +0000)
26 files changed:
MANIFEST
Makefile
localinst.perl
schema/bse.sql
site/cgi-bin/admin/add.pl
site/cgi-bin/bse.cfg
site/cgi-bin/modules/BSE/Session.pm
site/cgi-bin/modules/BSE/Shop/Util.pm
site/cgi-bin/modules/BSE/UserReg.pm
site/cgi-bin/modules/BSE/Util/Tags.pm
site/cgi-bin/modules/DevHelp/Tags.pm
site/cgi-bin/modules/Generate.pm
site/cgi-bin/modules/Util.pm
site/cgi-bin/search.pl
site/cgi-bin/shop.pl
site/cgi-bin/user.pl
site/docs/TODO.pod
site/docs/bse.pod
site/docs/config.pod
site/docs/makedocs
site/docs/secure.pod [new file with mode: 0644]
site/templates/admin/edit_1.tmpl
site/templates/admin/edit_2.tmpl
site/util/upgrade_mysql.pl
t/BSE/Test.pm
test.cfg.base

index f946072..9193086 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -102,12 +102,16 @@ site/docs/bugs.html
 site/docs/bugs.pod
 site/docs/config.html
 site/docs/config.pod
+site/docs/gen.html
 site/docs/makedocs
 site/docs/search.html
+site/docs/secure.html
+site/docs/secure.pod
 site/docs/shop.html
 site/docs/shopadmin.html
 site/docs/templates.html
 site/docs/templates.pod
+site/docs/upgrade_mysql.html
 site/htdocs/a/.htaccess
 site/htdocs/admin/advanced.html
 site/htdocs/admin/help/file.html
index e740d7b..52b133a 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION=0.11_09
+VERSION=0.11_10
 DISTNAME=bse-$(VERSION)
 DISTBUILD=$(DISTNAME)
 DISTTAR=../$(DISTNAME).tar
index e5c97b4..e841808 100644 (file)
@@ -64,7 +64,7 @@ my $cfg = do { local $/; <CFG> };
 close CFG;
 $cfg =~ s/^name\s*=.*/name=Test Server/m;
 $cfg =~ s/^url\s*=.*/"url=" . BSE::Test::base_url()/me;
-$cfg =~ s/^secureurl\s*=.*/"secureurl=" . BSE::Test::base_url()/me;
+$cfg =~ s/^secureurl\s*=.*/"secureurl=" . BSE::Test::base_securl()/me;
 my $uploads = "$instbase/uploads";
 $cfg =~ s!^downloads\s*=.*!downloads=$uploads!m;
 -d $uploads 
index 21fa5f2..98a7030 100644 (file)
@@ -10,7 +10,7 @@ CREATE TABLE article (
   -- the order to display articles in
   -- used for ordering sibling articles
   displayOrder integer not NULL default 0,
-  title varchar(64) DEFAULT '' NOT NULL,
+  title varchar(255) DEFAULT '' NOT NULL,
   titleImage varchar(64) not null,
   body text NOT NULL,
 
index 1508db3..f76760d 100755 (executable)
@@ -17,6 +17,7 @@ use Carp 'verbose';
 use Squirrel::ImageEditor;
 use BSE::Cfg;
 use BSE::Session;
+use BSE::Util::Tags;
 
 my $cfg = BSE::Cfg->new;
 my %session;
@@ -209,6 +210,7 @@ my $stepparent_index;
 my $child_index = -1;
 %acts =
   (
+   BSE::Util::Tags->basic(\%acts, $CGI::Q, $cfg),
    #iterate_image=>\&iterate_image,
    image=>\&image,
    article=>\&article,
index 7e9e051..9a5083a 100644 (file)
@@ -38,6 +38,7 @@ title = My $(site/name)
 [messages]
 user/notyourorder = Order $1 isn't your order
 shop/fileitems = You have products in your cart that include downloadable files.  Please logon or register before checking out.
+shop/logonrequired = This site requires that you be logged on to make a purchase.  Please logon or register before checking out.
 
 [downloads]
 ; if true, an order must be marked paid for before the user can download
index 557f268..9953725 100644 (file)
@@ -42,6 +42,23 @@ sub tie_it {
   $saved = $session;
 }
 
+sub change_cookie {
+  my ($self, $session, $cfg, $sessionid, $newsession) = @_;
+
+  my $lifetime = $cfg->entry('basic', 'cookie_lifetime') || '+3h';
+  print "Set-Cookie: ",
+  CGI::Cookie->new(-name=>'sessionid', -value=>$sessionid, 
+                  -expires=>$lifetime),"\n";
+  my $dh = BSE::DB->single;
+  eval {
+    tie %$newsession, $SESSION_CLASS, $sessionid,
+    {
+     Handle=>$dh->{dbh},
+     LockHandle=>$dh->{dbh}
+    };
+  };
+}
+
 # this shouldn't be necessary, but it stopped working elsewhere and this
 # fixed it
 END {
index e8bf44e..fb663e7 100644 (file)
@@ -15,8 +15,16 @@ sub shop_cart_tags {
   my $item_index;
   my $option_index;
   my @options;
+  my $user;
+  if ($session->{userid}) {
+    require 'SiteUsers.pm';
+    $user = SiteUsers->getBy(userId=>$session->{userid});
+  }
+
   return
     (
+     ifUser => sub { $user },
+     user => sub { CGI::escapeHTML($user ? $user->{$_[0]} : '') },
      iterate_items_reset => sub { $item_index = -1 },
      iterate_items => 
      sub { 
@@ -37,6 +45,7 @@ sub shop_cart_tags {
      },
      index => sub { $item_index },
      total => sub { total($cart, $cart_prods, $session->{custom}) },
+     count => sub { scalar @$cart },
      iterate_options_reset => sub { $option_index = -1 },
      iterate_options => sub { ++$option_index < @options },
      option => sub { CGI::escapeHTML($options[$option_index]{$_[0]}) },
@@ -253,12 +262,17 @@ sub need_logon {
     for my $prod (@$cart_prods) {
       my @files = ArticleFiles->getBy(articleId=>$prod->{id});
       if (grep $_->{forSale}, @files) {
-       return 1;
+       return ("register before checkout", "shop/fileitems");
       }
     }
   }
+
+  my $require_logon = $cfg->entryBool('shop', 'require_logon', 0);
+  if (!$session->{userid} && $require_logon) {
+    return ("register before checkout", "shop/logonrequired");
+  }
   
-  return 0;
+  return;
 }
 
 1;
index 26ee6dc..fd69b40 100644 (file)
@@ -88,14 +88,85 @@ sub logon {
   print "Set-Cookie: ",CGI::Cookie->new(-name=>"userid", 
                                        -value=>$user->{userId},
                                        -path=>"/"),"\n";
-  
+
+  _got_user_refresh($session, $cgi, $cfg);
+}
+
+sub _got_user_refresh {
+  my ($session, $cgi, $cfg) = @_;
+
+  my $baseurl = $cfg->entryVar('site', 'url');
+  my $securl = $cfg->entryVar('site', 'secureurl');
+  my $need_magic = $baseurl ne $securl;
+  my $onbase = 1;
+  if ($need_magic) {
+    my $debug = $cfg->entryBool('debug', 'logon_cookies', 0);
+    print STDERR "Logon Cookies Debug\n" if $debug;
+
+    # which host are we on?
+    # first get info about the 2 possible hosts
+    my ($baseprot, $basehost, $baseport) = 
+      $baseurl =~ m!^(\w+)://([\w-.]+)(?::(\d+))?!;
+    $baseport ||= $baseprot eq 'http' ? 80 : 443;
+    print STDERR "Base: prot: $baseprot  Host: $basehost  Port: $baseport\n"
+      if $debug;
+
+    #my ($secprot, $sechost, $secport) = 
+    #  $securl =~ m!^(\w+)://([\w-.]+)(?::(\d+))?!;
+
+    # get info about the current host
+    my $port = $ENV{SERVER_PORT} || 80;
+    my $ishttps = exists $ENV{HTTPS} || exists $ENV{SSL_CIPHER};
+    print STDERR "\$ishttps: $ishttps\n" if $debug;
+    my $protocol = $ishttps ? 'https' : 'http';
+
+    if (lc $ENV{SERVER_NAME} ne lc $basehost
+       || lc $protocol ne $baseprot
+       || $baseport != $port) {
+      $onbase = 0;
+    }
+  }
   my $refresh = $cgi->param('r');
-  if ($refresh) {
-    refresh_to($refresh);
+  if ($need_magic) {
+    my $url = $onbase ? $securl : $baseurl;
+    my $finalbase = $onbase ? $baseurl : $securl;
+    $refresh ||= "$ENV{SCRIPT_NAME}?userpage=1";
+    $refresh = $finalbase . $refresh unless $refresh =~ /^\w+:/;
+    $url .= "$ENV{SCRIPT_NAME}?setcookie=".$session->{_session_id};
+    $url .= "&r=".CGI::escape($refresh);
+    refresh_to($url);
   }
   else {
-    refresh_to($cfg->entryErr('site', 'url') . "$ENV{SCRIPT_NAME}?userpage=1");
+    if ($refresh) {
+      refresh_to($refresh);
+    }
+    else {
+      refresh_to($cfg->entryErr('site', 'url') . "$ENV{SCRIPT_NAME}?userpage=1");
+    }
+  }
+}
+
+sub set_cookie {
+  my ($self, $session, $cgi, $cfg) = @_;
+
+  my $msgs = BSE::Message->new(cfg=>$cfg, section=>'user');
+  my $cookie = $cgi->param('setcookie')
+    or return $self->show_logon($session, $cgi, $cfg, 
+                               $msgs->(nocookie=>"No cookie provided"));
+  my %newsession;
+  BSE::Session->change_cookie($session, $cfg, $cookie, \%newsession);
+  my $refresh = $cgi->param('r') 
+    or return $self->show_logon($session, $cgi, $cfg, 
+                               $msgs->(norefresh=>"No refresh provided"));
+  my $userid = $newsession{userid};
+  if ($userid) {
+    my $user = SiteUsers->getBy(userId => $userid);
+    use CGI::Cookie;
+    print "Set-Cookie: ",CGI::Cookie->new(-name=>"userid", 
+                                         -value=>$userid,
+                                         -path=>"/"),"\n";
   }
+  refresh_to($refresh);
 }
 
 sub logoff {
@@ -341,14 +412,15 @@ sub register {
                                          -path=>"/"),"\n";
     use Util qw/refresh_to/;
     
+    _got_user_refresh($session, $cgi, $cfg);
     
-    my $refresh = $cgi->param('r');
-    if ($refresh) {
-      refresh_to($refresh);
-    }
-    else {
-      return refresh_to($cfg->entryErr('site', 'url') . "/cgi-bin/user.pl?show_opts=1");
-    }
+#      my $refresh = $cgi->param('r');
+#      if ($refresh) {
+#        refresh_to($refresh);
+#      }
+#      else {
+#        return refresh_to($cfg->entryErr('site', 'url') . "/cgi-bin/user.pl?show_opts=1");
+#      }
   }
   else {
     $self->show_register($session, $cgi, $cfg,
index f6b665d..e490409 100644 (file)
@@ -94,10 +94,12 @@ sub static {
      },
      cfg =>
      sub {
-       my ($section, $key) = split ' ', $_[0];
+       my ($section, $key, $def) = split ' ', $_[0];
        $cfg or return '';
        my $value = $cfg->entry($section, $key);
-       defined $value or $value = '';
+       unless (defined $value) {
+        $value = defined($def) ? $def : '';
+       }
        $value;
      },
      _format => 
index 140fd40..1a39320 100644 (file)
@@ -8,7 +8,16 @@ sub make_iterator {
   my @result =
       (
        "iterate_${plural}_reset" => sub { $index = -1 },
-       $single => sub { CGI::escapeHTML($array->[$index]{$_[0]}) },
+       $single => 
+       sub { 
+        $index >= 0 && $index < @$array 
+          or return "** $single used outside of iterator **";
+        defined($_[0])
+          or return "** no parameter supplied to $single **";
+        my $value = $array->[$index]{$_[0]};
+        defined($value) or return '';
+        return CGI::escapeHTML($value);
+       },
        "if\u$plural" => sub { @$array },
        "${single}_index" => sub { $index },
       );
@@ -184,14 +193,6 @@ sub static {
         or die; # leaves if in place
        $left =~ $right;
      },
-     cfg =>
-     sub {
-       my ($section, $key) = split ' ', $_[0];
-       $cfg or return '';
-       my $value = $cfg->entry($section, $key);
-       defined $value or $value = '';
-       $value;
-     },
      _format => 
      sub {
        my ($value, $fmt) = @_;
index eacdd47..e0d64d0 100644 (file)
@@ -607,7 +607,14 @@ sub excerpt {
   # do a reverse sort so that the longer terms (and composite
   # terms) are replaced first
   my $re_str = join("|", reverse sort @reterms);
-  my $re = $case_sensitive ? qr/\b($re_str)\b/ : qr/\b($re_str)\b/i;
+  my $re;
+  my $cfg = $self->{cfg};
+  if ($cfg->entryBool('basic', 'highlight_partial', 1)) {
+    $re = $case_sensitive ? qr/\b($re_str)/ : qr/\b($re_str)/i;
+  }
+  else {
+    $re = $case_sensitive ? qr/\b($re_str)\b/ : qr/\b($re_str)\b/i;
+  }
 
   # this used to try searching children as well, but it broke more
   # than it fixed
index 8f9354d..538659f 100644 (file)
@@ -41,7 +41,7 @@ sub generate_low {
 
   my $outname = $article->{link};
   $outname =~ s!/\w*$!!;
-  $outname =~ s{^\w+://[\w.-]+}{};
+  $outname =~ s{^\w+://[\w.-]+(?::\d+)?}{};
   $outname = $CONTENTBASE . $outname;
   $outname =~ s!//+!/!;
   my $content = $gen_cache{$genname}->generate($article, $articles);
index d60c03c..a4bccb1 100755 (executable)
@@ -8,6 +8,9 @@ use BSE::DB;
 use Squirrel::Template;
 use Constants qw(:search);
 use Carp;
+use BSE::Cfg;
+
+my $cfg = BSE::Cfg->new;
 
 my $results_per_page = 10;
 
@@ -289,7 +292,7 @@ sub excerpt {
   eval "use $generator";
   confess "Cannot use $generator: $@" if $@;
 
-  $gens{$generator} ||= $generator->new(admin=>$admin);
+  $gens{$generator} ||= $generator->new(admin=>$admin, cfg=>$cfg);
 
   return $gens{$generator}->excerpt($article, $found, $case_sensitive, @terms);
 }
index d4500cb..7a728eb 100755 (executable)
@@ -139,38 +139,8 @@ sub show_cart {
   %acts =
     (
      BSE::Custom->cart_actions(\%acts, \@cart, \@cart_prods, \%custom_state),
-     iterate_items_reset => sub { $item_index = -1; },
-     iterate_items => 
-     sub { 
-       if (++$item_index < @cart) {
-        $option_index = -1;
-        @options = cart_item_opts($cart[$item_index], 
-                                  $cart_prods[$item_index]);
-        return 1;
-       }
-       return 0;
-     },
-     item => 
-     sub { $cart[$item_index]{$_[0]} || $cart_prods[$item_index]{$_[0]} },
-     extended =>
-     sub { 
-       my $what = $_[0] || 'retailPrice';
-       $cart[$item_index]{units} * $cart_prods[$item_index]{$what};
-     },
-     index => sub { $item_index },
-     total => sub { total(\@cart, \@cart_prods, \%custom_state) },
-     money =>
-     sub {
-       my ($func, $args) = split ' ', $_[0], 2;
-       $acts{$func} || return "<: money $_[0] :>";
-       return sprintf("%.02f", $acts{$func}->($args)/100);
-     },
-     count => sub { scalar @cart },
-     iterate_options_reset => sub { $option_index = -1 },
-     iterate_options => sub { ++$option_index < @options },
-     option => sub { CGI::escapeHTML($options[$option_index]{$_[0]}) },
-     ifOptions => sub { @options },
-     options => sub { nice_options(@options) },
+     shop_cart_tags(\%acts, \@cart, \@cart_prods, \%session, $CGI::Q),
+     basic_tags(\%acts),
     );
   $session{custom} = \%custom_state;
 
@@ -230,8 +200,8 @@ sub checkout {
 
   my @cart_prods = map { Products->getByPkey($_->{productId}) } @cart;
 
-  if (need_logon($cfg, \@cart, \@cart_prods, \%session)) {
-    refresh_logon("register before checkout.", 'shop/fileitems');
+  if (my ($msg, $id) = need_logon($cfg, \@cart, \@cart_prods, \%session)) {
+    refresh_logon($msg, $id);
     return;
   }
 
@@ -252,41 +222,11 @@ sub checkout {
   my %acts;
   %acts =
     (
-     iterate_items_reset => sub { $item_index = -1 },
-     iterate_items => 
-     sub { 
-       if (++$item_index < @cart) {
-        $option_index = -1;
-        @options = cart_item_opts($cart[$item_index], 
-                                  $cart_prods[$item_index]);
-        return 1;
-       }
-       return 0;
-     },
-     item => 
-     sub { $cart[$item_index]{$_[0]} || $cart_prods[$item_index]{$_[0]} },
-     extended =>
-     sub { 
-       my $what = $_[0] || 'retailPrice';
-       $cart[$item_index]{units} * $cart_prods[$item_index]{$what};
-     },
-     index => sub { $item_index },
-     total => sub { total(\@cart, \@cart_prods, \%custom_state) },
-     money =>
-     sub {
-       my ($func, $args) = split ' ', $_[0], 2;
-       $acts{$func} || return "<: money $_[0] :>";
-       return sprintf("%.02f", $acts{$func}->($args)/100);
-     },
-     count => sub { scalar @cart },
+     shop_cart_tags(\%acts, \@cart, \@cart_prods, \%session, $CGI::Q),
+     basic_tags(\%acts),
      message => sub { $message },
      old => sub { CGI::escapeHTML($olddata ? param($_[0]) : 
                    $user && defined $user->{$_[0]} ? $user->{$_[0]} : '') },
-     iterate_options_reset => sub { $option_index = -1 },
-     iterate_options => sub { ++$option_index < @options },
-     option => sub { CGI::escapeHTML($options[$option_index]{$_[0]}) },
-     ifOptions => sub { @options },
-     options => sub { nice_options(@options) },
      BSE::Custom->checkout_actions(\%acts, \@cart, \@cart_prods, \%custom_state, $CGI::Q),
     );
   $session{custom} = \%custom_state;
@@ -414,8 +354,8 @@ sub prePurchase {
   }
   $order{orderDate} = $today;
 
-  if (need_logon($cfg, \@cart, \@products, \%session)) {
-    refresh_logon("Some of the products in your cart include downloadable files.  Please logon or register before checkout.");
+  if (my ($msg, $id) = need_logon($cfg, \@cart, \@products, \%session)) {
+    refresh_logon($msg, $id);
     return;
   }
 
@@ -596,8 +536,8 @@ sub purchase {
     $order{gst} += $item->{gst} * $item->{units};
   }
 
-  if (need_logon($cfg, \@cart, \@products, \%session)) {
-    refresh_logon("Some of the products in your cart include downloadable files.  Please logon or register before checkout.");
+  if (my ($msg, $id) = need_logon($cfg, \@cart, \@products, \%session)) {
+    refresh_logon($msg, $id);
     return;
   }
 
@@ -783,7 +723,7 @@ sub send_order {
     # encrypt and sign
     my %opts = 
       (
-       sign=> 1,
+       sign=> $cfg->entryBool('basic', 'sign', 1),
        passphrase=> $passphrase,
        stripwarn=>1,
        #debug=>1,
@@ -824,7 +764,7 @@ sub epoch_to_sql {
 
 sub refresh_logon {
   my ($msg, $msgid) = @_;
-  my $url = $urlbase."/cgi-bin/user.pl";
+  my $url = $securlbase."/cgi-bin/user.pl";
   my %parms;
   $parms{r} = $securlbase."/cgi-bin/shop.pl?checkout=1";
   $parms{message} = $msg if $msg;
@@ -878,6 +818,14 @@ Formats the given field as a money value (without a currency symbol.)
 
 The number of items in the cart.
 
+=item ifUser
+
+Conditional tag, true if a registered user is logged in.
+
+=item user I<field>
+
+Retrieved the given field from the currently logged in user, if any.
+
 =back
 
 =head2 Checkout tags
index 10218dd..59876f3 100755 (executable)
@@ -36,6 +36,7 @@ my %actions =
    blacklist => 'blacklist',
    confirm => 'confirm',
    unsub => 'unsub',
+   setcookie => 'set_cookie',
   );
 
 my $cgi = CGI->new;
index f63bb70..3a18146 100644 (file)
@@ -136,6 +136,10 @@ add a test suite
 
 level parameter to add.pl isn't checked for validity
 
+=item *
+
+Java applet WYSIWYG body text editor (adrian)
+
 =back
 
 =cut
index c8c2fc8..9fc1147 100644 (file)
@@ -10,6 +10,71 @@ Maybe I'll add some other bits here.
 
 =head1 CHANGES
 
+=head2 0.11_10
+
+=over
+
+=item *
+
+test.cfg now has a C<securl> option to control the configured secure url
+
+=item *
+
+added site/doc/secure.pod, describing security considerations
+
+=item *
+
+article title field has been extended to 255 characters.  The title
+edit field maximum length can be controlled with the C<title_size>
+item in [field] in F<bse.cfg>.
+
+=item *
+
+you can get access to the currently logged in user on the checkout and
+cart pages using the C<ifUser> conditional tag and the C<user> value
+tag.
+
+=item *
+
+stripped some more common code out of shop.pl
+
+=item *
+
+extended the common cfg tag to take a third default value parameter
+
+=item *
+
+search result excerpts can now bold partial matches 
+
+=item *
+
+the page regenerator didn't handle the case where a port name was
+present in the secure url.
+
+=item *
+
+now generate gen.html from gen.pl
+
+=item *
+
+added POD to site/docs/makedocs and generate the HTML
+
+=item *
+
+added POD to site/util/upgrade_mysql.pod and generate a HTML version
+
+=item *
+
+when a user logs on and the secure url is different from the base url,
+BSE now refreshes to the other side of the site to set the same
+session cookie there.  This allows session information to be shared
+with the two sides of the site.
+
+There is a known issue with this: any session information (like the
+shopping cart) stored on the other side of the site is not retained.
+
+=back
+
 =head2 0.11_09
 
 =over
index 82c6f21..b50fac4 100644 (file)
@@ -119,6 +119,15 @@ Minimum password length in characters.  Default: 4.
 Device to read random data from.  This device should not block when it
 runs out of entropy.
 
+=item sign
+
+If this is true then the encrypted messages containing the customer's
+credit card number are sent to the shop owner signed.  To avoid
+keeping a passphrase and signing key on the server you can set this to
+false (0).  This has the effect that anyone could send you an unsigned
+message encrypted with your public key, though this may not be a
+security threat.  Default: True.
+
 =back
 
 =head2 [mail]
@@ -255,6 +264,66 @@ The from field for the email.  Default: $SHOP_FROM.
 
 =back
 
+=head2 [search]
+
+=over
+
+=item highlight_partial
+
+If this is true then partial matches will be highlight in search
+result excerpts.  Default: True
+
+=back
+
+=head2 [shop]
+
+=over
+
+=item register_if_files
+
+If true the customer is required to register before checkout if there
+are any for sale files attached to products in the cart.  Default: True
+
+=item require_logon
+
+If true the customer is required to be logged on before checkout,
+whether or not for sale files are attached to products in the cart.
+Default: False.
+
+=back
+
+=head2 [fields]
+
+=over
+
+=item title_size
+
+The maximum length of the article title field.  Default: 255.  Should
+not be set higher than this unless you change the database schema.
+
+=back
+
+=head2 [debug]
+
+Used for debugging.
+
+=over
+
+=item logon_cookies
+
+When a user logs on, and the site url is different to the secure url
+BSE attempts to refresh to the other "side" of the site to set the
+same cookie.
+
+BSE does some simple comparisons to attempt to determine whether the
+logon form was triggered on the secure side of the site (possibly from
+the shop) or on the insecure side.  Since CGI doesn't necessarily give
+us all the information required, it's possible it will guess wrong.
+
+Setting this option to 1 will enable debugging information sent to standard error, which will be sent to the error log on Apache.  This probably isn't useful on IIS.
+
+=back
+
 =head1 AUTHOR
 
 Tony Cook <tony@develop-help.com>
index 222ef21..a1772f1 100644 (file)
@@ -19,9 +19,14 @@ my @targets =
    'shopadmin.html',
    'TODO.html',
    'config.html',
+   'secure.html',
+   'gen.html',
+   'upgrade_mysql.html',
+   'makedocs.html',
   );
 
 my @exts = qw(.pod .pm .pl);
+push(@exts, ''); # I should have put a .pl on makedocs
 
 my @search =
   (
@@ -29,6 +34,7 @@ my @search =
    '../cgi-bin/',
    '../cgi-bin/modules/',
    '../cgi-bin/admin/',
+   '../util/',
   );
 
 use Getopt::Std;
@@ -72,3 +78,58 @@ Usage: $0      - make the documentation files
 EOS
   exit;
 }
+
+__END__
+
+=head1 NAME
+
+makedocs - produces HTML documentation from POD for BSE
+
+=head1 SYNOPSIS
+
+  perl makedocs [-nh]
+
+=head1 DESCRIPTION
+
+Used during the BSE distribution build process to product HTML
+versions of the POD documentation included with various parts of BSE.
+
+Searches in various standard places for source pod/pl/pm files and
+converts them into HTML.
+
+=head1 OPTIONS
+
+C<makedocs> is typically run without options.
+
+=over
+
+=item -n
+
+Report the actions that would be taken without actually performing the
+conversions.
+
+=item -h
+
+Produces a brief usage message.
+
+=back
+
+=head1 BUGS
+
+We're keeping a dependency list in this file, it should be elsewhere,
+maybe we could parse MANIFEST.
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 REVISION
+
+$Revision$
+
+=head1 SEE ALSO
+
+bse
+
+=cut
+
diff --git a/site/docs/secure.pod b/site/docs/secure.pod
new file mode 100644 (file)
index 0000000..d4a2cee
--- /dev/null
@@ -0,0 +1,47 @@
+=head1 NAME
+
+secure.pod - security implications of BSE
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head2 CGI Environment
+
+=over
+
+=item *
+
+your document tree needs to be writable by the user that the CGI
+scripts run as to allow regeneration from the web.  If there are any
+security issues in the code (none are known) it may be possible to
+write other data to these directories.
+
+Possible solution: always regenerate from the command-line using
+F<gen.pl>.
+
+=back
+
+=head2 Shop email
+
+=over
+
+=item *
+
+it's possible to disable the signing of the emails containing orders
+sent to the shop owner.  This makes it impossible to tell the
+difference between an order from the site and a forgery.
+
+Possible solution: check the site for each order.
+
+=back
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 REVISION
+
+$Revision$
+
+=cut
index 9b8e374..6a979c2 100644 (file)
@@ -48,7 +48,7 @@
           <tr> 
             <th> <:articleType:> Title: </th>
             <td bgcolor="#FFFFFF"> 
-              <input type="text" name="title" maxlength="64" size="64" value="<: article title :>">
+              <input type="text" name="title" maxlength="<:cfg fields title_size 255:>" size="64" value="<: article title :>">
             </td>
           </tr>
           <tr> 
index 023bb45..ade6345 100644 (file)
@@ -48,7 +48,7 @@
           <tr> 
             <th> <:articleType:> Title: </th>
             <td bgcolor="#FFFFFF"> 
-              <input type="text" name="title" maxlength="64" size="64" value="<: article title :>">
+              <input type="text" name="title" maxlength="<:cfg fields title_size 255:>" size="64" value="<: article title :>">
             </td>
           </tr>
           <tr> 
index 6fba701..a073c3f 100644 (file)
@@ -225,3 +225,62 @@ sub create_clauses {
     return $results[0];
   }
 }
+
+__END__
+
+=head1 NAME
+
+upgrade_mysql.pl - upgrades the sites mysql database to the description in mysql.str
+
+=head1 SYNOPSIS
+
+  perl upgrade_mysql.pl [-bn] [-v [verbosity]]
+
+=head1 DESCRIPTION
+
+Upgrades your BSE database, as described in your Constants.pm to the
+schema described in mysql.str.
+
+BACKUP YOUR DATABASE BEFORE USING THIS TOOL.
+
+=head1 OPTIONS
+
+=over
+
+=item -b
+
+Asserts that the user has done a backup.  Avoids the interactive query
+about having done a backup.
+
+=item -n
+
+Only check for the changes needed, rather than actually performing the
+upgrade.  Since it's possible that tables might not exist when
+checking for indices, this may give you some errors.
+
+=item -v [verbosity]
+
+Controls verbosity of output.  The default level (1), will produce
+basic descriptions of what is happening, including which table is
+being checked, and any changes being made.
+
+Level 2 will print debug messages containing any SQL that's being
+executed.
+
+Level 3 prints information useful only to developers.
+
+=back
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 REVISION
+
+$Revision$
+
+=head1 SEE ALSO
+
+bse
+
+=cut
index 4ea4b0b..21ad394 100644 (file)
@@ -20,6 +20,10 @@ close TESTCFG;
 
 sub base_url { $conf{base_url} or die "No base_url in test config" }
 
+sub base_securl { 
+  $conf{securl} or $conf{base_url} or die "No securl or base_url in test.cfg"
+}
+
 sub base_dir { $conf{base_dir} or die "No base_dir in test config" }
 
 sub mysql_name { $conf{mysql} or die "No mysql in test config" }
index 3ef7739..1279c0c 100644 (file)
@@ -1,5 +1,6 @@
 # the url of your test sie
 base_url = http://blah.blah.blah
+securl = https://blah.blah.blah
 # where to install the site
 base_dir = /foo/bar/quux
 # the database user/password/dsn