Filename | /usr/local/src/github.com/foswiki/core/lib/Foswiki/Plugins/SubscribePlugin.pm |
Statements | Executed 67 statements in 1.92ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
2 | 1 | 1 | 5.69ms | 175s | _SUBSCRIBE | Foswiki::Plugins::SubscribePlugin::
8 | 4 | 1 | 84µs | 84µs | CORE:subst (opcode) | Foswiki::Plugins::SubscribePlugin::
1 | 1 | 1 | 32µs | 114µs | initPlugin | Foswiki::Plugins::SubscribePlugin::
1 | 1 | 1 | 26µs | 33µs | BEGIN@4 | Foswiki::Plugins::SubscribePlugin::
1 | 1 | 1 | 20µs | 128µs | BEGIN@7 | Foswiki::Plugins::SubscribePlugin::
0 | 0 | 0 | 0s | 0s | _alert | Foswiki::Plugins::SubscribePlugin::
0 | 0 | 0 | 0s | 0s | _subscribe | Foswiki::Plugins::SubscribePlugin::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | # See the bottom of the file for description, copyright and license information | ||||
2 | package Foswiki::Plugins::SubscribePlugin; | ||||
3 | |||||
4 | 2 | 61µs | 2 | 40µs | # spent 33µs (26+7) within Foswiki::Plugins::SubscribePlugin::BEGIN@4 which was called:
# once (26µs+7µs) by Foswiki::Plugin::BEGIN@2.16 at line 4 # spent 33µs making 1 call to Foswiki::Plugins::SubscribePlugin::BEGIN@4
# spent 7µs making 1 call to strict::import |
5 | 1 | 2µs | require Foswiki::Func; | ||
6 | |||||
7 | 2 | 1.25ms | 2 | 236µs | # spent 128µs (20+108) within Foswiki::Plugins::SubscribePlugin::BEGIN@7 which was called:
# once (20µs+108µs) by Foswiki::Plugin::BEGIN@2.16 at line 7 # spent 128µs making 1 call to Foswiki::Plugins::SubscribePlugin::BEGIN@7
# spent 108µs making 1 call to vars::import |
8 | |||||
9 | 1 | 2µs | our $VERSION = '$Rev$'; | ||
10 | 1 | 1µs | our $RELEASE = '03 Dec 2008'; | ||
11 | 1 | 2µs | our $SHORTDESCRIPTION = | ||
12 | 'This is a companion plugin to the MailerContrib. It allows you to trivially add a "Subscribe me" link to topics to get subscribed to changes.'; | ||||
13 | 1 | 1µs | our $NO_PREFS_IN_TOPIC = 1; | ||
14 | |||||
15 | 1 | 1µs | our $UID; | ||
16 | 1 | 800ns | our $WEB; | ||
17 | 1 | 800ns | our $TOPIC; | ||
18 | |||||
19 | # spent 114µs (32+83) within Foswiki::Plugins::SubscribePlugin::initPlugin which was called:
# once (32µs+83µs) by Foswiki::Plugin::__ANON__[/usr/local/src/github.com/foswiki/core/lib/Foswiki/Plugin.pm:235] at line 228 of /usr/local/src/github.com/foswiki/core/lib/Foswiki/Plugin.pm | ||||
20 | 1 | 6µs | ( $TOPIC, $WEB ) = @_; | ||
21 | |||||
22 | 1 | 13µs | 1 | 82µs | Foswiki::Func::registerTagHandler( 'SUBSCRIBE', \&_SUBSCRIBE ); # spent 82µs making 1 call to Foswiki::Func::registerTagHandler |
23 | 1 | 2µs | $UID = 1; | ||
24 | |||||
25 | 1 | 11µs | return 1; | ||
26 | } | ||||
27 | |||||
28 | # Show a button inviting (un)subscription to this topic | ||||
29 | # spent 175s (5.69ms+175) within Foswiki::Plugins::SubscribePlugin::_SUBSCRIBE which was called 2 times, avg 87.7s/call:
# 2 times (5.69ms+175s) by Foswiki::Func::__ANON__[/usr/local/src/github.com/foswiki/core/lib/Foswiki/Func.pm:573] at line 568 of /usr/local/src/github.com/foswiki/core/lib/Foswiki/Func.pm, avg 87.7s/call | ||||
30 | 2 | 8µs | my ( $session, $params, $topic, $web ) = @_; | ||
31 | |||||
32 | 2 | 18µs | 2 | 66µs | my $query = Foswiki::Func::getCgiQuery(); # spent 66µs making 2 calls to Foswiki::Func::getCgiQuery, avg 33µs/call |
33 | 2 | 2µs | my $form; | ||
34 | 2 | 13µs | 2 | 101µs | my $suid = $query->param('subscribe_uid'); # spent 101µs making 2 calls to Foswiki::Request::param, avg 51µs/call |
35 | |||||
36 | 2 | 23µs | 2 | 124µs | my $cur_user = Foswiki::Func::getWikiName(); # spent 124µs making 2 calls to Foswiki::Func::getWikiName, avg 62µs/call |
37 | |||||
38 | # SMELL: this means that subscription changes can only happen from a | ||||
39 | # url to a topic that contains a %SUBCRIBE% tag, rather than the url | ||||
40 | # params meaning something. It also leads to incorrect display to the | ||||
41 | # user if subscription data is rendered prior to the processing (like | ||||
42 | # subing while displaying the webNotify topic) | ||||
43 | 2 | 3µs | if ( $suid && $suid == $UID ) { | ||
44 | |||||
45 | # make sure we're not doing this twice.. | ||||
46 | $query->delete('subscribe_uid'); | ||||
47 | |||||
48 | # We have been asked to subscribe | ||||
49 | my $topics = $query->param('subscribe_topic'); | ||||
50 | $topics =~ /^(.*)$/; | ||||
51 | $topics = $1; # Untaint - we will check it later | ||||
52 | my $who = $query->param('subscribe_subscriber'); | ||||
53 | $who ||= $cur_user; | ||||
54 | if ( $who eq $Foswiki::cfg{DefaultUserWikiName} ) { | ||||
55 | $form = _alert("$who cannot subscribe"); | ||||
56 | } | ||||
57 | else { | ||||
58 | my $unsubscribe = $query->param('subscribe_remove'); | ||||
59 | _subscribe( $web, $topics, $who, $cur_user, $unsubscribe ); | ||||
60 | } | ||||
61 | } | ||||
62 | |||||
63 | 2 | 15µs | 2 | 80µs | my $who = $params->{who} || Foswiki::Func::getWikiName(); # spent 80µs making 2 calls to Foswiki::Func::getWikiName, avg 40µs/call |
64 | 2 | 7µs | if ( $who eq $Foswiki::cfg{DefaultUserWikiName} ) { | ||
65 | $form = ''; | ||||
66 | } | ||||
67 | else { | ||||
68 | 2 | 6µs | my $topics = $params->{topic} || $topic; | ||
69 | 2 | 3µs | my $unsubscribe = 0; | ||
70 | 2 | 195µs | require Foswiki::Contrib::MailerContrib; | ||
71 | 2 | 20µs | 2 | 175s | if ( # spent 175s making 2 calls to Foswiki::Contrib::MailerContrib::isSubscribedTo, avg 87.7s/call |
72 | Foswiki::Contrib::MailerContrib::isSubscribedTo( | ||||
73 | $web, $who, $topics | ||||
74 | ) | ||||
75 | ) | ||||
76 | { | ||||
77 | $unsubscribe = 'yes'; | ||||
78 | } | ||||
79 | |||||
80 | 2 | 7µs | my $url; | ||
81 | 2 | 13µs | if ( $Foswiki::Plugins::VERSION < 1.2 ) { | ||
82 | $url = Foswiki::Func::getScriptUrl( $WEB, $TOPIC, 'view' ) | ||||
83 | . "?subscribe_topic=$topics;subscribe_subscriber=$who;subscribe_remove=$unsubscribe;subscribe_uid=$UID"; | ||||
84 | } | ||||
85 | else { | ||||
86 | 2 | 33µs | 2 | 981µs | $url = Foswiki::Func::getScriptUrl( # spent 981µs making 2 calls to Foswiki::Func::getScriptUrl, avg 491µs/call |
87 | $WEB, $TOPIC, 'view', | ||||
88 | subscribe_topic => $topics, | ||||
89 | subscribe_subscriber => $who, | ||||
90 | subscribe_remove => $unsubscribe, | ||||
91 | subscribe_uid => $UID | ||||
92 | ); | ||||
93 | } | ||||
94 | |||||
95 | 2 | 7µs | $form = $params->{format}; | ||
96 | 2 | 7µs | my $actionName = 'Subscribe'; | ||
97 | 2 | 6µs | if ( $unsubscribe eq 'yes' ) { | ||
98 | $form = $params->{formatunsubscribe} | ||||
99 | if ( $params->{formatunsubscribe} ); | ||||
100 | $actionName = 'Unsubscribe'; | ||||
101 | } | ||||
102 | 2 | 6µs | if ($form) { | ||
103 | 2 | 94µs | 2 | 73µs | $form =~ s/\$url/$url/g; # spent 73µs making 2 calls to Foswiki::Plugins::SubscribePlugin::CORE:subst, avg 36µs/call |
104 | 2 | 15µs | 2 | 4µs | $form =~ s/\$wikiname/$who/g; # spent 4µs making 2 calls to Foswiki::Plugins::SubscribePlugin::CORE:subst, avg 2µs/call |
105 | 2 | 14µs | 2 | 4µs | $form =~ s/\$topics/$topics/g; # spent 4µs making 2 calls to Foswiki::Plugins::SubscribePlugin::CORE:subst, avg 2µs/call |
106 | 2 | 18µs | 2 | 4µs | $form =~ s/\$action/%MAKETEXT{"$actionName"}%/g; # spent 4µs making 2 calls to Foswiki::Plugins::SubscribePlugin::CORE:subst, avg 2µs/call |
107 | } | ||||
108 | else { | ||||
109 | $form = CGI::a( { href => $url }, $actionName ); | ||||
110 | } | ||||
111 | } | ||||
112 | |||||
113 | 2 | 2µs | $UID++; | ||
114 | 2 | 29µs | return $form; | ||
115 | } | ||||
116 | |||||
117 | sub _alert { | ||||
118 | my ($mess) = @_; | ||||
119 | return "<span class='twikiAlert'>$mess</span>"; | ||||
120 | } | ||||
121 | |||||
122 | # Handle a (un)subscription request | ||||
123 | sub _subscribe { | ||||
124 | my ( $web, $topics, $subscriber, $cur_user, $unsubscribe ) = @_; | ||||
125 | |||||
126 | #print STDERR "_subscribe($web, $topics, $subscriber, $cur_user, $unsubscribe);\n"; | ||||
127 | |||||
128 | return _alert("bad subscriber '$subscriber'") | ||||
129 | if !( | ||||
130 | ( | ||||
131 | $Foswiki::cfg{LoginNameFilterIn} | ||||
132 | && $subscriber =~ m/($Foswiki::cfg{LoginNameFilterIn})/ | ||||
133 | ) | ||||
134 | || $subscriber =~ m/^([A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4})$/i | ||||
135 | || $subscriber =~ m/($Foswiki::regex{wikiWordRegex})/o | ||||
136 | ) | ||||
137 | || $subscriber eq $Foswiki::cfg{DefaultUserWikiName}; | ||||
138 | $subscriber = $1; # untaint | ||||
139 | |||||
140 | if ( $unsubscribe && $unsubscribe =~ /^(on|true|yes)$/i ) { | ||||
141 | $unsubscribe = '-'; | ||||
142 | |||||
143 | #$mess = 'unsubscribed from'; | ||||
144 | } | ||||
145 | else { | ||||
146 | undef $unsubscribe; | ||||
147 | } | ||||
148 | require Foswiki::Contrib::MailerContrib; | ||||
149 | Foswiki::Contrib::MailerContrib::changeSubscription( $web, $subscriber, | ||||
150 | $topics, $unsubscribe ); | ||||
151 | |||||
152 | #return _alert("$subscriber has been $mess <nop>$web.<nop>$topics"); | ||||
153 | return ""; | ||||
154 | } | ||||
155 | |||||
156 | 1 | 8µs | 1; | ||
157 | __END__ | ||||
# spent 84µs within Foswiki::Plugins::SubscribePlugin::CORE:subst which was called 8 times, avg 11µs/call:
# 2 times (73µs+0s) by Foswiki::Plugins::SubscribePlugin::_SUBSCRIBE at line 103, avg 36µs/call
# 2 times (4µs+0s) by Foswiki::Plugins::SubscribePlugin::_SUBSCRIBE at line 104, avg 2µs/call
# 2 times (4µs+0s) by Foswiki::Plugins::SubscribePlugin::_SUBSCRIBE at line 106, avg 2µs/call
# 2 times (4µs+0s) by Foswiki::Plugins::SubscribePlugin::_SUBSCRIBE at line 105, avg 2µs/call |