← Index
NYTProf Performance Profile   « line view »
For /usr/local/libexec/sympa/task_manager-debug.pl
  Run on Tue Jun 1 22:32:51 2021
Reported on Tue Jun 1 22:35:15 2021

Filename/usr/local/libexec/sympa/Sympa/Ticket.pm
StatementsExecuted 0 statements in 0s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
0000s0sSympa::Ticket::::BEGIN@27Sympa::Ticket::BEGIN@27
0000s0sSympa::Ticket::::BEGIN@28Sympa::Ticket::BEGIN@28
0000s0sSympa::Ticket::::BEGIN@29Sympa::Ticket::BEGIN@29
0000s0sSympa::Ticket::::BEGIN@31Sympa::Ticket::BEGIN@31
0000s0sSympa::Ticket::::BEGIN@32Sympa::Ticket::BEGIN@32
0000s0sSympa::Ticket::::BEGIN@33Sympa::Ticket::BEGIN@33
0000s0sSympa::Ticket::::BEGIN@34Sympa::Ticket::BEGIN@34
0000s0sSympa::Ticket::::BEGIN@35Sympa::Ticket::BEGIN@35
0000s0sSympa::Ticket::::__ANON__Sympa::Ticket::__ANON__ (xsub)
0000s0sSympa::Ticket::::createSympa::Ticket::create
0000s0sSympa::Ticket::::loadSympa::Ticket::load
0000s0sSympa::Ticket::::purge_old_ticketsSympa::Ticket::purge_old_tickets
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1# -*- indent-tabs-mode: nil; -*-
2# vim:ft=perl:et:sw=4
3# $Id$
4
5# Sympa - SYsteme de Multi-Postage Automatique
6#
7# Copyright (c) 1997, 1998, 1999 Institut Pasteur & Christophe Wolfhugel
8# Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
9# 2006, 2007, 2008, 2009, 2010, 2011 Comite Reseau des Universites
10# Copyright (c) 2011, 2012, 2013, 2014, 2015, 2016, 2017 GIP RENATER
11#
12# This program is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2 of the License, or
15# (at your option) any later version.
16#
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with this program. If not, see <http://www.gnu.org/licenses/>.
24
25package Sympa::Ticket;
26
27use strict;
28use warnings;
29use POSIX qw();
30
31use Conf;
32use Sympa::DatabaseManager;
33use Sympa::Log;
34use Sympa::Tools::Password;
35use Sympa::Tools::Time;
36
37my $log = Sympa::Log->instance;
38
39# Create new entry in one_time_ticket table using a rand as id so later
40# access is authenticated.
41# Old name: Sympa::Auth::create_one_time_ticket().
42sub create {
43 my $email = shift;
44 my $robot = shift;
45 my $data_string = shift;
46 my $remote_addr = shift;
47 ## Value may be 'mail' if the IP address is not known
48
49 my $ticket = Sympa::Tools::Password::get_random();
50 #$log->syslog('info', '(%s, %s, %s, %s) Value = %s',
51 # $email, $robot, $data_string, $remote_addr, $ticket);
52
53 my $date = time;
54
55 my $sdm = Sympa::DatabaseManager->instance;
56 unless (
57 $sdm
58 and $sdm->do_prepared_query(
59 q{INSERT INTO one_time_ticket_table
60 (ticket_one_time_ticket, robot_one_time_ticket,
61 email_one_time_ticket, date_one_time_ticket,
62 data_one_time_ticket,
63 remote_addr_one_time_ticket, status_one_time_ticket)
64 VALUES (?, ?, ?, ?, ?, ?, ?)},
65 $ticket, $robot,
66 $email, time,
67 $data_string,
68 $remote_addr, 'open'
69 )
70 ) {
71 $log->syslog(
72 'err',
73 'Unable to insert new one time ticket for user %s, robot %s in the database',
74 $email,
75 $robot
76 );
77 return undef;
78 }
79 return $ticket;
80}
81
82# Read one_time_ticket from table and remove it.
83# Old name: Sympa::Auth::create_one_time_ticket().
84sub load {
85 $log->syslog('debug2', '(%s, %s, %s)', @_);
86 my $robot = shift;
87 my $ticket_number = shift;
88 my $addr = shift;
89
90 my $sth;
91 my $sdm = Sympa::DatabaseManager->instance;
92 unless (
93 $sdm
94 and $sth = $sdm->do_prepared_query(
95 q{SELECT ticket_one_time_ticket AS ticket,
96 robot_one_time_ticket AS robot,
97 email_one_time_ticket AS email,
98 date_one_time_ticket AS "date",
99 data_one_time_ticket AS data,
100 remote_addr_one_time_ticket AS remote_addr,
101 status_one_time_ticket as status
102 FROM one_time_ticket_table
103 WHERE ticket_one_time_ticket = ? AND robot_one_time_ticket = ?},
104 $ticket_number, $robot
105 )
106 ) {
107 $log->syslog('err',
108 'Unable to retrieve one time ticket %s from database',
109 $ticket_number);
110 return {'result' => 'error'};
111 }
112
113 my $ticket = $sth->fetchrow_hashref('NAME_lc');
114 $sth->finish;
115
116 unless ($ticket) {
117 $log->syslog('info', 'Unable to find one time ticket %s', $ticket);
118 return {'result' => 'not_found'};
119 }
120
121 my $result;
122 my $printable_date =
123 POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime $ticket->{'date'});
124 my $lockout = Conf::get_robot_conf($robot, 'one_time_ticket_lockout')
125 || 'open';
126 my $lifetime =
127 Sympa::Tools::Time::duration_conv(
128 Conf::get_robot_conf($robot, 'one_time_ticket_lifetime') || 0);
129
130 if ($lockout eq 'one_time' and $ticket->{'status'} ne 'open') {
131 $result = 'closed';
132 $log->syslog('info', 'Ticket %s from %s has been used before (%s)',
133 $ticket_number, $ticket->{'email'}, $printable_date);
134 } elsif ($lockout eq 'remote_addr'
135 and $ticket->{'status'} ne $addr
136 and $ticket->{'status'} ne 'open') {
137 $result = 'closed';
138 $log->syslog('info',
139 'Ticket %s from %s refused because accessed by the other (%s)',
140 $ticket_number, $ticket->{'email'}, $printable_date);
141 } elsif ($lifetime and $ticket->{'date'} + $lifetime < time) {
142 $log->syslog('info', 'Ticket %s from %s refused because expired (%s)',
143 $ticket_number, $ticket->{'email'}, $printable_date);
144 $result = 'expired';
145 } else {
146 $result = 'success';
147 }
148
149 if ($result eq 'success') {
150 unless (
151 $sth = $sdm->do_prepared_query(
152 q{UPDATE one_time_ticket_table
153 SET status_one_time_ticket = ?
154 WHERE ticket_one_time_ticket = ? AND
155 robot_one_time_ticket = ?},
156 $addr, $ticket_number, $robot
157 )
158 ) {
159 $log->syslog('err',
160 'Unable to set one time ticket %s status to %s',
161 $ticket_number, $addr);
162 } elsif (!$sth->rows) {
163 # ticket may be removed by task.
164 $log->syslog('info', 'Unable to find one time ticket %s',
165 $ticket_number);
166 return {'result' => 'not_found'};
167 }
168 }
169
170 $log->syslog('info', 'Ticket: %s; Result: %s', $ticket_number, $result);
171 return {
172 'result' => $result,
173 'date' => $ticket->{'date'},
174 'email' => $ticket->{'email'},
175 'remote_addr' => $ticket->{'remote_addr'},
176 'robot' => $robot,
177 'data' => $ticket->{'data'},
178 'status' => $ticket->{'status'}
179 };
180}
181
182# Remove old one_time_ticket from a particular robot or from all robots.
183# Delay is a parameter in seconds.
184# Old name: Sympa::Session::purge_old_tickets().
185sub purge_old_tickets {
186 $log->syslog('debug2', '(%s)', @_);
187 my $robot = shift;
188
189 my $delay = Sympa::Tools::Time::duration_conv(
190 $Conf::Conf{'one_time_ticket_table_ttl'});
191
192 unless ($delay) {
193 $log->syslog('info', '(%s) Exit with delay null', $robot);
194 return;
195 }
196
197 my @tickets;
198 my $sth;
199 my $sdm = Sympa::DatabaseManager->instance;
200 unless ($sdm) {
201 $log->syslog('err', 'Unavailable database connection');
202 return;
203 }
204
205 my @conditions;
206 push @conditions,
207 sprintf('robot_one_time_ticket = %s', $sdm->quote($robot))
208 if $robot and $robot ne '*';
209 push @conditions, sprintf('%d > date_one_time_ticket', time - $delay)
210 if $delay;
211
212 my $condition = join(' AND ', @conditions);
213 my $where = "WHERE $condition" if $condition;
214
215 my $count_statement =
216 sprintf 'SELECT COUNT(*) FROM one_time_ticket_table %s', $where;
217 my $statement = sprintf 'DELETE FROM one_time_ticket_table %s', $where;
218
219 unless ($sth = $sdm->do_query($count_statement)) {
220 $log->syslog('err',
221 'Unable to count old one time tickets for robot %s', $robot);
222 return undef;
223 }
224
225 my $total = $sth->fetchrow;
226 if ($total == 0) {
227 $log->syslog('debug', 'No tickets to expire');
228 } else {
229 unless ($sth = $sdm->do_query($statement)) {
230 $log->syslog('err',
231 'Unable to delete expired one time tickets for robot %s',
232 $robot);
233 return undef;
234 }
235 }
236 return $total;
237}
238
2391;
240__END__