| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Database::Schema::Verification; |
|
2
|
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
19674
|
use 5.008007; |
|
|
1
|
|
|
|
|
5
|
|
|
|
1
|
|
|
|
|
40
|
|
|
4
|
1
|
|
|
1
|
|
6
|
use strict; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
32
|
|
|
5
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
|
1
|
|
|
|
|
5
|
|
|
|
1
|
|
|
|
|
38
|
|
|
6
|
1
|
|
|
1
|
|
1186
|
use MIME::Lite; |
|
|
1
|
|
|
|
|
38911
|
|
|
|
1
|
|
|
|
|
32
|
|
|
7
|
1
|
|
|
1
|
|
697
|
use Class::ParmList qw(parse_parms); |
|
|
1
|
|
|
|
|
1306
|
|
|
|
1
|
|
|
|
|
51
|
|
|
8
|
1
|
|
|
1
|
|
352
|
use Time::Timestamp; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
our $VERSION = '1.02'; |
|
11
|
|
|
|
|
|
|
use constant TABLE => 'verification'; |
|
12
|
|
|
|
|
|
|
use constant HARD_RETURN_LIMIT => 500; # hard coded hashref return limit, can be overridden locally |
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=head1 NAME |
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
Database::Schema::Verification - Perl extension for storing and verifing various levels of information |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
use Database::Schema::Verification; |
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
my $v = Database::Schema::Verification->new( |
|
23
|
|
|
|
|
|
|
-dbh => $dbh, |
|
24
|
|
|
|
|
|
|
-type => 'my_type', |
|
25
|
|
|
|
|
|
|
-type_id => 22, |
|
26
|
|
|
|
|
|
|
-msg => $txtVerificationEmailMsg, |
|
27
|
|
|
|
|
|
|
); |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
my $rv = $v->check(); |
|
30
|
|
|
|
|
|
|
my $rv = $v->insert(); |
|
31
|
|
|
|
|
|
|
my $rv = $v->isVerified(); |
|
32
|
|
|
|
|
|
|
my $rv = $v->load(); |
|
33
|
|
|
|
|
|
|
my $rv = $v->requestVerification(); |
|
34
|
|
|
|
|
|
|
my $rv = $v->verifiy(-action => 1); |
|
35
|
|
|
|
|
|
|
my $rv = $v->remove(); |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
# returns array of Database::Schema::Verification objects |
|
38
|
|
|
|
|
|
|
# each of a hardcoded return limit of 500, wich can be overwritten |
|
39
|
|
|
|
|
|
|
my @ary = $v->returnUnprocessed(); |
|
40
|
|
|
|
|
|
|
my @ary = $v->returnUnverified(); |
|
41
|
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
44
|
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
The Verification module provides an easy storage interface for keeping track of what data has been verified, what has been surpressed and what needs verification. At it's core it provides a relation between it's master key (vid) and a combination of the type of data you are working with (usually associates with a table within your database) and it's master key. This module also provides you with a simple email tool that provides notification of an event requiring verification. |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
Accompanied within this is a 'contrib' directory. In there you'll find a CGI script. The purpose of this script is to allow authors the ability to place embedded links within the email notifications. These links can provide a set of parameters that will trigger any of the verification functions. This allows users to click the links in the email and verify or surpess data as it becomes avalible. |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
The basic concept is to allow authors to insert this where ever they need to. This can be it's own verification database where: |
|
50
|
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
type => 'databaseName.table', |
|
52
|
|
|
|
|
|
|
type_id => $databaseName.table.keyId |
|
53
|
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
This would allow you to maintain one verification database for multiple databases or applications |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
OR it can be a simple table embeded into your program database |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
type => 'table', |
|
59
|
|
|
|
|
|
|
type_id => $table.keyId |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
This allows you to scale it as you need it and apply verification to any level of data you are working with. |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
**Note: All string returns are in the format: |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
return ('reason we bombed out...',[undef,0]); |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
This allows you to extract why the function failed with a: |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
my ($str,$rv) = function->check(...); |
|
70
|
|
|
|
|
|
|
if(!defined($rv)){ |
|
71
|
|
|
|
|
|
|
die($str); |
|
72
|
|
|
|
|
|
|
} |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
=head1 OBJECT METHODS |
|
75
|
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
=head2 new() |
|
77
|
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
Default constructor |
|
79
|
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
my $v = Database::Schema::Verification->new( |
|
81
|
|
|
|
|
|
|
# required |
|
82
|
|
|
|
|
|
|
-dbh => $dbh, |
|
83
|
|
|
|
|
|
|
-type => 'my_type', |
|
84
|
|
|
|
|
|
|
-type_id => 22, |
|
85
|
|
|
|
|
|
|
-msg => $txtVerificationEmailMsg, |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
# optional |
|
88
|
|
|
|
|
|
|
-vid => $vid, |
|
89
|
|
|
|
|
|
|
-dt_added => $dt_added, [see Time::Timestamp] |
|
90
|
|
|
|
|
|
|
-dt_updated => $dt_updated, [see Time::Timestamp] |
|
91
|
|
|
|
|
|
|
-verified => $verified, # see verified() for inputs |
|
92
|
|
|
|
|
|
|
-verified_by => $verified_by, |
|
93
|
|
|
|
|
|
|
-verified_by_ip => $verified_by_ip, [see Net::IP] |
|
94
|
|
|
|
|
|
|
-table => $table # default is 'verification' |
|
95
|
|
|
|
|
|
|
); |
|
96
|
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
=over 4 |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
=item dbh [DBI handle] |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
A DBI handle |
|
102
|
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
=item vid [int] |
|
104
|
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
This pre-specifies the verification id |
|
106
|
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
=item type [string] |
|
108
|
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
This is the type of data we are verifiying (usually use the database table we are targeting) |
|
110
|
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
=item type_id [int] |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
The key id field for the table data we are verifing |
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
=item msg [string] |
|
116
|
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
Text to be included in the verification message |
|
118
|
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
=item dt_added [int|string] (stored as Time::Timestamp obj) |
|
120
|
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
Optional: Initial timestamp, automagically inserted if left blank |
|
122
|
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
=item dt_updated [int|string] (stored as Time::Timestamp obj) |
|
124
|
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
Optional: Last updated timestamp, automagically handled if left blank |
|
126
|
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
=item verified [int] |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
Optional: Allows you to auto set the verification status (see verify() for list of inputs |
|
130
|
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
=item verified_by [string] |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
Optional: Allows specification of the verifing source (who done did it) |
|
134
|
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
=item verified_by_ip [string|int] (stores as Net::IP object) |
|
136
|
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
Optional: Allows specification of the source ip who verified the data (who's box done did it) |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
=item table [string] |
|
140
|
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
Option: Overrides the default base table definition # default is 'verification' |
|
142
|
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
=back |
|
144
|
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
=cut |
|
146
|
|
|
|
|
|
|
sub new { |
|
147
|
|
|
|
|
|
|
my ($class,%parms) = @_; |
|
148
|
|
|
|
|
|
|
my $self = {}; |
|
149
|
|
|
|
|
|
|
bless($self,$class); |
|
150
|
|
|
|
|
|
|
$self->init(%parms); |
|
151
|
|
|
|
|
|
|
return $self; |
|
152
|
|
|
|
|
|
|
} |
|
153
|
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
# INIT |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
sub init { |
|
157
|
|
|
|
|
|
|
my ($self,%parms) = @_; |
|
158
|
|
|
|
|
|
|
$parms{-table} = TABLE() if(!$parms{-table}); |
|
159
|
|
|
|
|
|
|
$parms{-ignoreTypeCase} = 1 if(!$parms{-ignoreTypeCase}); |
|
160
|
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
die 'We need a dbh!!' if(!$parms{-dbh}); |
|
162
|
|
|
|
|
|
|
$self->dbh( $parms{-dbh}); |
|
163
|
|
|
|
|
|
|
$self->table( $parms{-table}); |
|
164
|
|
|
|
|
|
|
$self->vid( $parms{-vid}); |
|
165
|
|
|
|
|
|
|
$self->type_id( $parms{-type_id}); |
|
166
|
|
|
|
|
|
|
$self->type( $parms{-type}); |
|
167
|
|
|
|
|
|
|
$self->dt_added( $parms{-dt_added}); |
|
168
|
|
|
|
|
|
|
$self->dt_updated( $parms{-dt_updated}); |
|
169
|
|
|
|
|
|
|
$self->verified( $parms{-verified}); |
|
170
|
|
|
|
|
|
|
$self->verified_by( $parms{-verified_by}); |
|
171
|
|
|
|
|
|
|
$self->verified_by_ip( $parms{-verified_by_ip}); |
|
172
|
|
|
|
|
|
|
$self->msg( $parms{-msg}); |
|
173
|
|
|
|
|
|
|
} |
|
174
|
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
# METHODS |
|
176
|
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
=head2 check() |
|
178
|
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
This function checks to see if your key or key pair (type && type_id) already exist in the database. By default $v->vid(), $v->type() and $v->type_id() are taken in the function but can be overwritten with parms. |
|
180
|
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
$v->check( |
|
182
|
|
|
|
|
|
|
# optional override of object properties |
|
183
|
|
|
|
|
|
|
-type => $type, |
|
184
|
|
|
|
|
|
|
-type_id => $type_id, |
|
185
|
|
|
|
|
|
|
-vid => $vid, |
|
186
|
|
|
|
|
|
|
); |
|
187
|
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
Returns: |
|
189
|
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
Errstr on failure |
|
191
|
|
|
|
|
|
|
1 on KeyExsits |
|
192
|
|
|
|
|
|
|
0 on keyNotExists |
|
193
|
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
=cut |
|
195
|
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
sub check { |
|
197
|
|
|
|
|
|
|
my $self = shift; |
|
198
|
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
200
|
|
|
|
|
|
|
-parms => \@_, |
|
201
|
|
|
|
|
|
|
-required => [], |
|
202
|
|
|
|
|
|
|
-legal => [ qw(-type -type_id -vid) ], |
|
203
|
|
|
|
|
|
|
-defaults => { |
|
204
|
|
|
|
|
|
|
-type => $self->type(), |
|
205
|
|
|
|
|
|
|
-type_id => $self->type_id(), |
|
206
|
|
|
|
|
|
|
-vid => $self->vid(), |
|
207
|
|
|
|
|
|
|
} |
|
208
|
|
|
|
|
|
|
}); |
|
209
|
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
211
|
|
|
|
|
|
|
my ($type,$type_id,$vid) = $parms->get('-type','-type_id','-vid'); |
|
212
|
|
|
|
|
|
|
return ("invalid params: [type,type_id|vid] required! \n",undef) unless(($type && $type_id) || $vid); |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
my ($sql,@x); |
|
215
|
|
|
|
|
|
|
if($vid){ |
|
216
|
|
|
|
|
|
|
$sql = 'SELECT id FROM `'.$self->table().'` WHERE `id` = ?'; |
|
217
|
|
|
|
|
|
|
$x[0] = $vid; |
|
218
|
|
|
|
|
|
|
} |
|
219
|
|
|
|
|
|
|
else { |
|
220
|
|
|
|
|
|
|
$sql = 'SELECT id FROM `'.$self->table().'` WHERE `type_id` = ? and `type` = ?'; |
|
221
|
|
|
|
|
|
|
@x = ($type_id,$type); |
|
222
|
|
|
|
|
|
|
} |
|
223
|
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
225
|
|
|
|
|
|
|
my $rv = $sth->execute(@x); |
|
226
|
|
|
|
|
|
|
if($rv) { |
|
227
|
|
|
|
|
|
|
my @row = $sth->fetchrow_array(); |
|
228
|
|
|
|
|
|
|
return (undef,1) if($row[0]); |
|
229
|
|
|
|
|
|
|
return 0; |
|
230
|
|
|
|
|
|
|
} |
|
231
|
|
|
|
|
|
|
return ('database failed: '.$self->dbh->errstr(),undef); |
|
232
|
|
|
|
|
|
|
} |
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
=head2 insert() |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
This function loads a verification object into the database (pre-checks the type && type_id first). By default $v->vid(),$v->type() and $v->type_id() are checked. These can be overwritten with params. |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
$v->insert( |
|
239
|
|
|
|
|
|
|
# optional override of object properties |
|
240
|
|
|
|
|
|
|
-type => $type, |
|
241
|
|
|
|
|
|
|
-type_id => $type_id, |
|
242
|
|
|
|
|
|
|
-fork => 1, # forks back a loaded object on insert completion |
|
243
|
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
# vid can be set manually, but it's usually auto-incremented by the database |
|
245
|
|
|
|
|
|
|
# all other properties should be set by the new() or their accessors before this is called |
|
246
|
|
|
|
|
|
|
); |
|
247
|
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
Returns: |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
0 on KeyExists |
|
251
|
|
|
|
|
|
|
$objectRef [-forkOnExists] |
|
252
|
|
|
|
|
|
|
Errstr on failure |
|
253
|
|
|
|
|
|
|
($vid,1) on success |
|
254
|
|
|
|
|
|
|
($objectRef,1) on success [with fork parm] |
|
255
|
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
=cut |
|
257
|
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
sub insert { |
|
259
|
|
|
|
|
|
|
my $self = shift; |
|
260
|
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
262
|
|
|
|
|
|
|
-parms => \@_, |
|
263
|
|
|
|
|
|
|
-required => [qw(-type -type_id)], |
|
264
|
|
|
|
|
|
|
-legal => [qw(-type -type_id -vid -fork -forkOnExist -msg )], |
|
265
|
|
|
|
|
|
|
-defaults => { |
|
266
|
|
|
|
|
|
|
-type => $self->type(), |
|
267
|
|
|
|
|
|
|
-type_id => $self->type_id(), |
|
268
|
|
|
|
|
|
|
-vid => $self->vid(), |
|
269
|
|
|
|
|
|
|
-msg => $self->msg(), |
|
270
|
|
|
|
|
|
|
} |
|
271
|
|
|
|
|
|
|
}); |
|
272
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
273
|
|
|
|
|
|
|
my ($vid,$type,$type_id,$fork,$forkOnExist,$msg) = $parms->get('-vid','-type','-type_id','-fork','-forkOnExist','-msg'); |
|
274
|
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
$self->dt_added(time()) unless($self->dt_added()); |
|
276
|
|
|
|
|
|
|
$self->dt_updated(time()); |
|
277
|
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
if($self->check(-type => $type, -type_id => $type_id, -vid => $vid) == 1){ |
|
279
|
|
|
|
|
|
|
return ('check: keys already exist',0) unless($forkOnExist); |
|
280
|
|
|
|
|
|
|
return (undef,$self->load(-vid => $vid, -type => $type, -type_id => $type_id, -fork => 1)); |
|
281
|
|
|
|
|
|
|
} |
|
282
|
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
my $sql = 'INSERT INTO `'.$self->table().'` (`id`,`type_id`,`type`,`dt_added`,`dt_updated`,`msg`) VALUES (?,?,?,?,?,?)'; |
|
284
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
285
|
|
|
|
|
|
|
my $rv = $sth->execute($vid,$type_id,$type,$self->dt_added->epoch(),$self->dt_updated->epoch(),$msg); |
|
286
|
|
|
|
|
|
|
return ('insert failed: '.$self->dbh->errstr(),undef) unless($rv); |
|
287
|
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
return ($self->returnVid(),1) unless($fork); |
|
289
|
|
|
|
|
|
|
return (undef,$self->load(-type=> $type, -type_id => $type_id, -fork => 1)); |
|
290
|
|
|
|
|
|
|
} |
|
291
|
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
=head2 requestVerification() |
|
293
|
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
Function takes in MIME::Lite parms and submits a notification for review. It can become particularly useful when coupled with a cgi script (see contrib directory). Embedding links into these messages allows you to verify or suppress verification by clicking a link in the email. |
|
295
|
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
my $msg = 'Please Verify Me!!!!'; |
|
297
|
|
|
|
|
|
|
$v->requestVerification( |
|
298
|
|
|
|
|
|
|
-to => 'myself@you.com', |
|
299
|
|
|
|
|
|
|
-from => 'root@localhost', |
|
300
|
|
|
|
|
|
|
-msg => $msg, |
|
301
|
|
|
|
|
|
|
-subject => 'Verification required!!', |
|
302
|
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
# optional |
|
304
|
|
|
|
|
|
|
-update => 1, # default |
|
305
|
|
|
|
|
|
|
); |
|
306
|
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
Returns: |
|
308
|
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
Errstr on failure |
|
310
|
|
|
|
|
|
|
1 on success |
|
311
|
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
=over 4 |
|
313
|
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
=item update |
|
315
|
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
By default, a call to requestVerification() will update our 'verified' status in the table to 0 (notified, but unverified). If for some reason we need to suppress it, setting -update => 0 (NOT UNDEF!) will do override it for us. |
|
317
|
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
=item debug |
|
319
|
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
This will print the email to screen will cause our database to NOT be updated (no matter what). |
|
321
|
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
$v-requestVerification( |
|
323
|
|
|
|
|
|
|
..., |
|
324
|
|
|
|
|
|
|
..., |
|
325
|
|
|
|
|
|
|
-debug => 1, |
|
326
|
|
|
|
|
|
|
); |
|
327
|
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
=back |
|
329
|
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
Supported Email Args: |
|
331
|
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
-to,-from,-cc,-bcc,-subject,-type,-msg |
|
333
|
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
See MIME::Lite for more info |
|
335
|
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
Returns: |
|
337
|
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
Errstr on failure |
|
339
|
|
|
|
|
|
|
1 on success |
|
340
|
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
=cut |
|
342
|
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
sub requestVerification { |
|
344
|
|
|
|
|
|
|
my $self = shift; |
|
345
|
|
|
|
|
|
|
|
|
346
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
347
|
|
|
|
|
|
|
-parms => \@_, |
|
348
|
|
|
|
|
|
|
-required => [ qw(-to -from -subject -msg) ], |
|
349
|
|
|
|
|
|
|
-defaults => { |
|
350
|
|
|
|
|
|
|
-msg => $self->msg(), |
|
351
|
|
|
|
|
|
|
-cc => '', |
|
352
|
|
|
|
|
|
|
-bcc => '', |
|
353
|
|
|
|
|
|
|
-update => 1, |
|
354
|
|
|
|
|
|
|
} |
|
355
|
|
|
|
|
|
|
}); |
|
356
|
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
return "invalid parameters\n".Carp::longmess (Class::ParmList->error()) unless(defined($parms)); |
|
358
|
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
my ($to,$from,$cc,$bcc,$subject,$type,$msg,$update,$debug) = $parms->get('-to','-from','-cc','-bcc','-subject','-type','-msg','-update','-debug'); |
|
360
|
|
|
|
|
|
|
my $email = MIME::Lite->new( |
|
361
|
|
|
|
|
|
|
From => $from, |
|
362
|
|
|
|
|
|
|
To => $to, |
|
363
|
|
|
|
|
|
|
Cc => $cc, |
|
364
|
|
|
|
|
|
|
Bcc => $bcc, |
|
365
|
|
|
|
|
|
|
Subject => $subject, |
|
366
|
|
|
|
|
|
|
Type => $type, |
|
367
|
|
|
|
|
|
|
Data => $msg, |
|
368
|
|
|
|
|
|
|
); |
|
369
|
|
|
|
|
|
|
return (print $email->as_string()."\n") if($debug); |
|
370
|
|
|
|
|
|
|
my $rv = $email->send(); |
|
371
|
|
|
|
|
|
|
if($rv){ |
|
372
|
|
|
|
|
|
|
return (undef,1) unless($update); |
|
373
|
|
|
|
|
|
|
$self->verify(-action => 0); |
|
374
|
|
|
|
|
|
|
} |
|
375
|
|
|
|
|
|
|
return ('msg failed to send: '.$rv,undef); |
|
376
|
|
|
|
|
|
|
} |
|
377
|
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
=head2 isVerified() |
|
379
|
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
Method checks to see the verified status of the VID or keypair (type && type_id). |
|
381
|
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
my $rv = $v->isVerified( |
|
383
|
|
|
|
|
|
|
# optional override of object properties |
|
384
|
|
|
|
|
|
|
-type => $type, |
|
385
|
|
|
|
|
|
|
-type_id => $type_id, |
|
386
|
|
|
|
|
|
|
-vid => $vid, |
|
387
|
|
|
|
|
|
|
); |
|
388
|
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
Returns: |
|
390
|
|
|
|
|
|
|
|
|
391
|
|
|
|
|
|
|
Errstr on failure |
|
392
|
|
|
|
|
|
|
verified status on success (see verifiy() for more details) |
|
393
|
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
=cut |
|
395
|
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
sub isVerified { |
|
397
|
|
|
|
|
|
|
my $self = shift; |
|
398
|
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
400
|
|
|
|
|
|
|
-parms => \@_, |
|
401
|
|
|
|
|
|
|
-required => [], |
|
402
|
|
|
|
|
|
|
-legal => [ qw(-type -type_id -vid) ], |
|
403
|
|
|
|
|
|
|
-defaults => { |
|
404
|
|
|
|
|
|
|
-type => $self->type(), |
|
405
|
|
|
|
|
|
|
-type_id => $self->type_id(), |
|
406
|
|
|
|
|
|
|
-vid => $self->vid(), |
|
407
|
|
|
|
|
|
|
} |
|
408
|
|
|
|
|
|
|
}); |
|
409
|
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
411
|
|
|
|
|
|
|
my ($type,$type_id,$vid) = $parms->get('-type','-type_id','-vid'); |
|
412
|
|
|
|
|
|
|
return ("invalid params: [type,type_id|vid] required!\n",undef) unless(($type && $type_id) || $vid); |
|
413
|
|
|
|
|
|
|
|
|
414
|
|
|
|
|
|
|
return ("check failed\n",undef) if($self->check(-type => $type, -type_id => $type_id, -vid => $vid) != 1); |
|
415
|
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
my ($sql,@x); |
|
417
|
|
|
|
|
|
|
if($vid) { |
|
418
|
|
|
|
|
|
|
$sql = 'SELECT `verified`, `verified_by` FROM `'.$self->table().'` WHERE id = ?'; |
|
419
|
|
|
|
|
|
|
@x = ($vid); |
|
420
|
|
|
|
|
|
|
} |
|
421
|
|
|
|
|
|
|
else { |
|
422
|
|
|
|
|
|
|
$sql = 'SELECT `verified`, `verified_by` FROM `'.$self->table().'` WHERE type_id = ? AND type = ?'; |
|
423
|
|
|
|
|
|
|
@x = ($type_id,$type); |
|
424
|
|
|
|
|
|
|
} |
|
425
|
|
|
|
|
|
|
|
|
426
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
427
|
|
|
|
|
|
|
my $rv = $sth->execute(@x); |
|
428
|
|
|
|
|
|
|
return ('isVerified Failed: '.$self->dbh->errstr(),undef) unless($rv); |
|
429
|
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
my @row = $sth->fetchrow_array(); |
|
431
|
|
|
|
|
|
|
return ($row[0]); |
|
432
|
|
|
|
|
|
|
} |
|
433
|
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
=head2 returnVid() |
|
435
|
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
Returns the vid for a given pair of (type && type_id) assuming $v->vid() is not set. |
|
437
|
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
my $vid = $v->returnVid( |
|
439
|
|
|
|
|
|
|
# optional override of object properties |
|
440
|
|
|
|
|
|
|
-type => $type, |
|
441
|
|
|
|
|
|
|
-type_id => $type_id, |
|
442
|
|
|
|
|
|
|
); |
|
443
|
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
Returns: |
|
445
|
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
Errstr on failure |
|
447
|
|
|
|
|
|
|
vid on succeess |
|
448
|
|
|
|
|
|
|
|
|
449
|
|
|
|
|
|
|
=cut |
|
450
|
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
sub returnVid { |
|
452
|
|
|
|
|
|
|
my $self = shift; |
|
453
|
|
|
|
|
|
|
|
|
454
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
455
|
|
|
|
|
|
|
-parms => \@_, |
|
456
|
|
|
|
|
|
|
-required => [ qw(-type -type_id) ], |
|
457
|
|
|
|
|
|
|
-defaults => { |
|
458
|
|
|
|
|
|
|
-type => $self->type(), |
|
459
|
|
|
|
|
|
|
-type_id => $self->type_id(), |
|
460
|
|
|
|
|
|
|
} |
|
461
|
|
|
|
|
|
|
}); |
|
462
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
463
|
|
|
|
|
|
|
my ($type,$type_id) = $parms->get('-type','-type_id'); |
|
464
|
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
my $sql = 'SELECT id FROM `'.$self->table().'` WHERE `type` = ? and `type_id` = ?'; |
|
466
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
467
|
|
|
|
|
|
|
my $rv = $sth->execute($type,$type_id); |
|
468
|
|
|
|
|
|
|
my @row = $sth->fetchrow_array(); |
|
469
|
|
|
|
|
|
|
return $row[0] if($row[0]); |
|
470
|
|
|
|
|
|
|
return ('no vid found',undef); |
|
471
|
|
|
|
|
|
|
} |
|
472
|
|
|
|
|
|
|
|
|
473
|
|
|
|
|
|
|
=head2 load() |
|
474
|
|
|
|
|
|
|
|
|
475
|
|
|
|
|
|
|
Loads a verification record into our object or returns a fully loaded forked object. |
|
476
|
|
|
|
|
|
|
|
|
477
|
|
|
|
|
|
|
$v->load( |
|
478
|
|
|
|
|
|
|
# optional override of object properties |
|
479
|
|
|
|
|
|
|
-type => $type, |
|
480
|
|
|
|
|
|
|
-type_id => $type_id, |
|
481
|
|
|
|
|
|
|
); |
|
482
|
|
|
|
|
|
|
|
|
483
|
|
|
|
|
|
|
my $newObject = $v->load( |
|
484
|
|
|
|
|
|
|
# optional override of object properties |
|
485
|
|
|
|
|
|
|
-vid => $vid, |
|
486
|
|
|
|
|
|
|
-fork => 1, |
|
487
|
|
|
|
|
|
|
); |
|
488
|
|
|
|
|
|
|
|
|
489
|
|
|
|
|
|
|
Returns: |
|
490
|
|
|
|
|
|
|
|
|
491
|
|
|
|
|
|
|
Errstr on failure |
|
492
|
|
|
|
|
|
|
1 on success and not forked |
|
493
|
|
|
|
|
|
|
New Object if forked |
|
494
|
|
|
|
|
|
|
|
|
495
|
|
|
|
|
|
|
=cut |
|
496
|
|
|
|
|
|
|
|
|
497
|
|
|
|
|
|
|
sub load { |
|
498
|
|
|
|
|
|
|
my $self = shift; |
|
499
|
|
|
|
|
|
|
|
|
500
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
501
|
|
|
|
|
|
|
-parms => \@_, |
|
502
|
|
|
|
|
|
|
-legal => [qw(-type -type_id -vid -fork)], |
|
503
|
|
|
|
|
|
|
-defaults => { |
|
504
|
|
|
|
|
|
|
-type => $self->type(), |
|
505
|
|
|
|
|
|
|
-type_id => $self->type_id(), |
|
506
|
|
|
|
|
|
|
-vid => $self->vid(), |
|
507
|
|
|
|
|
|
|
} |
|
508
|
|
|
|
|
|
|
}); |
|
509
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
510
|
|
|
|
|
|
|
my ($type,$type_id,$vid,$fork) = $parms->get('-type','-type_id','-vid','-fork'); |
|
511
|
|
|
|
|
|
|
return ("invalid params: [-type,-type_id|-vid] required!\n",undef) unless($vid || ($type && $type_id)); |
|
512
|
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
my $sql = 'SELECT * FROM `'.$self->table().'` WHERE '; |
|
514
|
|
|
|
|
|
|
my @x; |
|
515
|
|
|
|
|
|
|
|
|
516
|
|
|
|
|
|
|
if($vid){ $sql .= '`id` = ?'; $x[0] = $vid; } |
|
517
|
|
|
|
|
|
|
else { $sql .= '`type` = ? AND `type_id` = ?'; $x[0] = $type; $x[1] = $type_id; } |
|
518
|
|
|
|
|
|
|
|
|
519
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
520
|
|
|
|
|
|
|
my $rv = $sth->execute(@x); |
|
521
|
|
|
|
|
|
|
return ('load failed: '.$self->dbh->errstr(),undef) unless($rv); |
|
522
|
|
|
|
|
|
|
|
|
523
|
|
|
|
|
|
|
my $hr = $sth->fetchrow_hashref(); |
|
524
|
|
|
|
|
|
|
return ('no records found',undef) unless(keys %$hr); |
|
525
|
|
|
|
|
|
|
|
|
526
|
|
|
|
|
|
|
return ref($self)->new( |
|
527
|
|
|
|
|
|
|
-dbh => $self->dbh, |
|
528
|
|
|
|
|
|
|
-vid => $hr->{id}, |
|
529
|
|
|
|
|
|
|
-msg => $hr->{msg}, |
|
530
|
|
|
|
|
|
|
-dt_added => $hr->{dt_added}, |
|
531
|
|
|
|
|
|
|
-dt_updated => $hr->{dt_updated}, |
|
532
|
|
|
|
|
|
|
-type => $hr->{type}, |
|
533
|
|
|
|
|
|
|
-type_id => $hr->{type_id}, |
|
534
|
|
|
|
|
|
|
-verified => $hr->{verified}, |
|
535
|
|
|
|
|
|
|
-id => $hr->{id}, |
|
536
|
|
|
|
|
|
|
-verified_by => $hr->{verified_by}, |
|
537
|
|
|
|
|
|
|
-verified_by_ip => $hr->{verified_by_ip}, |
|
538
|
|
|
|
|
|
|
) if($fork); |
|
539
|
|
|
|
|
|
|
|
|
540
|
|
|
|
|
|
|
$self->vid( $hr->{id}); |
|
541
|
|
|
|
|
|
|
$self->type_id( $hr->{type_id}); |
|
542
|
|
|
|
|
|
|
$self->type( $hr->{type}); |
|
543
|
|
|
|
|
|
|
$self->verified( $hr->{verified}); |
|
544
|
|
|
|
|
|
|
$self->dt_added( $hr->{dt_added}); |
|
545
|
|
|
|
|
|
|
$self->dt_updated( $hr->{dt_updated}); |
|
546
|
|
|
|
|
|
|
$self->verified_by( $hr->{verified_by}); |
|
547
|
|
|
|
|
|
|
$self->verified_by_ip( $hr->{verified_by_ip}); |
|
548
|
|
|
|
|
|
|
$self->msg( $hr->{msg}); |
|
549
|
|
|
|
|
|
|
return (undef,1); |
|
550
|
|
|
|
|
|
|
} |
|
551
|
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
=head2 verify() |
|
553
|
|
|
|
|
|
|
|
|
554
|
|
|
|
|
|
|
Sets the verification status of the object. |
|
555
|
|
|
|
|
|
|
|
|
556
|
|
|
|
|
|
|
$v->verify( |
|
557
|
|
|
|
|
|
|
# required |
|
558
|
|
|
|
|
|
|
-action => $action, |
|
559
|
|
|
|
|
|
|
|
|
560
|
|
|
|
|
|
|
# optional override of object properties |
|
561
|
|
|
|
|
|
|
-type => $type, |
|
562
|
|
|
|
|
|
|
-type_id => $type_id, |
|
563
|
|
|
|
|
|
|
-vid => $vid, |
|
564
|
|
|
|
|
|
|
-verified_by => $verified_by, |
|
565
|
|
|
|
|
|
|
-verified_by_ip => $vip, |
|
566
|
|
|
|
|
|
|
); |
|
567
|
|
|
|
|
|
|
|
|
568
|
|
|
|
|
|
|
=cut |
|
569
|
|
|
|
|
|
|
|
|
570
|
|
|
|
|
|
|
# action hashref |
|
571
|
|
|
|
|
|
|
my $ACTIONS = { |
|
572
|
|
|
|
|
|
|
'UNVERIFIED' => 0, # unverified but notification has been sent |
|
573
|
|
|
|
|
|
|
'VERIFY' => 1, # duh |
|
574
|
|
|
|
|
|
|
'SUPPRESS' => 2, # its what jcmurphy likes to call a 'false positive' |
|
575
|
|
|
|
|
|
|
'UNDEFINE' => 3, # reset so the notification can be triggered again |
|
576
|
|
|
|
|
|
|
'REMOVE' => 4, # get rid of the evidence |
|
577
|
|
|
|
|
|
|
}; |
|
578
|
|
|
|
|
|
|
|
|
579
|
|
|
|
|
|
|
=pod |
|
580
|
|
|
|
|
|
|
|
|
581
|
|
|
|
|
|
|
Actions [and or status]: |
|
582
|
|
|
|
|
|
|
|
|
583
|
|
|
|
|
|
|
0 - UNVERIFIED # unverified but notification has been sent [set status to 'wait'] |
|
584
|
|
|
|
|
|
|
1 - VERIFY # duh |
|
585
|
|
|
|
|
|
|
2 - SUPPRESS # its what jcmurphy likes to call a 'false positive' |
|
586
|
|
|
|
|
|
|
3 - UNDEFINE # reset so the notification can be triggered again |
|
587
|
|
|
|
|
|
|
4 - REMOVE # get rid of the evidence |
|
588
|
|
|
|
|
|
|
|
|
589
|
|
|
|
|
|
|
Actions can be sent as strings or ints, it will figure out which automagically. |
|
590
|
|
|
|
|
|
|
|
|
591
|
|
|
|
|
|
|
Returns: |
|
592
|
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
Errstr on failure |
|
594
|
|
|
|
|
|
|
1 on success |
|
595
|
|
|
|
|
|
|
|
|
596
|
|
|
|
|
|
|
=cut |
|
597
|
|
|
|
|
|
|
|
|
598
|
|
|
|
|
|
|
sub verify { |
|
599
|
|
|
|
|
|
|
my $self = shift; |
|
600
|
|
|
|
|
|
|
|
|
601
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
602
|
|
|
|
|
|
|
-parms => \@_, |
|
603
|
|
|
|
|
|
|
-required => [qw(-verified_by -action)], |
|
604
|
|
|
|
|
|
|
-legal => [qw(-type -type_id -vid -verified_by -action -verified_by_ip)], |
|
605
|
|
|
|
|
|
|
-defaults => { |
|
606
|
|
|
|
|
|
|
-type => $self->type(), |
|
607
|
|
|
|
|
|
|
-type_id => $self->type_id(), |
|
608
|
|
|
|
|
|
|
-vid => $self->vid(), |
|
609
|
|
|
|
|
|
|
-verified_by => $self->verified_by(), |
|
610
|
|
|
|
|
|
|
-verified_by_ip => $self->verified_by_ip(), |
|
611
|
|
|
|
|
|
|
} |
|
612
|
|
|
|
|
|
|
}); |
|
613
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
614
|
|
|
|
|
|
|
my ($vid,$type,$type_id,$verified_by,$action,$verified_by_ip) = $parms->get('-vid','-type','-type_id','-verified_by','-action','-verified_by_ip'); |
|
615
|
|
|
|
|
|
|
return ("missing parmaeters\n",undef) unless(($vid) || ($type && $type_id)); |
|
616
|
|
|
|
|
|
|
|
|
617
|
|
|
|
|
|
|
return ('check failed',undef) if(!$self->check(-type => $type, -type_id => $type_id, -vid => $vid)); |
|
618
|
|
|
|
|
|
|
my $status = $self->isVerified(); |
|
619
|
|
|
|
|
|
|
return ('already processed',undef) if(defined($status) && $status > 0); |
|
620
|
|
|
|
|
|
|
my $a = $action; |
|
621
|
|
|
|
|
|
|
$action = $ACTIONS->{uc($action)} if(!($action =~ /^\d+$/)); # change to int if they sent a string |
|
622
|
|
|
|
|
|
|
|
|
623
|
|
|
|
|
|
|
return ('invalid action: '.uc($a),undef) unless(defined($action) && $action =~ /^[0-3]$/); |
|
624
|
|
|
|
|
|
|
return $self->remove() if($action == 4); |
|
625
|
|
|
|
|
|
|
$action = undef if($action == 3); |
|
626
|
|
|
|
|
|
|
|
|
627
|
|
|
|
|
|
|
my @x; $x[0] = $action; $x[1] = $verified_by; $x[2] = time(); |
|
628
|
|
|
|
|
|
|
my $sql = 'UPDATE `'.$self->table().'` SET `verified` = ?, `verified_by` = ?, `dt_updated` = ?'; |
|
629
|
|
|
|
|
|
|
|
|
630
|
|
|
|
|
|
|
if($self->verified_by_ip){ |
|
631
|
|
|
|
|
|
|
$sql .= ', verified_by_ip = '.$self->dbh->quote($self->verified_by_ip->intip()); |
|
632
|
|
|
|
|
|
|
} |
|
633
|
|
|
|
|
|
|
|
|
634
|
|
|
|
|
|
|
if($vid){ |
|
635
|
|
|
|
|
|
|
$sql .= ' WHERE id = ?'; |
|
636
|
|
|
|
|
|
|
$x[3] = $vid; |
|
637
|
|
|
|
|
|
|
} |
|
638
|
|
|
|
|
|
|
else{ |
|
639
|
|
|
|
|
|
|
$sql .= ' WHERE type_id = ? AND type = ?'; |
|
640
|
|
|
|
|
|
|
$x[3] = $type_id; $x[4] = $type; |
|
641
|
|
|
|
|
|
|
} |
|
642
|
|
|
|
|
|
|
|
|
643
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
644
|
|
|
|
|
|
|
my $rv = $sth->execute(@x); |
|
645
|
|
|
|
|
|
|
return (undef,1) if($rv); |
|
646
|
|
|
|
|
|
|
return ('Verification failed: '.$self->dbh->errstr(),undef); |
|
647
|
|
|
|
|
|
|
} |
|
648
|
|
|
|
|
|
|
|
|
649
|
|
|
|
|
|
|
=head2 remove() |
|
650
|
|
|
|
|
|
|
|
|
651
|
|
|
|
|
|
|
Removes the record from our table that this object represents. |
|
652
|
|
|
|
|
|
|
|
|
653
|
|
|
|
|
|
|
$v->remove( |
|
654
|
|
|
|
|
|
|
# optional override of object properties |
|
655
|
|
|
|
|
|
|
-vid => $vid, |
|
656
|
|
|
|
|
|
|
-type => $type, |
|
657
|
|
|
|
|
|
|
-type_id => $type_id, |
|
658
|
|
|
|
|
|
|
); |
|
659
|
|
|
|
|
|
|
|
|
660
|
|
|
|
|
|
|
Returns: |
|
661
|
|
|
|
|
|
|
|
|
662
|
|
|
|
|
|
|
Errstr on failure |
|
663
|
|
|
|
|
|
|
1 on success |
|
664
|
|
|
|
|
|
|
|
|
665
|
|
|
|
|
|
|
=cut |
|
666
|
|
|
|
|
|
|
|
|
667
|
|
|
|
|
|
|
sub remove { |
|
668
|
|
|
|
|
|
|
my $self = shift; |
|
669
|
|
|
|
|
|
|
|
|
670
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
671
|
|
|
|
|
|
|
-parms => \@_, |
|
672
|
|
|
|
|
|
|
-defaults => { |
|
673
|
|
|
|
|
|
|
-vid => $self->vid(), |
|
674
|
|
|
|
|
|
|
-type => $self->type(), |
|
675
|
|
|
|
|
|
|
-type_id => $self->type_id(), |
|
676
|
|
|
|
|
|
|
} |
|
677
|
|
|
|
|
|
|
}); |
|
678
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
679
|
|
|
|
|
|
|
my ($vid,$type,$type_id) = $parms->get('-vid','-type','-type_id'); |
|
680
|
|
|
|
|
|
|
return ('missing required parameters: [vid || type && type_id]',undef) unless($vid || ($type && $type_id)); |
|
681
|
|
|
|
|
|
|
|
|
682
|
|
|
|
|
|
|
my ($sql,@x); |
|
683
|
|
|
|
|
|
|
|
|
684
|
|
|
|
|
|
|
if($vid) { |
|
685
|
|
|
|
|
|
|
$sql = 'DELETE FROM `'.$self->table().'` WHERE `id` = ?'; |
|
686
|
|
|
|
|
|
|
$x[0] = $vid; |
|
687
|
|
|
|
|
|
|
} |
|
688
|
|
|
|
|
|
|
else { |
|
689
|
|
|
|
|
|
|
$sql = 'DELETE FROM `'.$self->table().'` WHERE `type` = ? AND `type_id` = ?'; |
|
690
|
|
|
|
|
|
|
$x[0] = $type; |
|
691
|
|
|
|
|
|
|
$x[1] = $type_id; |
|
692
|
|
|
|
|
|
|
} |
|
693
|
|
|
|
|
|
|
|
|
694
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
695
|
|
|
|
|
|
|
my $rv = $sth->execute(@x); |
|
696
|
|
|
|
|
|
|
|
|
697
|
|
|
|
|
|
|
return (undef,1) unless(!$rv); |
|
698
|
|
|
|
|
|
|
return ('remove failed: '.$self->dbh->errstr(),undef); |
|
699
|
|
|
|
|
|
|
} |
|
700
|
|
|
|
|
|
|
|
|
701
|
|
|
|
|
|
|
=head2 returnUnverified() |
|
702
|
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
By default this method returns an array of unverified objects from the database. Optionally a parm can override this and force the function to return a raw hashref too. There is a HARD_RETURN_LIMIT on the number of keys that can be accessed. This can also be overridden. |
|
704
|
|
|
|
|
|
|
|
|
705
|
|
|
|
|
|
|
my @aryOfObjects = $v->returnUnverified( |
|
706
|
|
|
|
|
|
|
# optional overrides |
|
707
|
|
|
|
|
|
|
-type => $type |
|
708
|
|
|
|
|
|
|
); |
|
709
|
|
|
|
|
|
|
|
|
710
|
|
|
|
|
|
|
my $hashref = $v->returnUnverified( |
|
711
|
|
|
|
|
|
|
-limit => 1000, |
|
712
|
|
|
|
|
|
|
-hashref => 1, |
|
713
|
|
|
|
|
|
|
); |
|
714
|
|
|
|
|
|
|
|
|
715
|
|
|
|
|
|
|
=over 4 |
|
716
|
|
|
|
|
|
|
|
|
717
|
|
|
|
|
|
|
=item limit |
|
718
|
|
|
|
|
|
|
|
|
719
|
|
|
|
|
|
|
This will override the hard coded limit of 500. Setting -limit => 0 will return ALL records (use with caution on large databases). Because of this, if the hard limit is set, the query will return the data in desc order. |
|
720
|
|
|
|
|
|
|
|
|
721
|
|
|
|
|
|
|
=item hashref |
|
722
|
|
|
|
|
|
|
|
|
723
|
|
|
|
|
|
|
This will return a raw hashref instead of an array of objects (set to 1). |
|
724
|
|
|
|
|
|
|
|
|
725
|
|
|
|
|
|
|
=back |
|
726
|
|
|
|
|
|
|
|
|
727
|
|
|
|
|
|
|
Returns: |
|
728
|
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
Errstr on failure |
|
730
|
|
|
|
|
|
|
HASHREF or OBJECT on success |
|
731
|
|
|
|
|
|
|
|
|
732
|
|
|
|
|
|
|
=cut |
|
733
|
|
|
|
|
|
|
|
|
734
|
|
|
|
|
|
|
sub returnUnverified { |
|
735
|
|
|
|
|
|
|
my $self = shift; |
|
736
|
|
|
|
|
|
|
|
|
737
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
738
|
|
|
|
|
|
|
-parms =>\@_, |
|
739
|
|
|
|
|
|
|
-legal => [qw(-type -limit -hashref)], |
|
740
|
|
|
|
|
|
|
-defaults => { |
|
741
|
|
|
|
|
|
|
-type => $self->type(), |
|
742
|
|
|
|
|
|
|
-limit => HARD_RETURN_LIMIT(), |
|
743
|
|
|
|
|
|
|
} |
|
744
|
|
|
|
|
|
|
}); |
|
745
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
746
|
|
|
|
|
|
|
my ($type,$limit,$hashref) = $parms->get('-type','-limit','-hashref'); |
|
747
|
|
|
|
|
|
|
|
|
748
|
|
|
|
|
|
|
my $sql = 'SELECT * FROM `'.$self->table().'` WHERE verified = 0'; |
|
749
|
|
|
|
|
|
|
$sql .= ' AND type = '.$self->dbh->quote($type) if($type); |
|
750
|
|
|
|
|
|
|
$sql .= ' ORDER BY id DESC'; |
|
751
|
|
|
|
|
|
|
$sql .= ' LIMIT '.$limit if($limit != 0); |
|
752
|
|
|
|
|
|
|
|
|
753
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
754
|
|
|
|
|
|
|
my $rv = $sth->execute(); |
|
755
|
|
|
|
|
|
|
|
|
756
|
|
|
|
|
|
|
return ('QueryFailed: '.$self->dbh->errstr(),undef) unless($rv); |
|
757
|
|
|
|
|
|
|
|
|
758
|
|
|
|
|
|
|
my $hr = $sth->fetchall_hashref('id'); |
|
759
|
|
|
|
|
|
|
return $hr if($hashref); |
|
760
|
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
my @a; |
|
762
|
|
|
|
|
|
|
foreach my $x (keys %$hr){ |
|
763
|
|
|
|
|
|
|
push(@a,ref($self)->new( |
|
764
|
|
|
|
|
|
|
-dbh => $self->dbh(), |
|
765
|
|
|
|
|
|
|
-vid => $hr->{$x}->{id}, |
|
766
|
|
|
|
|
|
|
-msg => $hr->{$x}->{msg}, |
|
767
|
|
|
|
|
|
|
-dt_added => $hr->{$x}->{dt_added}, |
|
768
|
|
|
|
|
|
|
-dt_updated => $hr->{$x}->{dt_updated}, |
|
769
|
|
|
|
|
|
|
-type => $hr->{$x}->{type}, |
|
770
|
|
|
|
|
|
|
-type_id => $hr->{$x}->{type_id}, |
|
771
|
|
|
|
|
|
|
-verified => $hr->{$x}->{verified}, |
|
772
|
|
|
|
|
|
|
-id => $hr->{$x}->{id}, |
|
773
|
|
|
|
|
|
|
-verified_by => $hr->{$x}->{verified_by}, |
|
774
|
|
|
|
|
|
|
-verified_by_ip => $hr->{$x}->{verified_by_ip}, |
|
775
|
|
|
|
|
|
|
) |
|
776
|
|
|
|
|
|
|
) |
|
777
|
|
|
|
|
|
|
} |
|
778
|
|
|
|
|
|
|
return @a; |
|
779
|
|
|
|
|
|
|
} |
|
780
|
|
|
|
|
|
|
|
|
781
|
|
|
|
|
|
|
=head2 returnUnprocessed() |
|
782
|
|
|
|
|
|
|
|
|
783
|
|
|
|
|
|
|
See returnUnVerified(). |
|
784
|
|
|
|
|
|
|
|
|
785
|
|
|
|
|
|
|
This returns anything that has verified set to NULL (ie: no notifications have been sent yet). |
|
786
|
|
|
|
|
|
|
|
|
787
|
|
|
|
|
|
|
=cut |
|
788
|
|
|
|
|
|
|
|
|
789
|
|
|
|
|
|
|
sub returnUnprocessed { |
|
790
|
|
|
|
|
|
|
my $self = shift; |
|
791
|
|
|
|
|
|
|
|
|
792
|
|
|
|
|
|
|
my $parms = parse_parms({ |
|
793
|
|
|
|
|
|
|
-parms => \@_, |
|
794
|
|
|
|
|
|
|
-legal => [qw(-type -limit -hashref)], |
|
795
|
|
|
|
|
|
|
-defaults => { |
|
796
|
|
|
|
|
|
|
-type => $self->type(), |
|
797
|
|
|
|
|
|
|
-limit => HARD_RETURN_LIMIT(), |
|
798
|
|
|
|
|
|
|
} |
|
799
|
|
|
|
|
|
|
}); |
|
800
|
|
|
|
|
|
|
|
|
801
|
|
|
|
|
|
|
return ("invalid parameters\n".Carp::longmess (Class::ParmList->error()),undef) unless(defined($parms)); |
|
802
|
|
|
|
|
|
|
my ($type,$limit,$hashref) = $parms->get('-type','-limit','-hashref'); |
|
803
|
|
|
|
|
|
|
|
|
804
|
|
|
|
|
|
|
my $sql = 'SELECT * FROM `'.$self->table().'` WHERE verified IS NULL'; |
|
805
|
|
|
|
|
|
|
$sql .= ' AND type = '.$self->dbh->quote($type) if($type); |
|
806
|
|
|
|
|
|
|
$sql .= ' ORDER BY id DESC'; |
|
807
|
|
|
|
|
|
|
$sql .= ' LIMIT '.$limit if($limit != 0); |
|
808
|
|
|
|
|
|
|
|
|
809
|
|
|
|
|
|
|
my $sth = $self->dbh->prepare($sql); |
|
810
|
|
|
|
|
|
|
my $rv = $sth->execute(); |
|
811
|
|
|
|
|
|
|
|
|
812
|
|
|
|
|
|
|
return ('QueryFailed: '.$self->dbh->errstr(),undef) unless($rv); |
|
813
|
|
|
|
|
|
|
my $hr = $sth->fetchall_hashref('id'); |
|
814
|
|
|
|
|
|
|
return $hr if($hashref); |
|
815
|
|
|
|
|
|
|
|
|
816
|
|
|
|
|
|
|
my @a; |
|
817
|
|
|
|
|
|
|
foreach my $x (keys %$hr){ |
|
818
|
|
|
|
|
|
|
push(@a,ref($self)->new( |
|
819
|
|
|
|
|
|
|
-dbh => $self->dbh(), |
|
820
|
|
|
|
|
|
|
-vid => $hr->{$x}->{id}, |
|
821
|
|
|
|
|
|
|
-msg => $hr->{$x}->{msg}, |
|
822
|
|
|
|
|
|
|
-dt_added => $hr->{$x}->{dt_added}, |
|
823
|
|
|
|
|
|
|
-dt_updated => $hr->{$x}->{dt_updated}, |
|
824
|
|
|
|
|
|
|
-type => $hr->{$x}->{type}, |
|
825
|
|
|
|
|
|
|
-type_id => $hr->{$x}->{type_id}, |
|
826
|
|
|
|
|
|
|
-verified => $hr->{$x}->{verified}, |
|
827
|
|
|
|
|
|
|
-id => $hr->{$x}->{id}, |
|
828
|
|
|
|
|
|
|
-verified_by => $hr->{$x}->{verified_by}, |
|
829
|
|
|
|
|
|
|
-verified_by_ip => $hr->{$x}->{verified_by_ip}, |
|
830
|
|
|
|
|
|
|
) |
|
831
|
|
|
|
|
|
|
) |
|
832
|
|
|
|
|
|
|
} |
|
833
|
|
|
|
|
|
|
return @a; |
|
834
|
|
|
|
|
|
|
} |
|
835
|
|
|
|
|
|
|
|
|
836
|
|
|
|
|
|
|
=pod |
|
837
|
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
=head1 OBJECT ACCESSORS and MODIFIERS |
|
839
|
|
|
|
|
|
|
|
|
840
|
|
|
|
|
|
|
=head2 dbh() |
|
841
|
|
|
|
|
|
|
|
|
842
|
|
|
|
|
|
|
Sets and Retrieves dbh handle |
|
843
|
|
|
|
|
|
|
|
|
844
|
|
|
|
|
|
|
=cut |
|
845
|
|
|
|
|
|
|
|
|
846
|
|
|
|
|
|
|
sub dbh { |
|
847
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
848
|
|
|
|
|
|
|
$self->{_dbh} = $v if(defined($v)); |
|
849
|
|
|
|
|
|
|
return $self->{_dbh}; |
|
850
|
|
|
|
|
|
|
} |
|
851
|
|
|
|
|
|
|
|
|
852
|
|
|
|
|
|
|
=head2 table() |
|
853
|
|
|
|
|
|
|
|
|
854
|
|
|
|
|
|
|
Sets and Retrieves the default table to use in our lookups |
|
855
|
|
|
|
|
|
|
|
|
856
|
|
|
|
|
|
|
=cut |
|
857
|
|
|
|
|
|
|
|
|
858
|
|
|
|
|
|
|
sub table { |
|
859
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
860
|
|
|
|
|
|
|
$self->{_table} = $v if(defined($v)); |
|
861
|
|
|
|
|
|
|
return $self->{_table}; |
|
862
|
|
|
|
|
|
|
} |
|
863
|
|
|
|
|
|
|
|
|
864
|
|
|
|
|
|
|
=head2 vid() |
|
865
|
|
|
|
|
|
|
|
|
866
|
|
|
|
|
|
|
Sets and Retrieves the Verification ID |
|
867
|
|
|
|
|
|
|
|
|
868
|
|
|
|
|
|
|
=cut |
|
869
|
|
|
|
|
|
|
|
|
870
|
|
|
|
|
|
|
sub vid { |
|
871
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
872
|
|
|
|
|
|
|
$self->{_vid} = $v if(defined($v)); |
|
873
|
|
|
|
|
|
|
return $self->{_vid}; |
|
874
|
|
|
|
|
|
|
} |
|
875
|
|
|
|
|
|
|
|
|
876
|
|
|
|
|
|
|
=head2 type() |
|
877
|
|
|
|
|
|
|
|
|
878
|
|
|
|
|
|
|
Sets and Retrieves the type of data we are working with (usually the other table name). |
|
879
|
|
|
|
|
|
|
|
|
880
|
|
|
|
|
|
|
=cut |
|
881
|
|
|
|
|
|
|
|
|
882
|
|
|
|
|
|
|
sub type { |
|
883
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
884
|
|
|
|
|
|
|
$self->{_type} = $v if(defined($v)); |
|
885
|
|
|
|
|
|
|
return $self->{_type}; |
|
886
|
|
|
|
|
|
|
} |
|
887
|
|
|
|
|
|
|
|
|
888
|
|
|
|
|
|
|
|
|
889
|
|
|
|
|
|
|
=head2 type_id() |
|
890
|
|
|
|
|
|
|
|
|
891
|
|
|
|
|
|
|
Sets and Retrieves the key id for the type of data we are working with (the key in the other table). |
|
892
|
|
|
|
|
|
|
|
|
893
|
|
|
|
|
|
|
=cut |
|
894
|
|
|
|
|
|
|
|
|
895
|
|
|
|
|
|
|
sub type_id { |
|
896
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
897
|
|
|
|
|
|
|
$self->{_type_id} = $v if(defined($v)); |
|
898
|
|
|
|
|
|
|
return $self->{_type_id}; |
|
899
|
|
|
|
|
|
|
} |
|
900
|
|
|
|
|
|
|
|
|
901
|
|
|
|
|
|
|
=head2 verified() |
|
902
|
|
|
|
|
|
|
|
|
903
|
|
|
|
|
|
|
Sets and Retrieves the objects verification status |
|
904
|
|
|
|
|
|
|
|
|
905
|
|
|
|
|
|
|
=cut |
|
906
|
|
|
|
|
|
|
|
|
907
|
|
|
|
|
|
|
sub verified { |
|
908
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
909
|
|
|
|
|
|
|
$self->{_verified} = $v if(defined($v)); |
|
910
|
|
|
|
|
|
|
return $self->{_verified}; |
|
911
|
|
|
|
|
|
|
} |
|
912
|
|
|
|
|
|
|
|
|
913
|
|
|
|
|
|
|
=head2 dt_added() |
|
914
|
|
|
|
|
|
|
|
|
915
|
|
|
|
|
|
|
Sets and Retrieves the date our vid was added. Returns a Time::Timestamp object |
|
916
|
|
|
|
|
|
|
|
|
917
|
|
|
|
|
|
|
=cut |
|
918
|
|
|
|
|
|
|
|
|
919
|
|
|
|
|
|
|
sub dt_added { |
|
920
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
921
|
|
|
|
|
|
|
$self->{_dt_added} = Time::Timestamp->new(ts => $v) if(defined($v)); |
|
922
|
|
|
|
|
|
|
return $self->{_dt_added}; |
|
923
|
|
|
|
|
|
|
} |
|
924
|
|
|
|
|
|
|
|
|
925
|
|
|
|
|
|
|
=head2 dt_updated() |
|
926
|
|
|
|
|
|
|
|
|
927
|
|
|
|
|
|
|
Sets and Retrieves the date our vid was last updated. Returns a Time::Timestamp object |
|
928
|
|
|
|
|
|
|
|
|
929
|
|
|
|
|
|
|
=cut |
|
930
|
|
|
|
|
|
|
|
|
931
|
|
|
|
|
|
|
sub dt_updated { |
|
932
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
933
|
|
|
|
|
|
|
$self->{_dt_updated} = Time::Timestamp->new(ts => $v) if(defined($v)); |
|
934
|
|
|
|
|
|
|
return $self->{_dt_updated}; |
|
935
|
|
|
|
|
|
|
} |
|
936
|
|
|
|
|
|
|
|
|
937
|
|
|
|
|
|
|
=head2 verified_by() |
|
938
|
|
|
|
|
|
|
|
|
939
|
|
|
|
|
|
|
Sets and Retrieves who last set our verified field |
|
940
|
|
|
|
|
|
|
|
|
941
|
|
|
|
|
|
|
=cut |
|
942
|
|
|
|
|
|
|
|
|
943
|
|
|
|
|
|
|
sub verified_by { |
|
944
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
945
|
|
|
|
|
|
|
$self->{_verified_by} = $v if(defined($v)); |
|
946
|
|
|
|
|
|
|
return $self->{_verified_by}; |
|
947
|
|
|
|
|
|
|
} |
|
948
|
|
|
|
|
|
|
|
|
949
|
|
|
|
|
|
|
=head2 verified_by_ip() |
|
950
|
|
|
|
|
|
|
|
|
951
|
|
|
|
|
|
|
Sets and Retrieves what ip was used to set our last verified field. Returns a Net::IP object. Accepts Big::Int's. |
|
952
|
|
|
|
|
|
|
|
|
953
|
|
|
|
|
|
|
=cut |
|
954
|
|
|
|
|
|
|
|
|
955
|
|
|
|
|
|
|
sub verified_by_ip { |
|
956
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
957
|
|
|
|
|
|
|
if($v){ |
|
958
|
|
|
|
|
|
|
$v = Net::IP::bintoip(Net::IP::inttobin($v)) if($v =~ /^\d+$/); |
|
959
|
|
|
|
|
|
|
$self->{_verified_by_ip} = Net::IP->new($v); |
|
960
|
|
|
|
|
|
|
} |
|
961
|
|
|
|
|
|
|
return $self->{_verified_by_ip}; |
|
962
|
|
|
|
|
|
|
} |
|
963
|
|
|
|
|
|
|
|
|
964
|
|
|
|
|
|
|
=head2 msg() |
|
965
|
|
|
|
|
|
|
|
|
966
|
|
|
|
|
|
|
Sets and Retrieves an optional msg that explains what needs verifying (ie: the body used to be sent in a $self->requestVerification() email. |
|
967
|
|
|
|
|
|
|
|
|
968
|
|
|
|
|
|
|
=cut |
|
969
|
|
|
|
|
|
|
|
|
970
|
|
|
|
|
|
|
sub msg { |
|
971
|
|
|
|
|
|
|
my ($self,$v) = @_; |
|
972
|
|
|
|
|
|
|
$self->{_msg} = $v if(defined($v)); |
|
973
|
|
|
|
|
|
|
return $self->{_msg}; |
|
974
|
|
|
|
|
|
|
} |
|
975
|
|
|
|
|
|
|
|
|
976
|
|
|
|
|
|
|
1; |
|
977
|
|
|
|
|
|
|
__END__ |