summaryrefslogtreecommitdiff
path: root/FS/FS/banned_pay.pm
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2015-02-24 20:53:53 -0800
committerIvan Kohler <ivan@freeside.biz>2015-02-24 20:53:53 -0800
commitc901bfbd9114865ce0c6fd76c6378e534c3616d5 (patch)
tree7245d73bde51aaf380f6b3a27ec7909b4e54f2f0 /FS/FS/banned_pay.pm
parent59fe7dfd7fa6d31c30f3458af05510041ba529e0 (diff)
banned card hashing rewrite, RT#32290, RT#23741
Diffstat (limited to 'FS/FS/banned_pay.pm')
-rw-r--r--FS/FS/banned_pay.pm74
1 files changed, 44 insertions, 30 deletions
diff --git a/FS/FS/banned_pay.pm b/FS/FS/banned_pay.pm
index 713c81a..3d51bcd 100644
--- a/FS/FS/banned_pay.pm
+++ b/FS/FS/banned_pay.pm
@@ -1,9 +1,10 @@
package FS::banned_pay;
+use base qw( FS::otaker_Mixin FS::Record );
use strict;
-use base qw( FS::otaker_Mixin FS::Record );
use Digest::MD5 qw(md5_base64);
-use FS::Record qw( qsearch qsearchs );
+use Digest::SHA qw( sha512_base64 );
+use FS::Record qw( qsearchs dbh );
use FS::CurrentUser;
=head1 NAME
@@ -33,22 +34,43 @@ supported:
=over 4
-=item bannum - primary key
+=item bannum
+
+primary key
+
+=item payby
+
+I<CARD> or I<CHEK>
+
+=item payinfo
-=item payby - I<CARD> or I<CHEK>
+fingerprint of banned card (base64-encoded MD5 or SHA512 digest)
-=item payinfo - fingerprint of banned card (base64-encoded MD5 digest)
+=item payinfo_hash
-=item _date - specified as a UNIX timestamp; see L<perlfunc/"time">. Also see
+Digest hash algorythm, currently either MD5 or SHA512. Empty implies a legacy
+MD5 hash.
+
+=item _date
+
+specified as a UNIX timestamp; see L<perlfunc/"time">. Also see
L<Time::Local> and L<Date::Parse> for conversion functions.
-=item end_date - optional end date, also specified as a UNIX timestamp.
+=item end_date
+
+optional end date, also specified as a UNIX timestamp.
+
+=item usernum
+
+order taker (assigned automatically, see L<FS::access_user>)
-=item usernum - order taker (assigned automatically, see L<FS::access_user>)
+=item bantype
-=item bantype - Ban type: "" or null (regular ban), "warn" (warning)
+Ban type: "" or null (regular ban), "warn" (warning)
-=item reason - reason (text)
+=item reason
+
+reason (text)
=back
@@ -74,27 +96,15 @@ sub table { 'banned_pay'; }
Adds this record to the database. If there is an error, returns the error,
otherwise returns false.
-=cut
-
-# the insert method can be inherited from FS::Record
-
=item delete
Delete this record from the database.
-=cut
-
-# the delete method can be inherited from FS::Record
-
=item replace OLD_RECORD
Replaces the OLD_RECORD with this one in the database. If there is an error,
returns the error, otherwise returns false.
-=cut
-
-# the replace method can be inherited from FS::Record
-
=item check
Checks all fields to make sure this is a valid ban. If there is
@@ -103,9 +113,6 @@ and replace methods.
=cut
-# the check method should currently be supplied - FS::Record contains some
-# data checking routines
-
sub check {
my $self = shift;
@@ -113,6 +120,7 @@ sub check {
$self->ut_numbern('bannum')
|| $self->ut_enum('payby', [ 'CARD', 'CHEK' ] )
|| $self->ut_text('payinfo')
+ || $self->ut_enum('payinfo_hash', [ '', 'MD5', 'SHA512' ] )
|| $self->ut_numbern('_date')
|| $self->ut_numbern('end_date')
|| $self->ut_enum('bantype', [ '', 'warn' ] )
@@ -144,11 +152,17 @@ sub ban_search {
my( $class, %opt ) = @_;
qsearchs({
'table' => 'banned_pay',
- 'hashref' => {
- 'payby' => $opt{payby},
- 'payinfo' => md5_base64($opt{payinfo}),
- },
- 'extra_sql' => 'AND ( end_date IS NULL OR end_date >= '. time. ' ) ',
+ 'hashref' => { 'payby' => $opt{payby}, },
+ 'extra_sql' => "
+ AND (((payinfo_hash IS NULL OR payinfo_hash = '' OR payinfo_hash = 'MD5')
+ AND payinfo = ". dbh->quote( md5_base64($opt{payinfo}) ). "
+ )
+ OR
+ (payinfo_hash = 'SHA256'
+ AND payinfo = ". dbh->quote( sha512_base64($opt{payinfo}) ). "
+ )
+ )
+ AND ( end_date IS NULL OR end_date >= ". time. " ) ",
});
}