'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;
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 );
# 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) {
#@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
###
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
# 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'} || {};
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%>">
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",
% }
% 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'];
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;
#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' ), ".
#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>
<%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');
%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');
}