diff options
author | Christopher Burger <burgerc@freeside.biz> | 2017-12-01 17:11:10 -0500 |
---|---|---|
committer | Christopher Burger <burgerc@freeside.biz> | 2017-12-01 17:11:10 -0500 |
commit | 51383e090e0e49c31a0f4a942a10f242b4061be2 (patch) | |
tree | 326f356d0c98d9d1d26f793d69b64d6608ca269d | |
parent | ba58657e5c3de57db339a9a97f9cea26af341077 (diff) | |
parent | 197f613bac6c3f9a4bd7d1ea5fbf4769aea4ce1a (diff) |
Merge branch 'master' of ssh://git.freeside.biz/home/git/freeside
-rw-r--r-- | FS/FS/part_export/passwdfile.pm | 4 | ||||
-rw-r--r-- | FS/FS/part_export/shellcommands.pm | 4 | ||||
-rw-r--r-- | FS/FS/part_export/shellcommands_withdomain.pm | 4 | ||||
-rw-r--r-- | FS/FS/svc_acct.pm | 5 | ||||
-rw-r--r-- | rt/etc/RT_SiteConfig.pm | 189 | ||||
-rw-r--r-- | rt/etc/initialdata | 19 | ||||
-rw-r--r-- | rt/lib/RT/Condition/StatusChangeQuietResolve.pm | 48 |
7 files changed, 264 insertions, 9 deletions
diff --git a/FS/FS/part_export/passwdfile.pm b/FS/FS/part_export/passwdfile.pm index 2978d25..6713c8d 100644 --- a/FS/FS/part_export/passwdfile.pm +++ b/FS/FS/part_export/passwdfile.pm @@ -9,8 +9,8 @@ use FS::part_export::null; tie %options, 'Tie::IxHash', 'crypt' => { label=>'Password encryption', - type=>'select', options=>[qw(crypt md5)], - default=>'crypt', + type=>'select', options=>[qw(crypt md5 sha512)], + default=>'md5', }, ; diff --git a/FS/FS/part_export/shellcommands.pm b/FS/FS/part_export/shellcommands.pm index 775af17..7c280e5 100644 --- a/FS/FS/part_export/shellcommands.pm +++ b/FS/FS/part_export/shellcommands.pm @@ -97,8 +97,8 @@ tie my %options, 'Tie::IxHash', }, 'crypt' => { label => 'Default password encryption', - type=>'select', options=>[qw(crypt md5)], - default => 'crypt', + type=>'select', options=>[qw(crypt md5 sha512)], + default => 'md5', }, 'groups_susp_reason' => { label => 'Radius group mapping to reason (via template user)', diff --git a/FS/FS/part_export/shellcommands_withdomain.pm b/FS/FS/part_export/shellcommands_withdomain.pm index 29715b7..b307133 100644 --- a/FS/FS/part_export/shellcommands_withdomain.pm +++ b/FS/FS/part_export/shellcommands_withdomain.pm @@ -63,8 +63,8 @@ tie my %options, 'Tie::IxHash', type => 'checkbox', }, 'crypt' => { label => 'Default password encryption', - type=>'select', options=>[qw(crypt md5)], - default => 'crypt', + type=>'select', options=>[qw(crypt md5 sha512)], + default => 'md5', }, 'fail_on_output' => { label => 'Treat any output from the command as an error', diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index 0894980..de9199d 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -2542,6 +2542,11 @@ sub crypt_password { ); } elsif ( $encryption eq 'md5' ) { return unix_md5_crypt( $self->_password ); + } elsif ( $encryption eq 'sha512' ) { + return crypt( + $self->_password, + '$6$rounds=15420$'. join('', map $saltset[int(rand(64))], (1..16) ) + ); } elsif ( $encryption eq 'sha1_base64' ) { #for acct_sql my $pass = sha1_base64( $self->_password ); $pass .= '=' x (4 - length($pass) % 4); #properly padded base64 diff --git a/rt/etc/RT_SiteConfig.pm b/rt/etc/RT_SiteConfig.pm index d22da42..6420d11 100644 --- a/rt/etc/RT_SiteConfig.pm +++ b/rt/etc/RT_SiteConfig.pm @@ -58,4 +58,193 @@ Set($MessageBoxRichTextHeight, 368); #Set(@Plugins,(qw(Extension::QuickDelete RT::FM))); + +# Define default lifecycle to include resolved_quiet status workflow +Set(%Lifecycles, + default => { + initial => [qw(new)], # loc_qw + active => [qw(open stalled)], # loc_qw + inactive => [qw(resolved resolved_quiet rejected deleted)], # loc_qw + + defaults => { + on_create => 'new', + on_merge => 'resolved', + approved => 'open', + denied => 'rejected', + reminder_on_open => 'open', + reminder_on_resolve => 'resolved', + }, + + transitions => { + "" => [qw(new open resolved)], + + # from => [ to list ], + new => [qw(open stalled resolved resolved_quiet rejected deleted)], + open => [qw(new stalled resolved resolved_quiet rejected deleted)], + stalled => [qw(new open rejected resolved resolved_quiet deleted)], + resolved => [qw(new open stalled rejected deleted)], + resolved_quiet => [qw(resolved)], + rejected => [qw(new open stalled resolved resolved_quiet deleted)], + deleted => [qw(new open stalled rejected resolved resolved_quiet)], + }, + + rights => { + '* -> deleted' => 'DeleteTicket', + '* -> *' => 'ModifyTicket', + }, + actions => [ + 'new -> open' => { label => 'Open It', update => 'Respond' }, + 'new -> resolved' => { label => 'Resolve', update => 'Comment' }, + 'new -> resolved_quiet' => { label => 'Quiet Resolve', update => 'Comment' }, + 'new -> rejected' => { label => 'Reject', update => 'Respond' }, + 'new -> deleted' => { label => 'Delete', }, + 'open -> stalled' => { label => 'Stall', update => 'Comment' }, + 'open -> resolved' => { label => 'Resolve', update => 'Comment' }, + 'open -> resolved_quiet' => { label => 'Quiet Resolve', update => 'Comment' }, + 'open -> rejected' => { label => 'Reject', update => 'Respond' }, + 'stalled -> open' => { label => 'Open It', }, + 'resolved -> open' => { label => 'Re-open', update => 'Comment' }, + 'rejected -> open' => { label => 'Re-open', update => 'Comment' }, + 'deleted -> open' => { label => 'Undelete', }, + ], + }, +# don't change lifecyle of the approvals, they are not capable to deal with +# custom statuses + approvals => { + initial => [ 'new' ], + active => [ 'open', 'stalled' ], + inactive => [ 'resolved', 'rejected', 'deleted' ], + + defaults => { + on_create => 'new', + on_merge => 'resolved', + reminder_on_open => 'open', + reminder_on_resolve => 'resolved', + }, + + transitions => { + '' => [qw(new open resolved)], + + # from => [ to list ], + new => [qw(open stalled resolved rejected deleted)], + open => [qw(new stalled resolved rejected deleted)], + stalled => [qw(new open rejected resolved deleted)], + resolved => [qw(new open stalled rejected deleted)], + rejected => [qw(new open stalled resolved deleted)], + deleted => [qw(new open stalled rejected resolved)], + }, + rights => { + '* -> deleted' => 'DeleteTicket', + '* -> rejected' => 'ModifyTicket', + '* -> *' => 'ModifyTicket', + }, + actions => [ + 'new -> open' => { label => 'Open It', update => 'Respond' }, + 'new -> resolved' => { label => 'Resolve', update => 'Comment' }, + 'new -> rejected' => { label => 'Reject', update => 'Respond' }, + 'new -> deleted' => { label => 'Delete', }, + 'open -> stalled' => { label => 'Stall', update => 'Comment' }, + 'open -> resolved' => { label => 'Resolve', update => 'Comment' }, + 'open -> rejected' => { label => 'Reject', update => 'Respond' }, + 'stalled -> open' => { label => 'Open It', }, + 'resolved -> open' => { label => 'Re-open', update => 'Comment' }, + 'rejected -> open' => { label => 'Re-open', update => 'Comment' }, + 'deleted -> open' => { label => 'Undelete', }, + ], + }, +); + +# Lifecycle 'default' from RT_Config.pm +# Customer may set the lifecycle on their ticket queue as 'hide_resolve_quiet' +# to suppress the 'resolve_quiet' ticket status +Set(%Lifecycles, + hide_resolve_quiet => { + initial => [qw(new)], # loc_qw + active => [qw(open stalled)], # loc_qw + inactive => [qw(resolved rejected deleted)], # loc_qw + + defaults => { + on_create => 'new', + on_merge => 'resolved', + approved => 'open', + denied => 'rejected', + reminder_on_open => 'open', + reminder_on_resolve => 'resolved', + }, + + transitions => { + "" => [qw(new open resolved)], + + # from => [ to list ], + new => [qw( open stalled resolved rejected deleted)], + open => [qw(new stalled resolved rejected deleted)], + stalled => [qw(new open rejected resolved deleted)], + resolved => [qw(new open stalled rejected deleted)], + rejected => [qw(new open stalled resolved deleted)], + deleted => [qw(new open stalled rejected resolved )], + }, + rights => { + '* -> deleted' => 'DeleteTicket', + '* -> *' => 'ModifyTicket', + }, + actions => [ + 'new -> open' => { label => 'Open It', update => 'Respond' }, # loc{label} + 'new -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label} + 'new -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label} + 'new -> deleted' => { label => 'Delete', }, # loc{label} + 'open -> stalled' => { label => 'Stall', update => 'Comment' }, # loc{label} + 'open -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label} + 'open -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label} + 'stalled -> open' => { label => 'Open It', }, # loc{label} + 'resolved -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label} + 'rejected -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label} + 'deleted -> open' => { label => 'Undelete', }, # loc{label} + ], + }, +# don't change lifecyle of the approvals, they are not capable to deal with +# custom statuses + approvals => { + initial => [ 'new' ], + active => [ 'open', 'stalled' ], + inactive => [ 'resolved', 'rejected', 'deleted' ], + + defaults => { + on_create => 'new', + on_merge => 'resolved', + reminder_on_open => 'open', + reminder_on_resolve => 'resolved', + }, + + transitions => { + '' => [qw(new open resolved)], + + # from => [ to list ], + new => [qw(open stalled resolved rejected deleted)], + open => [qw(new stalled resolved rejected deleted)], + stalled => [qw(new open rejected resolved deleted)], + resolved => [qw(new open stalled rejected deleted)], + rejected => [qw(new open stalled resolved deleted)], + deleted => [qw(new open stalled rejected resolved)], + }, + rights => { + '* -> deleted' => 'DeleteTicket', + '* -> rejected' => 'ModifyTicket', + '* -> *' => 'ModifyTicket', + }, + actions => [ + 'new -> open' => { label => 'Open It', update => 'Respond' }, # loc{label} + 'new -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label} + 'new -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label} + 'new -> deleted' => { label => 'Delete', }, # loc{label} + 'open -> stalled' => { label => 'Stall', update => 'Comment' }, # loc{label} + 'open -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label} + 'open -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label} + 'stalled -> open' => { label => 'Open It', }, # loc{label} + 'resolved -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label} + 'rejected -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label} + 'deleted -> open' => { label => 'Undelete', }, # loc{label} + ], + }, +); + 1; diff --git a/rt/etc/initialdata b/rt/etc/initialdata index aa2010f..8769fed 100644 --- a/rt/etc/initialdata +++ b/rt/etc/initialdata @@ -254,7 +254,12 @@ # ExecModule => 'CustomFieldChange', # ApplicableTransTypes => 'Any', #}, - + { Name => 'On Resolve Allow Quiet', + Description => 'Whenever a ticket is resolved, '. + 'except with resolve_quiet', + ApplicableTransTypes => 'Status', + ExecModule => 'StatusChangeQuietResolve', + }, ); @Templates = ( @@ -931,8 +936,12 @@ Hour: { $SubscriptionObj->SubValue('Hour') } ScripCondition => 'On Owner Change', ScripAction => 'Notify Owner', Template => 'Transaction in HTML' }, - { Description => 'On Resolve Notify Requestors', - ScripCondition => 'On Resolve', +# { Description => 'On Resolve Notify Requestors', +# ScripCondition => 'On Resolve', +# ScripAction => 'Notify Requestors', +# Template => 'Resolved in HTML' }, + { Description => 'On Resolve Notify Requestors, Allow Quiet Resolve', + ScripCondition => 'On Resolve Allow Quiet', ScripAction => 'Notify Requestors', Template => 'Resolved in HTML' }, { Description => "On transaction, add any tags in the transaction's subject to the ticket's subject", @@ -1068,6 +1077,10 @@ Hour: { $SubscriptionObj->SubValue('Hour') } # superseded by "notify owner and adminccs" 'notify adminccs' => { 'transaction' => 1 }, }, + 'on resolve' => { + # superseded by "On Resolve Notify Requestors, Allow Quiet Resolve" + 'notify requestors' => { 'resolved in html' => 1 }, + }, ); # -*- perl -*- diff --git a/rt/lib/RT/Condition/StatusChangeQuietResolve.pm b/rt/lib/RT/Condition/StatusChangeQuietResolve.pm new file mode 100644 index 0000000..8426141 --- /dev/null +++ b/rt/lib/RT/Condition/StatusChangeQuietResolve.pm @@ -0,0 +1,48 @@ +package RT::Condition::StatusChangeQuietResolve; +use base 'RT::Condition'; +use strict; +use warnings; + +=head2 DESCRIPTION + +This condition allows for muting of resolution notifications when +combined with the ticket status 'resolved_quiet' + +If status has been updated as 'resolved_quiet', this condition +will block notification, and update ticket status to 'resolved' + +If status has been updated as 'resolved', this condition +will block notification only if the previous ticket status +had been 'resolved_quiet' + +=cut + +sub IsApplicable { + my $self = shift; + my $txn = $self->TransactionObj; + my ($type, $field) = ($txn->Type, $txn->Field); + + return 0 + unless $type eq 'Status' + || ($type eq 'Set' && $field eq 'Status'); + + return 0 + unless $txn->NewValue eq 'resolved' + || $txn->NewValue eq 'resolved_quiet'; + + my $ticket = $self->TicketObj; + + if ($txn->NewValue eq 'resolved_quiet') { + $ticket->SetStatus('resolved'); + return 0; + } + elsif ($txn->NewValue eq 'resolved' && $txn->OldValue eq 'resolved_quiet') { + return 0; + } + + return 1; +} + +RT::Base->_ImportOverlays(); + +1; |