the link[] body text tag can now be configured to redirect via a
authorTony Cook <tony@develop-help.com>
Fri, 20 Apr 2007 05:06:36 +0000 (05:06 +0000)
committertony <tony@45cb6cf1-00bc-42d2-bb5a-07f51df49f94>
Fri, 20 Apr 2007 05:06:36 +0000 (05:06 +0000)
disclaimer page.  See [html].redirect_links in L<config.pod>.

13 files changed:
MANIFEST
Makefile
site/cgi-bin/admin/admin.pl
site/cgi-bin/bse.cfg
site/cgi-bin/modules/BSE/Formatter.pm
site/cgi-bin/modules/BSE/UI/Dispatch.pm
site/cgi-bin/modules/BSE/UI/Redirect.pm [new file with mode: 0644]
site/cgi-bin/modules/DevHelp/Formatter.pm
site/cgi-bin/nuser.pl
site/docs/bse.pod
site/docs/config.pod
site/templates/user/base_redirect.tmpl [new file with mode: 0644]
test.cfg

index 0d9fd66..4cd6098 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -139,6 +139,7 @@ site/cgi-bin/modules/BSE/UI/Formmail.pm
 site/cgi-bin/modules/BSE/UI/Image.pm
 site/cgi-bin/modules/BSE/UI/NUser.pm
 site/cgi-bin/modules/BSE/UI/Page.pm
+site/cgi-bin/modules/BSE/UI/Redirect.pm
 site/cgi-bin/modules/BSE/UI/Shop.pm
 site/cgi-bin/modules/BSE/UI/SiteuserCommon.pm
 site/cgi-bin/modules/BSE/UI/SiteUserUpdate.pm
@@ -470,6 +471,7 @@ site/templates/user/base_bookseminar.tmpl
 site/templates/user/base_cancelbooking.tmpl
 site/templates/user/base_editbooking.tmpl
 site/templates/user/base_orderdetail.tmpl
+site/templates/user/base_redirect.tmpl
 site/templates/user/blacklistdone_base.tmpl
 site/templates/user/cantunsub_base.tmpl
 site/templates/user/confirmed_base.tmpl
index 2ea5d13..8dc3e99 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,7 @@ dist: cleantree $(DISTTGZ)
        cp $(DISTTGZ) $(WEBBASE)/dists/
        cp site/docs/bse.html $(WEBBASE)/relnotes/bse-$(VERSION).html
        cp site/docs/*.html $(WEBBASE)/docs
-       cvs tag r`echo $(VERSION) | tr . _`
+       svn cp . http://svn.develop-help.com/devsvn/bse/tags/bse-$(VERSION)
 
 # make sure everything is committed
 cleantree:
@@ -26,10 +26,7 @@ cleantree:
          then echo '***' The debugger is still enabled ; \
          exit 1; \
        fi
-       if cvs status 2>/dev/null | grep -q '^\?\|Locally Modified' ; \
-          then echo '***' The tree has modified or unadded files ; \
-          exit 1 ; \
-        fi
+       test -z "`svn status`" || ( echo "Uncommitted files in the tree"; exit 1 )
 
 archive: $(DISTTGZ)
 
index 4b0af31..69f8f1c 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -w
 # -d:ptkdb
-#BEGIN { $ENV{DISPLAY} = '192.168.32.15:0.0' }
+#BEGIN { $ENV{DISPLAY} = '192.168.32.245:0.0' }
 use strict;
 use FindBin;
 use CGI::Carp 'fatalsToBrowser';
index 8fb4dad..189bc86 100644 (file)
@@ -47,6 +47,7 @@ user/userpage.tmpl = user,user/userpage_base.tmpl
 user/bookseminar.tmpl = user,user/base_bookseminar.tmpl
 user/bookconfirm.tmpl = user,user/base_bookconfirm.tmpl
 user/bookcomplete.tmpl = user,user/base_bookcomplete.tmpl
+user/redirect.tmpl = user,user/base_redirect.tmpl
 interest/confirm.tmpl = interest,interest/confirm_base.tmpl
 interest/askagain.tmpl = interest,interest/askagain_base.tmpl
 interest/error.tmpl = interest,interest/error_base.tmpl
@@ -365,6 +366,7 @@ includes=inline:<script type="text/javascript" src="/js/prototype.js"></script>
 
 [nuser controllers]
 user=BSE::UI::User
+redirect=BSE::UI::Redirect
 
 [includes]
 00bsecfg_d=bsecfg_d/
index 1b4e0f3..27d7285 100644 (file)
@@ -2,6 +2,7 @@ package BSE::Formatter;
 use strict;
 use DevHelp::HTML;
 use Carp 'confess';
+use Digest::MD5 qw(md5_hex);
 
 use base 'DevHelp::Formatter';
 
@@ -39,6 +40,9 @@ sub new {
     $self->{msentify} = 1;
   }
 
+  $self->{redirect_links} = $cfg->entry('html', 'redirect_links', '');
+  $self->{redirect_salt} = $cfg->entry('html', 'redirect_salt', '');
+
   $self;
 }
 
@@ -125,6 +129,33 @@ sub embed {
                           $templateid, $maxdepth, $self->{templater});
 }
 
+sub link {
+  my ($self, $url, $text) = @_;
+
+  if ($self->{redirect_links} =~ /[^\W\d]/) {
+    my $noredir_types = join '|', map quotemeta, split /,/, $self->{redirect_links};
+    if ($url =~ /^($noredir_types):/) {
+      return $self->SUPER::link($url, $text);
+    }
+  }
+  elsif (!$self->{redirect_links} || $url =~ /^mailto:/) {
+    return $self->SUPER::link($url, $text);
+  }
+
+  # formatter converted & to &amp; but we want them as & so they undergo
+  # uri conversion correctly
+  $url = unescape_html($url);
+  my $redir_hash = substr(md5_hex($url, $text, $self->{redirect_salt}), 0, 16);
+
+  my $new_url = '/cgi-bin/nuser.pl/redirect?url='
+    . escape_uri($url) . "&amp;h=$redir_hash";
+  if ($url ne $text) {
+    $new_url .= '&amp;t=' . escape_uri($text);
+  }
+
+  return $self->SUPER::link($new_url, $text);
+}
+
 sub _get_article {
   my ($self, $id, $error) = @_;
 
index 6eeeb0d..fd8c853 100644 (file)
@@ -22,7 +22,8 @@ sub dispatch {
   my $action;
   if (ref $self) {
     $action = $self->action;
-    $actions->{$action} or undef $action;
+    defined $action && $actions->{$action} 
+      or undef $action;
   }
   unless ($action) {
     for my $check (keys %$actions) {
diff --git a/site/cgi-bin/modules/BSE/UI/Redirect.pm b/site/cgi-bin/modules/BSE/UI/Redirect.pm
new file mode 100644 (file)
index 0000000..2742768
--- /dev/null
@@ -0,0 +1,41 @@
+package BSE::UI::Redirect;
+use strict;
+use base qw(BSE::UI::Dispatch);
+use Digest::MD5 qw(md5_hex);
+use DevHelp::HTML;
+
+my %actions =
+  (
+   redir => 1
+  );
+
+sub actions { \%actions };
+
+sub default_action { 'redir' }
+
+sub req_redir {
+  my ($self, $req) = @_;
+
+  my $cgi = $req->cgi;
+  my $url = $cgi->param('url')
+    or return $self->error($req, "No url supplied");
+  my $text = $cgi->param('t') || $url;
+  my $hash = $cgi->param('h')
+    or return $self->error($req, "No hash supplied");
+  my $salt = $req->cfg->entry('html', 'redirect_salt', '');
+  my $gen_hash = substr(md5_hex($url, $text, $salt), 0, 16);
+
+  $hash eq $gen_hash
+    or return $self->error($req, "Invalid hash supplied");
+
+  my %acts =
+    (
+     $req->dyn_user_tags(),
+     url => escape_html($url),
+     text => escape_html($text),
+    );
+
+  return $req->dyn_response('user/redirect', \%acts);
+}
+
+1;
index 3705563..0df49ed 100644 (file)
@@ -157,6 +157,12 @@ sub _fix_spanned {
   "$start$text$end";
 }
 
+sub link {
+  my ($self, $url, $text) = @_;
+
+  $self->_fix_spanned(qq/<a href="$url">/, "</a>", $text, 'link')
+}
+
 sub replace_char {
   my ($self, $rpart) = @_;
   $$rpart =~ s#(acronym|abbr|dfn)\[([^|\]\[]+)\|([^\]\[]+)\|([^\]\[]+)\]#
@@ -190,10 +196,10 @@ sub replace_char {
     $self->_fix_spanned(qq/<a href="$1" target="_blank">/, "</a>", $1, 'poplink')#ieg
     and return 1;
   $$rpart =~ s#link\[([^|\]\[]+)\|([^\]\[]+)\]#
-    $self->_fix_spanned(qq/<a href="$1">/, "</a>", $2, 'link')#eig
+    $self->link($1, $2)#eig
     and return 1;
   $$rpart =~ s#link\[([^|\]\[]+)\]#
-    $self->_fix_spanned(qq/<a href="$1">/, "</a>", $1, 'link')#ieg
+    $self->link($1, $1)#ieg
     and return 1;
   $$rpart =~ s#font\[([^|\]\[]+)\|([^\]\[]+)\]#
     $self->_fix_spanned(qq/<font size="$1">/, "</font>", $2)#egi
index 5b14f67..ee9e029 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -w
 # -d:ptkdb
-BEGIN { $ENV{DISPLAY} = '192.168.32.50:0.0' }
+BEGIN { $ENV{DISPLAY} = '192.168.32.245:0.0' }
 use strict;
 use FindBin;
 use lib "$FindBin::Bin/modules";
index 3c12813..6ef9008 100644 (file)
@@ -27,6 +27,11 @@ by itself, there must be an actual image tag replaced.
 
 the capitalize tag now lowercases anything it doesn't uppercase
 
+=item *
+
+the link[] body text tag can now be configured to redirect via a
+disclaimer page.  See [html].redirect_links in L<config.pod>.
+
 =back
 
 =head2 0.15_55
index b302fb9..d4e4a65 100644 (file)
@@ -176,6 +176,23 @@ The value of the charset keyword when outputting HTML from a script.
 Set to the empty string to suppress the charset keyword.  Default:
 iso-8859-1.
 
+=item redirect_links
+
+If this is a non-zero number, then all but mailto links are redirected
+to C<nuser.pl/redirect> so you can display a diclaimer.  If this
+contained alphabetics it's treated as a comma separated list of url
+schemes that should be handled via C<nuser.pl/redirect>.  If 0 or not
+present, no redirection is done.
+
+The redirect URL includes a hash of the url, title and the redirect
+salt to prevent using this mechanism by external sites for cookie
+stealing attacks.
+
+=item redirect_salt
+
+The salt used in generating the has for redirect_links.  Default: an
+empty string.
+
 =back
 
 =head2 [basic]
diff --git a/site/templates/user/base_redirect.tmpl b/site/templates/user/base_redirect.tmpl
new file mode 100644 (file)
index 0000000..63544fa
--- /dev/null
@@ -0,0 +1,7 @@
+<:wrap base.tmpl:>
+
+<p align="center">You're leaving our site, anything you see from now
+on is somebody else's problem.<p>
+
+<p align="center"><a href="<:url:>"><:text:></a></p>
+
index 8645c79..bf214f7 100644 (file)
--- a/test.cfg
+++ b/test.cfg
@@ -2,7 +2,7 @@
 base_url = http://bsetest.develop-help.com
 securl = http://bsetestshop.develop-help.com
 # where to install the site
-base_dir = /var/www/httpd/bsetest
+base_dir = /home/httpd/bsetest
 # the database user/password/dsn
 dbuser = bsetest
 dbpass = bsetest
@@ -253,6 +253,7 @@ admin group template sets.test=Test Templates
 html.msentify=1
 #html.ajaxcharset=1
 html.mbcs=1
+html.redirect_links=1
 debug.convert_charset=1
 html.charset=windows-1252