summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2015-08-04 11:16:41 -0700
committerMark Wells <mark@freeside.biz>2015-08-04 11:22:05 -0700
commit600e9b690d7649e8cde7a9a4cd1089fcb432d238 (patch)
tree1c4c44eb02857127fbd17e212ddfccbaf584fa21
parent4b616a57791fd6fb324194a0eb96a8f95826c533 (diff)
de-randomization fixes for testing, #37340
Conflicts: FS/FS/Conf.pm
-rw-r--r--FS/FS/Conf.pm7
-rw-r--r--FS/FS/Mason.pm2
-rw-r--r--FS/FS/Record.pm1
-rw-r--r--FS/FS/UI/Web.pm33
-rw-r--r--httemplate/elements/bill.html2
-rw-r--r--httemplate/elements/columnstart.html2
-rw-r--r--httemplate/elements/create_uri_query2
-rw-r--r--httemplate/elements/input-fcc_options.html2
-rw-r--r--httemplate/elements/pickcolor.html2
-rw-r--r--httemplate/elements/popup_link_onclick.html2
-rw-r--r--httemplate/elements/progress-init.html2
-rw-r--r--httemplate/elements/tr-input-mask.html2
-rw-r--r--httemplate/graph/elements/report.html2
13 files changed, 50 insertions, 11 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index c93608266..53459c721 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -5922,6 +5922,13 @@ and customer address. Include units.',
'type' => 'text',
},
+ {
+ 'key' => 'no_random_ids',
+ 'section' => '',
+ 'description' => 'Replace random identifiers in UI code with a static string, for repeatable testing. Don\'t use in production.',
+ 'type' => 'checkbox',
+ },
+
);
1;
diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm
index 3d577f6d2..ae4f07cdb 100644
--- a/FS/FS/Mason.pm
+++ b/FS/FS/Mason.pm
@@ -136,7 +136,7 @@ if ( -e $addl_handler_use_file ) {
use FS::Conf;
use FS::CGI qw(header menubar table itable ntable idiot
eidiot myexit http_header);
- use FS::UI::Web qw(svc_url);
+ use FS::UI::Web qw(svc_url random_id);
use FS::UI::Web::small_custview qw(small_custview);
use FS::UI::bytecount;
use FS::UI::REST qw( rest_auth rest_uri_remain encode_rest );
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index 70d4f672e..d6892a96c 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -527,6 +527,7 @@ sub qsearch {
# Check for encrypted fields and decrypt them.
## only in the local copy, not the cached object
+ no warnings 'deprecated'; # XXX silence the warning for now
if ( $conf_encryption
&& eval '@FS::'. $table . '::encrypted_fields' ) {
foreach my $record (@return) {
diff --git a/FS/FS/UI/Web.pm b/FS/FS/UI/Web.pm
index 6655f270f..13b2e2dc0 100644
--- a/FS/FS/UI/Web.pm
+++ b/FS/FS/UI/Web.pm
@@ -15,11 +15,13 @@ use FS::cust_main; # are sql_balance and sql_date_balance in the right module?
#@ISA = qw( FS::UI );
@ISA = qw( Exporter );
-@EXPORT_OK = qw( svc_url );
+@EXPORT_OK = qw( svc_url random_id );
$DEBUG = 0;
$me = '[FS::UID::Web]';
+our $NO_RANDOM_IDS;
+
###
# date parsing
###
@@ -608,6 +610,35 @@ sub is_mobile {
return 0;
}
+=item random_id [ DIGITS ]
+
+Returns a random number of length DIGITS, or if unspecified, a long random
+identifier consisting of the timestamp, process ID, and a random number.
+Anything in the UI that needs a random identifier should use this.
+
+=cut
+
+sub random_id {
+ my $digits = shift;
+ if (!defined $NO_RANDOM_IDS) {
+ my $conf = FS::Conf->new;
+ $NO_RANDOM_IDS = $conf->exists('no_random_ids') ? 1 : 0;
+ }
+ if ( $NO_RANDOM_IDS ) {
+ if ( $digits > 0 ) {
+ return 0;
+ } else {
+ return '0000000000-0000-000000000.000000';
+ }
+ } else {
+ if ($digits > 0) {
+ return int(rand(10 ** $digits));
+ } else {
+ return time . "-$$-" . rand() * 2**32;
+ }
+ }
+}
+
=back
=cut
diff --git a/httemplate/elements/bill.html b/httemplate/elements/bill.html
index 64a1a6d2c..420a7489b 100644
--- a/httemplate/elements/bill.html
+++ b/httemplate/elements/bill.html
@@ -45,7 +45,7 @@ my $label = $opt{'label'};
# formname no longer needs to be passed from outside, but we still
# need one and it needs to be unique
my $formname = $opt{'formname'} ||
- 'bill'.sprintf('%04d',int(rand(10000))).$custnum;
+ 'bill'.sprintf('%04d',random_id(4)).$custnum;
my $url = $opt{'url'} || '';
my $message = $opt{'message'} || 'Finished!';
my $bill_opts = $opt{'bill_opts'} || {};
diff --git a/httemplate/elements/columnstart.html b/httemplate/elements/columnstart.html
index 1ffbcb9e8..245c308a7 100644
--- a/httemplate/elements/columnstart.html
+++ b/httemplate/elements/columnstart.html
@@ -10,7 +10,7 @@
Pass 'aligned' => 1 to have corresponding rows in the columns line up.
</%doc>
-% my $id = sprintf('table%08d', rand(100000000));
+% my $id = sprintf('table%08d', random_id(8));
<TR>
<TD CLASS="background" COLSPAN=99>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 id="<%$id%>">
diff --git a/httemplate/elements/create_uri_query b/httemplate/elements/create_uri_query
index ce6249e0e..414d53ba4 100644
--- a/httemplate/elements/create_uri_query
+++ b/httemplate/elements/create_uri_query
@@ -18,7 +18,7 @@ my $query = $cgi->query_string;
if ( length($query) > 1920 || $opt{secure} ) { #stupid IE 2083 URL limit
- my $session = int(rand(4294967296)); #XXX
+ my $session = random_id(9);
my $pref = new FS::access_user_pref({
'usernum' => $FS::CurrentUser::CurrentUser->usernum,
'prefname' => "redirect$session",
diff --git a/httemplate/elements/input-fcc_options.html b/httemplate/elements/input-fcc_options.html
index 064c647fc..080b40f88 100644
--- a/httemplate/elements/input-fcc_options.html
+++ b/httemplate/elements/input-fcc_options.html
@@ -9,7 +9,7 @@
% }
% unless ($opt{html_only}) {
% my $popup = $fsurl.'misc/part_pkg_fcc_options.html?id=';
-% my $popup_name = 'popup-'.time. "-$$-". rand() * 2**32;
+% my $popup_name = 'popup-'.random_id();
<SCRIPT TYPE="text/javascript">
function edit_fcc_options() {
var id = this.dataset['target'];
diff --git a/httemplate/elements/pickcolor.html b/httemplate/elements/pickcolor.html
index d410ebfc7..2b0647fbf 100644
--- a/httemplate/elements/pickcolor.html
+++ b/httemplate/elements/pickcolor.html
@@ -38,7 +38,7 @@ my %opt = @_;
my $value = length($opt{curr_value}) ? $opt{curr_value} : $opt{value};
-my $unum = int(rand(100000));
+my $unum = random_id(5);
my $id = $opt{'id'} || $opt{'field'}.$unum;
diff --git a/httemplate/elements/popup_link_onclick.html b/httemplate/elements/popup_link_onclick.html
index 0690dc812..612de7520 100644
--- a/httemplate/elements/popup_link_onclick.html
+++ b/httemplate/elements/popup_link_onclick.html
@@ -62,7 +62,7 @@ $scrolling = $params->{'scrolling'} if exists $params->{'scrolling'};
#stupid safari is caching the "location" of popup iframs, and submitting them
#instead of displaying them. this should prevent that.
-my $popup_name = 'popup-'.time. "-$$-". rand() * 2**32;
+my $popup_name = 'popup-'.random_id();
my $onclick =
"overlib( OLiframeContent($action, $width, $height, '$popup_name', 0, '$scrolling' ), ".
diff --git a/httemplate/elements/progress-init.html b/httemplate/elements/progress-init.html
index 5b42aa1a8..2728240ef 100644
--- a/httemplate/elements/progress-init.html
+++ b/httemplate/elements/progress-init.html
@@ -170,6 +170,6 @@ $progress_url->query_form(
#stupid safari is caching the "location" of popup iframs, and submitting them
#instead of displaying them. this should prevent that.
-my $popup_name = 'popup-'.time. "-$$-". rand() * 2**32;
+my $popup_name = 'popup-'.random_id();
</%init>
diff --git a/httemplate/elements/tr-input-mask.html b/httemplate/elements/tr-input-mask.html
index fdd20962d..93e322c6c 100644
--- a/httemplate/elements/tr-input-mask.html
+++ b/httemplate/elements/tr-input-mask.html
@@ -68,7 +68,7 @@ my $init = 0;
<%init>
my %opt = @_;
# must have a DOM id
-my $id = $opt{id} || sprintf('input%04d',int(rand(10000)));
+my $id = $opt{id} || sprintf('input%04d',random_id(4));
my $value = length($opt{curr_value}) ? $opt{curr_value} : $opt{value} || '';
my $clipboard_hack = $FS::CurrentUser::CurrentUser->option('enable_mask_clipboard_hack');
diff --git a/httemplate/graph/elements/report.html b/httemplate/graph/elements/report.html
index cffc82816..f1b0d166d 100644
--- a/httemplate/graph/elements/report.html
+++ b/httemplate/graph/elements/report.html
@@ -331,7 +331,7 @@ if ( $cgi->param('session') =~ /^(\d+)$/ ) {
%opt = %{ $m->cache->get($session) };
}
else {
- $session = sprintf("%010d%06d", time, int(rand(1000000)));
+ $session = sprintf("%010d", random_id(10));
$m->cache->set($session, \%opt, '1h');
}