0.12_14 commit r0_12_14
authorTony Cook <tony@develop-help.com>
Tue, 10 Sep 2002 04:46:36 +0000 (04:46 +0000)
committertony <tony@45cb6cf1-00bc-42d2-bb5a-07f51df49f94>
Tue, 10 Sep 2002 04:46:36 +0000 (04:46 +0000)
18 files changed:
Makefile
localinst.perl
site/cgi-bin/bse.cfg
site/cgi-bin/modules/BSE/AdminUsers.pm
site/cgi-bin/modules/BSE/Session.pm
site/cgi-bin/shop.pl
site/docs/access.pod
site/docs/bse.pod
site/templates/admin/menu.tmpl
site/templates/admin/product_detail.tmpl
site/templates/checkout_base.tmpl
site/templates/common/default.tmpl
site/templates/common/defsteps.tmpl
site/templates/common/downloads.tmpl
site/templates/common/news_item.tmpl
site/templates/common/sidebar.tmpl
site/templates/common/sidebar_section.tmpl
site/templates/shopitem.tmpl

index a6946ba..d3924c0 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION=0.12_13
+VERSION=0.12_14
 DISTNAME=bse-$(VERSION)
 DISTBUILD=$(DISTNAME)
 DISTTAR=../$(DISTNAME).tar
index 73ffb68..1c88233 100644 (file)
@@ -70,7 +70,7 @@ open TESTCONF, "< $conffile"
   or die "Could not open config file $conffile: $!";
 while (<TESTCONF>) {
   chomp;
-  /^\s*(\w+)\.(\w+)\s*=\s*(.*\S)\s*$/ or next;
+  /^\s*(\w[^=]*\w)\.(\w+)\s*=\s*(.*\S)\s*$/ or next;
   $conf{lc $1}{lc $2} = $3;
 }
 
index 3555ff9..da84a0b 100644 (file)
@@ -118,6 +118,9 @@ template=shopitem.tmpl
 [Global permissions]
 shop_access = 1
 all_but_shop = 3
+subscriptions=4
+orders=5
+users_and_groups=6
 
 [Article permissions]
 full_access = 0
@@ -132,7 +135,7 @@ descendants=1
 [permission change_body]
 help=The user only has permission to change the body of the article or product.
 permissions=edit_field_edit_body,edit_field_edit_title,edit_save
-brief=Change body
+brief=Change body or title
 
 [permission shop_access]
 help=The user has complete access to articles in the shop
@@ -148,3 +151,21 @@ descendants=1
 brief=All but shop admin
 permissions=not(admin_*)
 
+[permission subscriptions]
+help=The user can create, edit and send subscriptions
+articles=-1
+brief=Subscriptions
+permissions=subs_*
+
+[permission orders]
+help=The user can view the order list, order details, and mark orders filled.
+articles=-1
+brief=Shop Orders
+permissions=shop_order_*
+
+[permission users_and_groups]
+help=The user can manage users, groups and their permissions
+articles=-1
+brief=User/Group management
+permissions=admin_*
+
index 512a520..101aa43 100644 (file)
@@ -563,7 +563,7 @@ sub req_saveuser {
       or return $class->req_showuser($req, "Password and confirmation password don't match");
     $user->{password} = $password;
   }
-  if ($cgi->param('savegperms')) {
+  if ($cgi->param('savegperms') && $req->user_can('admin_user_save_gperms')) {
     my $perms = '';
     my @gperms = $cgi->param('gperms');
     for my $id (@gperms) {
@@ -576,7 +576,7 @@ sub req_saveuser {
   }
   $user->save;
 
-  if ($cgi->param('savegroups') && $req->user_can("admin_save_user_groups")) {
+  if ($cgi->param('savegroups') && $req->user_can("admin_user_save_groups")) {
     require BSE::TB::AdminGroups;
     require BSE::TB::AdminUsers;
     my @group_ids = map $_->{id}, BSE::TB::AdminGroups->all;
@@ -668,7 +668,7 @@ sub req_savegroup {
   }
   $group->save;
 
-  if ($cgi->param('saveusers') && $req->user_can("admin_save_group_users")) {
+  if ($cgi->param('saveusers') && $req->user_can("admin_group_save_users")) {
     require BSE::TB::AdminGroups;
     require BSE::TB::AdminUsers;
     my @member_ids = map $_->{id}, BSE::TB::AdminUsers->all;
index 9953725..5df5ebc 100644 (file)
@@ -37,7 +37,7 @@ sub tie_it {
   # save the new sessionid
     print "Set-Cookie: ",
     CGI::Cookie->new(-name=>'sessionid', -value=>$session->{_session_id}, 
-                    -expires=>$lifetime),"\n";
+                    -expires=>$lifetime, -path=>"/"),"\n";
   }
   $saved = $session;
 }
index d5942c3..241b742 100755 (executable)
@@ -634,7 +634,8 @@ sub purchase {
     return;
   }
 
-  $order{orderDate} = $today;
+  use BSE::Util::SQL qw(now_sqldatetime);
+  $order{orderDate} = now_sqldatetime;
   $order{paymentType} = $paymentType;
   ++$session{changed};
 
index 360999d..34caf68 100644 (file)
@@ -4,158 +4,285 @@ access.pod - access control for administration of BSE
 
 =head1 SYNOPSIS
 
-The implementation of access control for BSE.
+How to configure and enable access control for BSE administration.
 
 =head1 DESCRIPTION
 
+As of release 0.12_13 of BSE, it provides a moderately powerful
+mechanism to control access to various administration functions,
+especially for maintaining content.
+
 The aim is to provide flexible access control, without requiring
 micro-management from the administrators.
 
-Since we want to be control a user's access to specific fields
-(eg. the template and parent fields), rather than having an admin have
-to setup specific access to those fields, we want some sort of "macro"
-mechansim to control several things at once.
+Internally BSE now provides for fairly fine-grained access to editing
+existing articles and creating new articles, hopefully without
+overloading the person who will manage the users and groups.
+
+=head1 BEFORE ENABLING ACCESS CONTROL
+
+Make sure you create users with sufficient access control to maintain
+the system.
+
+At the very least create a user and give them the 
+I<User/Group management> global permission.
+
+=head1 ENABLING ACCESS CONTROL
+
+Once you have at least created a user/groups administrator, set the
+access_control value to 1 in bse.cfg.
+
+Once you've done that you will be prompted for a username and password
+whenever you try to access BSE's administration functions.
+
+=head1 USERS, GROUPS AND PERMISSIONS
+
+All permissions in BSE are positive - the permissions you give a user
+and their groups are combined together so that if the user has a right
+enabled for themselves, for any group they are a member of, or for the
+I<everyone> group, they will have access to the function.
+
+The permissions visible to the user administrator are split into two
+categories:
+
+=over
+
+=item 1.
+
+Global permissions - these apply in general, like access to the order
+list, or to user/group management.  These can also include article
+permissions that have been applied to specific articles, or to subsets
+of the article tree.
+
+=item 2.
+
+Article permissions - these are applied to specific articles by the
+user administrator, and can control the article or all of the children
+of the article, depending on how the permission was setup.
+
+=back
+
+BSE provides default sets of global and article permissions, but you
+can add extrs more specific to your business needs, see L</ADDING NEW
+PERMISSIONS>.
 
-Some possible access macros could be:
+The standard global permissions shipped with BSE are:
 
 =over
 
 =item *
 
-allow editing body and title of an article
+B<Shop admin> - the user has complete access to modify the content in
+the shop
 
 =item *
 
-add an article, with everything fixed, except for title and body
+B<All but shop admin> - the user has complete access to modify
+content, except in the shop
 
 =item *
 
-allow changes to everything but the shop
+B<Subscriptions> - the user can create, modify and send subcriptions
+from the subscriptions manager.
 
 =item *
 
-allow changes only to the shop
+B<Shop Orders> - the user can view the order list, order details and
+mark orders filled.
 
-=back
+=item *
 
-We also need to be able to separately control whole trees, rather than
-just specific articles, so it should be possible to refer to "all
-descendants of article foo".
+B<Users/Group management> - the user can create new users and groups,
+manage group membership, and control the permissions that the users
+and groups have
 
-Possible article permissions:
+=back
+
+The article permissions are:
 
 =over
 
 =item *
 
-add child
+B<Full access> - the user can modify the article and any of it's
+children, and add new children.
 
 =item *
 
-modify
+B<Change body or title> - the user can change the body and title of
+the indicated article.  No other fields can be changed.
 
-=item *
+=back
+
+=head1 ADDING NEW PERMISSIONS
+
+Besides the standard permissions described above, you can add
+permissions more specific to your organizaton by adding entries to a
+few sections in the bse.cfg file.
+
+Each permission has a unique index associated with it.  This must be a
+natural number (0 or a positive whole number).
+
+Each permission has an identifier which is used to choose the
+configuration section that the permission is described in.
+
+Article permissions are listed in the [Article permissions] section,
+and global permission in the [Global permissions] section, with the
+identifer being the key, and the index being the value.  eg.
 
-modify field I<foo>
+  [Global permissions]
+  shop_access = 1
+  all_but_shop = 3
+  subscriptions=4
+  orders=5
+  users_and_groups=6
+
+  [Article permissions]
+  full_access = 0
+  change_body = 2
+
+The identifier for each permission is used to find the description of
+the permission, for an I<identifier> the section would be [permission
+I<identifier>].
+
+For article permissions you can define the following entries in the
+description:
+
+=over
 
 =item *
 
-add image
+brief - the brief description of the permission that is displayed in
+the administration user interface.  Default: the permission identifier.
 
 =item *
 
-reorder children
+help - a longer description of the permission used as the title of the
+help images next to each permission.  Default: empty string.
 
 =item *
 
-delete
+permissions - which low-level permissions are granted by this
+permission.  See L<Describing low-level permissions>.  The permission
+will only be used if this is set.
 
 =item *
 
-delete image
+descendants - if this is set to 1 then the permission also applies to
+the descendants of the article the permission is set on.  Default: 0.
+
+=back
+
+Group permission require only one extra entry:
+
+=over
 
 =item *
 
-change image details
+articles - the articles this permission applies to.  See L<Selecting
+articles for global permissions>.
 
 =back
 
-=head1 MACRO PERMISSIONS
+See the supplied bse.cfg for the definitions of the standard global
+and article permissions.
 
-These would be split into two types of macro permissions, those that
-control specific articles, and those that are applied to an article.
+=head2 Describing low-level permissions
 
-Each macro will need to be described in bse.cfg, and the name of the
-macro assigned an index so that it can be controlled.
+The C<permissions> keyword is a comma separated list of permission
+names, or patterns for permission names.
 
-Since most normal permissions aren't going to be directly useful, the
-only permissions stored in the system will be macro based permissions.
+Typically you will either use explicit permission names, or a base
+name with a wildcard, but it's possible to use more complex matches.
 
-=head2 Attached macros
+Alternatively, the permission can be C<not(>I<permission list>C<)>
+where I<permission list is a comma separated list of permission names
+or patterns.
 
-These name one or more articles and the permissions can be different
-for each article.
+Eg. if you want the permission to give the use access to all edit
+functions for the selected articles you could do:
 
-=head2 Unattached macros
+  permissions=edit_*
 
-These supply a set of permissions to some article specified through
-the administration interface.
+If you want to give the user access to edit and save all field of an
+article:
 
-=head1 GROUPS
+  permissions=edit_field_edit_*,edit_save
 
-To make it simpler to control permissions, each user belongs to one of
-more groups, each of which only supplied positive permissions.
+Alternatively this could be:
 
-Whether or not listed in the group, each user is in the "everyone"
-group.
+  permissions=edit_(field_edit_*|save)
 
-=head1 DEFAULT PERMISSIONS
+but the first is probably clearer.
 
-The everyone group, and the administrator user, both have the macro
-"Full Access" on all descendants of article -1.
+The patterns you can use, are effectively any perl regular expression,
+except that you're limited by the permissions field being split on
+commas, and the translation of '*' to '.*'.  If you don't understand
+this, just use '*' to match anything.
 
+See L<LOW-LEVEL ARTICLE PERMISSIONS> and L<LOW-LEVEL GENERAL
+PERMISSIONS> for descriptions of the permissions themselves.
 
-=head1 MACRO STORAGE
+=head2 Selecting articles for global permissions
 
-To simplify processing we have two sections in the config file:
+The simplest form for the C<articles> value is a list of article ids:
 
-=over
+  articles=3,9
 
-=item *
+You can also match articles that are children of a given article:
 
-[Global permissions] - keeps permissions that have all article
-references resolved
+  articles=childof(3)
 
-=item *
+or a given type of article:
 
-[Article permissions] - permissions which have to reference an article
+  articles=typeof(Product)
 
-=back
+You can also to negate a set of articles:
 
-The [permission ids] section is used to translate permission indexes to
-permission ids.
+  articles=not(child(3),9)
 
-The [permission names] section is used to translate permission indexes
-to descriptive permission names.
+=head1 LOW-LEVEL ARTICLE PERMISSIONS
 
-=head1 PERMISSIONS REFERENCE
+These permissions are applied to specific articles, and depending on
+whether the childof() operator or descendants flag is set, can apply
+to the give article or it's children.
 
 =head2 Article editing
 
+These control adding new articles and modifying the content of
+existing articles.
+
+If you want a "macro" to allow all of the following, add 'edit_*' to
+the permissions keyword.
+
 =over
 
 =item *
 
-edit_add_child
+edit_save
 
-The user can add a child to this article, or reparent an article to
-have this article as a parent.
+The user can save changes to the given article.  The user will also
+need appropriate permissions to modify the fields
+(edit_field_edit_I<fieldname>).
 
 =item *
 
 edit_field_edit_I<fieldname>
 
-The user can edit the given field in an existing article.
+The user can edit the given field in an existing article.  Note that
+the system may prevent editing of some fields even if you give them
+permission, like the title and summary fields of a product that have
+been used in an order.
+
+To give permission to edit any field add 'edit_field_edit_*' to the
+permission description.
+
+=item *
+
+edit_add_child
+
+The user can add a child to this article, or reparent an article to
+have this article as a parent.
 
 =item *
 
@@ -170,63 +297,254 @@ section, or some default value will be used.
 
 =item *
 
+edit_reorder_children
+
+The user can change the order of the children or stepchildren of the
+article.
+
+=item *
+
+edit_reorder_stepparents
+
+The user can change the order of the stepparents of the article.
+
+=back
+
+=head2 Image management
+
+You can control whether a user can add, remove, reorder or change the
+details of the images attached to an article.
+
+There is no control over individual images.
+
+If you want to give users full image control, add 'edit_images_*' to
+the permissions entry.
+
+=over
+
+=item *
+
 edit_images_add
 
+The user can add a new image.
+
+=item *
+
 edit_images_reorder
 
+The order of the images can be changed.
+
+=item *
+
 edit_images_save
 
+The fields for each image (url, alt text) can be changed.
+
+=item *
+
 edit_images_delete
 
+Images can be deleted.
+
+=back
+
+=head2 File management
+
+=over
+
 =item *
 
 edit_files_reorder
 
+The user can change the order of the files for the article(s).
+
+=item *
+
 edit_files_add
 
+The user can add new files to the article(s).
+
+=item *
+
 edit_files_delete
 
+The user can delete files from the article(s).
+
+=item *
+
 edit_files_save
 
+The user can change the details for files from the article(s).
+
+=back
+
+=head2 Regeneration
+
+=over
+
 =item *
 
-edit_reorder_children
+regen_extras
 
-edit_reorder_stepparents
+regen_article
+
+regen_all
+
+=back
+
+=head1 LOW-LEVEL GENERAL PERMISSIONS
+
+These permissions don't apply to specific articles and control
+operations outside of the article tree.  For the permissions to be
+appliedn they should be applied to article "-1" (the site)
+
+=head2 Subscriptions
+
+=over
 
 =item *
 
 subs_add
 
+The user can create new subscriptions.
+
+=item *
+
 subs_edit
 
+The user can edit existing subscriptions.
+
 =item *
 
-regen_extras
+subs_send
 
-regen_article
+The user can send subscriptions
 
-regen_all
+=back
+
+=head2 Shop orders
+
+These permissions provide no control over the content of the shop,
+since that can be controlled through article permissions.
+
+To create a "macro" with access to all order management functions, use
+'shop_order_*'.
+
+=over
 
 =item *
 
 shop_order_list
 
+The user can view the list of orders.
+
+=item *
+
 shop_order_detail
 
+The user can view the details of an order.
+
+=item *
+
 shop_order_filled
 
+The user can mark orders as filled.
+
 =back
 
 =head2 User/Group Administration
 
+This controls whether a the user can manage users and groups.
+
+Typically you will just want to add 'admin_*' to the permissions key
+for the macro.
+
+These permissions assume a bit of foresight on the user - ie. that
+they won't delete the permissions they need to do their job.
+
 =over
 
 =item *
 
-admin_*
+admin_user_add
+
+The user can create new users.
+
+=item *
+
+admin_user_save
+
+The user can save changes to existing users.
+
+=item *
+
+admin_group_save_gperms
+
+The user can set global permissions for users.
+
+=item *
+
+admin_user_save_groups
+
+The user can save changes to the group membership of users.
+
+=item *
+
+admin_user_save_artrights
+
+The user can save article rights for users.
+
+=item *
+
+admin_user_del
+
+The user can delete users.
+
+=item *
+
+admin_group_add
+
+The user can create groups.
+
+=item *
+
+admin_group_save
+
+The user can save changes to groups.
+
+=item *
+
+admin_group_save_gperms
+
+The user can save global permissions for groups.
+
+=item *
+
+admin_group_save_users
+
+The user can save the membership for groups.
+
+=item *
+
+admin_group_save_artrights
+
+The user can save article rights for groups.
+
+=item *
+
+admin_group_del
+
+The user can delete groups.
 
 =back
 
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 REVISION
+
+$Revision$
+
 =cut
 
index df00dad..bcdbbe1 100644 (file)
@@ -10,6 +10,44 @@ Maybe I'll add some other bits here.
 
 =head1 CHANGES
 
+=head2 0.12_14
+
+=over
+
+=item *
+
+product_detail.tmpl hadn't been converted to use the global money tag
+
+=item *
+
+different versions of CGI::Cookie use different default paths, we now
+force a path of "/".
+
+=item *
+
+really store the date and _time_ in the order date.
+
+=item *
+
+if the system needs you to logon for checkout, it now supplies the
+correct parameter to the logon code to return you to the checkout
+after you logon.
+
+=item *
+
+when setting configuration values from test.cfg with the:
+
+I<section>.I<key> = I<value>
+
+syntax, I<section> can now have spaces in it.
+
+=item *
+
+added some basic permission descriptions, and documentation on the
+permissions system
+
+=back
+
 =head2 0.12_13
 
 =over
index 2838b75..1e0f672 100644 (file)
@@ -101,6 +101,16 @@ href="/cgi-bin/admin/add.pl?parentid=3">Add catalog</a></td>
     <td colspan="2"><a 
 href="/cgi-bin/admin/subs.pl">Subscriptions administration</a></td>
  
+</tr>
+  <tr> 
+    <td width="15">&nbsp;</td>
+    <td>&nbsp;</td>
+</tr>
+  <tr> 
+    <td colspan="2"><a 
+href="/cgi-bin/admin/adminusers.pl">User/Group administration</a></td>
 </tr>
   <tr> 
     <td width="15">&nbsp;</td>
index 0687f9c..84de3ec 100644 (file)
         </tr>
         <tr> 
           <th align="left" nowrap bgcolor="#FFFFFF">Retail price:</th>
-          <td bgcolor="#FFFFFF" width="100%">$<:money retailPrice:></td>
+          <td bgcolor="#FFFFFF" width="100%">$<:money product retailPrice:></td>
         </tr>
         <tr> 
           <th align="left" nowrap bgcolor="#FFFFFF">Wholesale price:</th>
-          <td bgcolor="#FFFFFF" width="100%">$<:money wholesalePrice:></td>
+          <td bgcolor="#FFFFFF" width="100%">$<:money product wholesalePrice:></td>
         </tr>
         <tr> 
           <th align="left" nowrap bgcolor="#FFFFFF">GST:</th>
-          <td bgcolor="#FFFFFF" width="100%">$<:money gst:></td>
+          <td bgcolor="#FFFFFF" width="100%">$<:money product gst:></td>
         </tr>
         <tr> 
           <th align="left" nowrap bgcolor="#FFFFFF">Release date:</th>
index bfdd3e6..42d990f 100644 (file)
@@ -126,7 +126,33 @@ function BSE_validateForm {
     <td></td>
   </tr>
 </table>
-<p>&nbsp;</p>
+<script language="JavaScript">
+<!--
+// extract the userid cookie, if any, and either present a logon form,
+// or a logoff button
+var cookies = document.cookie;
+var start = cookies.indexOf("userid=");
+var userid = '';
+if (start != -1) {
+  start += 7;
+  var end = cookies.indexOf(';', start);
+  if (end == -1) end = cookies.length;
+  userid = cookies.substring(start, end);
+}
+if (userid != '') {
+    document.write('<p>&nbsp;</p>');
+}
+else {
+    document.write('<br>');
+    document.write('<table bgcolor="#EEEEEE" border="0" cellspacing="0" cellpadding="10" width="100%">');
+    document.write('<tr>');
+    document.write('  <td> <font face="Verdana, Arial, Helvetica, sans-serif" size="2">If you wish to track the status of your order you must either <a href="/cgi-bin/user.pl?show_register=1&r=/cgi-bin/shop.pl?checkout=1"><b>Register</b></a> or <a href="/cgi-bin/user.pl?show_logon=1&r=/cgi-bin/shop.pl?checkout=1"><b>Logon</b></a> before you continue with this purchase.</font></td>');
+    document.write('</tr>');
+    document.write('</table>');
+    document.write('<br>');
+}
+//-->
+</script>
 <form action="/cgi-bin/shop.pl" method="POST" onSubmit="BSE_validateForm();return document.MM_returnValue">
   <font face="Verdana, Arial, Helvetica, sans-serif" size="3"> <b>Shipping Details:</b></font> 
   <hr noshade size="1">
index 91462e2..12f9083 100644 (file)
@@ -67,12 +67,12 @@ Embedded:> <br>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:file 
             description:></font></td>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:if 
-            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"> 
+            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"> 
             <:file displayName:></a><:eif File:></font></td>
           <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:kb 
             file sizeInBytes:></font></td>
           <td nowrap align="center"> <:if 
-            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
+            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
         </tr>
         <:iterator end files:> 
       </table>
index 68c91e3..041b9d4 100644 (file)
@@ -75,12 +75,12 @@ Stepparents:>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:file 
             description:></font></td>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:if 
-            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"> 
+            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"> 
             <:file displayName:></a><:eif File:></font></td>
           <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:kb 
             file sizeInBytes:></font></td>
           <td nowrap align="center"> <:if 
-            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
+            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
         </tr>
         <:iterator end files:> 
       </table>
index d3b6f1d..2aa0c9d 100644 (file)
@@ -91,12 +91,12 @@ Stepparents:>
           <td bgcolor="#FFFFFF" width="70%"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:file 
             description:></font></td>
           <td bgcolor="#FFFFFF" width="30%"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:if 
-            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"> 
+            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"> 
             <:file displayName:></a><:eif File:></font></td>
           <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:kb 
             file sizeInBytes:></font></td>
           <td nowrap align="center"> <:if 
-            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
+            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
         </tr>
         <:iterator end files:> 
       </table>
index 007d17e..c928aa9 100644 (file)
@@ -129,12 +129,12 @@ Embedded:><:if Files:> <br>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:file 
             description:></font></td>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:if 
-            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"> 
+            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"> 
             <:file displayName:></a><:eif File:></font></td>
           <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:kb 
             file sizeInBytes:></font></td>
           <td nowrap align="center"> <:if 
-            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
+            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
         </tr>
         <:iterator end files:> 
       </table>
index 315d0bf..77292e9 100644 (file)
@@ -128,12 +128,12 @@ Embedded:><:if Files:> <br>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:file 
             description:></font></td>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:if 
-            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"> 
+            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"> 
             <:file displayName:></a><:eif File:></font></td>
           <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:kb 
             file sizeInBytes:></font></td>
           <td nowrap align="center"> <:if 
-            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
+            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
         </tr>
         <:iterator end files:> 
       </table>
index e0f7e5f..f6c6fda 100644 (file)
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:file 
             description:></font></td>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:if 
-            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"> 
+            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"> 
             <:file displayName:></a><:eif File:></font></td>
           <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:kb 
             file sizeInBytes:></font></td>
           <td nowrap align="center"> <:if 
-            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
+            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:if Embedded:><:url parent:><:or Embedded:><:url article:><:eif Embedded:><:or:><:eif:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
         </tr>
         <:iterator end files:> 
       </table>
index 4151d53..b81e6e3 100644 (file)
 </table>
   <:or Options:><:eif Options:>
   <:ifProduct leadTime:> 
-   <p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="-2" color="#FE7F00">Usually ships in: <:product leadTime:> <:if Eq [product leadTime] "1":>day<:or Eq:>days<:eif Eq:></font></b>
-</p><:or:><br><:eif:>
+   
+  <p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="-2" color="#FE7F00">Usually ships in:</font><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"> <:product leadTime:> <:if Eq [product leadTime] "1":>day<:or Eq:>days<:eif Eq:></font></b>
+</p>
+  <:or:><br><:eif:>
 
 <table border="0" cellspacing="0" cellpadding="0">
     <tr valign="middle" align="center"> 
@@ -129,12 +131,12 @@ Product:>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:file 
             description:></font></td>
           <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:if 
-            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"> 
+            File forSale:><:file displayName:><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:url article:><:or:><:eif:>"> 
             <:file displayName:></a><:eif File:></font></td>
           <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:kb 
             file sizeInBytes:></font></td>
           <td nowrap align="center"> <:if 
-            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
+            File forSale:><img src="/images/filestatus/locked.gif" width="15" height="15" alt="Locked" title="Locked"><img src="/images/filestatus/forSale.gif" width="15" height="15" alt="File must be purchased" title="File must be purchased"><:or File:><a href="/cgi-bin/user.pl?download_file=1&file=<:file id:><:ifFile requireUser:>&r=<:url article:><:or:><:eif:>"><img src="/images/filestatus/download.gif" width="15" height="15" alt="Download now" title="Download now" border="0"></a><:ifFile requireUser:><img src="/images/filestatus/requireUser.gif" width="15" height="15" alt="For registered users only" title="For registered users only"><:or:><img src="/images/trans_pixel.gif" width="15" height="15" title="For registered users only"><:eif:><:eif File:></td>
         </tr>
         <:iterator end files:> 
       </table>