diff options
Diffstat (limited to 'FS')
| -rw-r--r-- | FS/FS/Conf.pm | 7 | ||||
| -rw-r--r-- | FS/FS/Mason.pm | 3 | ||||
| -rw-r--r-- | FS/FS/TicketSystem/RT_External.pm | 5 | ||||
| -rw-r--r-- | FS/FS/TicketSystem/RT_Internal.pm | 111 | 
4 files changed, 125 insertions, 1 deletions
| diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 10f5d0449..70dfa6851 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -2881,6 +2881,13 @@ worry that config_items is freeside-specific and icky.      'type'        => 'checkbox',    }, +  { +    'key'         => 'rt-crontool', +    'section'     => '', +    'description' => 'Enable the RT CronTool extension.', +    'type'        => 'checkbox', +  }, +  );  1; diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index cce2dbf21..5e77b9893 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -384,6 +384,9 @@ sub mason_interps {                          ${$_[0]} = "'". ${$_[0]}. "'";                        }                      }, +    compiler     => HTML::Mason::Compiler::ToObject->new( +                      allow_globals        => [qw(%session)], +                    ),    );    my $rt_interp = new HTML::Mason::Interp ( diff --git a/FS/FS/TicketSystem/RT_External.pm b/FS/FS/TicketSystem/RT_External.pm index 3a9c7e82d..c788c03a1 100644 --- a/FS/FS/TicketSystem/RT_External.pm +++ b/FS/FS/TicketSystem/RT_External.pm @@ -349,5 +349,10 @@ sub transaction_status {    $self->_retrieve_single_value($sql);  } +sub access_right { +  warn "WARNING: no access rights available w/ external RT"; +  0; +} +  1; diff --git a/FS/FS/TicketSystem/RT_Internal.pm b/FS/FS/TicketSystem/RT_Internal.pm index d24a96c04..6ac3fc61f 100644 --- a/FS/FS/TicketSystem/RT_Internal.pm +++ b/FS/FS/TicketSystem/RT_Internal.pm @@ -1,13 +1,16 @@  package FS::TicketSystem::RT_Internal;  use strict; -use vars qw( @ISA ); +use vars qw( @ISA $DEBUG );  use FS::UID qw(dbh);  use FS::CGI qw(popurl);  use FS::TicketSystem::RT_Libs; +use RT::CurrentUser;  @ISA = qw( FS::TicketSystem::RT_Libs ); +$DEBUG = 1; +  sub sql_num_customer_tickets {    "( select count(*) from tickets                       join links on ( tickets.id = links.localbase ) @@ -25,5 +28,111 @@ sub baseurl {    }  } +#mapping/genericize?? +#ShowConfigTab ModifySelf +sub access_right { +  my( $self, $session, $right ) = @_; + +  #return '' unless $conf->config('ticket_system'); +  return '' unless FS::Conf->new->config('ticket_system'); + +  $self->_web_external_auth($session) +    unless $session +    && $session->{'CurrentUser'}; + +  $session->{'CurrentUser'}->HasRight( Right  => $right, +                                       Object => $RT::System ); +} + +#shameless false laziness w/rt/html/autohandler to get logged into RT from afar +sub _web_external_auth { +  my( $self, $session ) = @_; + +  my $user = $FS::CurrentUser::CurrentUser->username; + +  $session->{'CurrentUser'} = RT::CurrentUser->new(); + +  warn "loading RT user for $user\n" +    if $DEBUG; + +  $session->{'CurrentUser'}->Load($user); + +  if ( ! $session->{'CurrentUser'}->Id() ) { + +      # Create users on-the-fly + +      warn "can't load RT user for $user; auto-creating\n" +        if $DEBUG; + +      my $UserObj = RT::User->new( RT::CurrentUser->new('RT_System') ); + +      my ( $val, $msg ) = $UserObj->Create( +          %{ ref($RT::AutoCreate) ? $RT::AutoCreate : {} }, +          Name  => $user, +          Gecos => $user, +      ); + +      if ($val) { + +          # now get user specific information, to better create our user. +          my $new_user_info +              = RT::Interface::Web::WebExternalAutoInfo($user); + +          # set the attributes that have been defined. +          # FIXME: this is a horrible kludge. I'm sure there's something cleaner +          foreach my $attribute ( +              'Name',                  'Comments', +              'Signature',             'EmailAddress', +              'PagerEmailAddress',     'FreeformContactInfo', +              'Organization',          'Disabled', +              'Privileged',            'RealName', +              'NickName',              'Lang', +              'EmailEncoding',         'WebEncoding', +              'ExternalContactInfoId', 'ContactInfoSystem', +              'ExternalAuthId',        'Gecos', +              'HomePhone',             'WorkPhone', +              'MobilePhone',           'PagerPhone', +              'Address1',              'Address2', +              'City',                  'State', +              'Zip',                   'Country' +              ) +          { +              #uhh, wrong root +              #$m->comp( '/Elements/Callback', %ARGS, +              #    _CallbackName => 'NewUser' ); + +              my $method = "Set$attribute"; +              $UserObj->$method( $new_user_info->{$attribute} ) +                  if ( defined $new_user_info->{$attribute} ); +          } +          $session->{'CurrentUser'}->Load($user); +      } +      else { + +         # we failed to successfully create the user. abort abort abort. +          delete $session->{'CurrentUser'}; + +          die "can't auto-create RT user"; #an error message would be nice :/ +          #$m->abort() unless $RT::WebFallbackToInternalAuth; +          #$m->comp( '/Elements/Login', %ARGS, +          #    Error => loc( 'Cannot create user: [_1]', $msg ) ); +      } +  } + +  unless ( $session->{'CurrentUser'}->Id() ) { +      delete $session->{'CurrentUser'}; + +      die "can't auto-create RT user"; +      #$user = $orig_user; +      #  +      #if ($RT::WebExternalOnly) { +      #    $m->comp( '/Elements/Login', %ARGS, +      #        Error => loc('You are not an authorized user') ); +      #    $m->abort(); +      #} +  } + +} +  1; | 
