Author: CrawfordCurrie Date: 2007-11-02 12:59:54 -0500 (Fri, 02 Nov 2007) New Revision: 15463 Modified: twiki/branches/MAIN/twikiplugins/MailerContrib/data/TWiki/MailerContrib.txt twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Change.pm twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Config.spec twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Subscriber.pm twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/WebNotify.pm twiki/branches/MAIN/twikiplugins/MailerContrib/templates/mailnotify.tmpl twiki/branches/MAIN/twikiplugins/MailerContrib/test/unit/MailerContrib/MailerContribSuite.pm Log: Item4818: added quotes to support non-alphabetic and other wierd group names Item4887: corrected minor rendering error Item4917: removed dependence on symbolic web names Modified: twiki/branches/MAIN/twikiplugins/MailerContrib/data/TWiki/MailerContrib.txt =================================================================== --- twiki/branches/MAIN/twikiplugins/MailerContrib/data/TWiki/MailerContrib.txt 2007-11-02 09:25:28 UTC (rev 15462) +++ twiki/branches/MAIN/twikiplugins/MailerContrib/data/TWiki/MailerContrib.txt 2007-11-02 17:59:54 UTC (rev 15463) @@ -33,15 +33,17 @@ Each web can optionally contain a topic called <nop>%NOTIFYTOPIC%. <!-- Included by %SYSTEMWEB%.WebChangesAlert --> %STARTINCLUDE% -Users subscribe to email notifications using their %SYSTEMWEB%.WikiName or an alternative email address, and can specify the webs/topics they wish to track using one of these bullet list formats: +Users subscribe to email notifications using their %SYSTEMWEB%.WikiName or an alternative email address, and can specify the webs/topics they wish to track, WWhole groups of users can also be subscribed for notification. -_three spaces_ * [ _webname_ . ] _wikiName_ - _SMTP mail address_ <br /> -_three spaces_ * [ _webName_ . ] _wikiName_ <br /> -_three spaces_ * _SMTP mail address_ <br /> -_three spaces_ * _SMTP mail address_ : _topics_ <br /> -_three spaces_ * [ _webname_ . ] _wikiName_ : _topics_ +The general format of a subscription is: -In the above, _topics_ is a space-separated list of topics: +_three spaces_ =*= _subscriber_ [ =:= _topics_ ] + +Where _subscriber_ can be a %SYSTEMWEB%.WikiName, an E-mail address, or a +group name. If _subscriber_ contains any characters that are not legal in +an email address, then it must be enclosed in 'single' or "double" quotes. + +_topics_ is an optional space-separated list of topics: * ... *without* a _Web._ prefix * ...that exist in this web. Users may further customize the specific content they will receive using the following controls: @@ -57,7 +59,7 @@ </verbatim> Subscribe Daisy to all changes to topics that start with =Web=. <verbatim> - * dai...@fl...: Web* + * dai...@fl... : Web* </verbatim> Subscribe Daisy to changes to topics starting with =Petal=, and their immediate children, !WeedKillers and children to a depth of 3, and all topics that match start with =Pretty= and end with =Flowers= e.g. =PrettyPinkFlowers= <verbatim> @@ -80,9 +82,14 @@ * GardenGroup: AllNewsLetters? (3) * pe...@fl...: - ManureNewsLetter </verbatim> +Subscribe =IT:admins= (a non-TWiki group defined by an alternate user mapping) to all changes to Web* topics. +<verbatim> + * 'IT:admins' : Web* +</verbatim> + A user may be listed many times in the <nop>%NOTIFYTOPIC% topic. Where a user has several lines in <nop>%NOTIFYTOPIC% that all match the same topic, they will only be notified about _changes_ that topic _once_ (though they will still receive individual mails for news topics). -If a _TWiki group_ is listed for notification, the group will be recursively expanded to the e-mail addresses of all members. +If a _group_ is listed for notification, the group will be recursively expanded to the e-mail addresses of all members. __%X% Warning: Because an email address is not linked to a user name, there is no way for TWiki to check access controls for email addresses. A user identified by an email address will only be sent change notifications if the topic they are asubscribed to is readable by guest users. You can limit what email addresses can be used in <nop>%NOTIFYTOPIC%, or even block use of emails altogther, using the ={MailerContrib}{EmailFilterIn} setting in =configure=. @@ -157,6 +164,7 @@ | License: | GPL | | Version: | %$VERSION% | | Change History: | | +| 2 Nov 2007 | Bugs:Item4818: added quotes to support non-alphabetic and other wierd group names Bugs:Item4887: corrected minor rendering error Bugs:Item4917: removed dependence on symbolic web names | | 9 Sep 2007 | Bugs:Item4326 workaround for possible error in !WebNotify API in old releases, Should not affect most users. | | 6 Sep 2007 | Bugs:Item4488 doc tweaks | | 14550 | Bugs:Item4461 - 'Changed' link now points to most recent changes, not the entire history | Modified: twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Change.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Change.pm 2007-11-02 09:25:28 UTC (rev 15462) +++ twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Change.pm 2007-11-02 17:59:54 UTC (rev 15463) @@ -169,18 +169,13 @@ $this->{TEXT_SUMMARY} = $s; } - # URL-encode topic names for use of I18N topic names in plain text - my $scriptUrl = - $this->{SESSION}->getScriptUrl( - 1, 'view', - URI::Escape::uri_escape( $this->{WEB} ), - URI::Escape::uri_escape( $this->{TOPIC})); my $tim = TWiki::Time::formatTime( $this->{TIME} ); - $template =~ s/%TOPICNAME%/$this->{TOPIC}/g; $template =~ s/%AUTHOR%/$this->{AUTHOR}/g; $template =~ s/%TIME%/$tim/g; $template =~ s/%CUR_REV%/$this->{CURR_REV}/g; $template =~ s/%BASE_REV%/$this->{BASE_REV}/g; + $template =~ s/%TOPICNAME%/$this->{TOPIC}/g; # deprecated DO NOT USE! + $template =~ s/%TOPIC%/$this->{TOPIC}/g; my $frev = ''; if( $this->{CURR_REV} ) { if( $this->{CURR_REV} > 1 ) { @@ -192,7 +187,11 @@ } } $template =~ s/%REVISION%/$frev/g; - $template =~ s/%URL%/$scriptUrl/g; + + # URL-encode topic names for use of I18N topic names in plain text + # DEPRECATED! DO NOT USE! + $template =~ s#%URL%#%SCRIPTURL{view}%/%ENCODE{%WEB%}%/%ENCODE{%TOPIC%}%#g; + $template =~ s/%TEXTHEAD%/$this->{TEXT_SUMMARY}/g; return $template; } Modified: twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Config.spec =================================================================== --- twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Config.spec 2007-11-02 09:25:28 UTC (rev 15462) +++ twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Config.spec 2007-11-02 17:59:54 UTC (rev 15463) @@ -1,11 +1,12 @@ # ---+ Mailer Contrib # Settings for the mailer that sends out topic change notifications. -# **REGEX EXPERT** +# **REGEX** # Define the regular expression that an email address entered in WebNotify # must match to be identified as a legal email by the notifier. You can use # this expression to - for example - filter email addresses on your company # domain, or even block use of raw emails in WebNotify altogether (just make # it something that will never match, e.g. ='^notAnEmail$'=). # If this is not defined, then the default setting of -# ='([A-Za-z0-9.+-_]+\@[A-Za-z0-9.-]+)'= is used. +# =[A-Za-z0-9.+-_]+\@[A-Za-z0-9.-]+= is used. $TWiki::cfg{MailerContrib}{EmailFilterIn} = ''; + Modified: twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Subscriber.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Subscriber.pm 2007-11-02 09:25:28 UTC (rev 15462) +++ twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/Subscriber.pm 2007-11-02 17:59:54 UTC (rev 15463) @@ -237,7 +237,11 @@ @{$this->{unsubscriptions}} ); $unsubs = " - $unsubs" if $unsubs; - return " * " . $this->{name} . ": " . + my $name = $this->{name}; + if ($name !~ /^($TWiki::regex{wikiWordRegex}|$TWiki::cfg{MailerContrib}{EmailFilterIn})$/) { + $name = $name =~ /'/ ? '"'.$name.'"' : "'$name'"; + } + return " * " . $name . ": " . $subs . $unsubs; } Modified: twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/WebNotify.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/WebNotify.pm 2007-11-02 09:25:28 UTC (rev 15462) +++ twiki/branches/MAIN/twikiplugins/MailerContrib/lib/TWiki/Contrib/MailerContrib/WebNotify.pm 2007-11-02 17:59:54 UTC (rev 15463) @@ -38,7 +38,7 @@ =pod ----++ new($session, $web, $topic) +---++ new($session, $web, $topic, %options) * =$session= - TWiki object * =$web= - web name * =$topic= - topic name @@ -127,7 +127,7 @@ * =$topics= - wildcard expression giving topics to subscribe to * =$depth= - Child depth to scan (default 0) * =$mode= - ! if this is a non-changes subscription and the topics should - be mailed evebn if there are no changes. ? to mail the full topic only + be mailed even if there are no changes. ? to mail the full topic only if there are changes. undef to mail changes only. Add a subscription, adding the subscriber if necessary. @@ -227,7 +227,7 @@ } } } else { - $this->_emailWarn($subscriber,$name,$web); + $this->_emailWarn($subscriber,$name,$web); } } } @@ -286,47 +286,33 @@ $this->{meta} = $meta; # join \ terminated lines $text =~ s/\\\r?\n//gs; - my $webRE = qr/$TWiki::cfg{UsersWebName}\.|%(?:USERS|MAIN)WEB%\./o; - foreach my $line ( split ( /\r?\n/, $text )) { - if ( $line =~ /^\s+\*\s$webRE?($TWiki::regex{wikiWordRegex})\s+\-\s+($TWiki::cfg{MailerContrib}{EmailFilterIn})/ ) { - # * Main.WikiName - email@domain - # * %USERSWEB%.WikiName - email@domain - if ( $1 ne $TWiki::cfg{DefaultUserWikiName} ) { - # Add email address to list if non-guest and non-duplicate - $this->subscribe( $2, '*', 0 ); - } + my $webRE = qr/(?:$TWiki::cfg{UsersWebName}\.)?/o; + foreach my $baseline ( split ( /\r?\n/, $text )) { + my $line = TWiki::Func::expandCommonVariables( + $baseline, $this->{topic}, $this->{web}, $meta); + if( $line =~ /^\s+\*\s$webRE($TWiki::regex{wikiWordRegex})\s+\-\s+($TWiki::cfg{MailerContrib}{EmailFilterIn})/o + && $1 ne $TWiki::cfg{DefaultUserWikiName}) { + # Main.WikiName - email@domain (legacy format) + $this->subscribe( $2, '*', 0 ); $in_pre = 0; } - elsif ( $line =~ /^\s+\*\s$webRE?($TWiki::regex{wikiWordRegex})\s*$/o ) { - # * Main.WikiName - # %USERSWEB%.WikiName - # WikiName - $this->subscribe($1, '*', 0 ); - $in_pre = 0; - } - elsif ( $line =~ /^\s+\*\s($TWiki::cfg{MailerContrib}{EmailFilterIn})\s*$/ ) { - # * email@domain - $this->subscribe($1, '*', 0 ); - $in_pre = 0; - } - elsif ( $line =~ /^\s+\*\s($TWiki::cfg{MailerContrib}{EmailFilterIn})\s*:(.*)$/ ) { - # * email@domain: topics - $this->_parsePages( $1, $2 ); - $in_pre = 0; - } - elsif ( $line =~ /^\s+\*\s$webRE?([$TWiki::regex{mixedAlphaNum}]+)\s*:(.*)$/o ) { - # * Main.WikiName: topics - # * %USERSWEB%.WikiName: topics - if ( $2 ne $TWiki::cfg{DefaultUserWikiName} ) { - $this->_parsePages( $1, $2 ); + elsif ( $line =~ /^\s+\*\s$webRE($TWiki::regex{wikiWordRegex}|'.*?'|".*?"|$TWiki::cfg{MailerContrib}{EmailFilterIn})\s*(:(.*))?$/o + && $1 ne $TWiki::cfg{DefaultUserWikiName}) { + my $subscriber = $1; + my $topics = $3; + $subscriber =~ s/^(['"])(.*)\1$/$2/; + if (defined($topics) && $topics) { + $this->_parsePages( $subscriber, $topics ); + } else { + $this->subscribe($subscriber, '*', 0 ); } $in_pre = 0; } else { if( $in_pre ) { - $this->{pretext} .= "$line\n"; + $this->{pretext} .= "$baseline\n"; } else { - $this->{posttext} .= "$line\n"; + $this->{posttext} .= "$baseline\n"; } } } @@ -351,16 +337,18 @@ } } -# PRIVATE emailWarn to warn when an email address cannot be found for a subscriber. +# PRIVATE emailWarn to warn when an email address cannot be found +# for a subscriber. sub _emailWarn { - my ($this, $subscriber, $name, $web) = @_; + my ($this, $subscriber, $name, $web) = @_; - # Make sure we only warn once. Don't want to see this for every Topic we are notifying on. - unless(defined $this->{'nomail'}{$name}) { - $this->{'nomail'}{$name} = 1; - print STDERR "WARNING: Failed to find email for ". - $subscriber->stringify()." monitoring $web\n"; - } + # Make sure we only warn once. Don't want to see this for every + # Topic we are notifying on. + unless (defined $this->{nomail}{$name}) { + $this->{nomail}{$name} = 1; + print STDERR "WARNING: Failed to find permitted email for '". + $subscriber->stringify()."' when processing web '$web'\n"; + } } 1; Modified: twiki/branches/MAIN/twikiplugins/MailerContrib/templates/mailnotify.tmpl =================================================================== --- twiki/branches/MAIN/twikiplugins/MailerContrib/templates/mailnotify.tmpl 2007-11-02 09:25:28 UTC (rev 15462) +++ twiki/branches/MAIN/twikiplugins/MailerContrib/templates/mailnotify.tmpl 2007-11-02 17:59:54 UTC (rev 15463) @@ -22,9 +22,9 @@ -------------------------------- %TMPL:DEF{HTML:middle}%<tr> <td width="50%"> - <a href="%SCRIPTURL{"view"}%/%WEB%/%TOPICNAME%"><b>%TOPICNAME%</b></a> + <a href="%SCRIPTURL{"view"}%/%WEB%/%TOPIC%"><b>%TOPIC%</b></a> </td><td width="30%"> - <a href="%SCRIPTURL{"rdiff"}%/%WEB%/%TOPICNAME%?rev1=%BASE_REV%&rev2=%CUR_REV%" rel='nofollow'>%TIME%</a> - %REVISION% + <a href="%SCRIPTURL{"rdiff"}%/%WEB%/%TOPIC%?rev1=%BASE_REV%&rev2=%CUR_REV%" rel='nofollow'>%TIME%</a> - %REVISION% </td><td width="20%"> %AUTHOR% </td> @@ -50,8 +50,8 @@ -------------------------------- %TMPL:DEF{PLAIN:before}%%TMPL:END% -------------------------------- -%TMPL:DEF{PLAIN:middle}%- %TOPICNAME% (%AUTHOR%, %TIME%) %REVISION% -%URL% +%TMPL:DEF{PLAIN:middle}%- %TOPIC% (%AUTHOR%, %TIME%) %REVISION% +%SCRIPTURL{"view"}%/%ENCODE{%WEB%}%/%ENCODE{%TOPIC%}% %TMPL:END% -------------------------------- Modified: twiki/branches/MAIN/twikiplugins/MailerContrib/test/unit/MailerContrib/MailerContribSuite.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/MailerContrib/test/unit/MailerContrib/MailerContribSuite.pm 2007-11-02 09:25:28 UTC (rev 15462) +++ twiki/branches/MAIN/twikiplugins/MailerContrib/test/unit/MailerContrib/MailerContribSuite.pm 2007-11-02 17:59:54 UTC (rev 15463) @@ -112,7 +112,7 @@ }, # single topic with one level of children { - entry => "email1\@example.com: TestTopic1 (1)", + entry => "'email1\@example.com': TestTopic1 (1)", email => "email1\@example.com", topicsout => "TestTopic1 TestTopic11 TestTopic12", }, @@ -150,8 +150,14 @@ { email => "email7\@example.com", entry => "email7\@example.com: TestTopic*1 - \\\n TestTopic2*", - topicsout => "TestTopic1 TestTopic11 TestTopic121" - }, + topicsout => "TestTopic1 TestTopic11 TestTopic121", + }, + # Strange group name; just checking parser, here + { + email => "email8\@example.com", + entry => "'IT:admins': TestTopic1", + topicsout => "", + }, ); my $s = ""; |