Skip to content

Commit 9c463b9

Browse files
committed
Merge branch 'rel-11_0' into rel-11_1
2 parents e3854b0 + 45b8735 commit 9c463b9

401 files changed

Lines changed: 2916 additions & 2796 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

COPYING-Third-Party

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,3 +364,8 @@ o Name: Spectrum
364364
o Name: DejaVu Fonts
365365
Web: https://dejavu-fonts.github.io/
366366
License: Free License - https://dejavu-fonts.github.io/License.html
367+
368+
o Name: Wikipedia Logo
369+
Web: https://commons.wikimedia.org/wiki/File:Antu_wikipedia.svg
370+
License: Creative Commons Attribution-Share Alike 3.0 Unported - https://creativecommons.org/licenses/by-sa/3.0/deed.en
371+
Note: This file is from the Antü Plasma Suite. No changes were made. Path to file is var/httpd/htdocs/skins/Customer/default/img/sample_wikipedia.png.

Kernel/Config/Files/XML/Framework.xml

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@
494494
<Description Translatable="1">Defines the URL rich text editor path.</Description>
495495
<Navigation>Frontend::Base</Navigation>
496496
<Value>
497-
<Item ValueType="String" ValueRegex="">&lt;OTOBO_CONFIG_Frontend::WebPath&gt;js/thirdparty/ckeditor5-47.3.0/</Item>
497+
<Item ValueType="String" ValueRegex="">&lt;OTOBO_CONFIG_Frontend::WebPath&gt;js/thirdparty/ckeditor5-47.6.1/</Item>
498498
</Value>
499499
</Setting>
500500
<Setting Name="Frontend::RichTextWidth" Required="1" Valid="1">
@@ -522,14 +522,14 @@
522522
<Description Translatable="1">Path to CKEditor content CSS file. Changes to this setting will only consistently apply after deleting the OTOBO Cache via the Maint::Cache::Delete command!</Description>
523523
<Navigation>Frontend::Base</Navigation>
524524
<Value>
525-
<Item ValueType="String" ValueRegex="">common/css/ckeditor5-47.3.0-content.css</Item>
525+
<Item ValueType="String" ValueRegex="">common/css/ckeditor5-47.6.1-content.css</Item>
526526
</Value>
527527
</Setting>
528528
<Setting Name="Frontend::RichTextEditorStyles" Required="1" Valid="1" ConfigLevel="200">
529529
<Description Translatable="1">Path to CKEditor editor CSS file. Changes to this setting will only consistently apply after deleting the OTOBO Cache via the Maint::Cache::Delete command!</Description>
530530
<Navigation>Frontend::Base</Navigation>
531531
<Value>
532-
<Item ValueType="String" ValueRegex="">common/css/ckeditor5-47.3.0-editor.css</Item>
532+
<Item ValueType="String" ValueRegex="">common/css/ckeditor5-47.6.1-editor.css</Item>
533533
</Value>
534534
</Setting>
535535
<Setting Name="CustomerFrontend::RichText::DefaultCSS" Required="1" Valid="1">
@@ -543,14 +543,14 @@
543543
<Description Translatable="1">Path to CKEditor content CSS file. Changes to this setting will only consistently apply after deleting the OTOBO Cache via the Maint::Cache::Delete command!</Description>
544544
<Navigation>Frontend::Base</Navigation>
545545
<Value>
546-
<Item ValueType="String" ValueRegex="">common/css/ckeditor5-47.3.0-content.css</Item>
546+
<Item ValueType="String" ValueRegex="">common/css/ckeditor5-47.6.1-content.css</Item>
547547
</Value>
548548
</Setting>
549549
<Setting Name="CustomerFrontend::RichTextEditorStyles" Required="1" Valid="1" ConfigLevel="200">
550550
<Description Translatable="1">Path to CKEditor editor CSS file. Changes to this setting will only consistently apply after deleting the OTOBO Cache via the Maint::Cache::Delete command!</Description>
551551
<Navigation>Frontend::Base</Navigation>
552552
<Value>
553-
<Item ValueType="String" ValueRegex="">common/css/ckeditor5-47.3.0-editor.css</Item>
553+
<Item ValueType="String" ValueRegex="">common/css/ckeditor5-47.6.1-editor.css</Item>
554554
</Value>
555555
</Setting>
556556
<Setting Name="Frontend::RichText::EnhancedMode" Required="1" Valid="1">
@@ -7661,16 +7661,23 @@ via the Preferences button after logging in.
76617661
<Item Key="TextColor">#00023c</Item>
76627662
<Item Key="Links">
76637663
<Hash>
7664-
<Item Key="https://duckduckgo.com/">1</Item>
7665-
<Item Key="https://www.wikipedia.org">2</Item>
7666-
<Item Key="https://www.openstreetmap.org">3</Item>
7664+
<Item Key="https://www.otobo.io">1</Item>
7665+
<Item Key="https://www.openstreetmap.org">2</Item>
7666+
<Item Key="https://www.wikipedia.org">3</Item>
76677667
</Hash>
76687668
</Item>
76697669
<Item Key="Images">
76707670
<Hash>
7671-
<Item Key="https://cdn3.iconfinder.com/data/icons/social-media-logos-flat-colorful-1/2048/5364_-_DuckDuckGo-512.png">1</Item>
7672-
<Item Key="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iNTEycHgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiB3aWR0aD0iNTEycHgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnIGlkPSJfeDMzXzc3LXdpa2lwZWRpYS13Ij48Zz48cGF0aCBkPSJNNDg1Ljk5OSwxMDguODUxbC0wLjIxNCw4Ljc2N2MtMjAuMTkzLDAuNTc2LTMyLjM0MSwxMS4zNTUtNDAuMTAxLDI4Ljk2MmMtMTcuOTY2LDQxLjUzOC03NC4yMzUsMTcyLjQ3Mi0xMTEuNjA0LDI1Ny43MDMgICAgaC05Ljc3M2wtNTguODU3LTEzOC43N2MtMjMuMzU1LDQ1LjcwNS00OS4wODIsOTMuNDI0LTcxLjI4NywxMzguNzdjLTAuMjE3LDAuMjE2LTEwLjc4LDAtMTAuNzgtMC4yMTYgICAgYy0zMy43MDQtNzguODM1LTY5LjA2MS0xNTcuMDk0LTEwMi44MzgtMjM2LjE0NWMtOC4xOTEtMTkuMTg3LTM1LjUtNTAuMzA0LTU0LjMyNy01MC4wODhjMC0yLjIyOC0wLjIxNi03LjE4Ni0wLjIxNi0xMC4yMDUgICAgaDExNi4zNDd2OS45ODljLTEzLjc5OCwwLjc5LTM3Ljk0Myw5LjU1OC0zMS4xMTcsMjQuNTc3YzE1LjczNywzNS43MTYsNzQuNDUxLDE3Mi42ODgsOTAuMjYsMjA3LjM5OSAgICBjMTAuNzgtMjEuMzQ0LDQxLjUzOC03OC40NzUsNTQuMTE0LTEwMi42MjJjLTkuOTg4LTIwLjMzNi00Mi4xMTItOTYuMjI1LTUyLjMxNy0xMTQuOTgxYy02Ljk3MS0xMi43OTItMjUuOTQxLTEzLjk0MS00MC4xLTE0LjE1NyAgICB2LTkuOTg5bDEwMi40MDYsMC4yMTZ2OS40MTRjLTEzLjk0MSwwLjQzMi0yNy4zNzksNS42MDUtMjEuMTI4LDE4Ljc1NmMxMy41ODEsMjguNzQ2LDIxLjk4OSw0OC45MzksMzQuNTY2LDc1LjI0MSAgICBjNC4wMjQtNy43NjIsMjQuOTM4LTQ5Ljg3MywzNC41NjYtNzIuNDM5YzYuMzk3LTE0LjgwMy0yLjgwNC0yMC41NTMtMjcuNzM5LTIxLjEyNmMwLjIxNS0yLjU4OCwwLTcuNDAyLDAuMjE1LTkuNzc1ICAgIGMzMS45MDgtMC4yMTUsNzkuODQyLTAuMjE1LDg4LjQ2NS0wLjQzMXY5Ljc3M2MtMTYuMTcsMC41NzUtMzIuOTEzLDkuMTk4LTQxLjc1MywyMi43ODFsLTQyLjU0Miw4OC4yNDkgICAgYzQuNTk4LDExLjU3MSw0NS40ODgsMTAyLjYyLDQ5LjcyNywxMTIuNjEybDg3Ljk2My0yMDMuMDg4Yy02LjE4LTE2LjYwMS0yNi4xNTgtMjAuMTk0LTMzLjkyLTIwLjMzOHYtOS45ODlsOTEuODQyLDAuNzkgICAgTDQ4NS45OTksMTA4Ljg1MXoiLz48L2c+PC9nPjxnIGlkPSJMYXllcl8xIi8+PC9zdmc+">2</Item>
7673-
<Item Key="https://cdn4.iconfinder.com/data/icons/logos-brands-5/24/openstreetmap-512.png">3</Item>
7671+
<Item Key="/otobo-web/skins/Customer/default/img/sample_otobo.png">1</Item>
7672+
<Item Key="/otobo-web/skins/Customer/default/img/sample_openstreetmap.png">2</Item>
7673+
<Item Key="/otobo-web/skins/Customer/default/img/sample_wikipedia.png">3</Item>
7674+
</Hash>
7675+
</Item>
7676+
<Item Key="Titles">
7677+
<Hash>
7678+
<Item Key="OTOBO">1</Item>
7679+
<Item Key="OpenStreetMap">2</Item>
7680+
<Item Key="Wikipedia">3</Item>
76747681
</Hash>
76757682
</Item>
76767683
</Hash>

Kernel/GenericInterface/Transport/HTTP/SOAP.pm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use PerlIO; ## no perlimports, not sure whether this is needed
2828
use HTTP::Status qw(status_message);
2929
use Plack::Response ();
3030
use SOAP::Lite; # for enabling debugging import +trace => 'all'
31+
use Text::Trim qw(rtrim);
3132

3233
# OTOBO modules
3334
use Kernel::System::VariableCheck qw(:all);
@@ -211,6 +212,10 @@ sub ProviderProcessRequest {
211212
Data => $Content,
212213
);
213214

215+
# Normalize Content by removing trailing white space.
216+
# This make SOAP::Lite work with XML::Parser >= 1.48.
217+
rtrim($Content);
218+
214219
# Deserialize data.
215220
my $Deserialized = eval { SOAP::Deserializer->deserialize($Content); };
216221
my $DeserializedFault = $@ || '';

Kernel/Modules/CustomerDashboardCommon.pm

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,40 @@ sub Run {
5050

5151
my $Output = $LayoutObject->CustomerHeader();
5252

53+
# validate that each tile has a valid and unique Order
54+
# tiles with invalid or duplicate Order are moved to the end by giving them top Order values
55+
my $MaxOrder = 0;
56+
my %OrderUsed;
57+
my @InvalidOrderTiles;
58+
for my $Tile ( sort { $UsedTiles->{$a}->{Order} <=> $UsedTiles->{$b}->{Order} } keys $UsedTiles->%* ) {
59+
60+
# check if the Order is valid and unique
61+
my $Order = $UsedTiles->{$Tile}{Order};
62+
if ( $Order !~ m/^\d+$/ || $OrderUsed{$Order} ) {
63+
push @InvalidOrderTiles, $Tile;
64+
my $Message = $LayoutObject->{LanguageObject}->Translate(
65+
'Registration for tile \'%s\' of CustomerDashboard is invalid! Order needs to be a number and unique.',
66+
$Tile,
67+
);
68+
$Kernel::OM->Get('Kernel::System::Log')->Log(
69+
Priority => 'error',
70+
Message => $Message,
71+
);
72+
}
73+
else {
74+
if ( $Order > $MaxOrder ) {
75+
$MaxOrder = $Order;
76+
}
77+
$OrderUsed{$Order} = 1;
78+
}
79+
}
80+
81+
for my $Tile (@InvalidOrderTiles) {
82+
$UsedTiles->{$Tile}{Order} = ++$MaxOrder;
83+
}
84+
5385
# generate the HTML of the individual tiles
5486
my $TileHTML = '';
55-
my %OrderUsed;
5687
for my $Tile ( sort { $UsedTiles->{$a}->{Order} <=> $UsedTiles->{$b}->{Order} } keys $UsedTiles->%* ) {
5788

5889
# check if the registration for each tile is valid
@@ -93,21 +124,6 @@ sub Run {
93124
# create a backend object
94125
my $BackendObject = $BackendModule->new();
95126

96-
# check if the Order is an unique number
97-
my $TileID = sprintf '%02d', $UsedTiles->{$Tile}{Order}; # assuming Order being less than 100
98-
if ( $TileID !~ m/^\d+$/ || ++$OrderUsed{$TileID} > 1 ) {
99-
my $Message = $LayoutObject->{LanguageObject}->Translate(
100-
'Registration for tile %s of CustomerDashboard is invalid! Order needs to be a unique number.',
101-
$Tile,
102-
);
103-
$Kernel::OM->Get('Kernel::System::Log')->Log(
104-
Priority => 'error',
105-
Message => $Message,
106-
);
107-
108-
return $LayoutObject->ErrorScreen( Message => $Message );
109-
}
110-
111127
# replace the OTOBO_CONFIG macro in the config, for settings like:
112128
# <Item Key="BackgroundImage">&lt;OTOBO_CONFIG_Frontend::WebPath&gt;common/img/Dashboard/dashboard_bgfl.png</Item>
113129
my $Config = $UsedTiles->{$Tile}->{Config} || {};
@@ -119,6 +135,8 @@ sub Run {
119135
$Config->{$Key} =~ s{<OTOBO_CONFIG_(.+?)>}{$ConfigObject->Get($1)}egx;
120136
}
121137

138+
my $TileID = sprintf '%02d', $UsedTiles->{$Tile}{Order}; # assuming Order being less than 100
139+
122140
# get the HTML
123141
$TileHTML .= $BackendObject->Run(
124142
TileID => $TileID,

Kernel/Modules/CustomerTicketMessage.pm

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,6 @@ sub Run {
823823
);
824824
}
825825

826-
$Output .= $LayoutObject->CustomerNavigationBar();
827826
$Output .= $Self->_MaskNew(
828827
Attachments => \@Attachments,
829828
%GetParam,

Kernel/Output/HTML/CustomerDashboard/TileToolBox.pm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,15 @@ sub Run {
4040

4141
my %Links = reverse %{ $Param{Config}{Links} };
4242
my %Images = reverse %{ $Param{Config}{Images} };
43+
my %Titles = reverse %{ $Param{Config}{Titles} // {} };
4344

4445
for my $Key ( sort { $a <=> $b } keys %Links ) {
4546
$LayoutObject->Block(
4647
Name => 'Link',
4748
Data => {
4849
Link => $Links{$Key},
4950
Image => $Images{$Key},
51+
Title => $Titles{$Key} // '',
5052
},
5153
);
5254
}

Kernel/Output/HTML/Templates/Standard/Dashboard/TileToolBox.tt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<h2 style="color: [% Data.TextColor | html %]">[% Translate(Data.Text) | html %]</h2>
1818
<div>
1919
[% RenderBlockStart("Link") %]
20-
<a href="[% Data.Link | html %]" style="background-image: url([% Data.Image | html %])" target="_blank"></a>
20+
<a href="[% Data.Link | html %]" style="background-image: url([% Data.Image | html %])" title="[% Data.Title | html %]" target="_blank"></a>
2121
[% RenderBlockEnd("Link") %]
2222
</div>
2323
</div>

Kernel/System/DynamicField/Driver/CustomerUser.pm

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ use Kernel::System::VariableCheck qw(IsArrayRefWithData IsHashRefWithData);
3838
our @ObjectDependencies = (
3939
'Kernel::Config',
4040
'Kernel::System::CustomerUser',
41-
'Kernel::System::Group',
4241
'Kernel::System::DynamicField',
4342
'Kernel::System::DynamicField::Backend',
43+
'Kernel::System::Group',
4444
'Kernel::System::Log',
4545
);
4646

@@ -95,6 +95,72 @@ sub new {
9595
return $Self;
9696
}
9797

98+
sub FieldValueValidate {
99+
my ( $Self, %Param ) = @_;
100+
101+
# Check for defined value.
102+
if ( !defined $Param{Value} ) {
103+
$Kernel::OM->Get('Kernel::System::Log')->Log(
104+
Priority => 'error',
105+
Message => "Need Value in $Param{DynamicFieldConfig}->{FieldType} DynamicField!",
106+
);
107+
108+
return;
109+
}
110+
111+
# validate values via SearchObjects
112+
# driver prevents usage of PossibleValuesGet on purpose for performance reasons
113+
if ( length $Param{Value} ) {
114+
my @Values;
115+
if ( ref $Param{Value} eq 'ARRAY' ) {
116+
@Values = @{ $Param{Value} };
117+
}
118+
else {
119+
push @Values, $Param{Value};
120+
}
121+
122+
if ( $Param{ExternalSource} && $Param{DynamicFieldConfig}{Config}{ImportSearchAttribute} ) {
123+
my $TransformedValues = $Self->_TransformExternalSource(
124+
DynamicFieldConfig => $Param{DynamicFieldConfig},
125+
ValueArray => \@Values,
126+
UserID => $Param{UserID},
127+
);
128+
VALUE:
129+
for my $Value ( $TransformedValues->@* ) {
130+
131+
# empty values are considered valid
132+
next VALUE unless $Value;
133+
134+
my @SearchResult = $Self->SearchObjects(
135+
DynamicFieldConfig => $Param{DynamicFieldConfig},
136+
ObjectID => $Value,
137+
UserID => $Param{UserID},
138+
);
139+
140+
return unless @SearchResult;
141+
}
142+
}
143+
else {
144+
VALUE:
145+
for my $Value (@Values) {
146+
147+
# empty values are considered valid
148+
next VALUE unless $Value;
149+
150+
my @SearchResult = $Self->SearchObjects(
151+
DynamicFieldConfig => $Param{DynamicFieldConfig},
152+
ObjectID => $Value,
153+
UserID => $Param{UserID},
154+
);
155+
156+
return unless @SearchResult;
157+
}
158+
}
159+
}
160+
161+
return 1;
162+
}
163+
98164
sub PossibleValuesGet {
99165

100166
# this field makes no use of PossibleValuesGet for performance purpose - instead, values are checked via CustomerUserDataGet
@@ -159,8 +225,8 @@ sub GetFieldTypeSettings {
159225
Explanation => Translatable('When set via an external source (e.g. web service or import / export), the value will be interpreted as this attribute.'),
160226
InputType => 'Selection',
161227
SelectionData => {
162-
'UserLogin' => 'Login',
163-
'UserEmail' => 'E-Mail',
228+
'UserLogin' => 'Login',
229+
'PostMasterSearch' => 'E-Mail',
164230
},
165231
PossibleNone => 1,
166232
Multiple => 0,
@@ -458,8 +524,6 @@ sub _GetHTTPLink {
458524
$AccessRo = 1;
459525
}
460526
}
461-
462-
return;
463527
}
464528

465529
if ( $AccessRo || $AccessRw ) {

Kernel/System/Ticket/FieldRestrictions.pm

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,11 @@ sub GetFieldStates {
269269

270270
# values of visible fields turning invisible are deleted or set to values of ticket data if present
271271
my $UpdateRequired = !defined $DFParam->{"DynamicField_$DFName"} ? 0 :
272-
ref( $DFParam->{"DynamicField_$DFName"} ) ?
273-
( IsArrayRefWithData( $DFParam->{"DynamicField_$DFName"} ) ? 1 : 0 ) :
274-
$DFParam->{"DynamicField_$DFName"} =~ m/^-?$/ ? 0 : 1;
272+
ref( $DFParam->{"DynamicField_$DFName"} )
273+
?
274+
( IsArrayRefWithData( $DFParam->{"DynamicField_$DFName"} ) ? 1 : 0 )
275+
:
276+
$DFParam->{"DynamicField_$DFName"} =~ m/^-?$/ ? 0 : 1;
275277

276278
my %TicketData;
277279
if ( $Param{TicketID} ) {
@@ -754,6 +756,8 @@ sub SetACLPreselectionCache {
754756
SLA => 'SLAID',
755757
StandardTemplate => 'StandardTemplateID',
756758
CustomerUser => 'ServiceID', # for some unknown reason the changed element upon customer user change is always ServiceID
759+
CustomerUserID => 'CustomerUserID',
760+
CustomerID => 'CustomerID',
757761
);
758762

759763
# dynamic fields

0 commit comments

Comments
 (0)