1# --
2# Copyright (C) 2001-2020 OTRS AG, https://otrs.com/
3# --
4# This software comes with ABSOLUTELY NO WARRANTY. For details, see
5# the enclosed file COPYING for license information (GPL). If you
6# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
7# --
8
9package Kernel::Modules::AdminRole;
10
11use strict;
12use warnings;
13
14use Kernel::Language qw(Translatable);
15
16our $ObjectManagerDisabled = 1;
17
18sub new {
19    my ( $Type, %Param ) = @_;
20
21    # allocate new hash for object
22    my $Self = {%Param};
23    bless( $Self, $Type );
24
25    return $Self;
26}
27
28sub Run {
29    my ( $Self, %Param ) = @_;
30
31    my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
32    my $ParamObject  = $Kernel::OM->Get('Kernel::System::Web::Request');
33    my $LogObject    = $Kernel::OM->Get('Kernel::System::Log');
34    my $GroupObject  = $Kernel::OM->Get('Kernel::System::Group');
35    my $Notification = $ParamObject->GetParam( Param => 'Notification' ) || '';
36
37    # ------------------------------------------------------------ #
38    # change
39    # ------------------------------------------------------------ #
40    if ( $Self->{Subaction} eq 'Change' ) {
41        my $ID = $ParamObject->GetParam( Param => 'ID' )
42            || $ParamObject->GetParam( Param => 'RoleID' )
43            || '';
44        my %Data = $GroupObject->RoleGet(
45            ID => $ID,
46        );
47        my $Output = $LayoutObject->Header();
48        $Output .= $LayoutObject->NavigationBar();
49        $Output .= $LayoutObject->Notify( Info => Translatable('Role updated!') )
50            if ( $Notification && $Notification eq 'Update' );
51        $Self->_Edit(
52            Action => 'Change',
53            %Data,
54        );
55        $Output .= $LayoutObject->Output(
56            TemplateFile => 'AdminRole',
57            Data         => \%Param,
58        );
59        $Output .= $LayoutObject->Footer();
60        return $Output;
61    }
62
63    # ------------------------------------------------------------ #
64    # change action
65    # ------------------------------------------------------------ #
66    elsif ( $Self->{Subaction} eq 'ChangeAction' ) {
67
68        # challenge token check for write action
69        $LayoutObject->ChallengeTokenCheck();
70
71        my $Note = '';
72        my ( %GetParam, %Errors );
73        for my $Parameter (qw(ID Name Comment ValidID)) {
74            $GetParam{$Parameter} = $ParamObject->GetParam( Param => $Parameter ) || '';
75        }
76
77        # check for needed data
78        if ( !$GetParam{Name} ) {
79            $Errors{NameInvalid} = 'ServerError';
80        }
81
82        # if no errors occurred
83        if ( !%Errors ) {
84
85            # update group
86            my $RoleUpdate = $GroupObject->RoleUpdate(
87                %GetParam,
88                UserID => $Self->{UserID}
89            );
90
91            if ($RoleUpdate) {
92
93                # if the user would like to continue editing the role, just redirect to the edit screen
94                # otherwise return to overview
95                if (
96                    defined $ParamObject->GetParam( Param => 'ContinueAfterSave' )
97                    && ( $ParamObject->GetParam( Param => 'ContinueAfterSave' ) eq '1' )
98                    )
99                {
100                    return $LayoutObject->Redirect(
101                        OP => "Action=$Self->{Action};Subaction=Change;ID=$GetParam{ID};Notification=Update"
102                    );
103                }
104                else {
105                    return $LayoutObject->Redirect( OP => "Action=$Self->{Action};Notification=Update" );
106                }
107            }
108            else {
109                $Note = $LogObject->GetLogEntry(
110                    Type => 'Error',
111                    What => 'Message',
112                );
113            }
114        }
115
116        # something went wrong
117        my $Output = $LayoutObject->Header();
118        $Output .= $LayoutObject->NavigationBar();
119        $Output .= $Note
120            ? $LayoutObject->Notify(
121            Priority => 'Error',
122            Info     => $Note,
123            )
124            : '';
125        $Self->_Edit(
126            Action => 'Change',
127            %GetParam,
128            %Errors,
129        );
130        $Output .= $LayoutObject->Output(
131            TemplateFile => 'AdminRole',
132            Data         => \%Param,
133        );
134        $Output .= $LayoutObject->Footer();
135        return $Output;
136    }
137
138    # ------------------------------------------------------------ #
139    # add
140    # ------------------------------------------------------------ #
141    elsif ( $Self->{Subaction} eq 'Add' ) {
142        my %GetParam = ();
143        $GetParam{Name} = $ParamObject->GetParam( Param => 'Name' );
144        my $Output = $LayoutObject->Header();
145        $Output .= $LayoutObject->NavigationBar();
146        $Self->_Edit(
147            Action => 'Add',
148            %GetParam,
149        );
150        $Output .= $LayoutObject->Output(
151            TemplateFile => 'AdminRole',
152            Data         => \%Param,
153        );
154        $Output .= $LayoutObject->Footer();
155        return $Output;
156    }
157
158    # ------------------------------------------------------------ #
159    # add action
160    # ------------------------------------------------------------ #
161    elsif ( $Self->{Subaction} eq 'AddAction' ) {
162
163        # challenge token check for write action
164        $LayoutObject->ChallengeTokenCheck();
165
166        my $Note = '';
167        my ( %GetParam, %Errors );
168        for my $Parameter (qw(ID Name Comment ValidID)) {
169            $GetParam{$Parameter} = $ParamObject->GetParam( Param => $Parameter ) || '';
170        }
171
172        # check for needed data
173        if ( !$GetParam{Name} ) {
174            $Errors{NameInvalid} = 'ServerError';
175        }
176
177        # if no errors occurred
178        if ( !%Errors ) {
179
180            # add role
181            my $RoleID = $GroupObject->RoleAdd(
182                %GetParam,
183                UserID => $Self->{UserID}
184            );
185
186            if ($RoleID) {
187                $Self->_Overview();
188                my $Output = $LayoutObject->Header();
189                $Output .= $LayoutObject->NavigationBar();
190                $Output .= $LayoutObject->Notify( Info => Translatable('Role added!') );
191                $Output .= $LayoutObject->Output(
192                    TemplateFile => 'AdminRole',
193                    Data         => \%Param,
194                );
195                $Output .= $LayoutObject->Footer();
196                return $Output;
197            }
198            else {
199                $Note = $LogObject->GetLogEntry(
200                    Type => 'Error',
201                    What => 'Message',
202                );
203            }
204        }
205        my $Output = $LayoutObject->Header();
206        $Output .= $Note
207            ? $LayoutObject->Notify(
208            Priority => 'Error',
209            Info     => $Note,
210            )
211            : '';
212        $Output .= $LayoutObject->NavigationBar();
213        $Self->_Edit(
214            Action => 'Add',
215            %GetParam,
216            %Errors,
217        );
218        $Output .= $LayoutObject->Output(
219            TemplateFile => 'AdminRole',
220            Data         => \%Param,
221        );
222        $Output .= $LayoutObject->Footer();
223        return $Output;
224    }
225
226    # ------------------------------------------------------------
227    # overview
228    # ------------------------------------------------------------
229    else {
230        $Self->_Overview();
231
232        my $Output = $LayoutObject->Header();
233        $Output .= $LayoutObject->NavigationBar();
234        $Output .= $LayoutObject->Notify( Info => Translatable('Role updated!') )
235            if ( $Notification && $Notification eq 'Update' );
236
237        $Output .= $LayoutObject->Output(
238            TemplateFile => 'AdminRole',
239            Data         => \%Param,
240        );
241        $Output .= $LayoutObject->Footer();
242        return $Output;
243    }
244
245}
246
247sub _Edit {
248    my ( $Self, %Param ) = @_;
249
250    my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
251
252    $LayoutObject->Block(
253        Name => 'Overview',
254        Data => \%Param,
255    );
256
257    $LayoutObject->Block( Name => 'ActionList' );
258    $LayoutObject->Block( Name => 'ActionOverview' );
259
260    # get valid list
261    my %ValidList        = $Kernel::OM->Get('Kernel::System::Valid')->ValidList();
262    my %ValidListReverse = reverse %ValidList;
263
264    $Param{ValidOption} = $LayoutObject->BuildSelection(
265        Data       => \%ValidList,
266        Name       => 'ValidID',
267        Class      => 'Modernize',
268        SelectedID => $Param{ValidID} || $ValidListReverse{valid},
269    );
270
271    $LayoutObject->Block(
272        Name => 'OverviewUpdate',
273        Data => \%Param,
274    );
275
276    return 1;
277}
278
279sub _Overview {
280    my ( $Self, %Param ) = @_;
281
282    my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
283    my $GroupObject  = $Kernel::OM->Get('Kernel::System::Group');
284
285    $LayoutObject->Block(
286        Name => 'Overview',
287        Data => \%Param,
288    );
289
290    $LayoutObject->Block( Name => 'ActionList' );
291    $LayoutObject->Block( Name => 'ActionAdd' );
292    $LayoutObject->Block( Name => 'Filter' );
293
294    my %List = $GroupObject->RoleList(
295        ValidID => 0,
296    );
297    my $ListSize = keys %List;
298
299    $LayoutObject->Block(
300        Name => 'OverviewHeader',
301        Data => {
302            AllItemsCount => $ListSize,
303        },
304    );
305
306    # if there is data available, it is shown
307    if (%List) {
308        $LayoutObject->Block(
309            Name => 'OverviewResult',
310            Data => \%Param,
311        );
312
313        # get valid list
314        my %ValidList = $Kernel::OM->Get('Kernel::System::Valid')->ValidList();
315        for my $KeyList ( sort { $List{$a} cmp $List{$b} } keys %List ) {
316
317            my %Data = $GroupObject->RoleGet( ID => $KeyList );
318            $LayoutObject->Block(
319                Name => 'OverviewResultRow',
320                Data => {
321                    Valid => $ValidList{ $Data{ValidID} },
322                    %Data,
323                },
324            );
325        }
326    }
327
328    # otherwise, a message is displayed
329    else {
330        $LayoutObject->Block(
331            Name => 'NoRolesDefined',
332            Data => {},
333        );
334    }
335    return 1;
336}
337
3381;
339