From f1ea8105d44294a8619da12b394ba18798a4dd7c Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Tue, 18 May 2010 15:58:24 -0700 Subject: [PATCH] Allow users to unsubscribe via email address, without logging in. Fixes bug #11559. --- docs/changelog/7.x.x.txt | 1 + .../root_import_collaboration.wgpkg | Bin 0 -> 39517 bytes docs/upgrades/upgrade_7.9.4-7.9.5.pl | 10 +++ lib/WebGUI/Asset/Post/Thread.pm | 68 ++++++++++++++--- lib/WebGUI/Asset/Wobject/Collaboration.pm | 72 +++++++++++++++--- lib/WebGUI/Help/Asset_Collaboration.pm | 20 +++++ lib/WebGUI/Session/Form.pm | 5 +- .../i18n/English/Asset_Collaboration.pm | 72 ++++++++++++++++-- 8 files changed, 221 insertions(+), 27 deletions(-) create mode 100644 docs/upgrades/packages-7.9.5/root_import_collaboration.wgpkg diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 67e700b9e..4948e88b9 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -23,6 +23,7 @@ - fixed #11549: Shortcut Asset cannot override Page Layout - added #11502: Gallery: Allow specification of location when uploading ZIP archives - added #11517: Gallery: Sorting of files uploaded in zip archives + - fixed #11559: Unsubscribe Link in Emails 7.9.4 - We're shipping underscore.js now for its suite of extremely handy utility diff --git a/docs/upgrades/packages-7.9.5/root_import_collaboration.wgpkg b/docs/upgrades/packages-7.9.5/root_import_collaboration.wgpkg new file mode 100644 index 0000000000000000000000000000000000000000..f83442066e23e98792995aa5a5570f8f8f7559ca GIT binary patch literal 39517 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 literal 0 HcmV?d00001 diff --git a/docs/upgrades/upgrade_7.9.4-7.9.5.pl b/docs/upgrades/upgrade_7.9.4-7.9.5.pl index bc84dffd0..3d5487d0f 100644 --- a/docs/upgrades/upgrade_7.9.4-7.9.5.pl +++ b/docs/upgrades/upgrade_7.9.4-7.9.5.pl @@ -36,6 +36,7 @@ modifySortItems( $session ); fixRequestForApprovalScratch($session); addRejectNoticeSetting($session); updateGroupGroupingsTable($session); +installNewCSUnsubscribeTemplate($session); finish($session); # this line required @@ -57,6 +58,15 @@ sub addRejectNoticeSetting { print "DONE!\n" unless $quiet; } +#---------------------------------------------------------------------------- +sub installNewCSUnsubscribeTemplate { + my $session = shift; + print "\tAdding new unsubscribe template to the CS... " unless $quiet; + $session->db->write(q|ALTER TABLE Collaboration ADD COLUMN unsubscribeTemplateId CHAR(22) NOT NULL|); + $session->db->write(q|UPDATE Collaboration set unsubscribeTemplateId='default_CS_unsubscribe'|); + print "DONE!\n" unless $quiet; +} + #---------------------------------------------------------------------------- # Add keys and indicies to groupGroupings to help speed up group queries sub updateGroupGroupingsTable { diff --git a/lib/WebGUI/Asset/Post/Thread.pm b/lib/WebGUI/Asset/Post/Thread.pm index d87d2bc3d..056832ed0 100644 --- a/lib/WebGUI/Asset/Post/Thread.pm +++ b/lib/WebGUI/Asset/Post/Thread.pm @@ -1021,18 +1021,22 @@ sub unstick { #------------------------------------------------------------------- -=head2 unsubscribe ( ) +=head2 unsubscribe ( [$user] ) -Negates the subscribe method. +Unsubscribes a user from this thread. + +=head3 $user + +An optional user object to unsubscribe. If the object isn't passed, then it uses the session user. =cut sub unsubscribe { - my $self = shift; + my $self = shift; + my $user = shift || $self->session->user; my $group = WebGUI::Group->new($self->session,$self->get("subscriptionGroupId")); - return - if !$group; - $group->deleteUsers([$self->session->user->userId]); + return unless $group; + $group->deleteUsers([$user->userId]); } @@ -1381,16 +1385,60 @@ sub www_unstick { #------------------------------------------------------------------- -=head2 www_unsubscribe ( ) +=head2 www_unsubscribe ( [$message] ) The web method to unsubscribe from a thread. +=head3 $message + +An error message to display to the user. + =cut sub www_unsubscribe { - my $self = shift; - $self->unsubscribe if $self->canSubscribe; - return $self->www_view; + my $self = shift; + my $message = shift; + if($self->canSubscribe){ + $self->unsubscribe; + return $self->www_view; + } + else { + my $session = $self->session; + my $i18n = WebGUI::International->new($session, 'Asset_Collaboration'); + my $var = $self->get(); + $var->{title} = $self->getTitle; + $var->{url} = $self->getUrl; + $var->{formHeader} = WebGUI::Form::formHeader($session) + . WebGUI::Form::hidden($session, { name => 'func', value => 'unsubscribeConfirm', }, ), + $var->{formFooter} = WebGUI::Form::formFooter($session), + $var->{formSubmit} = WebGUI::Form::submit($session, { value => $i18n->get('unsubscribe'), }), + $var->{formEmail} = WebGUI::Form::email($session, { name => 'userEmail', value => $session->form->process('userEmail'), }), + $var->{formMessage} = $message; + return $self->getParent->processStyle($self->processTemplate($var, $self->getParent->get("unsubscribeTemplateId"))); + } +} + +#------------------------------------------------------------------- + +=head2 www_unsubscribeConfirm ( ) + +Process the unsubscribe form. + +=cut + +sub www_unsubscribeConfirm { + my $self = shift; + my $session = $self->session; + return $self->www_view unless $session->form->validToken; + my $email = $session->form->process('userEmail', 'email'); + return $self->www_view unless $email; + my $user = WebGUI::User->newByEmail($session, $email); + my $i18n = WebGUI::International->new($session, 'Asset_Collaboration'); + if (! $user) { + return $self->www_unsubscribe($i18n->get('no user email error message')); + } + $self->unsubscribe($user); + return $self->www_unsubscribe($i18n->get('You have been unsubscribed')); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Wobject/Collaboration.pm b/lib/WebGUI/Asset/Wobject/Collaboration.pm index deff387e6..af0798408 100644 --- a/lib/WebGUI/Asset/Wobject/Collaboration.pm +++ b/lib/WebGUI/Asset/Wobject/Collaboration.pm @@ -895,6 +895,14 @@ sub definition { hoverHelp=>$i18n->get('post received template hoverHelp'), defaultValue=>'default_post_received1', }, + unsubscribeTemplateId =>{ + fieldType=>'template', + namespace=>'Collaboration/Unsubscribe', + tab=>'display', + label=>$i18n->get('unsubscribe template'), + hoverHelp=>$i18n->get('unsubscribe template hoverHelp'), + defaultValue=>'default_CS_unsubscribe', + }, ); push(@{$definition}, { @@ -1542,18 +1550,22 @@ sub subscribe { #------------------------------------------------------------------- -=head2 unsubscribe ( ) +=head2 unsubscribe ( [$user] ) Unsubscribes a user from this collaboration system +=head3 $user + +An optional user object to unsubscribe. If the object isn't passed, then it uses the session user. + =cut sub unsubscribe { - my $self = shift; - my $group = WebGUI::Group->new($self->session,$self->get("subscriptionGroupId")); - return - unless $group; - $group->deleteUsers([$self->session->user->userId],[$self->get("subscriptionGroupId")]); + my $self = shift; + my $user = shift || $self->session->user; + my $group = WebGUI::Group->new($self->session,$self->get("subscriptionGroupId")); + return unless $group; + $group->deleteUsers([$user->userId]); } @@ -1690,24 +1702,64 @@ sub www_unarchiveAll { #------------------------------------------------------------------- -=head2 www_unsubscribe ( ) +=head2 www_unsubscribe ( [$message] ) The web method to unsubscribe from a collaboration. +=head3 $message + +An error message to display to the user. + =cut sub www_unsubscribe { - my $self = shift; + my $self = shift; + my $message = shift; if($self->canSubscribe){ $self->unsubscribe; return $self->www_view; - }else{ - return $self->session->privilege->noAccess; + } + else { + my $session = $self->session; + my $i18n = WebGUI::International->new($session, 'Asset_Collaboration'); + my $var = $self->get(); + $var->{title} = $self->getTitle; + $var->{url} = $self->getUrl; + $var->{formHeader} = WebGUI::Form::formHeader($session) + . WebGUI::Form::hidden($session, { name => 'func', value => 'unsubscribeConfirm', }, ), + $var->{formFooter} = WebGUI::Form::formFooter($session), + $var->{formSubmit} = WebGUI::Form::submit($session, { value => $i18n->get('unsubscribe'), }), + $var->{formEmail} = WebGUI::Form::email($session, { name => 'userEmail', value => $session->form->process('userEmail'), }), + $var->{formMessage} = $message; + return $self->processStyle($self->processTemplate($var, $self->get("unsubscribeTemplateId"))); } } #------------------------------------------------------------------- +=head2 www_unsubscribeConfirm ( ) + +Process the unsubscribe form. + +=cut + +sub www_unsubscribeConfirm { + my $self = shift; + my $session = $self->session; + return $self->www_view unless $session->form->validToken; + my $email = $session->form->process('userEmail', 'email'); + return $self->www_view unless $email; + my $user = WebGUI::User->newByEmail($session, $email); + my $i18n = WebGUI::International->new($session, 'Asset_Collaboration'); + if (! $user) { + return $self->www_unsubscribe($i18n->get('no user email error message')); + } + $self->unsubscribe($user); + return $self->www_unsubscribe($i18n->get('You have been unsubscribed')); +} + +#------------------------------------------------------------------- + =head2 www_view Extend the base method to handle the visitor cache timeout. diff --git a/lib/WebGUI/Help/Asset_Collaboration.pm b/lib/WebGUI/Help/Asset_Collaboration.pm index ef134eb75..2ceb1e4ee 100644 --- a/lib/WebGUI/Help/Asset_Collaboration.pm +++ b/lib/WebGUI/Help/Asset_Collaboration.pm @@ -199,6 +199,26 @@ our $HELP = { related => [ ], }, + 'collaboration unsubscribe template' => { + title => 'collaboration unsubscribe template title', + body => '', + fields => [], + isa => [], + variables => [ + { name => 'formHeader', + description => 'unsubscribe formHeader', }, + { name => 'formSubmit', + description => 'unsubscribe formSubmit', }, + { name => 'formEmail', + description => 'unsubscribe formEmail', }, + { name => 'formFooter', + description => 'unsubscribe formFooter', }, + { name => 'formMessage', + description => 'unsubscribe formMessage', }, + ], + related => [ ], + }, + }; 1; diff --git a/lib/WebGUI/Session/Form.pm b/lib/WebGUI/Session/Form.pm index 47ae64471..e5dff2315 100644 --- a/lib/WebGUI/Session/Form.pm +++ b/lib/WebGUI/Session/Form.pm @@ -186,9 +186,10 @@ the one in this user's current session. sub validToken { my ($self) = @_; my $session = $self->session; - $session->log->debug('HTTP method: '. $session->request->method); - $session->log->debug('CSRF token: '. $session->scratch->get('webguiCsrfToken')); + $session->log->warn('HTTP method: '. $session->request->method); + $session->log->warn('CSRF token: '. $session->scratch->get('webguiCsrfToken')); return 0 unless $session->request->method eq 'POST'; + $session->log->warn('Web token: '. $self->param('webguiCsrfToken')); return 0 unless $self->param('webguiCsrfToken') eq $session->scratch->get('webguiCsrfToken'); return 1; } diff --git a/lib/WebGUI/i18n/English/Asset_Collaboration.pm b/lib/WebGUI/i18n/English/Asset_Collaboration.pm index c795f7249..33ab098db 100644 --- a/lib/WebGUI/i18n/English/Asset_Collaboration.pm +++ b/lib/WebGUI/i18n/English/Asset_Collaboration.pm @@ -597,6 +597,12 @@ our $I18N = { lastUpdated => 1109696029, }, + 'Unsubscribe from %s' => { + message => q|Unsubscribe from %s|, + lastUpdated => 1274216526, + context => q|Label for the unsubscribe form. %s will be filled in with the title of the CS.|, + }, + 'url' => { message => q|URL|, lastUpdated => 1109696029, @@ -1580,17 +1586,37 @@ the Collaboration Asset, the user will be notified.|, message => q|The assetId of this Collaboration System. Unlike the variable assetId, this one will not be overridden by the assetIds inside of Threads or Posts.|, lastUpdated => 1170543345, }, - + 'subscription group label' => { message => q|Subscription Group|, lastUpdated => 1170543345, }, - + 'subscription group hoverHelp' => { message => q|Manage the users in the subscription group for this Collaboration System|, lastUpdated => 1170543345, }, + 'unsubscribe template' => { + message => q|Unsubscribe Template|, + lastUpdated => 1274208100, + }, + + 'unsubscribe template hoverHelp' => { + message => q|Choose a template to help a user, who is not logged in, unsubscribe from either the CS or from a Thread within it.|, + lastUpdated => 1274208493, + }, + + 'unsubscribe instructions' => { + message => q|Please enter in the email address of the user who wants to unsubscribe|, + lastUpdated => 1274208493, + }, + + 'no user email error message' => { + message => q|No user with that email can be found.|, + lastUpdated => 1274208493, + }, + 'group to edit label' => { message => q|Group to Edit Posts|, lastUpdated => 1206733328, @@ -1599,7 +1625,7 @@ the Collaboration Asset, the user will be notified.|, message => q|A group that is allowed to edit posts after they have been submitted.|, lastUpdated => 1269283819, }, - + 'use captcha label' => { message => q|Use Post Captcha|, lastUpdated => 1170543345, @@ -1609,7 +1635,7 @@ the Collaboration Asset, the user will be notified.|, message => q|Choose whether or not to make users verify their humnanity before being able to post to this collaboration system|, lastUpdated => 1170543345, }, - + 'captcha label' => { message => q|Verify your humanity|, lastUpdated => 1170543345, @@ -1631,7 +1657,7 @@ the Collaboration Asset, the user will be notified.|, message => q|Keywords|, lastUpdated => 1170543345, }, - + 'asset not committed' => { message => q{

Error!

You need to commit this collaboration system before you can create a new thread

}, lastUpdated => 1166848379, @@ -1683,6 +1709,42 @@ the Collaboration Asset, the user will be notified.|, lastUpdated => 0, }, + 'unsubscribe formHeader' => { + message => q{HTML code to start the unsubscribe form.}, + context => q{Template variable help}, + lastUpdated => 0, + }, + + 'unsubscribe formFooter' => { + message => q{HTML code to end the unsubscribe form.}, + context => q{Template variable help}, + lastUpdated => 0, + }, + + 'unsubscribe formSubmit' => { + message => q{A button to submit the form.}, + context => q{Template variable help}, + lastUpdated => 0, + }, + + 'unsubscribe formEmail' => { + message => q{A text form with email completion.}, + context => q{Template variable help}, + lastUpdated => 0, + }, + + 'unsubscribe formMessage' => { + message => q{Internationalized messages to tell the user about errors and successes.}, + context => q{Template variable help}, + lastUpdated => 0, + }, + + 'You have been unsubscribed' => { + message => q{You have been unsubscribed.}, + context => q{status message}, + lastUpdated => 0, + }, + }; 1;