'type' => 'select',
'select_hash' => [ '' => '',
'usps' => 'U.S. Postal Service',
- 'ezlocate' => 'EZLocate',
'tomtom' => 'TomTom',
'melissa' => 'Melissa WebSmart',
],
{
'key' => 'tomtom-userid',
'section' => 'UI',
- 'description' => 'TomTom geocoding service API key. See <a href="http://www.tomtom.com/">the TomTom website</a> to obtain a key. This is recommended for addresses in the United States only.',
+ 'description' => 'TomTom geocoding service API key. See <a href="http://geocoder.tomtom.com/">the TomTom website</a> to obtain a key. This is recommended for addresses in the United States only.',
'type' => 'text',
},
{
- 'key' => 'ezlocate-userid',
- 'section' => 'UI',
- 'description' => 'User ID for EZ-Locate service. See <a href="http://www.geocode.com/">the TomTom website</a> for access and pricing information.',
- 'type' => 'text',
- },
-
- {
- 'key' => 'ezlocate-password',
- 'section' => 'UI',
- 'description' => 'Password for EZ-Locate service.',
- 'type' => 'text'
- },
-
- {
'key' => 'melissa-userid',
'section' => 'UI', # it's really not...
'description' => 'User ID for Melissa WebSmart service. See <a href="http://www.melissadata.com/">the Melissa website</a> for access and pricing.',
addr_clean=> 'Y' }
}
-my %ezlocate_error = ( # USA_Geo_002 documentation
- 10 => 'State not found',
- 11 => 'City not found',
- 12 => 'Invalid street address',
- 14 => 'Street name not found',
- 15 => 'Address range does not exist',
- 16 => 'Ambiguous address',
- 17 => 'Intersection not found', #unused?
-);
-
-sub standardize_ezlocate {
- my $self = shift;
- my $location = shift;
- my $class;
- #if ( $location->{country} eq 'US' ) {
- # $class = 'USA_Geo_004Tool';
- #}
- #elsif ( $location->{country} eq 'CA' ) {
- # $class = 'CAN_Geo_001Tool';
- #}
- #else { # shouldn't be a fatal error, just pass through unverified address
- # warn "standardize_teleatlas: address lookup in '".$location->{country}.
- # "' not available\n";
- # return $location;
- #}
- #my $path = $conf->config('teleatlas-path') || '';
- #local @INC = (@INC, $path);
- #eval "use $class;";
- #if ( $@ ) {
- # die "Loading $class failed:\n$@".
- # "\nMake sure the TeleAtlas Perl SDK is installed correctly.\n";
- #}
-
- $class = 'Geo::EZLocate'; # use our own library
- eval "use $class 0.02"; #Geo::EZLocate 0.02 for error handling
- die $@ if $@;
-
- my $userid = $conf->config('ezlocate-userid')
- or die "no ezlocate-userid configured\n";
- my $password = $conf->config('ezlocate-password')
- or die "no ezlocate-password configured\n";
-
- my $tool = $class->new($userid, $password);
- my $match = $tool->findAddress(
- $location->{address1},
- $location->{city},
- $location->{state},
- $location->{zip}, #12345-6789 format is allowed
- );
- warn "ezlocate returned match:\n".Dumper($match) if $DEBUG > 1;
- # error handling - B codes indicate success
- die $ezlocate_error{$match->{MAT_STAT}}."\n"
- unless $match->{MAT_STAT} =~ /^B\d$/;
-
- my %result = (
- address1 => $match->{MAT_ADDR},
- address2 => $location->{address2},
- city => $match->{MAT_CITY},
- state => $match->{MAT_ST},
- country => $location->{country},
- zip => $match->{MAT_ZIP},
- latitude => $match->{MAT_LAT},
- longitude => $match->{MAT_LON},
- censustract => $match->{FIPS_ST}.$match->{FIPS_CTY}.
- sprintf('%07.2f',$match->{CEN_TRCT}),
- addr_clean => 'Y',
- );
- if ( $match->{STD_ADDR} ) {
- # then they have a postal standardized address for us
- %result = ( %result,
- address1 => $match->{STD_ADDR},
- address2 => $location->{address2},
- city => $match->{STD_CITY},
- state => $match->{STD_ST},
- zip => $match->{STD_ZIP}.'-'.$match->{STD_P4},
- );
- }
-
- \%result;
-}
-
sub _tomtom_query { # helper method for the below
my %args = @_;
my $result = Geo::TomTom::Geocoding->query(%args);
{ field => 'agent_type',
type => 'select-agent_type',
disabled => ! $acl_edit_global,
- #XXX ??? 'element_name' => 'agent_type',
element_etc => 'size="10"',
multiple => '1', #cause edit.html is dum
curr_value_callback => sub {
--- /dev/null
+<& elements/search.html,
+ title => 'Contacts',
+ name_singular => 'contact',
+ query => { select => $select,
+ table => 'contact',
+ addl_from => $addl_from,
+ hashref => \%hash,
+ extra_sql => $extra_sql,
+ },
+ count_query => "SELECT COUNT(*) FROM contact $extra_sql", #XXX
+ header => [ 'First', 'Last', 'Title', 'Company', 'Self-service', ],
+ fields => [ 'first', 'last', 'title', 'company', 'selfservice_access' ],
+ links => [ '', '', '', $company_link, '', ],
+&>
+<%init>
+
+my $select = 'contact.*';
+my %hash = ();
+my $addl_from = '';
+
+my $company_link = '';
+
+if ( $cgi->param('selfservice_access') eq 'Y' ) {
+ $hash{'selfservice_access'} = 'Y';
+}
+
+my $extra_sql = '';
+if ( $cgi->param('cust_main') ) {
+ $select .= ', cust_main.company';
+ $addl_from = ' LEFT JOIN cust_main USING ( custnum )';
+ $extra_sql = ' custnum IS NOT NULL ';
+ $company_link = [ $p.'view/cust_main.cgi?', 'custnum' ];
+} elsif ( $cgi->param('prospect_main') ) {
+ $select .= ', prospect_main.company';
+ $addl_from = ' LEFT JOIN prospect_main USING ( prospectnum )';
+ $extra_sql = ' prospectnum IS NOT NULL ';
+ $company_link = [ $p.'view/prospect_main.html?', 'prospectnum' ];
+}
+
+$extra_sql = (keys(%hash) ? ' AND ' : ' WHERE '). $extra_sql
+ if $extra_sql;
+
+</%init>
#listref of column labels, <TH>
#recommended unless 'query' is an SQL query string
- # (if not specified the database column names will be used)
+ # (if not specified the database column names will be used) (XXX this is not currently working either)
'header' => [ '#',
'Item',
{ 'label' => 'Another Item',
],
#listref - each item is a literal column name (or method) or coderef
- #if not specified all columns will be shown
+ #if not specified all columns will be shown (XXX this is not currently working?)
'fields' => [
'column',
sub { my $row = shift; $row->column; },
'agent_pos' => 3, # optional position (starting from 0) to
# insert an Agent column (query needs to be a
# qsearch hashref and header & fields need to
- # be defined)
+ # be defined)cust_pkg_susp.html
# sort, link & display properties for fields
# or a listref of link and method name to append,
# or a listref of link and coderef to run and append
# or a coderef that returns such a listref
- 'links' => [],`
+ 'links' => [],
#listref - each item is the empty string,
# or a string onClick handler for the corresponding link
+++ /dev/null
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
-#
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
-# <sales@bestpractical.com>
-#
-# (Except where explicitly superseded by other copyright notices)
-#
-#
-# LICENSE:
-#
-# This work is made available to you under the terms of Version 2 of
-# the GNU General Public License. A copy of that license should have
-# been provided with this software, but in any event can be snarfed
-# from www.gnu.org.
-#
-# This work is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301 or visit their web page on the internet at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-#
-#
-# CONTRIBUTION SUBMISSION POLICY:
-#
-# (The following paragraph is not intended to limit the rights granted
-# to you to modify and distribute this software under the terms of
-# the GNU General Public License and is only of importance to you if
-# you choose to contribute your changes and enhancements to the
-# community by submitting them to Best Practical Solutions, LLC.)
-#
-# By intentionally submitting any modifications, corrections or
-# derivatives to this work, or any other work intended for use with
-# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-# you are the copyright holder for those contributions and you grant
-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
-# royalty-free, perpetual, license to use, copy, create derivative
-# works based on those contributions, and sublicense and distribute
-# those contributions and any derivatives thereof.
-#
-# END BPS TAGGED BLOCK }}}
-use strict;
-use warnings;
-
-use lib "/opt/rt3/local/lib";
-use lib "/opt/rt3/lib";
-
-
-use RT;
-RT::LoadConfig();
-RT::Init();
-
-use RT::Queues;
-
-my $queues = RT::Queues->new( RT->SystemUser );
-$queues->UnLimit();
-while ( my $queue = $queues->Next ) {
- print "Processing queue ". ($queue->Name || $queue->id) ."...\n";
- my $old_attr = $queue->FirstAttribute('BrandedSubjectTag');
- unless ( $old_attr ) {
- print "\thas no old-style subject tag. skipping\n";
- next;
- }
- my $old_value = $old_attr->Content;
- unless ( $old_value ) {
- print "\thas empty old-style subject tag\n";
- } else {
- my ($status, $msg) = $queue->SetSubjectTag( $old_value );
- unless ( $status ) {
- print STDERR "\tERROR. Couldn't set tag: $msg\n";
- next;
- } else {
- print "\thave set new-style subject tag to '$old_value'\n";
- }
- }
-
- my ($status, $msg) = $queue->DeleteAttribute('BrandedSubjectTag');
- unless ( $status ) {
- print STDERR "\tERROR. Couldn't delete old-style tag: $msg\n";
- next;
- } else {
- print "\tdeleted old-style tag entry\n";
- }
- print "\tDONE\n";
-}
-
-exit 0;
-
+++ /dev/null
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
-#
-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
-# <sales@bestpractical.com>
-#
-# (Except where explicitly superseded by other copyright notices)
-#
-#
-# LICENSE:
-#
-# This work is made available to you under the terms of Version 2 of
-# the GNU General Public License. A copy of that license should have
-# been provided with this software, but in any event can be snarfed
-# from www.gnu.org.
-#
-# This work is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301 or visit their web page on the internet at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-#
-#
-# CONTRIBUTION SUBMISSION POLICY:
-#
-# (The following paragraph is not intended to limit the rights granted
-# to you to modify and distribute this software under the terms of
-# the GNU General Public License and is only of importance to you if
-# you choose to contribute your changes and enhancements to the
-# community by submitting them to Best Practical Solutions, LLC.)
-#
-# By intentionally submitting any modifications, corrections or
-# derivatives to this work, or any other work intended for use with
-# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-# you are the copyright holder for those contributions and you grant
-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
-# royalty-free, perpetual, license to use, copy, create derivative
-# works based on those contributions, and sublicense and distribute
-# those contributions and any derivatives thereof.
-#
-# END BPS TAGGED BLOCK }}}
-use strict;
-use warnings;
-
-use lib "/opt/rt3/local/lib";
-use lib "/opt/rt3/lib";
-
-
-use RT;
-RT::LoadConfig();
-RT::Init();
-
-use RT::Attributes;
-my $attrs = RT::Attributes->new( RT->SystemUser );
-$attrs->Limit(FIELD => 'ObjectType', OPERATOR=> '=', VALUE => 'RT::User');
-$attrs->Limit(FIELD => 'Name', OPERATOR=> '=', VALUE => 'ical-auth-token');
-while ( my $attr = $attrs->Next ) {
- my $uid = $attr->ObjectId;
- print "Processing auth token of user #". $uid ."...\n";
-
- my $user = RT::User->new( RT->SystemUser );
- $user->Load( $uid );
- unless ( $user->id ) {
- print STDERR "\tERROR. Couldn't load user record\n";
- next;
- }
-
- my ($status, $msg);
-
- ($status, $msg) = $user->DeleteAttribute('AuthToken')
- if $user->FirstAttribute('AuthToken');
- unless ( $status ) {
- print STDERR "\tERROR. Couldn't delete duplicated attribute: $msg\n";
- next;
- } else {
- print "\tdeleted duplicate attribute\n";
- }
-
- ($status, $msg) = $attr->SetName('AuthToken');
- unless ( $status ) {
- print STDERR "\tERROR. Couldn't rename attribute: $msg\n";
- next;
- } else {
- print "\trenamed attribute\n";
- }
- print "\tDONE\n";
-}
-
-exit 0;
+++ /dev/null
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
-#
-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
-# <sales@bestpractical.com>
-#
-# (Except where explicitly superseded by other copyright notices)
-#
-#
-# LICENSE:
-#
-# This work is made available to you under the terms of Version 2 of
-# the GNU General Public License. A copy of that license should have
-# been provided with this software, but in any event can be snarfed
-# from www.gnu.org.
-#
-# This work is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301 or visit their web page on the internet at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-#
-#
-# CONTRIBUTION SUBMISSION POLICY:
-#
-# (The following paragraph is not intended to limit the rights granted
-# to you to modify and distribute this software under the terms of
-# the GNU General Public License and is only of importance to you if
-# you choose to contribute your changes and enhancements to the
-# community by submitting them to Best Practical Solutions, LLC.)
-#
-# By intentionally submitting any modifications, corrections or
-# derivatives to this work, or any other work intended for use with
-# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-# you are the copyright holder for those contributions and you grant
-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
-# royalty-free, perpetual, license to use, copy, create derivative
-# works based on those contributions, and sublicense and distribute
-# those contributions and any derivatives thereof.
-#
-# END BPS TAGGED BLOCK }}}
-use strict;
-use warnings;
-
-use lib "/opt/rt3/local/lib";
-use lib "/opt/rt3/lib";
-
-use RT;
-RT::LoadConfig();
-RT->Config->Set('LogToScreen' => 'debug');
-RT::Init();
-
-$| = 1;
-
-if (my $re = RT->Config->Get('RTAddressRegexp')) {
- print "No need to use this script, you already have RTAddressRegexp set to $re\n";
- exit;
-}
-
-use RT::Queues;
-my $queues = RT::Queues->new( RT->SystemUser );
-$queues->UnLimit;
-
-my %merged;
-merge(\%merged, RT->Config->Get('CorrespondAddress'), RT->Config->Get('CommentAddress'));
-while ( my $queue = $queues->Next ) {
- merge(\%merged, $queue->CorrespondAddress, $queue->CommentAddress);
-}
-
-my @domains;
-for my $domain (sort keys %merged) {
- my @addresses;
- for my $base (sort keys %{$merged{$domain}}) {
- my @subbits = keys(%{$merged{$domain}{$base}});
- if (@subbits > 1) {
- push @addresses, "\Q$base\E(?:".join("|",@subbits).")";
- } else {
- push @addresses, "\Q$base\E$subbits[0]";
- }
- }
- if (@addresses > 1) {
- push @domains, "(?:".join("|", @addresses).")\Q\@".$domain."\E";
- } else {
- push @domains, "$addresses[0]\Q\@$domain\E";
- }
-}
-my $re = join "|", @domains;
-
-print <<ENDDESCRIPTION;
-You can add the following to RT_SiteConfig.pm, but may want to collapse it into a more efficient regexp.
-Keep in mind that this only contains the email addresses that RT knows about, you should also examine
-your mail system for aliases that reach RT but which RT doesn't know about.
-ENDDESCRIPTION
-print "Set(\$RTAddressRegexp,qr{^(?:${re})\$}i);\n";
-
-sub merge {
- my $merged = shift;
- for my $address (grep {defined and length} @_) {
- $address =~ /^\s*(.*?)(-comments?)?\@(.*?)\s*$/;
- $merged->{lc $3}{$1}{$2||''}++;
- }
-}
+++ /dev/null
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
-#
-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
-# <sales@bestpractical.com>
-#
-# (Except where explicitly superseded by other copyright notices)
-#
-#
-# LICENSE:
-#
-# This work is made available to you under the terms of Version 2 of
-# the GNU General Public License. A copy of that license should have
-# been provided with this software, but in any event can be snarfed
-# from www.gnu.org.
-#
-# This work is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301 or visit their web page on the internet at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-#
-#
-# CONTRIBUTION SUBMISSION POLICY:
-#
-# (The following paragraph is not intended to limit the rights granted
-# to you to modify and distribute this software under the terms of
-# the GNU General Public License and is only of importance to you if
-# you choose to contribute your changes and enhancements to the
-# community by submitting them to Best Practical Solutions, LLC.)
-#
-# By intentionally submitting any modifications, corrections or
-# derivatives to this work, or any other work intended for use with
-# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-# you are the copyright holder for those contributions and you grant
-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
-# royalty-free, perpetual, license to use, copy, create derivative
-# works based on those contributions, and sublicense and distribute
-# those contributions and any derivatives thereof.
-#
-# END BPS TAGGED BLOCK }}}
-use strict;
-use warnings;
-
-use lib "/opt/rt3/local/lib";
-use lib "/opt/rt3/lib";
-
-use RT;
-RT::LoadConfig();
-RT->Config->Set('LogToScreen' => 'debug');
-RT::Init();
-
-$| = 1;
-
-$RT::Handle->BeginTransaction();
-
-use RT::CustomFields;
-my $CFs = RT::CustomFields->new( RT->SystemUser );
-$CFs->UnLimit;
-$CFs->Limit( FIELD => 'Type', VALUE => 'Select' );
-
-my $seen;
-while (my $cf = $CFs->Next ) {
- next if $cf->BasedOnObj->Id;
- my @categories;
- my %mapping;
- my $values = $cf->Values;
- while (my $value = $values->Next) {
- next unless defined $value->Category and length $value->Category;
- push @categories, $value->Category unless grep {$_ eq $value->Category} @categories;
- $mapping{$value->Name} = $value->Category;
- }
- next unless @categories;
-
- $seen++;
- print "Found CF '@{[$cf->Name]}' with categories:\n";
- print " $_\n" for @categories;
-
- print "Split this CF's categories into a hierarchical custom field (Y/n)? ";
- my $dothis = <>;
- next if $dothis =~ /n/i;
-
- print "Enter name of CF to create as category ('@{[$cf->Name]} category'): ";
- my $newname = <>;
- chomp $newname;
- $newname = $cf->Name . " category" unless length $newname;
-
- # bump the CF's sort oder up by one
- $cf->SetSortOrder( ($cf->SortOrder || 0) + 1 );
-
- # ..and add a new CF before it
- my $new = RT::CustomField->new( RT->SystemUser );
- my ($id, $msg) = $new->Create(
- Name => $newname,
- Type => 'Select',
- MaxValues => 1,
- LookupType => $cf->LookupType,
- SortOrder => $cf->SortOrder - 1,
- );
- die "Can't create custom field '$newname': $msg" unless $id;
-
- # Set the CF to be based on what we just made
- $cf->SetBasedOn( $new->Id );
-
- # Apply it to all of the same things
- {
- my $ocfs = RT::ObjectCustomFields->new( RT->SystemUser );
- $ocfs->LimitToCustomField( $cf->Id );
- while (my $ocf = $ocfs->Next) {
- my $newocf = RT::ObjectCustomField->new( RT->SystemUser );
- ($id, $msg) = $newocf->Create(
- SortOrder => $ocf->SortOrder,
- CustomField => $new->Id,
- ObjectId => $ocf->ObjectId,
- );
- die "Can't create ObjectCustomField: $msg" unless $id;
- }
- }
-
- # Copy over all of the rights
- {
- my $acl = RT::ACL->new( RT->SystemUser );
- $acl->LimitToObject( $cf );
- while (my $ace = $acl->Next) {
- my $newace = RT::ACE->new( RT->SystemUser );
- ($id, $msg) = $newace->Create(
- PrincipalId => $ace->PrincipalId,
- PrincipalType => $ace->PrincipalType,
- RightName => $ace->RightName,
- Object => $new,
- );
- die "Can't assign rights: $msg" unless $id;
- }
- }
-
- # Add values for all of the categories
- for my $i (0..$#categories) {
- ($id, $msg) = $new->AddValue(
- Name => $categories[$i],
- SortOrder => $i + 1,
- );
- die "Can't create custom field value: $msg" unless $id;
- }
-
- # Grovel through all ObjectCustomFieldValues, and add the
- # appropriate category
- {
- my $ocfvs = RT::ObjectCustomFieldValues->new( RT->SystemUser );
- $ocfvs->LimitToCustomField( $cf->Id );
- while (my $ocfv = $ocfvs->Next) {
- next unless exists $mapping{$ocfv->Content};
- my $newocfv = RT::ObjectCustomFieldValue->new( RT->SystemUser );
- ($id, $msg) = $newocfv->Create(
- CustomField => $new->Id,
- ObjectType => $ocfv->ObjectType,
- ObjectId => $ocfv->ObjectId,
- Content => $mapping{$ocfv->Content},
- );
- }
- }
-}
-
-$RT::Handle->Commit;
-print "No custom fields with categories found\n" unless $seen;
+++ /dev/null
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
-#
-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
-# <sales@bestpractical.com>
-#
-# (Except where explicitly superseded by other copyright notices)
-#
-#
-# LICENSE:
-#
-# This work is made available to you under the terms of Version 2 of
-# the GNU General Public License. A copy of that license should have
-# been provided with this software, but in any event can be snarfed
-# from www.gnu.org.
-#
-# This work is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301 or visit their web page on the internet at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-#
-#
-# CONTRIBUTION SUBMISSION POLICY:
-#
-# (The following paragraph is not intended to limit the rights granted
-# to you to modify and distribute this software under the terms of
-# the GNU General Public License and is only of importance to you if
-# you choose to contribute your changes and enhancements to the
-# community by submitting them to Best Practical Solutions, LLC.)
-#
-# By intentionally submitting any modifications, corrections or
-# derivatives to this work, or any other work intended for use with
-# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-# you are the copyright holder for those contributions and you grant
-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
-# royalty-free, perpetual, license to use, copy, create derivative
-# works based on those contributions, and sublicense and distribute
-# those contributions and any derivatives thereof.
-#
-# END BPS TAGGED BLOCK }}}
-use strict;
-use warnings;
-
-use lib "/opt/rt3/local/lib";
-use lib "/opt/rt3/lib";
-
-use RT;
-RT::LoadConfig;
-RT::Init;
-
-$| = 1;
-
-use Getopt::Long;
-use Digest::SHA;
-my $fix;
-GetOptions("fix!" => \$fix);
-
-use RT::Users;
-my $users = RT::Users->new( $RT::SystemUser );
-$users->Limit(
- FIELD => 'Password',
- OPERATOR => 'IS NOT',
- VALUE => 'NULL',
- ENTRYAGGREGATOR => 'AND',
-);
-$users->Limit(
- FIELD => 'Password',
- OPERATOR => '!=',
- VALUE => '*NO-PASSWORD*',
- ENTRYAGGREGATOR => 'AND',
-);
-$users->Limit(
- FIELD => 'Password',
- OPERATOR => 'NOT STARTSWITH',
- VALUE => '!',
- ENTRYAGGREGATOR => 'AND',
-);
-push @{$users->{'restrictions'}{ "main.Password" }}, "AND", {
- field => 'LENGTH(main.Password)',
- op => '<',
- value => '40',
-};
-
-# we want to update passwords on disabled users
-$users->{'find_disabled_rows'} = 1;
-
-my $count = $users->Count;
-if ($count == 0) {
- print "No users with unsalted or weak cryptography found.\n";
- exit 0;
-}
-
-if ($fix) {
- print "Upgrading $count users...\n";
- while (my $u = $users->Next) {
- my $stored = $u->__Value("Password");
- my $raw;
- if (length $stored == 32) {
- $raw = pack("H*",$stored);
- } elsif (length $stored == 22) {
- $raw = MIME::Base64::decode_base64($stored);
- } elsif (length $stored == 13) {
- printf "%20s => Old crypt() format, cannot upgrade\n", $u->Name;
- } else {
- printf "%20s => Unknown password format!\n", $u->Name;
- }
- next unless $raw;
-
- my $salt = pack("C4",map{int rand(256)} 1..4);
- my $sha = Digest::SHA::sha256(
- $salt . $raw
- );
- $u->_Set(
- Field => "Password",
- Value => MIME::Base64::encode_base64(
- $salt . substr($sha,0,26), ""),
- );
- }
- print "Done.\n";
- exit 0;
-} else {
- if ($count < 20) {
- print "$count users found with unsalted or weak-cryptography passwords:\n";
- print " Id | Name\n", "-"x9, "+", "-"x9, "\n";
- while (my $u = $users->Next) {
- printf "%8d | %s\n", $u->Id, $u->Name;
- }
- } else {
- print "$count users found with unsalted or weak-cryptography passwords\n";
- }
-
- print "\n", "Run again with --fix to upgrade.\n";
- exit 1;
-}
+++ /dev/null
-ServerRoot %%SERVER_ROOT%%
-PidFile %%PID_FILE%%
-LockFile %%LOCK_FILE%%
-ServerAdmin root@localhost
-
-%%LOAD_MODULES%%
-
-<IfModule !mpm_netware_module>
-<IfModule !mpm_winnt_module>
-User freeside
-Group freeside
-</IfModule>
-</IfModule>
-
-ServerName localhost
-Listen %%LISTEN%%
-
-ErrorLog "%%LOG_FILE%%"
-LogLevel debug
-
-<Directory />
- Options FollowSymLinks
- AllowOverride None
- Order deny,allow
- Deny from all
-</Directory>
-
-AddDefaultCharset UTF-8
-
-FastCgiServer %%RT_SBIN_PATH%%/rt-server.fcgi \
- -socket %%TMP_DIR%%/socket \
- -processes 1 \
- -idle-timeout 180 \
- -initial-env RT_SITE_CONFIG=%%RT_SITE_CONFIG%% \
- -initial-env RT_TESTING=1
-
-Alias /NoAuth/images/ %%DOCUMENT_ROOT%%/NoAuth/images/
-ScriptAlias / %%RT_SBIN_PATH%%/rt-server.fcgi/
-
-DocumentRoot "%%DOCUMENT_ROOT%%"
-<Location />
- Order allow,deny
- Allow from all
-
-%%BASIC_AUTH%%
-
- Options +ExecCGI
- AddHandler fastcgi-script fcgi
-</Location>
-
+++ /dev/null
-<IfModule mpm_prefork_module>
- StartServers 1
- MinSpareServers 1
- MaxSpareServers 1
- MaxClients 1
- MaxRequestsPerChild 0
-</IfModule>
-
-<IfModule mpm_worker_module>
- StartServers 1
- MinSpareThreads 1
- MaxSpareThreads 1
- ThreadLimit 1
- ThreadsPerChild 1
- MaxClients 1
- MaxRequestsPerChild 0
-</IfModule>
-
-ServerRoot %%SERVER_ROOT%%
-PidFile %%PID_FILE%%
-LockFile %%LOCK_FILE%%
-ServerAdmin root@localhost
-
-%%LOAD_MODULES%%
-
-<IfModule !mpm_netware_module>
-<IfModule !mpm_winnt_module>
-User freeside
-Group freeside
-</IfModule>
-</IfModule>
-
-ServerName localhost
-Listen %%LISTEN%%
-
-ErrorLog "%%LOG_FILE%%"
-LogLevel debug
-
-<Directory />
- Options FollowSymLinks
- AllowOverride None
- Order deny,allow
- Deny from all
-</Directory>
-
-AddDefaultCharset UTF-8
-PerlSetEnv RT_SITE_CONFIG %%RT_SITE_CONFIG%%
-
-DocumentRoot "%%DOCUMENT_ROOT%%"
-<Location />
- Order allow,deny
- Allow from all
-
-%%BASIC_AUTH%%
-
- SetHandler modperl
-
- PerlResponseHandler Plack::Handler::Apache2
- PerlSetVar psgi_app %%RT_SBIN_PATH%%/rt-server
-</Location>
-
-<Perl>
- $ENV{RT_TESTING}=1;
- use Plack::Handler::Apache2;
- Plack::Handler::Apache2->preload("%%RT_SBIN_PATH%%/rt-server");
-</Perl>
-