java/code schema/spacewalk
by Tomáš Kašpárek
java/code/src/com/redhat/rhn/frontend/strings/database/StringResource_en_US.xml | 6 +++++
schema/spacewalk/common/data/rhnTimezone.sql | 6 +++++
schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/050-rhnTimezone-data.sql | 12 ++++++++++
3 files changed, 24 insertions(+)
New commits:
commit 5c264e4331e6e2b72921f84eeb699c2f40969e2c
Author: Johannes Renner <jrenner(a)suse.de>
Date: Wed Feb 12 10:39:07 2014 +0100
Add missing GMT+3 timezone as Saudi Arabia
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/database/StringResource_en_US.xml b/java/code/src/com/redhat/rhn/frontend/strings/database/StringResource_en_US.xml
index 0312614..e7f3437 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/database/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/database/StringResource_en_US.xml
@@ -326,6 +326,12 @@
<context context-type="sourcefile">/rhn/account/UserDetails</context>
</context-group>
</trans-unit>
+ <trans-unit id="Asia/Riyadh">
+ <source>(GMT+0300) Saudi Arabia</source>
+ <context-group name="ctx">
+ <context context-type="sourcefile">/rhn/account/UserDetails</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="Asia/Tehran">
<source>(GMT+0330) Iran</source>
<context-group name="ctx">
diff --git a/schema/spacewalk/common/data/rhnTimezone.sql b/schema/spacewalk/common/data/rhnTimezone.sql
index 2a70465..84b6fce 100644
--- a/schema/spacewalk/common/data/rhnTimezone.sql
+++ b/schema/spacewalk/common/data/rhnTimezone.sql
@@ -224,6 +224,12 @@ insert into rhnTimezone
(id, olson_name, display_name)
values
(sequence_nextval('rhn_timezone_id_seq'),
+ 'Asia/Riyadh', 'Saudi Arabia');
+
+insert into rhnTimezone
+ (id, olson_name, display_name)
+values
+ (sequence_nextval('rhn_timezone_id_seq'),
'Asia/Tehran', 'Iran');
insert into rhnTimezone
diff --git a/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/050-rhnTimezone-data.sql b/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/050-rhnTimezone-data.sql
new file mode 100644
index 0000000..117806a
--- /dev/null
+++ b/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/050-rhnTimezone-data.sql
@@ -0,0 +1,12 @@
+insert into rhnTimezone (id, olson_name, display_name) (
+ select sequence_nextval('rhn_timezone_id_seq'),
+ 'Asia/Riyadh',
+ 'Saudi Arabia'
+ from dual
+ where not exists (
+ select 1
+ from rhnTimezone
+ where olson_name = 'Asia/Riyadh'
+ and display_name = 'Saudi Arabia'
+ )
+);
10 years, 3 months
11 commits - branding/css java/buildconf java/code web/modules
by Tomáš Kašpárek
branding/css/spacewalk-theme.less | 11 +
java/buildconf/build-taskdefs.xml | 16 -
java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_es.xml | 2
java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTagUtil.java | 2
java/code/webapp/WEB-INF/pages/admin/config/monitoring.jsp | 22 ++
java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf | 12 -
java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp | 100 ++++------
java/code/webapp/WEB-INF/pages/errata/packages/add.jsp | 50 ++---
java/code/webapp/WEB-INF/pages/ssm/systems/migrate.jsp | 40 ++--
java/code/webapp/WEB-INF/pages/user/create/usercreate.jsp | 10 -
web/modules/sniglets/Sniglets/ListView/List.pm | 10 -
11 files changed, 145 insertions(+), 130 deletions(-)
New commits:
commit 3e800b42ec666f9812e1e72b234fb90f43fb82e9
Author: Tomas Kasparek <tkasparek(a)redhat.com>
Date: Wed Feb 12 09:25:58 2014 +0100
style CreateUser page so it resembles old look
diff --git a/branding/css/spacewalk-theme.less b/branding/css/spacewalk-theme.less
index 82f2902..b5a6c77 100644
--- a/branding/css/spacewalk-theme.less
+++ b/branding/css/spacewalk-theme.less
@@ -720,3 +720,14 @@ ul.nav.nav-tabs:last-child {
color: #c00;
}
+
+.box-small {
+ display: inline !important;
+ width: 70px !important;
+}
+
+.box-large {
+ display: inline !important;
+ width: 200px !important;
+}
+
diff --git a/java/code/webapp/WEB-INF/pages/user/create/usercreate.jsp b/java/code/webapp/WEB-INF/pages/user/create/usercreate.jsp
index 017e827..35fa5d9 100644
--- a/java/code/webapp/WEB-INF/pages/user/create/usercreate.jsp
+++ b/java/code/webapp/WEB-INF/pages/user/create/usercreate.jsp
@@ -33,7 +33,6 @@
<rhn:csrf />
<div class="row-0">
- <div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h4><bean:message key="usercreate.login" /></h4>
@@ -102,8 +101,6 @@
</table>
</div>
</div>
- </div>
- <div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h4><bean:message key="usercreate.accountInfo" /></h4>
@@ -113,14 +110,14 @@
<tr>
<td><label for="firstNames"><rhn:required-field key="usercreate.names"/>:</td></label>
<td>
- <html:select styleClass="form-control margin-bottom-xs" property="prefix">
+ <html:select styleClass="form-control margin-bottom-xs box-small" property="prefix">
<html:options collection="availablePrefixes"
property="value"
labelProperty="label" />
</html:select>
- <html:text property="firstNames" size="15" styleClass="form-control margin-bottom-xs" maxlength="${firstNameLength}" styleId="firstNames"/>
- <html:text property="lastName" size="15" styleClass="form-control margin-bottom-xs" maxlength="${lastNameLength}"/>
+ <html:text property="firstNames" size="15" styleClass="form-control margin-bottom-xs box-large" maxlength="${firstNameLength}" styleId="firstNames"/>
+ <html:text property="lastName" size="15" styleClass="form-control margin-bottom-xs box-large" maxlength="${lastNameLength}"/>
</td>
</tr>
@@ -137,7 +134,6 @@
</table>
</div>
</div>
- </div>
</div>
<c:if test="${account_type == 'into_org'}">
commit 1913f5c5a9d2658d0b79a2683159419d884fb43d
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Mon Feb 10 14:26:07 2014 +0100
/rhn/systems/details/configuration/addfiles/CreateFile.do?sid=...
too much space between radios due to wrong usage of form-group.
(cherry picked from commit d95d0ad2c58790750a6b7c563187a18ae09111a6)
diff --git a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
index b48e677..2e8721c 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
@@ -32,20 +32,12 @@
<bean:message key="addfiles.jsp.type.text" />
</label>
</div>
- </div>
- </div>
- <div class="form-group">
- <div class="col-lg-offset-3 col-lg-6">
<div class="checkbox">
<label>
<html:radio property="filetype" value="directory" styleId="dir_radio" />
<bean:message key="addfiles.jsp.type.directory" />
</label>
</div>
- </div>
- </div>
- <div class="form-group">
- <div class="col-lg-offset-3 col-lg-6">
<div class="checkbox">
<label>
<html:radio property="filetype" value="symlink" styleId="symlink_radio" />
commit 9d5b1aec7478aaffddbb3acfd4fcffd58ce8af9a
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Mon Feb 10 12:20:55 2014 +0100
use help-block for help text in form
(cherry picked from commit ff8bb05e0c32bce08ca45204a1b65cf39bcbcb45)
diff --git a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
index 335d48f..b48e677 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
@@ -134,7 +134,9 @@
</div>
<div class="form-group">
<div class="col-lg-offset-3 col-lg-6">
- <strong><bean:message key="filedetails.jsp.tip.ownership" /></strong>
+ <span class="help-block">
+ <bean:message key="filedetails.jsp.tip.ownership" />
+ </span>
</div>
</div>
<div class="form-group">
commit e04050a4dc872a175c94393c83ab5f58ba728b69
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Sun Feb 9 19:49:16 2014 +0100
/rhn/systems/ssm/MigrateSystems.do popup menu (aka select) after 'Target Orgenization' is not styled
(cherry picked from commit 97cc7c7f5f562d496c6d1a8c4febc1aa9d63db12)
diff --git a/java/code/webapp/WEB-INF/pages/ssm/systems/migrate.jsp b/java/code/webapp/WEB-INF/pages/ssm/systems/migrate.jsp
index 325bab2..b694fb8 100644
--- a/java/code/webapp/WEB-INF/pages/ssm/systems/migrate.jsp
+++ b/java/code/webapp/WEB-INF/pages/ssm/systems/migrate.jsp
@@ -19,30 +19,30 @@
<c:choose>
<c:when test="${trustedOrgs == 0}">
- <strong><bean:message key="ssm.migrate.systems.notrust"/></strong>
+ <p class="bg-warning"><bean:message key="ssm.migrate.systems.notrust"/></p>
</c:when>
<c:otherwise>
- <html:form method="post" action="/systems/ssm/MigrateSystems.do">
+ <html:form styleClass="form-inline" method="post" action="/systems/ssm/MigrateSystems.do">
<rhn:csrf />
<rhn:submitted />
- <table class="details">
- <tr>
- <th>
- <bean:message key="ssm.migrate.systems.org"/>
- </th>
- <td>
- <html:select property="org">
- <html:option value="">-- None --</html:option>
- <c:forEach var="o" items="${orgs}">
- <html:option value="${o.name}">${o.name}</html:option>
- </c:forEach>
- </html:select>
- </td>
- <td class="text-right">
- <input type ="submit" name="dispatch" value="${rhn:localize('ssm.migrate.systems.confirmbutton')}"/>
- </td>
- </tr>
- </table>
+ <div class="form-group">
+ <label>
+ <bean:message key="ssm.migrate.systems.org"/>
+ </label>
+ </div>
+ <div class="form-group">
+ <html:select styleClass="form-control" property="org">
+ <html:option value="">-- None --</html:option>
+ <c:forEach var="o" items="${orgs}">
+ <html:option value="${o.name}">${o.name}</html:option>
+ </c:forEach>
+ </html:select>
+ </div>
+ <div class="form-group">
+ <button class="btn btn-success" type ="submit" name="dispatch" value="${rhn:localize('ssm.migrate.systems.confirmbutton')}">
+ ${rhn:localize('ssm.migrate.systems.confirmbutton')}
+ </button>
+ </div>
</html:form>
</c:otherwise>
</c:choose>
commit d15de33f700615d2023a49f17697f0b5418e608f
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Sat Feb 8 18:14:11 2014 +0100
Unstyled elements in /rhn/errata/manage/AddPackages.do?eid=...
(cherry picked from commit 60a749eb5d63e75641c27b553b5c479038b6c90b)
diff --git a/java/code/webapp/WEB-INF/pages/errata/packages/add.jsp b/java/code/webapp/WEB-INF/pages/errata/packages/add.jsp
index 20a5053..7309040 100644
--- a/java/code/webapp/WEB-INF/pages/errata/packages/add.jsp
+++ b/java/code/webapp/WEB-INF/pages/errata/packages/add.jsp
@@ -35,27 +35,28 @@
<rl:listset name="groupSet">
- <rhn:csrf />
-
-
-
-
- <p>
- <bean:message key="errata.edit.packages.add.viewlabel"/>
- <select name="view_channel">
- <c:forEach items="${viewoptions}" var="option">
- <option value="<c:out value="${option.value}"/>"
- <c:if test="${option.value == param.view_channel}">selected="1"</c:if>>
- <c:out value="${option.label}"/>
- </option>
- </c:forEach>
- </select>
- <html:submit property="view_clicked">
- <bean:message key="errata.edit.packages.add.viewsubmit"/>
- </html:submit>
- </p>
-
-
+ <rhn:csrf />
+ <p>
+ <div class="row-0">
+ <div class="col-xs-12 col-lg-6">
+ <div class="input-group">
+ <select class="form-control" name="view_channel">
+ <c:forEach items="${viewoptions}" var="option">
+ <option value="<c:out value="${option.value}"/>"
+ <c:if test="${option.value == param.view_channel}">selected="1"</c:if>>
+ <c:out value="${option.label}"/>
+ </option>
+ </c:forEach>
+ </select>
+ <span class="input-group-btn">
+ <button class="btn btn-default" type="submit" name="view_clicked">
+ <i class="fa fa-filter"></i>
+ </button>
+ </span>
+ </div>
+ </div>
+ </div>
+ </p>
<input type="hidden" name="eid" value="<c:out value="${param.eid}"/>" />
@@ -95,10 +96,9 @@
<div class="text-right">
<rhn:submitted/>
- <hr/>
- <input type="submit"
- name="dispatch"
- value='<bean:message key="errata.edit.packages.add.addpackages"/>'/>
+ <button type="submit" name="dispatch" class="btn btn-primary" value="<bean:message key='errata.edit.packages.add.addpackages'/>">
+ <bean:message key="errata.edit.packages.add.addpackages"/>
+ </button>
</div>
</rl:listset>
commit eccd640f1f807a2f5cc36f8fd3180ac42571891e
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Sat Feb 8 15:48:15 2014 +0100
Fixes bar going from 0..9 A..Z on /rhn/systems/details/packages/PackageList.do but A..Z 0..9 on /rhn/systems/SystemEntitlements.do and /network/systems/system_list/regular_in_channel_family.pxt
(Note, this is bug has been always been there and is not related to the user interface changes)
(cherry picked from commit fcaa4a1e8ce5b3d98d23f6b3b619f11eec82f389)
diff --git a/web/modules/sniglets/Sniglets/ListView/List.pm b/web/modules/sniglets/Sniglets/ListView/List.pm
index 3a69b9b..2b0beb1 100644
--- a/web/modules/sniglets/Sniglets/ListView/List.pm
+++ b/web/modules/sniglets/Sniglets/ListView/List.pm
@@ -511,7 +511,7 @@ sub render_alphabar_content {
my @ret;
my @attr;
- foreach my $alpha ('A' .. 'Z', '0' .. '9') {
+ foreach my $alpha ('0' .. '9', 'A' .. 'Z') {
if (exists $alphabar->{$alpha}) {
my $base = $alphabar->{$alpha};
commit db4e844c9eccff043e9dd60714319b42e8e5b967
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Sat Feb 8 15:16:06 2014 +0100
different set of pagination arrows on /network/systems/system_list/regular_in_channel_family.pxt
(cherry picked from commit 2aca14e864725a01c95bd8f86eff70919a455b9b)
diff --git a/web/modules/sniglets/Sniglets/ListView/List.pm b/web/modules/sniglets/Sniglets/ListView/List.pm
index 1e62114..3a69b9b 100644
--- a/web/modules/sniglets/Sniglets/ListView/List.pm
+++ b/web/modules/sniglets/Sniglets/ListView/List.pm
@@ -667,10 +667,10 @@ sub render_pagination_buttons {
# show buttons
if ($lower != '1' || ($upper != $total)) {
- $back_buttons_str = $self->render_pagination_button("First", "fa fa-fast-backward", " |< ", $back_status);
- $back_buttons_str .= $self->render_pagination_button("Prev", "fa fa-backward", " < ", $back_status);
- $forward_buttons_str = $self->render_pagination_button("Next", "fa fa-forward", " > ", $forward_status);
- $forward_buttons_str .= $self->render_pagination_button("Last", "fa fa-fast-forward", " >| ", $forward_status);
+ $back_buttons_str = $self->render_pagination_button("First", "fa fa-angle-double-left", " |< ", $back_status);
+ $back_buttons_str .= $self->render_pagination_button("Prev", "fa fa-angle-left", " < ", $back_status);
+ $forward_buttons_str = $self->render_pagination_button("Next", "fa fa-angle-right", " > ", $forward_status);
+ $forward_buttons_str .= $self->render_pagination_button("Last", "fa fa-angle-double-right", " >| ", $forward_status);
}
my %subst;
commit 15cd09cf6f5638d84148e1ded084dda8b2b238de
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Sat Feb 8 14:41:19 2014 +0100
panel inside a panel in rhn/configuration/Overview.do, just
give a title to the list, which is already a panel.
(cherry picked from commit 5284f38b0cfe4ef81cc053d253ce0f5594f1c415)
diff --git a/java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp b/java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp
index 0f85f0d..3fd1233 100644
--- a/java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp
+++ b/java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp
@@ -37,60 +37,52 @@
</div>
</div>
- <div class="panel panel-default">
- <div class="panel-heading">
- <h4><bean:message key="configoverview.jsp.modconfig"/></h4>
- </div>
- <div class="panel-body">
-
- <rhn:list pageList="${requestScope.recentFiles}" noDataText="configoverview.jsp.noFiles">
- <rhn:listdisplay>
- <rhn:column header="configoverview.jsp.filename"
- url="/rhn/configuration/file/FileDetails.do?cfid=${current.id}">
- <c:choose>
- <c:when test="${current.type == 'file'}">
- <rhn:icon type="header-file" />
- ${fn:escapeXml(current.path)}
- </c:when>
- <c:when test="${current.type == 'directory'}">
- <rhn:icon type="header-folder" />
- ${fn:escapeXml(current.path)}
- </c:when>
- <c:otherwise>
- <rhn:icon type="header-symlink" />
- ${fn:escapeXml(current.path)}
- </c:otherwise>
- </c:choose>
- </rhn:column>
-
- <rhn:column header="config.common.configChannel"
- url="/rhn/configuration/ChannelOverview.do?ccid=${current.configChannelId}">
-
- <c:if test="${current.configChannelType == 'normal'}">
- <rhn:icon type="header-channel" />
- ${current.channelNameDisplay}
- </c:if>
-
- <c:if test="${current.configChannelType == 'local_override'}">
- <rhn:icon type="header-system" />
- ${current.channelNameDisplay}
- </c:if>
-
- <c:if test="${current.configChannelType == 'server_import'}">
- <rhn:icon type="header-sandbox" />
- ${current.channelNameDisplay}
- </c:if>
-
- </rhn:column>
-
- <rhn:column header="configoverview.jsp.modified">
- ${current.modifiedDisplay}
- </rhn:column>
-
- </rhn:listdisplay>
- </rhn:list>
- </div>
- </div>
+ <rhn:list pageList="${requestScope.recentFiles}" noDataText="configoverview.jsp.noFiles">
+ <rhn:listdisplay title="configoverview.jsp.modconfig">
+ <rhn:column header="configoverview.jsp.filename"
+ url="/rhn/configuration/file/FileDetails.do?cfid=${current.id}">
+ <c:choose>
+ <c:when test="${current.type == 'file'}">
+ <rhn:icon type="header-file" />
+ ${fn:escapeXml(current.path)}
+ </c:when>
+ <c:when test="${current.type == 'directory'}">
+ <rhn:icon type="header-folder" />
+ ${fn:escapeXml(current.path)}
+ </c:when>
+ <c:otherwise>
+ <rhn:icon type="header-symlink" />
+ ${fn:escapeXml(current.path)}
+ </c:otherwise>
+ </c:choose>
+ </rhn:column>
+
+ <rhn:column header="config.common.configChannel"
+ url="/rhn/configuration/ChannelOverview.do?ccid=${current.configChannelId}">
+
+ <c:if test="${current.configChannelType == 'normal'}">
+ <rhn:icon type="header-channel" />
+ ${current.channelNameDisplay}
+ </c:if>
+
+ <c:if test="${current.configChannelType == 'local_override'}">
+ <rhn:icon type="header-system" />
+ ${current.channelNameDisplay}
+ </c:if>
+
+ <c:if test="${current.configChannelType == 'server_import'}">
+ <rhn:icon type="header-sandbox" />
+ ${current.channelNameDisplay}
+ </c:if>
+
+ </rhn:column>
+
+ <rhn:column header="configoverview.jsp.modified">
+ ${current.modifiedDisplay}
+ </rhn:column>
+
+ </rhn:listdisplay>
+ </rhn:list>
<div class="panel panel-default">
<div class="panel-heading">
commit 44b7e341f06254df8ccf874163f13ebd37f6f8e3
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Sat Feb 8 12:07:24 2014 +0100
/rhn/admin/config/MonitoringConfig.do
help texts ((e.g. 'redhat.com' for myemail@…)) should be bellow input bars (see /rhn/activationkeys/Edit.do?tid=1 how it should look like)
This form is generated from the backend by iterating a config description and a config
value map. The description is already concatenated with the help.
(This was already like that in Spacewalk 2.0 so this issue is not Bootstrap-port
specific)
We use a bit of page-specific Javascript to detect text of the type
"This is something (with some help)" to move the help and apply
the right style to it.
If the backend can provide the text separated then we should
try that instead.
(cherry picked from commit 12b33028b0fb4ee0662b45dd6decadefa73959a8)
diff --git a/java/code/webapp/WEB-INF/pages/admin/config/monitoring.jsp b/java/code/webapp/WEB-INF/pages/admin/config/monitoring.jsp
index a6663ca..cc475c8 100644
--- a/java/code/webapp/WEB-INF/pages/admin/config/monitoring.jsp
+++ b/java/code/webapp/WEB-INF/pages/admin/config/monitoring.jsp
@@ -4,6 +4,28 @@
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html>
+ <head>
+ <script type="text/javascript">
+ /*
+ * Config option value and help are already
+ * concatenated. Split them to display the help
+ * in the form correctly.
+ */
+ $(function() {
+ var textMixedWithHelp = /^(.+)\((.+)\)\s*$/;
+ $('label').each(function(idx, lbl) {
+ var match = textMixedWithHelp.exec($(lbl).html());
+ var input = $(lbl).attr('for');
+ if (match != null && input != undefined) {
+ $("[name='" + input + "']").after(
+ '<span class="help-block">' + match[2] + '</span>'
+ );
+ $(lbl).html(match[1]);
+ }
+ });
+ });
+ </script>
+ </head>
<body>
<rhn:toolbar base="h1" icon="header-info"
helpUrl="">
commit 1a4c333a6c7533ef72921243a7186088bc4cffe6
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Fri Feb 7 16:29:00 2014 +0100
fix unclosed that broke the top pagination selected count
for example /rhn/systems/DuplicateIPList.do
(cherry picked from commit 8839652c56473be64c9d9017d8e4ef5daac66fa8)
diff --git a/java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTagUtil.java b/java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTagUtil.java
index b032e50..7eee746 100644
--- a/java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTagUtil.java
+++ b/java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTagUtil.java
@@ -703,7 +703,7 @@ public class ListTagUtil {
public static void renderFilterSubmit(PageContext pageContext,
String uniqueName) throws JspException {
String filterName = makeFilterNameByLabel(uniqueName);
- String result = (String.format("<input type=\"hidden\" name=\"%s\" ", filterName));
+ String result = (String.format("<input type=\"hidden\" name=\"%s\">", filterName));
ListTagUtil.write(pageContext, result);
}
commit 268ad12a92fcc26cc71ec9a1cdcffc69aac519fa
Author: Duncan Mac-Vicar P <dmacvicar(a)suse.de>
Date: Fri Feb 7 16:00:54 2014 +0100
fix spanish translation for selected systems (string does not take a parameter anymore)
(cherry picked from commit 70d810ceccb28d0a48bf0c113bfbc5fb4fd8597a)
diff --git a/java/buildconf/build-taskdefs.xml b/java/buildconf/build-taskdefs.xml
index 121905f..551bc59 100644
--- a/java/buildconf/build-taskdefs.xml
+++ b/java/buildconf/build-taskdefs.xml
@@ -1,17 +1,17 @@
<project name="build-taskdefs">
<target name="init-ivy" depends="boot-deps" unless="installbuild">
<taskdef name="ivy-retrieve"
- classname="fr.jayasoft.ivy.ant.IvyRetrieve"
- classpathref="bootjars"/>
+ classname="org.apache.ivy.ant.IvyRetrieve"
+ classpathref="bootjars" />
<taskdef name="ivy-configure"
- classname="fr.jayasoft.ivy.ant.IvyConfigure"
- classpathref="bootjars"/>
+ classname="org.apache.ivy.ant.IvyConfigure"
+ classpathref="bootjars" />
<taskdef name="ivy-resolve"
- classname="fr.jayasoft.ivy.ant.IvyResolve"
- classpathref="bootjars"/>
+ classname="org.apache.ivy.ant.IvyResolve"
+ classpathref="bootjars" />
<taskdef name="ivy-publish"
- classname="fr.jayasoft.ivy.ant.IvyPublish"
- classpathref="bootjars"/>
+ classname="org.apache.ivy.ant.IvyPublish"
+ classpathref="bootjars" />
</target>
<target name="init-taskdefs" depends="link-jars,compile-internal"
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_es.xml b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_es.xml
index 9e31510..3156157 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_es.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_es.xml
@@ -1350,7 +1350,7 @@
5 systems selected
</context>
</context-group>
- <target>{0} sistemas seleccionados</target>
+ <target>sistemas seleccionados</target>
</trans-unit>
<!-- footer.jsp -->
<trans-unit id="footer.jsp.copyright">
10 years, 3 months
Changes to 'refs/tags/spacewalk-branding-2.1.27-1'
by Grant Gainey
Tag 'spacewalk-branding-2.1.27-1' created by Grant Gainey <ggainey(a)redhat.com> at 2014-02-11 19:35 +0000
Tagging package [spacewalk-branding] version [2.1.27-1] in directory [branding/].
Changes since spacewalk-web-2.1.55-1:
Grant Gainey (1):
Automatic commit of package [spacewalk-branding] release [2.1.27-1].
---
branding/spacewalk-branding.spec | 5 ++++-
rel-eng/packages/spacewalk-branding | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
---
10 years, 3 months
branding/spacewalk-branding.spec rel-eng/packages
by Grant Gainey
branding/spacewalk-branding.spec | 5 ++++-
rel-eng/packages/spacewalk-branding | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
New commits:
commit d482c94e23d5cf91d4ea8fdb89d52adc364ba245
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Tue Feb 11 14:35:24 2014 -0500
Automatic commit of package [spacewalk-branding] release [2.1.27-1].
diff --git a/branding/spacewalk-branding.spec b/branding/spacewalk-branding.spec
index 3afea03..95d513a 100644
--- a/branding/spacewalk-branding.spec
+++ b/branding/spacewalk-branding.spec
@@ -9,7 +9,7 @@
%endif
Name: spacewalk-branding
-Version: 2.1.26
+Version: 2.1.27
Release: 1%{?dist}
Summary: Spacewalk branding data
@@ -87,6 +87,9 @@ rm -rf %{buildroot}
%doc LICENSE
%changelog
+* Tue Feb 11 2014 Grant Gainey 2.1.27-1
+- 1063915, CVE-2013-4415 - Missed changing Search.do to post, perl-side
+
* Thu Feb 06 2014 Michael Mraka <michael.mraka(a)redhat.com> 2.1.26-1
- fixed create probe page aligning
- required field marker used to be red
diff --git a/rel-eng/packages/spacewalk-branding b/rel-eng/packages/spacewalk-branding
index 389225b..333cc0c 100644
--- a/rel-eng/packages/spacewalk-branding
+++ b/rel-eng/packages/spacewalk-branding
@@ -1 +1 @@
-2.1.26-1 branding/
+2.1.27-1 branding/
10 years, 3 months
Changes to 'refs/tags/spacewalk-web-2.1.55-1'
by Grant Gainey
Tag 'spacewalk-web-2.1.55-1' created by Grant Gainey <ggainey(a)redhat.com> at 2014-02-11 19:34 +0000
Tagging package [spacewalk-web] version [2.1.55-1] in directory [web/].
Changes since spacewalk-java-2.1.148-1:
Grant Gainey (2):
1063915, CVE-2013-4415 - Missed changing Search.do to post, perl-side
Automatic commit of package [spacewalk-web] release [2.1.55-1].
---
branding/styles/navbar_top_sat.txt | 2 +-
branding/templates/c.pxt | 2 +-
rel-eng/packages/spacewalk-web | 2 +-
web/html/errors/403.html | 2 +-
web/html/errors/404.html | 2 +-
web/html/errors/413.html | 2 +-
web/html/errors/500.html | 2 +-
web/spacewalk-web.spec | 5 ++++-
8 files changed, 11 insertions(+), 8 deletions(-)
---
10 years, 3 months
2 commits - branding/styles branding/templates rel-eng/packages web/html web/spacewalk-web.spec
by Grant Gainey
branding/styles/navbar_top_sat.txt | 2 +-
branding/templates/c.pxt | 2 +-
rel-eng/packages/spacewalk-web | 2 +-
web/html/errors/403.html | 2 +-
web/html/errors/404.html | 2 +-
web/html/errors/413.html | 2 +-
web/html/errors/500.html | 2 +-
web/spacewalk-web.spec | 5 ++++-
8 files changed, 11 insertions(+), 8 deletions(-)
New commits:
commit 36a45306e9891d8bce38bf719462b328f7f2304b
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Tue Feb 11 14:34:20 2014 -0500
Automatic commit of package [spacewalk-web] release [2.1.55-1].
diff --git a/rel-eng/packages/spacewalk-web b/rel-eng/packages/spacewalk-web
index 58b6d3b..37ee506 100644
--- a/rel-eng/packages/spacewalk-web
+++ b/rel-eng/packages/spacewalk-web
@@ -1 +1 @@
-2.1.54-1 web/
+2.1.55-1 web/
diff --git a/web/spacewalk-web.spec b/web/spacewalk-web.spec
index 952f244..494c202 100644
--- a/web/spacewalk-web.spec
+++ b/web/spacewalk-web.spec
@@ -4,7 +4,7 @@ Name: spacewalk-web
Summary: Spacewalk Web site - Perl modules
Group: Applications/Internet
License: GPLv2
-Version: 2.1.54
+Version: 2.1.55
Release: 1%{?dist}
URL: https://fedorahosted.org/spacewalk/
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
@@ -269,6 +269,9 @@ rm -rf $RPM_BUILD_ROOT
%doc LICENSE
%changelog
+* Tue Feb 11 2014 Grant Gainey 2.1.55-1
+- 1063915, CVE-2013-4415 - Missed changing Search.do to post, perl-side
+
* Tue Feb 04 2014 Michael Mraka <michael.mraka(a)redhat.com> 2.1.54-1
- changes in the logic to update the tick icon
commit a1447d9a892756af6d90f9c6d7454c9630ca03d6
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Tue Feb 11 14:32:44 2014 -0500
1063915, CVE-2013-4415 - Missed changing Search.do to post, perl-side
diff --git a/branding/styles/navbar_top_sat.txt b/branding/styles/navbar_top_sat.txt
index 43bc0bc..f57adcc 100644
--- a/branding/styles/navbar_top_sat.txt
+++ b/branding/styles/navbar_top_sat.txt
@@ -28,7 +28,7 @@ class="navPipe">|</span><a href="/rhn/Logout.do"><span>Sign Out</span></a>
<div id="header">
<a href="/"><img src="/img/logo.png" alt="Spacewalk" width="228" height="52" id="rhnLogo" /></a>
<div id="searchbar">
- <form name="form1" action="/rhn/Search.do" method="get">
+ <form name="form1" action="/rhn/Search.do" method="post">
<select name="search_type">
<option value="systems">Systems</option>
diff --git a/branding/templates/c.pxt b/branding/templates/c.pxt
index ccfdcd2..0f1eb80 100644
--- a/branding/templates/c.pxt
+++ b/branding/templates/c.pxt
@@ -49,7 +49,7 @@
</ul>
</rhn-display-login>
- <form name="form1" class="form-inline hidden-xs" role="form" action="/rhn/Search.do" method="get">
+ <form name="form1" class="form-inline hidden-xs" role="form" action="/rhn/Search.do" method="post">
<div class="form-group">
<select name="search_type" class="form-control input-sm">
diff --git a/web/html/errors/403.html b/web/html/errors/403.html
index 66cff71..c60feb1 100644
--- a/web/html/errors/403.html
+++ b/web/html/errors/403.html
@@ -28,7 +28,7 @@
<div id="header">
<a href="/"><img src="/img/logo.png" id="rhnLogo"></a>
<div id="searchbar">
- <form name="form1" action="/rhn/Search.do" method="get">
+ <form name="form1" action="/rhn/Search.do" method="post">
<select name="search_type">
<option value="systems">Systems</option>
diff --git a/web/html/errors/404.html b/web/html/errors/404.html
index e7b5fb3..511e31e 100644
--- a/web/html/errors/404.html
+++ b/web/html/errors/404.html
@@ -28,7 +28,7 @@
<div id="header">
<a href="/"><img src="/img/logo.png" id="rhnLogo"></a>
<div id="searchbar">
- <form name="form1" action="/rhn/Search.do" method="get">
+ <form name="form1" action="/rhn/Search.do" method="post">
<select name="search_type">
<option value="systems">Systems</option>
diff --git a/web/html/errors/413.html b/web/html/errors/413.html
index 984b736..2cae3a4 100644
--- a/web/html/errors/413.html
+++ b/web/html/errors/413.html
@@ -28,7 +28,7 @@
<div id="header">
<a href="/"><img src="/img/logo.png" id="rhnLogo"></a>
<div id="searchbar">
- <form name="form1" action="/rhn/Search.do" method="get">
+ <form name="form1" action="/rhn/Search.do" method="post">
<select name="search_type">
<option value="systems">Systems</option>
diff --git a/web/html/errors/500.html b/web/html/errors/500.html
index 1008075..049841a 100644
--- a/web/html/errors/500.html
+++ b/web/html/errors/500.html
@@ -28,7 +28,7 @@
<div id="header">
<a href="/"><img src="/img/logo.png" id="rhnLogo"></a>
<div id="searchbar">
- <form name="form1" action="/rhn/Search.do" method="get">
+ <form name="form1" action="/rhn/Search.do" method="post">
<select name="search_type">
<option value="systems">Systems</option>
10 years, 3 months
Changes to 'refs/tags/spacewalk-java-2.1.148-1'
by Grant Gainey
Tag 'spacewalk-java-2.1.148-1' created by Grant Gainey <ggainey(a)redhat.com> at 2014-02-11 16:13 +0000
Tagging package [spacewalk-java] version [2.1.148-1] in directory [java/].
Changes since spacewalk-schema-2.1.41-1:
Grant Gainey (8):
1063915, CVE-2012-6149, Fix XSS in notes.jsp
1063915, CVE-2013-1869, Only follow internal return_urls
1063915, CVE-2010-2236, Cleanse backticks from monitoring-probes where appropriate
1063915, CVE-2013-1869, close header-injection hole
1063915, CVE-2013-1871, Fix XSS in edit-address JSPs
1063915, CVE-2013-4415 - Fix XSS in new-list-tag by escaping _LABEL_SELECTED
1063915, CVE-2013-4415 - Fix XSS flaws in Spacewalk-search
Automatic commit of package [spacewalk-java] release [2.1.148-1].
---
java/code/src/com/redhat/rhn/domain/monitoring/command/CommandParameter.java | 20
java/code/src/com/redhat/rhn/domain/monitoring/command/FloatValidator.java | 1
java/code/src/com/redhat/rhn/domain/monitoring/command/IntegerValidator.java | 1
java/code/src/com/redhat/rhn/domain/monitoring/command/ParameterValidator.java | 8
java/code/src/com/redhat/rhn/domain/monitoring/command/ProbeStateValidator.java | 1
java/code/src/com/redhat/rhn/domain/monitoring/command/test/CommandTest.java | 36
java/code/src/com/redhat/rhn/frontend/action/BaseSearchAction.java | 251 +++++
java/code/src/com/redhat/rhn/frontend/action/SearchAction.java | 169 +--
java/code/src/com/redhat/rhn/frontend/action/audit/AuditSearchAction.java | 59 -
java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java | 134 ---
java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchAction.java | 377 +++-----
java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchHelper.java | 32
java/code/src/com/redhat/rhn/frontend/action/common/DateRangePicker.java | 3
java/code/src/com/redhat/rhn/frontend/action/errata/ErrataSearchAction.java | 285 ++----
java/code/src/com/redhat/rhn/frontend/action/errata/test/ErrataSearchActionTest.java | 44 -
java/code/src/com/redhat/rhn/frontend/action/help/DocSearchSetupAction.java | 185 ----
java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java | 28
java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchAction.java | 316 +++++++
java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchHelper.java | 42
java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchSetupAction.java | 433 ----------
java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchActionTest.java | 152 +++
java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchSetupActionTest.java | 153 ---
java/code/src/com/redhat/rhn/frontend/action/test/SearchActionTest.java | 16
java/code/src/com/redhat/rhn/frontend/security/PxtAuthenticationService.java | 2
java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/PageSizeDecorator.java | 7
java/code/src/com/redhat/rhn/frontend/xmlrpc/packages/search/PackagesSearchHandler.java | 37
java/code/webapp/WEB-INF/includes/header.jsp | 5
java/code/webapp/WEB-INF/pages/admin/users/edit_address.jsp | 5
java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp | 38
java/code/webapp/WEB-INF/pages/channel/packagesearch.jsp | 12
java/code/webapp/WEB-INF/pages/errata/erratasearch.jsp | 53 -
java/code/webapp/WEB-INF/pages/help/docsearch.jsp | 18
java/code/webapp/WEB-INF/pages/systems/sdc/notes.jsp | 4
java/code/webapp/WEB-INF/pages/systems/systemsearch.jsp | 12
java/code/webapp/WEB-INF/pages/user/edit/your_edit_address.jsp | 2
java/code/webapp/WEB-INF/struts-config.xml | 170 +--
java/spacewalk-java.spec | 17
rel-eng/packages/spacewalk-java | 2
38 files changed, 1486 insertions(+), 1644 deletions(-)
---
10 years, 3 months
8 commits - java/code java/spacewalk-java.spec rel-eng/packages
by Grant Gainey
java/code/src/com/redhat/rhn/domain/monitoring/command/CommandParameter.java | 20
java/code/src/com/redhat/rhn/domain/monitoring/command/FloatValidator.java | 1
java/code/src/com/redhat/rhn/domain/monitoring/command/IntegerValidator.java | 1
java/code/src/com/redhat/rhn/domain/monitoring/command/ParameterValidator.java | 8
java/code/src/com/redhat/rhn/domain/monitoring/command/ProbeStateValidator.java | 1
java/code/src/com/redhat/rhn/domain/monitoring/command/test/CommandTest.java | 36
java/code/src/com/redhat/rhn/frontend/action/BaseSearchAction.java | 251 +++++
java/code/src/com/redhat/rhn/frontend/action/SearchAction.java | 169 +--
java/code/src/com/redhat/rhn/frontend/action/audit/AuditSearchAction.java | 59 -
java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java | 134 ---
java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchAction.java | 377 +++-----
java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchHelper.java | 32
java/code/src/com/redhat/rhn/frontend/action/common/DateRangePicker.java | 3
java/code/src/com/redhat/rhn/frontend/action/errata/ErrataSearchAction.java | 285 ++----
java/code/src/com/redhat/rhn/frontend/action/errata/test/ErrataSearchActionTest.java | 44 -
java/code/src/com/redhat/rhn/frontend/action/help/DocSearchSetupAction.java | 185 ----
java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java | 28
java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchAction.java | 316 +++++++
java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchHelper.java | 42
java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchSetupAction.java | 433 ----------
java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchActionTest.java | 152 +++
java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchSetupActionTest.java | 153 ---
java/code/src/com/redhat/rhn/frontend/action/test/SearchActionTest.java | 16
java/code/src/com/redhat/rhn/frontend/security/PxtAuthenticationService.java | 2
java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/PageSizeDecorator.java | 7
java/code/src/com/redhat/rhn/frontend/xmlrpc/packages/search/PackagesSearchHandler.java | 37
java/code/webapp/WEB-INF/includes/header.jsp | 5
java/code/webapp/WEB-INF/pages/admin/users/edit_address.jsp | 5
java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp | 38
java/code/webapp/WEB-INF/pages/channel/packagesearch.jsp | 12
java/code/webapp/WEB-INF/pages/errata/erratasearch.jsp | 53 -
java/code/webapp/WEB-INF/pages/help/docsearch.jsp | 18
java/code/webapp/WEB-INF/pages/systems/sdc/notes.jsp | 4
java/code/webapp/WEB-INF/pages/systems/systemsearch.jsp | 12
java/code/webapp/WEB-INF/pages/user/edit/your_edit_address.jsp | 2
java/code/webapp/WEB-INF/struts-config.xml | 170 +--
java/spacewalk-java.spec | 17
rel-eng/packages/spacewalk-java | 2
38 files changed, 1486 insertions(+), 1644 deletions(-)
New commits:
commit 18c70164285cae0660fa3ac55c6656bb19b3b13f
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Tue Feb 11 11:13:20 2014 -0500
Automatic commit of package [spacewalk-java] release [2.1.148-1].
diff --git a/java/spacewalk-java.spec b/java/spacewalk-java.spec
index 5f319fc..c88916b 100644
--- a/java/spacewalk-java.spec
+++ b/java/spacewalk-java.spec
@@ -28,7 +28,7 @@ Name: spacewalk-java
Summary: Spacewalk Java site packages
Group: Applications/Internet
License: GPLv2
-Version: 2.1.147
+Version: 2.1.148
Release: 1%{?dist}
URL: https://fedorahosted.org/spacewalk
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
@@ -801,6 +801,21 @@ fi
%{jardir}/postgresql-jdbc.jar
%changelog
+* Tue Feb 11 2014 Grant Gainey <ggainey(a)redhat.com> 2.1.148-1
+- 1063915, CVE-2013-4415 - Fix XSS flaws in Spacewalk-search
+- 1063915, CVE-2013-4415 - Fix XSS in new-list-tag by escaping _LABEL_SELECTED
+- 1063915, CVE-2013-1871, Fix XSS in edit-address JSPs
+- 1063915, CVE-2013-1869, close header-injection hole
+- 1063915, CVE-2010-2236, Cleanse backticks from monitoring-probes where
+ appropriate
+- 1063915, CVE-2013-1869, Only follow internal return_urls
+- 1063915, CVE-2012-6149, Fix XSS in notes.jsp
+- Fix an ISE that could happen after clearing cookies (elaborator not bound)
+- Removed duplicate colons
+- Unified space before slash in void tags
+- Datepicker UI unification: Errata pages
+- use normal checkbox
+
* Mon Feb 10 2014 Tomas Kasparek <tkasparek(a)redhat.com> 2.1.147-1
- style ProbeEdit page
- updating susestudio-java-client to 1.4
diff --git a/rel-eng/packages/spacewalk-java b/rel-eng/packages/spacewalk-java
index d0207e4..1342778 100644
--- a/rel-eng/packages/spacewalk-java
+++ b/rel-eng/packages/spacewalk-java
@@ -1 +1 @@
-2.1.147-1 java/
+2.1.148-1 java/
commit 13351dd38339ae3635196894ae73c5dbb9058b99
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Tue Feb 11 11:03:06 2014 -0500
1063915, CVE-2013-4415 - Fix XSS flaws in Spacewalk-search
This is a single large change, since everything touches everything else:
* Rework search to rely on scrubbed form fields
* Refactor search to have a common, consistent approach
* Refactor search to use struts-standard wiring instead of making direct
redirect calls
* Clean up a lot of use/misuse/inconsistent-use of quoted strings vs
declared statics
* Stop blindly passing parameters along
* Stop blindly relying on params in JSPs, and use form-vars instead
* Combine struts-config search-forms into one combined-form, given the
number of shared fields
* Standardize (some) on html:hidden instead of mixing that and
<input type="hidden" in JSPs affected by other changes
diff --git a/java/code/src/com/redhat/rhn/frontend/action/BaseSearchAction.java b/java/code/src/com/redhat/rhn/frontend/action/BaseSearchAction.java
new file mode 100644
index 0000000..ecc158b
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/action/BaseSearchAction.java
@@ -0,0 +1,251 @@
+/**
+ * Copyright (c) 2013 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.frontend.action;
+
+import java.net.MalformedURLException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.action.DynaActionForm;
+
+import redstone.xmlrpc.XmlRpcException;
+import redstone.xmlrpc.XmlRpcFault;
+
+import com.redhat.rhn.common.localization.LocalizationService;
+import com.redhat.rhn.common.validator.ValidatorException;
+import com.redhat.rhn.frontend.struts.RhnAction;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
+
+/**
+ * Base action for searches - this is a place to put the 'magic strings' that connect the
+ * JSP forms and pages to the action, and to impose a certain amount of uniformity on
+ * our (currently-very-non-uniform) search processing.
+ *
+ * @author ggainey
+ *
+ */
+public abstract class BaseSearchAction extends RhnAction {
+ protected static Logger log = Logger.getLogger(BaseSearchAction.class);
+
+ /** Channel-arches a default package-search should look in */
+ public static final String[] DEFAULT_ARCHES = {
+ "channel-ia32", "channel-ia64",
+ "channel-x86_64",
+ "channel-s390",
+ "channel-s390x",
+ "channel-ppc",
+ "channel-sparc-sun-solaris", "channel-i386-sun-solaris" };
+
+ /** List of channel arches we don't really support any more. */
+ public static final List<String> EXCLUDED_ARCHES = Arrays.asList(new String[]
+ {"channel-sparc", "channel-alpha", "channel-iSeries", "channel-pSeries"});
+
+ // combinedSearchForm common keys
+ public static final String FINE_GRAINED = "fineGrained";
+ public static final String SEARCH_STR = "search_string";
+ public static final String VIEW_MODE = "view_mode";
+ public static final String SEARCH_OPT = "searchOptions";
+
+ // Package-specific keys
+ public static final String ALL_CHANNELS = "allChannels";
+ public static final String ARCHITECTURE = "architecture";
+ public static final String CHANNEL = "channel";
+ public static final String CHANNEL_ARCH = "channel_arch";
+ public static final String CHANNEL_ARCHES = "channelArches";
+ public static final String CHANNEL_FILTER = "channel_filter";
+ public static final String OPT_FREE_FORM = "search_free_form";
+ public static final String OPT_NAME_AND_DESC = "search_name_and_description";
+ public static final String OPT_NAME_AND_SUMMARY = "search_name_and_summary";
+ public static final String OPT_NAME_ONLY = "search_name";
+ public static final String RELEVANT = "relevant";
+ public static final String WHERE_CRITERIA = "whereCriteria";
+
+ // Errata-specific keys
+ public static final String OPT_ISSUE_DATE = "optionIssueDateSearch";
+ public static final String OPT_ADVISORY = "errata_search_by_advisory";
+ public static final String OPT_PKG_NAME = "errata_search_by_package_name";
+ public static final String OPT_CVE = "errata_search_by_cve";
+ public static final String OPT_ALL_FIELDS = "errata_search_by_all_fields";
+ public static final String ERRATA_BUG = "errata_type_bug";
+ public static final String ERRATA_SEC = "errata_type_security";
+ public static final String ERRATA_ENH = "errata_type_enhancement";
+
+ // Doc-specific keys
+ public static final String OPT_CONTENT_ONLY = "search_content";
+ public static final String OPT_TITLE_ONLY = "search_title";
+ public static final String OPT_CONTENT_TITLE = "search_content_title";
+
+ // System-specific keys
+ public static final String OPT_GROUPS_MAP = "optGroupsMap";
+ public static final String OPT_GROUPS_KEYS = "optGroupsKeys";
+ public static final String WHERE_TO_SEARCH = "whereToSearch";
+ public static final String INVERT_RESULTS = "invert";
+ public static final String WHERE_ALL = "all";
+ public static final String WHERE_SSM = "system_list";
+
+ //Xcddf-specific keys
+ public static final String SCAN_DATE_SEARCH = "optionScanDateSearch";
+
+ // addOption keys
+ public static final String DISPLAY_KEY = "display";
+ public static final String VALUE_KEY = "value";
+
+ /**
+ * {@inheritDoc}
+ * The default execute() workflow for search-related actions is to call executeBody(),
+ * handle any execptions thrown, and return whatever destination executeBody returned.
+ */
+ public ActionForward execute(ActionMapping mapping,
+ ActionForm formIn,
+ HttpServletRequest request,
+ HttpServletResponse response) {
+ ActionErrors errors = new ActionErrors();
+ DynaActionForm form = (DynaActionForm)formIn;
+ request.setAttribute(ListTagHelper.PARENT_URL, request.getRequestURI());
+ String searchString = form.getString(BaseSearchAction.SEARCH_STR);
+ ActionForward destination = mapping.findForward(RhnHelper.DEFAULT_FORWARD);
+
+ try {
+ // handle setup, the submission setups the searchstring below
+ // and redirects to this page which then performs the search.
+ destination = executeBody(request, mapping, form);
+ }
+ catch (XmlRpcException xre) {
+ log.error("Could not connect to search server.", xre);
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.connection_error"));
+ }
+ catch (XmlRpcFault e) {
+ log.info("Caught Exception :" + e + ", code [" + e.getErrorCode() + "]");
+ if (e.getErrorCode() == 100) {
+ log.error("Invalid search query", e);
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.could_not_parse_query",
+ searchString));
+ }
+ else if (e.getErrorCode() == 200) {
+ log.error("Index files appear to be missing: ", e);
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.index_files_missing",
+ searchString));
+ }
+ else {
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.could_not_execute_query",
+ searchString));
+ }
+ }
+ catch (MalformedURLException e) {
+ log.error("Could not connect to server.", e);
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.connection_error"));
+ }
+ catch (ValidatorException ve) {
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.use_free_form"));
+ }
+
+ if (!errors.isEmpty()) {
+ addErrors(request, errors);
+ }
+
+ return destination;
+ }
+
+ /**
+ * This method invokes insureFormDefaults(), followed by doExecute(). Child classes
+ * are expected to do "reasonable" things in those methods.
+ * @param request http request
+ * @param mapping action mapping
+ * @param form associated form
+ * @return expected destination from doExecute
+ * @throws MalformedURLException
+ * @throws XmlRpcFault
+ */
+ protected ActionForward executeBody(HttpServletRequest request, ActionMapping mapping,
+ DynaActionForm form)
+ throws MalformedURLException, XmlRpcFault {
+ insureFormDefaults(request, form);
+ return doExecute(request, mapping, form);
+ }
+
+ /**
+ * This is the guts of a search action - do what needs doing,
+ * and return what you think the next page should be
+ * @param request incoming HTTP request
+ * @param mapping incoming action-mapping
+ * @param form form associated with this mapping
+ * @return the desired desitination based on your processing
+ * @throws MalformedURLException
+ * @throws XmlRpcFault
+ */
+ protected abstract ActionForward doExecute(HttpServletRequest request,
+ ActionMapping mapping,
+ DynaActionForm form)
+ throws MalformedURLException, XmlRpcFault;
+
+ /**
+ * This gives the child-actions a chance to set up sane defaults no matter how
+ * the happen to be invoked. Set up the form here, so that it can be relied on
+ * by code later in the workflow.
+ *
+ * @param request incoming HTTP request
+ * @param form form associated with the request
+ */
+ protected abstract void insureFormDefaults(HttpServletRequest request,
+ DynaActionForm form);
+
+ /**
+ * Utility function to create options for the dropdown.
+ * @param options list containing all options.
+ * @param key resource bundle key used as the display value.
+ * @param value value to be submitted with form.
+ */
+ protected void addOption(List<Map<String, String>> options, String key, String value) {
+ addOption(options, key, value, false);
+ }
+
+ /**
+ * Utility function to create options for the dropdown.
+ * @param options list containing all options.
+ * @param key resource bundle key used as the display value.
+ * @param value value to be submitted with form.
+ * @param flag Flag the item with an asterisk (*) indicating it is *not*
+ * synch'd
+ */
+ public void addOption(List<Map<String, String>> options, String key, String value,
+ boolean flag) {
+ LocalizationService ls = LocalizationService.getInstance();
+ Map<String, String> selection = new HashMap<String, String>();
+ selection.put("display", (flag ? "*" : "") + ls.getMessage(key));
+ selection.put("value", StringEscapeUtils.escapeHtml(value));
+ options.add(selection);
+ }
+
+}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/SearchAction.java b/java/code/src/com/redhat/rhn/frontend/action/SearchAction.java
index 517c6f7..86b2699 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/SearchAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/SearchAction.java
@@ -14,30 +14,24 @@
*/
package com.redhat.rhn.frontend.action;
-import com.redhat.rhn.common.util.ServletUtils;
-import com.redhat.rhn.domain.org.OrgFactory;
-import com.redhat.rhn.domain.user.User;
-import com.redhat.rhn.frontend.action.channel.PackageSearchAction;
-import com.redhat.rhn.frontend.action.common.BadParameterException;
-import com.redhat.rhn.frontend.action.errata.ErrataSearchAction;
-import com.redhat.rhn.frontend.action.systems.SystemSearchSetupAction;
-import com.redhat.rhn.frontend.struts.RequestContext;
-import com.redhat.rhn.frontend.struts.RhnAction;
-import com.redhat.rhn.frontend.struts.RhnHelper;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import com.redhat.rhn.domain.org.OrgFactory;
+import com.redhat.rhn.domain.user.User;
+import com.redhat.rhn.frontend.action.common.BadParameterException;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnAction;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.frontend.struts.StrutsDelegate;
/**
* SearchAction
@@ -58,83 +52,23 @@ public class SearchAction extends RhnAction {
DynaActionForm daForm = (DynaActionForm) formIn;
if (isSubmitted(daForm)) {
- String searchString = daForm.getString("search_string");
+ String searchString = daForm.getString(BaseSearchAction.SEARCH_STR);
String searchType = daForm.getString("search_type");
if (searchType == null) {
return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
- else if (searchType.equals("systems") &&
- (user.getOrg().getEntitlements().contains(
- OrgFactory.getEntitlementSwMgrPersonal()) ||
- user.getOrg().getEntitlements().contains(
- OrgFactory.getEntitlementEnterprise()))) {
- Map attributes = new HashMap();
- attributes.put(RhnAction.SUBMITTED, "true");
- attributes.put(SystemSearchSetupAction.WHERE_TO_SEARCH, "all");
- attributes.put(SystemSearchSetupAction.VIEW_MODE,
- "systemsearch_name_and_description");
- attributes.put(SystemSearchSetupAction.SEARCH_STRING, searchString);
- attributes.put(SystemSearchSetupAction.FINE_GRAINED, "on");
- performRedirect("/systems/Search.do",
- request.getContextPath(),
- response,
- attributes);
-
- return null;
+ else if (searchType.equals("systems") && systemSearchAllowed(user)) {
+ return doSystemSearch(mapping, request, searchString);
}
else if (searchType.equals("errata")) {
- Map attributes = new HashMap();
- attributes.put("view_mode", "errata_search_by_all_fields");
- attributes.put(SystemSearchSetupAction.SEARCH_STRING, searchString);
- attributes.put("optionIssueDateSearch", Boolean.FALSE);
- attributes.put("errata_type_bug", Boolean.TRUE);
- attributes.put("errata_type_security", Boolean.TRUE);
- attributes.put("errata_type_enhancement", Boolean.TRUE);
- attributes.put(ErrataSearchAction.FINE_GRAINED, "on");
- performRedirect("/errata/Search.do",
- request.getContextPath(),
- response,
- attributes);
-
- return null;
+ return doErrataSearch(mapping, request, searchString);
}
else if (searchType.equals("packages")) {
- Map attributes = new HashMap();
- attributes.put("view_mode", "search_name_and_summary");
- attributes.put(SystemSearchSetupAction.SEARCH_STRING, searchString);
- attributes.put(PackageSearchAction.WHERE_CRITERIA, "architecture");
-
- // select all the arches to make a better search
- List<String> defaultArches = new ArrayList<String>();
- defaultArches.add("channel-ia32");
- defaultArches.add("channel-ia64");
- defaultArches.add("channel-x86_64");
- defaultArches.add("channel-s390");
- defaultArches.add("channel-s390x");
- defaultArches.add("channel-ppc");
- defaultArches.add("channel-sparc-sun-solaris");
- defaultArches.add("channel-i386-sun-solaris");
-
- attributes.put("channel_arch", defaultArches);
- attributes.put(PackageSearchAction.FINE_GRAINED, "on");
- performRedirect("/channels/software/Search.do",
- request.getContextPath(),
- response,
- attributes);
-
- return null;
+ return doPackageSearch(mapping, request, searchString);
}
else if (searchType.equals("docs")) {
- Map attributes = new HashMap();
- attributes.put("view_mode", "search_content_title");
- attributes.put(SystemSearchSetupAction.SEARCH_STRING, searchString);
- performRedirect("/help/Search.do",
- request.getContextPath(),
- response,
- attributes);
-
- return null;
+ return doDocsSearch(mapping, request, searchString);
}
else {
return mapping.findForward("error");
@@ -143,17 +77,60 @@ public class SearchAction extends RhnAction {
return mapping.findForward("error");
}
- protected void performRedirect(String url,
- String contextPath,
- HttpServletResponse response,
- Map attributes) {
- try {
- response.sendRedirect(
- ServletUtils.pathWithParams(contextPath + url, attributes));
- }
- catch (IOException ioe) {
- throw new RuntimeException(
- "Exception while trying to redirect: " + ioe);
- }
+ private ActionForward doErrataSearch(ActionMapping mapping, HttpServletRequest request,
+ String searchString) {
+ Map<String, Object> params = new HashMap<String, Object>();
+ params.put(BaseSearchAction.VIEW_MODE, BaseSearchAction.OPT_ALL_FIELDS);
+ params.put(BaseSearchAction.SEARCH_STR, searchString);
+ params.put(BaseSearchAction.OPT_ISSUE_DATE, Boolean.FALSE);
+ params.put(BaseSearchAction.ERRATA_BUG, Boolean.TRUE);
+ params.put(BaseSearchAction.ERRATA_SEC, Boolean.TRUE);
+ params.put(BaseSearchAction.ERRATA_ENH, Boolean.TRUE);
+ params.put(BaseSearchAction.FINE_GRAINED, true);
+ return StrutsDelegate.getInstance().forwardParams(
+ mapping.findForward("errata"), params);
+ }
+
+ private boolean systemSearchAllowed(User user) {
+ return user.getOrg().getEntitlements().contains(
+ OrgFactory.getEntitlementSwMgrPersonal()) ||
+ user.getOrg().getEntitlements().contains(
+ OrgFactory.getEntitlementEnterprise());
+ }
+
+ private ActionForward doSystemSearch(ActionMapping mapping, HttpServletRequest request,
+ String searchString) {
+ Map<String, Object> params = new HashMap<String, Object>();
+ params.put(BaseSearchAction.WHERE_TO_SEARCH, BaseSearchAction.WHERE_ALL);
+ params.put(BaseSearchAction.VIEW_MODE,
+ "systemsearch_name_and_description");
+ params.put(BaseSearchAction.SEARCH_STR, searchString);
+ params.put(BaseSearchAction.FINE_GRAINED, true);
+ return StrutsDelegate.getInstance().forwardParams(
+ mapping.findForward("systems"), params);
+ }
+
+ private ActionForward doDocsSearch(ActionMapping mapping, HttpServletRequest request,
+ String searchString) {
+ Map<String, Object> params = new HashMap<String, Object>();
+ params.put(BaseSearchAction.VIEW_MODE, "search_content_title");
+ params.put(BaseSearchAction.SEARCH_STR, searchString);
+ return StrutsDelegate.getInstance().forwardParams(
+ mapping.findForward("docs"), params);
+ }
+
+ private ActionForward doPackageSearch(ActionMapping mapping,
+ HttpServletRequest request, String searchString) {
+ Map<String, Object> params = new HashMap<String, Object>();
+ params.put(BaseSearchAction.VIEW_MODE,
+ BaseSearchAction.OPT_NAME_AND_SUMMARY);
+ params.put(BaseSearchAction.SEARCH_STR, searchString);
+ params.put(BaseSearchAction.WHERE_CRITERIA, "architecture");
+ params.put(BaseSearchAction.CHANNEL_ARCH,
+ BaseSearchAction.DEFAULT_ARCHES);
+ params.put(BaseSearchAction.FINE_GRAINED, true);
+
+ return StrutsDelegate.getInstance().forwardParams(
+ mapping.findForward("packages"), params);
}
}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/audit/AuditSearchAction.java b/java/code/src/com/redhat/rhn/frontend/action/audit/AuditSearchAction.java
index 61bc7bb..13ee073 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/audit/AuditSearchAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/audit/AuditSearchAction.java
@@ -14,31 +14,12 @@
*/
package com.redhat.rhn.frontend.action.audit;
-import com.redhat.rhn.common.util.DatePicker;
-import com.redhat.rhn.frontend.action.common.DateRangePicker;
-import com.redhat.rhn.frontend.dto.AuditReviewDto;
-import com.redhat.rhn.frontend.struts.RequestContext;
-import com.redhat.rhn.frontend.struts.RhnAction;
-import com.redhat.rhn.frontend.struts.RhnHelper;
-import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
-import com.redhat.rhn.manager.audit.AuditManager;
-
-import org.apache.log4j.Logger;
-import org.apache.struts.action.ActionForm;
-import org.apache.struts.action.ActionForward;
-import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
-import org.apache.struts.action.DynaActionForm;
-import org.stringtree.json.JSONWriter;
-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
-import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -47,6 +28,24 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.action.DynaActionForm;
+import org.stringtree.json.JSONWriter;
+
+import com.redhat.rhn.common.util.DatePicker;
+import com.redhat.rhn.frontend.action.common.DateRangePicker;
+import com.redhat.rhn.frontend.dto.AuditReviewDto;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnAction;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
+import com.redhat.rhn.manager.audit.AuditManager;
+
/**
* AuditSearchAction
* @version $Rev$
@@ -165,15 +164,13 @@ public class AuditSearchAction extends RhnAction {
Boolean parseDates, submitted, unrev;
DateRangePicker.DatePickerResults dpresults;
DynaActionForm dform = (DynaActionForm)form;
- Enumeration paramNames;
HttpSession session = request.getSession(true);
JSONWriter jsonwr = new JSONWriter();
List result = null;
Long start, end, seqno, cacheSeqno;
- Map forwardParams = makeParamMap(request);
Map<String, String[]> typemap;
RequestContext requestContext = new RequestContext(request);
- String machine, str;
+ String machine;
String[] autypes;
request.setAttribute(ListTagHelper.PARENT_URL, request.getRequestURI());
@@ -208,7 +205,7 @@ public class AuditSearchAction extends RhnAction {
unrev = true;
request.setAttribute("unreviewable", "true");
}
- else if (!submitted && request.getParameter("machine") != null) {
+ else if (!submitted && request.getAttribute("machine") != null) {
log.debug("auto-submit!");
// this is a click-through from the review list.
// we skip the search dialog and return the default selection
@@ -277,14 +274,6 @@ public class AuditSearchAction extends RhnAction {
// add any accumulated messages to be displayed
addMessages(request, amsgs);
- // set up parameters to forward
- paramNames = request.getParameterNames();
-
- while (paramNames.hasMoreElements()) {
- str = (String) paramNames.nextElement();
- forwardParams.put(str, request.getParameter(str));
- }
-
// either the search had no results, so we go back to the search form,
// or this is what they asked for
if (result == null) {
@@ -300,14 +289,10 @@ public class AuditSearchAction extends RhnAction {
request.setAttribute("endDisp", ">>");
}
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- forwardParams);
+ return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
- return getStrutsDelegate().forwardParams(
- mapping.findForward("view"),
- forwardParams);
+ return mapping.findForward("view");
}
}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
index 0b87f05..5850dc3 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
@@ -18,123 +18,47 @@ import java.net.MalformedURLException;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
-import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
-import org.apache.struts.action.ActionErrors;
-import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;
-import org.directwebremoting.util.Logger;
import redstone.xmlrpc.XmlRpcException;
import redstone.xmlrpc.XmlRpcFault;
import com.redhat.rhn.common.db.datasource.DataResult;
import com.redhat.rhn.common.util.DatePicker;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
import com.redhat.rhn.frontend.action.common.DateRangePicker;
import com.redhat.rhn.frontend.struts.RequestContext;
-import com.redhat.rhn.frontend.struts.RhnAction;
import com.redhat.rhn.frontend.struts.RhnHelper;
-import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
import com.redhat.rhn.frontend.taglibs.list.TagHelper;
import com.redhat.rhn.manager.audit.ScapManager;
/**
* XccdfSearchAction
*/
-public class XccdfSearchAction extends RhnAction {
+public class XccdfSearchAction extends BaseSearchAction {
- private static final String SEARCH_STRING = "search_string";
- private static final String WHERE_TO_SEARCH = "whereToSearch";
- private static final String SCAN_DATE_SEARCH = "optionScanDateSearch";
private static final String ANY_LABEL = "any";
private static final String SHOW_AS = "show_as";
private static final String TESTRESULT_ID = "tr";
private static final String RULERESULT_ID = "rr";
- private static Logger log = Logger.getLogger(XccdfSearchAction.class);
-
- /** {@inheritDoc} */
- public ActionForward execute(ActionMapping mapping, ActionForm formIn,
- HttpServletRequest request, HttpServletResponse response) {
- ActionErrors errors = new ActionErrors();
- DynaActionForm form = (DynaActionForm) formIn;
- String searchString = request.getParameter(SEARCH_STRING);
-
- request.setAttribute(ListTagHelper.PARENT_URL, request.getRequestURI());
-
- if (!isSubmitted(form)) {
- try {
- setupForm(request, form);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- request.getParameterMap());
- }
- catch (XmlRpcException xre) {
- log.error("Could not connect to search server.", xre);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- catch (XmlRpcFault e) {
- log.info("Caught Exception :" + e);
- log.info("ErrorCode = " + e.getErrorCode());
- e.printStackTrace();
- if (e.getErrorCode() == 100) {
- log.error("Invalid search query", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_parse_query",
- searchString));
- }
- else if (e.getErrorCode() == 200) {
- log.error("Index files appear to be missing: ", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.index_files_missing",
- searchString));
- }
- else {
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_execute_query",
- searchString));
- }
- }
- catch (MalformedURLException e) {
- log.error("Could not connect to server.", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- }
-
- if (!errors.isEmpty()) {
- addErrors(request, errors);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- createForwardParams(request));
- }
- return getStrutsDelegate().forwardParams(
- mapping.findForward("success"),
- createForwardParams(request));
- }
- private void setupForm(HttpServletRequest request, DynaActionForm form)
+ protected ActionForward doExecute(HttpServletRequest request, ActionMapping mapping,
+ DynaActionForm form)
throws MalformedURLException, XmlRpcException, XmlRpcFault {
RequestContext context = new RequestContext(request);
- String searchString = request.getParameter(SEARCH_STRING);
- String whereToSearch = request.getParameter(WHERE_TO_SEARCH);
+ String searchString = form.getString(SEARCH_STR);
+ String whereToSearch = form.getString(WHERE_TO_SEARCH);
- request.setAttribute(SEARCH_STRING, searchString);
- form.set(WHERE_TO_SEARCH,
- "system_list".equals(whereToSearch) ? whereToSearch : "all");
- setupRuleResultLabelOptions(request);
- setupShowAsOption(form);
DateRangePicker picker = setupDatePicker(form, request);
if (!StringUtils.isBlank(searchString)) {
@@ -154,21 +78,7 @@ public class XccdfSearchAction extends RhnAction {
request.setAttribute(RequestContext.PAGE_LIST, Collections.EMPTY_LIST);
picker.processDatePickers(false, false);
}
- }
-
- private Map createForwardParams(HttpServletRequest request) {
- Map forwardParams = makeParamMap(request);
- // keep all params except submitted, in order for the new list
- // tag pagination to work we need to pass along all the formvars it
- // generated.
- Enumeration paramNames = request.getParameterNames();
- while (paramNames.hasMoreElements()) {
- String name = (String) paramNames.nextElement();
- if (!SUBMITTED.equals(name)) {
- forwardParams.put(name, request.getParameter(name));
- }
- }
- return forwardParams;
+ return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
private Date getPickerDate(HttpServletRequest request, String paramName) {
@@ -182,8 +92,14 @@ public class XccdfSearchAction extends RhnAction {
}
private Boolean getOptionScanDateSearch(HttpServletRequest request) {
- String strDateSearch = request.getParameter(SCAN_DATE_SEARCH);
- return "on".equals(strDateSearch);
+ Object dateSrch = request.getAttribute(SCAN_DATE_SEARCH);
+ if (dateSrch instanceof Boolean) {
+ return ((Boolean)dateSrch).booleanValue();
+ }
+ else {
+ String strDateSearch = (String)request.getAttribute(SCAN_DATE_SEARCH);
+ return "on".equals(strDateSearch);
+ }
}
private DateRangePicker setupDatePicker(DynaActionForm form,
@@ -229,4 +145,22 @@ public class XccdfSearchAction extends RhnAction {
request.setAttribute("allResults", possibleResults);
}
+
+ @Override
+ protected void insureFormDefaults(HttpServletRequest request, DynaActionForm form) {
+ String searchString = form.getString(SEARCH_STR);
+ String whereToSearch = form.getString(WHERE_TO_SEARCH);
+
+ request.setAttribute(SEARCH_STR, searchString);
+ form.set(WHERE_TO_SEARCH,
+ "system_list".equals(whereToSearch) ? whereToSearch : "all");
+ setupRuleResultLabelOptions(request);
+ setupShowAsOption(form);
+ Map m = form.getMap();
+ Set<String> keys = (Set<String>)m.keySet();
+ for (String key : keys) {
+ Object vObj = m.get(key);
+ request.setAttribute(key, vObj);
+ }
+ }
}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchAction.java b/java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchAction.java
index 1a16714..b66bcbb 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchAction.java
@@ -15,173 +15,58 @@
package com.redhat.rhn.frontend.action.channel;
-import com.redhat.rhn.common.localization.LocalizationService;
-import com.redhat.rhn.common.validator.ValidatorException;
-import com.redhat.rhn.domain.channel.Channel;
-import com.redhat.rhn.domain.channel.ChannelArch;
-import com.redhat.rhn.domain.user.User;
-import com.redhat.rhn.frontend.dto.PackageDto;
-import com.redhat.rhn.frontend.dto.PackageOverview;
-import com.redhat.rhn.frontend.struts.RequestContext;
-import com.redhat.rhn.frontend.struts.RhnAction;
-import com.redhat.rhn.frontend.struts.RhnHelper;
-import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
-import com.redhat.rhn.frontend.xmlrpc.SearchServerIndexException;
-import com.redhat.rhn.manager.channel.ChannelManager;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-import org.apache.struts.action.ActionErrors;
-import org.apache.struts.action.ActionForm;
-import org.apache.struts.action.ActionForward;
-import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
-import org.apache.struts.action.DynaActionForm;
-
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import redstone.xmlrpc.XmlRpcException;
+import org.apache.commons.lang.StringUtils;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.DynaActionForm;
+
import redstone.xmlrpc.XmlRpcFault;
+import com.redhat.rhn.domain.channel.Channel;
+import com.redhat.rhn.domain.channel.ChannelArch;
+import com.redhat.rhn.domain.user.User;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
+import com.redhat.rhn.frontend.dto.PackageDto;
+import com.redhat.rhn.frontend.dto.PackageOverview;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.frontend.xmlrpc.SearchServerIndexException;
+import com.redhat.rhn.manager.channel.ChannelManager;
+
/**
* PackageSearchAction
* @version $Rev$
*/
-public class PackageSearchAction extends RhnAction {
- private static Logger log = Logger.getLogger(PackageSearchAction.class);
- /** List of channel arches we don't really support any more. */
- private static final String[] EXCLUDE_ARCH_LABELS = {"channel-sparc",
- "channel-alpha",
- "channel-iSeries",
- "channel-pSeries"};
- public static final String WHERE_CRITERIA = "whereCriteria";
- public static final String FINE_GRAINED = "fineGrained";
-
- /** {@inheritDoc} */
- public ActionForward execute(ActionMapping mapping, ActionForm formIn,
- HttpServletRequest request, HttpServletResponse response) {
-
- ActionErrors errors = new ActionErrors();
- DynaActionForm form = (DynaActionForm)formIn;
- request.setAttribute(ListTagHelper.PARENT_URL, request.getRequestURI());
- Map forwardParams = makeParamMap(request);
- String searchString = request.getParameter("search_string");
- String viewMode = form.getString("view_mode");
- String[] channelArches = form.getStrings("channel_arch");
-
- try {
- // handle setup, the submission setups the searchstring below
- // and redirects to this page which then performs the search.
- if (!isSubmitted(form)) {
- setupForm(request, form);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- request.getParameterMap());
- }
- }
- catch (XmlRpcException xre) {
- log.error("Could not connect to search server.", xre);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- catch (XmlRpcFault e) {
- log.info("Caught Exception :" + e);
- log.info("ErrorCode = " + e.getErrorCode());
- e.printStackTrace();
- if (e.getErrorCode() == 100) {
- log.error("Invalid search query", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_parse_query",
- searchString));
- }
- else if (e.getErrorCode() == 200) {
- log.error("Index files appear to be missing: ", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.index_files_missing",
- searchString));
- }
- else {
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_execute_query",
- searchString));
- }
- }
- catch (MalformedURLException e) {
- log.error("Could not connect to server.", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- catch (ValidatorException ve) {
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.use_free_form"));
- }
- catch (SearchServerIndexException se) {
- log.error("Exception caught: " + se.getMessage());
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("searchserver.index_out_of_sync_with_db"));
- }
-
- // keep all params except submitted, in order for the new list
- // tag pagination to work we need to pass along all the formvars it
- // generated.
- Enumeration paramNames = request.getParameterNames();
- while (paramNames.hasMoreElements()) {
- String name = (String) paramNames.nextElement();
- if (!SUBMITTED.equals(name)) {
- forwardParams.put(name, request.getParameter(name));
- }
- }
-
- forwardParams.put("search_string", searchString);
- forwardParams.put("view_mode", viewMode);
- forwardParams.put("channel_arch", channelArches);
-
- if (!errors.isEmpty()) {
- addErrors(request, errors);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- forwardParams);
- }
-
- return getStrutsDelegate().forwardParams(
- mapping.findForward("success"),
- forwardParams);
- }
+public class PackageSearchAction extends BaseSearchAction {
- private void setupForm(HttpServletRequest request, DynaActionForm form)
+ protected ActionForward doExecute(HttpServletRequest request, ActionMapping mapping,
+ DynaActionForm form)
throws MalformedURLException, XmlRpcFault, SearchServerIndexException {
RequestContext ctx = new RequestContext(request);
- String searchString = form.getString("search_string");
- String viewmode = form.getString("view_mode");
+ String searchString = form.getString(SEARCH_STR);
+ String viewmode = form.getString(VIEW_MODE);
Boolean fineGrained = (Boolean) form.get(FINE_GRAINED);
- String searchCriteria = request.getParameter(WHERE_CRITERIA);
+ String searchCriteria = form.getString(WHERE_CRITERIA);
String[] selectedArches = null;
Long filterChannelId = null;
boolean relevantFlag = false;
- // Default to relevant channels if no search criteria was specified
- if (searchCriteria == null || searchCriteria.equals("")) {
- searchCriteria = "relevant";
- }
-
// Handle the radio button selection for channel filtering
- if (searchCriteria.equals("relevant")) {
+ if (searchCriteria.equals(RELEVANT)) {
relevantFlag = true;
}
- if (searchCriteria.equals("architecture")) {
+ if (searchCriteria.equals(ARCHITECTURE)) {
/* The search call will function as being scoped to architectures if the arch
list isn't null. In order to actually get radio-button-like functionality
we can't rely on the arch list coming in from the form to be null; the
@@ -189,100 +74,76 @@ public class PackageSearchAction extends RhnAction {
push off retrieving the arches until we know we want to use them, we can
get the desired functionality described by the UI.
*/
- selectedArches = form.getStrings("channel_arch");
+ selectedArches = form.getStrings(CHANNEL_ARCH);
}
- else if (searchCriteria.equals("channel")) {
- String sChannelId = form.getString("channel_filter");
+ else if (searchCriteria.equals(CHANNEL)) {
+ String sChannelId = form.getString(CHANNEL_FILTER);
filterChannelId = Long.parseLong(sChannelId);
}
- if (viewmode.equals("")) { //first time viewing page
- viewmode = PackageSearchHelper.OPT_NAME_AND_SUMMARY;
- }
-
- if (fineGrained == null) {
- fineGrained = false;
- }
- if (PackageSearchHelper.OPT_FREE_FORM.equals(viewmode)) {
- // adding a boolean of true to signify we want the results to be
- // constrained to closer matches, this will force the Lucene Queries
- // to use a "MUST" instead of the default "SHOULD". It will not
- // allow fuzzy matches as in spelling errors, but it will allow
- // free form searches to do more advanced options
- fineGrained = true;
- form.set(FINE_GRAINED, fineGrained);
- }
-
- List searchOptions = new ArrayList();
- // setup the option list for select box (view_mode).
- addOption(searchOptions, "packages.search.free_form",
- PackageSearchHelper.OPT_FREE_FORM);
- addOption(searchOptions, "packages.search.name",
- PackageSearchHelper.OPT_NAME_ONLY);
- addOption(searchOptions, "packages.search.name_and_desc",
- PackageSearchHelper.OPT_NAME_AND_DESC);
- addOption(searchOptions, "packages.search.both",
- PackageSearchHelper.OPT_NAME_AND_SUMMARY);
-
- List channelArches = new ArrayList();
- List<ChannelArch> arches = ChannelManager.getChannelArchitectures();
- List<String> archLabels = ChannelManager.getSyncdChannelArches();
- for (ChannelArch arch : arches) {
- boolean exclude = false;
- for (String s : EXCLUDE_ARCH_LABELS) {
- if (arch.getLabel().equals(s)) {
- exclude = true;
- break;
- }
- }
-
- if (!exclude) {
- // if the label does *NOT* exist, this channel arch has no
- // channels in the database. So we want to flag it.
- addOption(channelArches, arch.getName(), arch.getLabel(),
- !archLabels.contains(arch.getLabel()));
- }
- }
+ List<Map<String, String>> searchOptions = buildSearchOptions();
+ List<Map<String, String>> channelArches = buildChannelArches();
// Load list of available channels to select as filter
- List allChannels =
- ChannelManager.allChannelsTree(ctx.getLoggedInUser());
-
- request.setAttribute("search_string", searchString);
- request.setAttribute("view_mode", viewmode);
- request.setAttribute("searchOptions", searchOptions);
- request.setAttribute("channelArches", channelArches);
- request.setAttribute("channel_arch", selectedArches);
- request.setAttribute("allChannels", allChannels);
- request.setAttribute("channel_filter", form.getString("channel_filter"));
- request.setAttribute("relevant", relevantFlag ? "yes" : "no");
- request.setAttribute(FINE_GRAINED, fineGrained ? "yes" : "no");
+ List allChannels = ChannelManager.allChannelsTree(ctx.getLoggedInUser());
+
+ request.setAttribute(SEARCH_STR, searchString);
+ request.setAttribute(VIEW_MODE, viewmode);
+ request.setAttribute(SEARCH_OPT, searchOptions);
+ request.setAttribute(CHANNEL_ARCHES, channelArches);
+ request.setAttribute(CHANNEL_ARCH, selectedArches);
+ request.setAttribute(ALL_CHANNELS, allChannels);
+ request.setAttribute(CHANNEL_FILTER,
+ form.getString(CHANNEL_FILTER));
+ request.setAttribute(RELEVANT, relevantFlag ? "yes" : "no");
+ request.setAttribute(FINE_GRAINED, fineGrained);
// Default where to search criteria
- request.setAttribute("whereCriteria", searchCriteria);
+ request.setAttribute(WHERE_CRITERIA, searchCriteria);
if (!StringUtils.isBlank(searchString)) {
- List<PackageOverview> results =
- PackageSearchHelper.performSearch(ctx.getWebSession().getId(),
- searchString,
- viewmode,
- selectedArches, relevantFlag, fineGrained);
-
- // Perform any post-search logic that wasn't done by the search server
- results = removeDuplicateNames(results);
-
- if (filterChannelId != null) {
- User user = ctx.getLoggedInUser();
- results = filterByChannel(user, filterChannelId, results);
- }
-
- log.warn("GET search: " + results);
+ List<PackageOverview> results = performSearch(ctx, searchString, viewmode,
+ fineGrained, selectedArches, filterChannelId, relevantFlag);
request.setAttribute(RequestContext.PAGE_LIST,
- results != null ? results : Collections.EMPTY_LIST);
+ results != null ? results : Collections.emptyList());
}
else {
- request.setAttribute(RequestContext.PAGE_LIST, Collections.EMPTY_LIST);
+ request.setAttribute(RequestContext.PAGE_LIST, Collections.emptyList());
}
+ return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
+ }
+
+ /**
+ * Actually do the package-search desired
+ * @param ctx incoming request context
+ * @param searchString string we're going to search on
+ * @param viewmode what kind-of search are we doing?
+ * @param fineGrained exact or fuzzy?
+ * @param selectedArches do we care about specific arches?
+ * @param filterChannelId do we care about a specific channel?
+ * @param relevantFlag do we only care about 'relevant to registered profiles"?
+ * @return list of package-overviews found
+ * @throws XmlRpcFault bad communication with search server
+ * @throws MalformedURLException possibly bad configuration for search server address
+ */
+ public List<PackageOverview> performSearch(RequestContext ctx, String searchString,
+ String viewmode, Boolean fineGrained, String[] selectedArches,
+ Long filterChannelId, boolean relevantFlag)
+ throws XmlRpcFault, MalformedURLException {
+ List<PackageOverview> results =
+ PackageSearchHelper.performSearch(ctx.getWebSession().getId(),
+ searchString,
+ viewmode,
+ selectedArches, relevantFlag, fineGrained);
+
+ // Perform any post-search logic that wasn't done by the search server
+ results = removeDuplicateNames(results);
+
+ if (filterChannelId != null) {
+ User user = ctx.getLoggedInUser();
+ results = filterByChannel(user, filterChannelId, results);
+ }
+ return results;
}
/**
@@ -342,23 +203,71 @@ public class PackageSearchAction extends RhnAction {
return newResult;
}
- private void addOption(List options, String key, String value) {
- addOption(options, key, value, false);
+ /**
+ * Make sure we have appropriate defaults no matter how we got here
+ * Set the defaults (where needed) back into the form so that the rest of the action
+ * can find them
+ * @param form where we expect values to end up
+ */
+ protected void insureFormDefaults(HttpServletRequest request, DynaActionForm form) {
+ String searchCriteria = form.getString(WHERE_CRITERIA);
+ // Default to relevant channels if no search criteria was specified
+ if (searchCriteria == null || searchCriteria.equals("")) {
+ form.set(WHERE_CRITERIA, RELEVANT);
+ }
+
+ String viewmode = form.getString("view_mode");
+ if (viewmode.equals("")) { //first time viewing page
+ form.set(VIEW_MODE, OPT_NAME_AND_SUMMARY);
+ }
+
+ Boolean fineGrained = (Boolean) form.get(FINE_GRAINED);
+ if (fineGrained == null) {
+ fineGrained = false;
+ }
+ if (OPT_FREE_FORM.equals(viewmode)) {
+ // adding a boolean of true to signify we want the results to be
+ // constrained to closer matches, this will force the Lucene Queries
+ // to use a "MUST" instead of the default "SHOULD". It will not
+ // allow fuzzy matches as in spelling errors, but it will allow
+ // free form searches to do more advanced options
+ fineGrained = true;
+ }
+ form.set(FINE_GRAINED, fineGrained);
}
/**
- * Utility function to create options for the dropdown.
- * @param options list containing all options.
- * @param key resource bundle key used as the display value.
- * @param value value to be submitted with form.
- * @param flag Flag the item with an asterisk (*) indicating it is *not*
- * synch'd
+ * Build the channel-arch-pulldown for all arches that are not in the 'excluded' list
+ * @return For each arch, a Map of localized display-name and value
*/
- private void addOption(List options, String key, String value, boolean flag) {
- LocalizationService ls = LocalizationService.getInstance();
- Map selection = new HashMap();
- selection.put("display", (flag ? "*" : "") + ls.getMessage(key));
- selection.put("value", value);
- options.add(selection);
+ private List<Map<String, String>> buildChannelArches() {
+ List<Map<String, String>> channelArches = new ArrayList<Map<String, String>>();
+ List<ChannelArch> arches = ChannelManager.getChannelArchitectures();
+ List<String> syncdLabels = ChannelManager.getSyncdChannelArches();
+ for (ChannelArch arch : arches) {
+ if (!EXCLUDED_ARCHES.contains(arch.getLabel())) {
+ // if the label does *NOT* exist, this channel arch has no
+ // channels in the database. So we want to flag it.
+ addOption(channelArches, arch.getName(), arch.getLabel(),
+ !syncdLabels.contains(arch.getLabel()));
+ }
+ }
+ return channelArches;
}
-}
+
+ /**
+ * Builds the package-search-option pulldown
+ * @return For each available option, a Map of localized display-name and value
+ */
+ private List<Map<String, String>> buildSearchOptions() {
+ List<Map<String, String>> searchOptions = new ArrayList<Map<String, String>>();
+ // setup the option list for select box (view_mode).
+ addOption(searchOptions, "packages.search.free_form", OPT_FREE_FORM);
+ addOption(searchOptions, "packages.search.name", OPT_NAME_ONLY);
+ addOption(searchOptions, "packages.search.name_and_desc", OPT_NAME_AND_DESC);
+ addOption(searchOptions, "packages.search.both", OPT_NAME_AND_SUMMARY);
+ return searchOptions;
+ }
+
+
+ }
diff --git a/java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchHelper.java b/java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchHelper.java
index 2015f79..3db8130 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchHelper.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/channel/PackageSearchHelper.java
@@ -14,14 +14,6 @@
*/
package com.redhat.rhn.frontend.action.channel;
-import com.redhat.rhn.common.conf.ConfigDefaults;
-import com.redhat.rhn.common.validator.ValidatorException;
-import com.redhat.rhn.frontend.dto.PackageOverview;
-import com.redhat.rhn.frontend.xmlrpc.SearchServerIndexException;
-import com.redhat.rhn.manager.channel.ChannelManager;
-
-import org.apache.log4j.Logger;
-
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -32,9 +24,18 @@ import java.util.List;
import java.util.ListIterator;
import java.util.Map;
+import org.apache.log4j.Logger;
+
import redstone.xmlrpc.XmlRpcClient;
import redstone.xmlrpc.XmlRpcFault;
+import com.redhat.rhn.common.conf.ConfigDefaults;
+import com.redhat.rhn.common.validator.ValidatorException;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
+import com.redhat.rhn.frontend.dto.PackageOverview;
+import com.redhat.rhn.frontend.xmlrpc.SearchServerIndexException;
+import com.redhat.rhn.manager.channel.ChannelManager;
+
/**
* PackageSearchHelper
* @version $Rev$
@@ -42,11 +43,6 @@ import redstone.xmlrpc.XmlRpcFault;
public class PackageSearchHelper {
private static Logger log = Logger.getLogger(PackageSearchHelper.class);
- public static final String OPT_FREE_FORM = "search_free_form";
- public static final String OPT_NAME_AND_DESC = "search_name_and_description";
- public static final String OPT_NAME_AND_SUMMARY = "search_name_and_summary";
- public static final String OPT_NAME_ONLY = "search_name";
-
private PackageSearchHelper() {
}
@@ -92,7 +88,7 @@ public class PackageSearchHelper {
}
if (results.isEmpty()) {
- return Collections.EMPTY_LIST;
+ return Collections.emptyList();
}
// need to make the search server results usable by database
@@ -169,7 +165,7 @@ public class PackageSearchHelper {
String mode,
List<String> arches) {
- if (!OPT_FREE_FORM.equals(mode) && searchstring.indexOf(':') > 0) {
+ if (!BaseSearchAction.OPT_FREE_FORM.equals(mode) && searchstring.indexOf(':') > 0) {
throw new ValidatorException("Can't use free form and field search.");
}
@@ -199,15 +195,15 @@ public class PackageSearchHelper {
String query = buf.toString().trim();
// when searching the name field, we also want to include the filename
// field in case the user passed in version number.
- if (OPT_NAME_AND_SUMMARY.equals(mode)) {
+ if (BaseSearchAction.OPT_NAME_AND_SUMMARY.equals(mode)) {
return "(name:(" + query + ")^2 summary:(" + query +
") filename:(" + query + "))" + archBuf.toString();
}
- else if (OPT_NAME_AND_DESC.equals(mode)) {
+ else if (BaseSearchAction.OPT_NAME_AND_DESC.equals(mode)) {
return "(name:(" + query + ")^2 description:(" + query +
") filename:(" + query + "))" + archBuf.toString();
}
- else if (OPT_NAME_ONLY.equals(mode)) {
+ else if (BaseSearchAction.OPT_NAME_ONLY.equals(mode)) {
return "(name:(" + query + ")^2 filename:(" + query + "))" +
archBuf.toString();
}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/common/DateRangePicker.java b/java/code/src/com/redhat/rhn/frontend/action/common/DateRangePicker.java
index 733c1b1..777df78 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/common/DateRangePicker.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/common/DateRangePicker.java
@@ -99,8 +99,11 @@ public class DateRangePicker {
retval.setEnd(end);
retval.setErrors(errors);
if (isSubmitted) {
+ // Make sure we can handle either url-params or form-vars; form wins if both
start.readMap(req.getParameterMap());
+ start.readMap(form.getMap());
end.readMap(req.getParameterMap());
+ end.readMap(form.getMap());
validateDates(errors, start, end);
}
else {
diff --git a/java/code/src/com/redhat/rhn/frontend/action/errata/ErrataSearchAction.java b/java/code/src/com/redhat/rhn/frontend/action/errata/ErrataSearchAction.java
index e70d454..889fe87 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/errata/ErrataSearchAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/errata/ErrataSearchAction.java
@@ -14,168 +14,68 @@
*/
package com.redhat.rhn.frontend.action.errata;
-import com.redhat.rhn.common.conf.ConfigDefaults;
-import com.redhat.rhn.common.db.datasource.DataResult;
-import com.redhat.rhn.common.localization.LocalizationService;
-import com.redhat.rhn.common.util.DatePicker;
-import com.redhat.rhn.common.validator.ValidatorException;
-import com.redhat.rhn.domain.org.Org;
-import com.redhat.rhn.frontend.action.common.DateRangePicker;
-import com.redhat.rhn.frontend.action.common.DateRangePicker.DatePickerResults;
-import com.redhat.rhn.frontend.dto.ErrataOverview;
-import com.redhat.rhn.frontend.struts.RequestContext;
-import com.redhat.rhn.frontend.struts.RhnAction;
-import com.redhat.rhn.frontend.struts.RhnHelper;
-import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
-import com.redhat.rhn.manager.errata.ErrataManager;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-import org.apache.struts.action.ActionErrors;
-import org.apache.struts.action.ActionForm;
-import org.apache.struts.action.ActionForward;
-import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
-import org.apache.struts.action.DynaActionForm;
-
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
-import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
+import java.util.Set;
import java.util.TimeZone;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.action.DynaActionForm;
import redstone.xmlrpc.XmlRpcClient;
-import redstone.xmlrpc.XmlRpcException;
import redstone.xmlrpc.XmlRpcFault;
+import com.redhat.rhn.common.conf.ConfigDefaults;
+import com.redhat.rhn.common.db.datasource.DataResult;
+import com.redhat.rhn.common.util.DatePicker;
+import com.redhat.rhn.domain.org.Org;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
+import com.redhat.rhn.frontend.action.common.DateRangePicker;
+import com.redhat.rhn.frontend.action.common.DateRangePicker.DatePickerResults;
+import com.redhat.rhn.frontend.dto.ErrataOverview;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.manager.errata.ErrataManager;
+
/**
* SearchAction
* @version $Rev$
*/
-public class ErrataSearchAction extends RhnAction {
-
- private static Logger log = Logger.getLogger(ErrataSearchAction.class);
- private static final String OPT_ADVISORY = "errata_search_by_advisory";
- private static final String OPT_PKG_NAME = "errata_search_by_package_name";
- private static final String OPT_CVE = "errata_search_by_cve";
- private static final String OPT_ALL_FIELDS = "errata_search_by_all_fields";
- public static final String FINE_GRAINED = "fineGrained";
-
- /** {@inheritDoc} */
- public ActionForward execute(ActionMapping mapping,
- ActionForm formIn,
- HttpServletRequest request,
- HttpServletResponse response) {
- ActionErrors errors = new ActionErrors();
- DynaActionForm form = (DynaActionForm)formIn;
- request.setAttribute(ListTagHelper.PARENT_URL, request.getRequestURI());
- Map forwardParams = makeParamMap(request);
- String searchString = request.getParameter("search_string");
- String viewMode = form.getString("view_mode");
-
- try {
- // handle setup, the submission setups the searchstring below
- // and redirects to this page which then performs the search.
- if (!isSubmitted(form)) {
- setupForm(request, form);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- request.getParameterMap());
- }
- }
- catch (XmlRpcException xre) {
- log.error("Could not connect to search server.", xre);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- catch (XmlRpcFault e) {
- log.info("Caught Exception :" + e);
- log.info("ErrorCode = " + e.getErrorCode());
- e.printStackTrace();
- if (e.getErrorCode() == 100) {
- log.error("Invalid search query", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_parse_query",
- searchString));
- }
- else if (e.getErrorCode() == 200) {
- log.error("Index files appear to be missing: ", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.index_files_missing",
- searchString));
- }
- else {
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_execute_query",
- searchString));
- }
- }
- catch (MalformedURLException e) {
- log.error("Could not connect to server.", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- catch (ValidatorException ve) {
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.use_free_form"));
- }
-
- // keep all params except submitted, in order for the new list
- // tag pagination to work we need to pass along all the formvars it
- // generated.
- Enumeration paramNames = request.getParameterNames();
- while (paramNames.hasMoreElements()) {
- String name = (String) paramNames.nextElement();
- if (!SUBMITTED.equals(name)) {
- forwardParams.put(name, request.getParameter(name));
- }
- }
-
- forwardParams.put("search_string", searchString);
- forwardParams.put("view_mode", viewMode);
- forwardParams.put(FINE_GRAINED, request.getParameter(FINE_GRAINED));
-
- if (!errors.isEmpty()) {
- addErrors(request, errors);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- forwardParams);
- }
-
- return getStrutsDelegate().forwardParams(
- mapping.findForward("success"),
- forwardParams);
- }
+public class ErrataSearchAction extends BaseSearchAction {
- private void setupForm(HttpServletRequest request, DynaActionForm form)
+ protected ActionForward doExecute(HttpServletRequest request, ActionMapping mapping,
+ DynaActionForm form)
throws MalformedURLException, XmlRpcFault {
RequestContext ctx = new RequestContext(request);
- String search = request.getParameter("search_string");
- String viewmode = request.getParameter("view_mode");
- String fineGrained = request.getParameter(FINE_GRAINED);
+ String search = form.getString(SEARCH_STR);
+
+ String viewmode = form.getString(VIEW_MODE);
+ Boolean fineGrained = (Boolean)form.get(FINE_GRAINED);
List searchOptions = new ArrayList();
// setup the option list for select box (view_mode).
- addOption(searchOptions, "errata_search_by_all_fields", OPT_ALL_FIELDS);
- addOption(searchOptions, "errata_search_by_advisory", OPT_ADVISORY);
- addOption(searchOptions, "errata_search_by_package_name", OPT_PKG_NAME);
- addOption(searchOptions, "errata_search_by_cve", OPT_CVE);
-
- request.setAttribute("search_string", search);
- request.setAttribute("view_mode", viewmode);
- request.setAttribute("searchOptions", searchOptions);
+ addOption(searchOptions, OPT_ALL_FIELDS, OPT_ALL_FIELDS);
+ addOption(searchOptions, OPT_ADVISORY, OPT_ADVISORY);
+ addOption(searchOptions, OPT_PKG_NAME, OPT_PKG_NAME);
+ addOption(searchOptions, OPT_CVE, OPT_CVE);
+
+ request.setAttribute(SEARCH_STR, search);
+ request.setAttribute(VIEW_MODE, viewmode);
+ request.setAttribute(SEARCH_OPT, searchOptions);
request.setAttribute(FINE_GRAINED, fineGrained);
// Process the dates, default the start date to yesterday
@@ -218,7 +118,6 @@ public class ErrataSearchAction extends RhnAction {
List results = performSearch(request, ctx.getWebSession().getId(),
search, viewmode, form);
- log.warn("GET search: " + results);
request.setAttribute(RequestContext.PAGE_LIST,
results != null ? results : Collections.EMPTY_LIST);
}
@@ -231,43 +130,63 @@ public class ErrataSearchAction extends RhnAction {
log.debug("End Start Date = " + dates.getEnd().getDate());
}
request.setAttribute(RequestContext.PAGE_LIST, Collections.EMPTY_LIST);
- Map paramMap = request.getParameterMap();
- if (!paramMap.containsKey("optionIssueDateSearch")) {
- form.set("optionIssueDateSearch", Boolean.FALSE);
- }
- if (!paramMap.containsKey("errata_type_bug")) {
- form.set("errata_type_bug", Boolean.TRUE);
- }
- if (!paramMap.containsKey("errata_type_security")) {
- form.set("errata_type_security", Boolean.TRUE);
- }
- if (!paramMap.containsKey("errata_type_enhancement")) {
- form.set("errata_type_enhancement", Boolean.TRUE);
- }
+
}
ActionMessages dateErrors = dates.getErrors();
addErrors(request, dateErrors);
+ return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
/**
- * Utility function to create options for the dropdown.
- * @param options list containing all options.
- * @param key resource bundle key used as the display value.
- * @param value value to be submitted with form.
+ * Make sure we have appropriate defaults no matter how we got here
+ * Set the defaults (where needed) back into the form so that the rest of the action
+ * can find them
+ * @param form where we expect values to be
*/
- private void addOption(List options, String key, String value) {
- LocalizationService ls = LocalizationService.getInstance();
- Map selection = new HashMap();
- selection.put("display", ls.getMessage(key));
- selection.put("value", value);
- options.add(selection);
+ protected void insureFormDefaults(HttpServletRequest request, DynaActionForm form) {
+ String viewmode = form.getString(VIEW_MODE);
+ if (viewmode.equals("")) { //first time viewing page
+ form.set(VIEW_MODE, "errata_search_by_all_fields");
+ }
+
+ Boolean fineGrained = (Boolean)form.get(FINE_GRAINED);
+ if (fineGrained == null) {
+ fineGrained = false;
+ form.set(FINE_GRAINED, fineGrained);
+ }
+
+ Boolean issueDateSrch = (Boolean)form.get(OPT_ISSUE_DATE);
+ if (issueDateSrch == null) {
+ form.set(OPT_ISSUE_DATE, Boolean.FALSE);
+ }
+
+ Boolean eTypeBug =
+ (form.get(ERRATA_BUG) == null ? Boolean.FALSE : (Boolean)form.get(ERRATA_BUG));
+ Boolean eTypeSec =
+ (form.get(ERRATA_SEC) == null ? Boolean.FALSE : (Boolean)form.get(ERRATA_SEC));
+ Boolean eTypeEnh =
+ (form.get(ERRATA_ENH) == null ? Boolean.FALSE : (Boolean)form.get(ERRATA_ENH));
+
+ // If no errata-type is set, set them all
+ if (!(eTypeBug || eTypeSec || eTypeEnh)) {
+ form.set(ERRATA_BUG, Boolean.TRUE);
+ form.set(ERRATA_SEC, Boolean.TRUE);
+ form.set(ERRATA_ENH, Boolean.TRUE);
+ }
+
+ Map m = form.getMap();
+ Set<String> keys = (Set<String>)m.keySet();
+ for (String key : keys) {
+ Object vObj = m.get(key);
+ request.setAttribute(key, vObj);
+ }
}
- private List performSearch(HttpServletRequest request, Long sessionId,
+ protected List performSearch(HttpServletRequest request, Long sessionId,
String searchString, String mode, DynaActionForm formIn)
throws XmlRpcFault, MalformedURLException {
- log.info("Performing errata search");
+ log.debug("Performing errata search");
RequestContext ctx = new RequestContext(request);
Org org = ctx.getCurrentUser().getOrg();
// call search server
@@ -323,10 +242,7 @@ public class ErrataSearchAction extends RhnAction {
path = "db.search";
}
else {
- Boolean fineGrained = (Boolean) formIn.get("fineGrained");
- if (fineGrained == null) {
- fineGrained = false;
- }
+ Boolean fineGrained = (Boolean) formIn.get(FINE_GRAINED);
args.add(fineGrained);
// Tells search server to use the lucene index
path = "index.search";
@@ -341,7 +257,7 @@ public class ErrataSearchAction extends RhnAction {
}
if (results.isEmpty()) {
- return Collections.EMPTY_LIST;
+ return Collections.emptyList();
}
// need to make the search server results usable by database
@@ -475,15 +391,15 @@ public class ErrataSearchAction extends RhnAction {
DynaActionForm formIn) {
if (log.isDebugEnabled()) {
log.debug("Filtering " + unfiltered.size() + " records based on Advisory type");
- log.debug("BugFixes = " + formIn.get("errata_type_bug"));
- log.debug("Security = " + formIn.get("errata_type_security"));
- log.debug("Enhancement = " + formIn.get("errata_type_enhancement"));
+ log.debug("BugFixes = " + formIn.get(ERRATA_BUG));
+ log.debug("Security = " + formIn.get(ERRATA_SEC));
+ log.debug("Enhancement = " + formIn.get(ERRATA_ENH));
}
List<ErrataOverview> filteredByType = new ArrayList<ErrataOverview>();
for (ErrataOverview eo : unfiltered) {
Boolean type = null;
if (eo.isBugFix()) {
- type = (Boolean)formIn.get("errata_type_bug");
+ type = (Boolean)formIn.get(ERRATA_BUG);
if (type != null) {
if (type) {
filteredByType.add(eo);
@@ -491,7 +407,7 @@ public class ErrataSearchAction extends RhnAction {
}
}
if (eo.isSecurityAdvisory()) {
- type = (Boolean)formIn.get("errata_type_security");
+ type = (Boolean)formIn.get(ERRATA_SEC);
if (type != null) {
if (type) {
filteredByType.add(eo);
@@ -499,7 +415,7 @@ public class ErrataSearchAction extends RhnAction {
}
}
if (eo.isProductEnhancement()) {
- type = (Boolean)formIn.get("errata_type_enhancement");
+ type = (Boolean)formIn.get(ERRATA_ENH);
if (type != null) {
if (type) {
filteredByType.add(eo);
@@ -510,8 +426,6 @@ public class ErrataSearchAction extends RhnAction {
return filteredByType;
}
-
-
private List<ErrataOverview> fleshOutErrataOverview(List<Long> idsIn, Org org) {
// Chunk the work to avoid issue with Oracle not liking
// an input parameter list to contain more than 1000 entries.
@@ -540,8 +454,6 @@ public class ErrataSearchAction extends RhnAction {
return unsorted;
}
-
-
private String getDateString(Date date) {
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
cal.setTime(date);
@@ -553,7 +465,7 @@ public class ErrataSearchAction extends RhnAction {
return currentTime;
}
- private String preprocessSearchString(String searchstring, String mode) {
+ protected String preprocessSearchString(String searchstring, String mode) {
StringBuffer buf = new StringBuffer(searchstring.length());
String[] tokens = searchstring.split(" ");
@@ -613,12 +525,23 @@ public class ErrataSearchAction extends RhnAction {
}
private Boolean getOptionIssueDateSearch(HttpServletRequest request) {
- String strDateSearch = request.getParameter("optionIssueDateSearch");
- if ("on".equals(strDateSearch)) {
- return true;
+ Object dateSrch = request.getAttribute(OPT_ISSUE_DATE);
+ if (dateSrch == null) {
+ return false;
}
- return false;
- }
+ if (dateSrch instanceof Boolean) {
+ return (Boolean) dateSrch;
+ }
+ else if (dateSrch instanceof String) {
+ if ("on".equals(dateSrch)) {
+ return true;
+ }
+ return false;
+ }
+ else {
+ return false;
+ }
+ }
}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/errata/test/ErrataSearchActionTest.java b/java/code/src/com/redhat/rhn/frontend/action/errata/test/ErrataSearchActionTest.java
index abf0daf..13ec7df 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/errata/test/ErrataSearchActionTest.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/errata/test/ErrataSearchActionTest.java
@@ -14,22 +14,24 @@
*/
package com.redhat.rhn.frontend.action.errata.test;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.collections.IteratorUtils;
+import org.apache.struts.action.ActionForward;
+
import com.redhat.rhn.domain.errata.Errata;
import com.redhat.rhn.domain.errata.test.ErrataFactoryTest;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
import com.redhat.rhn.frontend.action.errata.ErrataSearchAction;
import com.redhat.rhn.frontend.struts.RhnAction;
+import com.redhat.rhn.frontend.struts.RhnHelper;
import com.redhat.rhn.testing.ActionHelper;
import com.redhat.rhn.testing.RhnBaseTestCase;
import com.redhat.rhn.testing.UserTestUtils;
-import org.apache.commons.collections.IteratorUtils;
-import org.apache.struts.action.ActionForward;
-
-import java.util.HashMap;
-import java.util.Map;
-
/**
- * ErrataPackagesSetupActionTest
+ * ErrataSearchActionTest
* @version $Rev$
*/
public class ErrataSearchActionTest extends RhnBaseTestCase {
@@ -42,22 +44,24 @@ public class ErrataSearchActionTest extends RhnBaseTestCase {
this.getClass().getSimpleName()));
String name = e.getAdvisory();
- ah.setUpAction(action, "success");
- ah.getForm().set("view_mode", "errata_search_by_advisory");
+ ah.setUpAction(action, RhnHelper.DEFAULT_FORWARD);
+ ah.getForm().set(BaseSearchAction.VIEW_MODE, BaseSearchAction.OPT_ADVISORY);
ah.getForm().set(RhnAction.SUBMITTED, Boolean.TRUE);
// these are duplicated on PURPOSE! Because mockobjects SUCK ASS!
- ah.getRequest().setupAddParameter("search_string", name);
- ah.getRequest().setupAddParameter("search_string", name);
- ah.getRequest().setupAddParameter("view_mode", "errata_search_by_advisory");
- ah.getRequest().setupAddParameter("view_mode", "errata_search_by_advisory");
- ah.getRequest().setupAddParameter("fineGrained", "on");
- ah.getRequest().setupAddParameter("fineGrained", "on");
+ ah.getRequest().setupAddParameter(BaseSearchAction.SEARCH_STR, name);
+ ah.getRequest().setupAddParameter(BaseSearchAction.SEARCH_STR, name);
+ ah.getRequest().setupAddParameter(BaseSearchAction.VIEW_MODE,
+ BaseSearchAction.OPT_ADVISORY);
+ ah.getRequest().setupAddParameter(BaseSearchAction.VIEW_MODE,
+ BaseSearchAction.OPT_ADVISORY);
+ ah.getRequest().setupAddParameter(BaseSearchAction.FINE_GRAINED, "on");
+ ah.getRequest().setupAddParameter(BaseSearchAction.FINE_GRAINED, "on");
// I *HATE* Mockobjects
Map paramnames = new HashMap();
- paramnames.put("search_string", name);
- paramnames.put("view_mode", "errata_search_by_advisory");
- paramnames.put("fineGrained", "on");
+ paramnames.put(BaseSearchAction.SEARCH_STR, name);
+ paramnames.put(BaseSearchAction.VIEW_MODE, BaseSearchAction.OPT_ADVISORY);
+ paramnames.put(BaseSearchAction.FINE_GRAINED, "on");
paramnames.put(RhnAction.SUBMITTED, "true");
ah.getRequest().setupGetParameterNames(
IteratorUtils.asEnumeration(paramnames.keySet().iterator()));
@@ -65,10 +69,6 @@ public class ErrataSearchActionTest extends RhnBaseTestCase {
ah.setupClampListBounds();
ActionForward af = ah.executeAction();
-
- assertTrue(af.getPath().indexOf(name.replaceAll(" ", "+")) != -1);
- assertTrue(af.getPath().indexOf("errata_search_by_advisory") != -1);
-
}
}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/help/DocSearchSetupAction.java b/java/code/src/com/redhat/rhn/frontend/action/help/DocSearchSetupAction.java
index 85ed1c9..aa9bd37 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/help/DocSearchSetupAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/help/DocSearchSetupAction.java
@@ -14,158 +14,58 @@
*/
package com.redhat.rhn.frontend.action.help;
-import com.redhat.rhn.common.conf.ConfigDefaults;
-import com.redhat.rhn.common.localization.LocalizationService;
-import com.redhat.rhn.common.validator.ValidatorException;
-import com.redhat.rhn.common.validator.ValidatorWarning;
-import com.redhat.rhn.frontend.context.Context;
-import com.redhat.rhn.frontend.dto.HelpDocumentOverview;
-import com.redhat.rhn.frontend.struts.RequestContext;
-import com.redhat.rhn.frontend.struts.RhnAction;
-import com.redhat.rhn.frontend.struts.RhnHelper;
-import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-import org.apache.struts.action.ActionErrors;
-import org.apache.struts.action.ActionForm;
-import org.apache.struts.action.ActionForward;
-import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
-import org.apache.struts.action.DynaActionForm;
-
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.DynaActionForm;
import redstone.xmlrpc.XmlRpcClient;
-import redstone.xmlrpc.XmlRpcException;
import redstone.xmlrpc.XmlRpcFault;
+import com.redhat.rhn.common.conf.ConfigDefaults;
+import com.redhat.rhn.common.validator.ValidatorException;
+import com.redhat.rhn.common.validator.ValidatorWarning;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
+import com.redhat.rhn.frontend.context.Context;
+import com.redhat.rhn.frontend.dto.HelpDocumentOverview;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+
/**
* DocSearchSetupAction
* @version $Rev$
*/
-public class DocSearchSetupAction extends RhnAction {
+public class DocSearchSetupAction extends BaseSearchAction {
private static Logger log = Logger.getLogger(DocSearchSetupAction.class);
- private static final String OPT_FREE_FORM = "search_free_form";
- private static final String OPT_CONTENT_ONLY = "search_content";
- private static final String OPT_TITLE_ONLY = "search_title";
- private static final String OPT_CONTENT_TITLE = "search_content_title";
-
- /** {@inheritDoc} */
- @Override
- public ActionForward execute(ActionMapping mapping, ActionForm formIn,
- HttpServletRequest request, HttpServletResponse response) {
-
- ActionErrors errors = new ActionErrors();
- DynaActionForm form = (DynaActionForm)formIn;
- request.setAttribute(ListTagHelper.PARENT_URL, request.getRequestURI());
- Map forwardParams = makeParamMap(request);
- String searchString = request.getParameter("search_string");
- String viewMode = form.getString("view_mode");
-
- try {
- // handle setup, the submission setups the searchstring below
- // and redirects to this page which then performs the search.
- if (!isSubmitted(form)) {
- setupForm(request, form);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- request.getParameterMap());
- }
- }
- catch (XmlRpcException xre) {
- log.error("Could not connect to search server.", xre);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- catch (XmlRpcFault e) {
- log.info("Caught Exception :" + e);
- log.info("ErrorCode = " + e.getErrorCode());
- e.printStackTrace();
- if (e.getErrorCode() == 100) {
- log.error("Invalid search query", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_parse_query",
- searchString));
- }
- else if (e.getErrorCode() == 200) {
- log.error("Index files appear to be missing: ", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.index_files_missing",
- searchString));
- }
- else {
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_execute_query",
- searchString));
- }
- }
- catch (MalformedURLException e) {
- log.error("Could not connect to server.", e);
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- catch (ValidatorException ve) {
- errors.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.use_free_form"));
- }
-
- // keep all params except submitted, in order for the new list
- // tag pagination to work we need to pass along all the formvars it
- // generated.
- Enumeration paramNames = request.getParameterNames();
- while (paramNames.hasMoreElements()) {
- String name = (String) paramNames.nextElement();
- if (!SUBMITTED.equals(name)) {
- forwardParams.put(name, request.getParameter(name));
- }
- }
-
- forwardParams.put("search_string", searchString);
- forwardParams.put("view_mode", viewMode);
-
- if (!errors.isEmpty()) {
- addErrors(request, errors);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- forwardParams);
- }
-
- return getStrutsDelegate().forwardParams(
- mapping.findForward("success"),
- forwardParams);
- }
-
- private void setupForm(HttpServletRequest request, DynaActionForm form)
+ protected ActionForward doExecute(HttpServletRequest request, ActionMapping mapping,
+ DynaActionForm form)
throws MalformedURLException, XmlRpcFault {
RequestContext ctx = new RequestContext(request);
- String searchString = form.getString("search_string");
- String viewmode = form.getString("view_mode");
-
- List searchOptions = new ArrayList();
+ String searchString = form.getString(SEARCH_STR);
+ String viewmode = form.getString(VIEW_MODE);
+ List<Map<String, String>> searchOptions = new ArrayList<Map<String, String>>();
addOption(searchOptions, "docsearch.content_title", OPT_CONTENT_TITLE);
addOption(searchOptions, "docsearch.free_form", OPT_FREE_FORM);
addOption(searchOptions, "docsearch.content", OPT_CONTENT_ONLY);
addOption(searchOptions, "docsearch.title", OPT_TITLE_ONLY);
- request.setAttribute("search_string", searchString);
- request.setAttribute("view_mode", viewmode);
- request.setAttribute("searchOptions", searchOptions);
+ request.setAttribute(SEARCH_STR, searchString);
+ request.setAttribute(VIEW_MODE, viewmode);
+ request.setAttribute(SEARCH_OPT, searchOptions);
if (!StringUtils.isBlank(searchString)) {
@@ -174,10 +74,16 @@ public class DocSearchSetupAction extends RhnAction {
viewmode, request);
log.debug("GET search: " + results);
request.setAttribute(RequestContext.PAGE_LIST,
- results != null ? results : Collections.EMPTY_LIST);
+ results != null ? results : Collections.emptyList());
}
else {
- request.setAttribute(RequestContext.PAGE_LIST, Collections.EMPTY_LIST);
+ request.setAttribute(RequestContext.PAGE_LIST, Collections.emptyList());
+ }
+ if (isSubmitted(form)) {
+ return mapping.findForward("success");
+ }
+ else {
+ return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
}
@@ -208,7 +114,7 @@ public class DocSearchSetupAction extends RhnAction {
searchFreeForm = true;
}
args.add(searchFreeForm);
- List results = Collections.EMPTY_LIST;
+ List results = Collections.emptyList();
try {
results = (List)client.invoke("index.search", args);
}
@@ -237,7 +143,7 @@ public class DocSearchSetupAction extends RhnAction {
}
if (results.isEmpty()) {
- return Collections.EMPTY_LIST;
+ return Collections.emptyList();
}
List<HelpDocumentOverview> docs = new ArrayList<HelpDocumentOverview>();
@@ -290,28 +196,15 @@ public class DocSearchSetupAction extends RhnAction {
return "(content:(" + query + ") title:(" + query + "))";
}
-
// OPT_FREE_FORM send as is.
return buf.toString();
}
- private void addOption(List options, String key, String value) {
- addOption(options, key, value, false);
- }
+ @Override
+ protected void insureFormDefaults(HttpServletRequest request, DynaActionForm form) {
+ String searchString = request.getParameter(SEARCH_STR);
+ String viewmode = request.getParameter(VIEW_MODE);
- /**
- * Utility function to create options for the dropdown.
- * @param options list containing all options.
- * @param key resource bundle key used as the display value.
- * @param value value to be submitted with form.
- * @param flag Flag the item with an asterisk (*) indicating it is *not*
- * synch'd
- */
- private void addOption(List options, String key, String value, boolean flag) {
- LocalizationService ls = LocalizationService.getInstance();
- Map selection = new HashMap();
- selection.put("display", (flag ? "*" : "") + ls.getMessage(key));
- selection.put("value", value);
- options.add(selection);
}
+
}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchAction.java b/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchAction.java
new file mode 100644
index 0000000..aad1edb
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchAction.java
@@ -0,0 +1,316 @@
+/**
+ * Copyright (c) 2009--2012 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.frontend.action.systems;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.action.DynaActionForm;
+
+import redstone.xmlrpc.XmlRpcException;
+import redstone.xmlrpc.XmlRpcFault;
+
+import com.redhat.rhn.common.db.datasource.DataResult;
+import com.redhat.rhn.common.localization.LocalizationService;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
+import com.redhat.rhn.frontend.action.common.BadParameterException;
+import com.redhat.rhn.frontend.dto.SystemSearchResult;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.frontend.struts.StrutsDelegate;
+import com.redhat.rhn.frontend.taglibs.list.helper.ListRhnSetHelper;
+import com.redhat.rhn.frontend.taglibs.list.helper.Listable;
+import com.redhat.rhn.manager.rhnset.RhnSetDecl;
+
+/**
+ * Action handling the advanced system search page.
+ */
+public class SystemSearchAction extends BaseSearchAction implements Listable {
+
+ public static final String DATA_SET = "searchResults";
+
+ public static final String[] OPT_GROUPS_TITLES = {"systemsearch.jsp.details",
+ "systemsearch.jsp.activity",
+ "systemsearch.jsp.hardware",
+ "systemsearch.jsp.devices",
+ "systemsearch.jsp.dmiinfo",
+ "systemsearch.jsp.networkinfo",
+ "systemsearch.jsp.packages",
+ "systemsearch.jsp.location"};
+
+ public static final String[][] OPT_GROUPS = {
+ /* details */
+ { SystemSearchHelper.NAME_AND_DESCRIPTION, SystemSearchHelper.ID,
+ SystemSearchHelper.CUSTOM_INFO,
+ SystemSearchHelper.SNAPSHOT_TAG,
+ SystemSearchHelper.RUNNING_KERNEL,
+ SystemSearchHelper.UUID },
+ /* activity group */
+ { SystemSearchHelper.CHECKIN, SystemSearchHelper.REGISTERED },
+ /* hardware group */
+ { SystemSearchHelper.CPU_MODEL, SystemSearchHelper.CPU_MHZ_LT,
+ SystemSearchHelper.CPU_MHZ_GT,
+ SystemSearchHelper.NUM_CPUS_LT,
+ SystemSearchHelper.NUM_CPUS_GT,
+ SystemSearchHelper.RAM_LT, SystemSearchHelper.RAM_GT },
+ /* device group */
+ { SystemSearchHelper.HW_DESCRIPTION, SystemSearchHelper.HW_DRIVER,
+ SystemSearchHelper.HW_DEVICE_ID,
+ SystemSearchHelper.HW_VENDOR_ID },
+ /* dmiinfo */
+ { SystemSearchHelper.DMI_SYSTEM, SystemSearchHelper.DMI_BIOS,
+ SystemSearchHelper.DMI_ASSET },
+ /* network info */
+ { SystemSearchHelper.HOSTNAME, SystemSearchHelper.IP,
+ SystemSearchHelper.IP6 },
+ /* packages */
+ { SystemSearchHelper.INSTALLED_PACKAGES,
+ SystemSearchHelper.NEEDED_PACKAGES },
+ /* location */
+ { SystemSearchHelper.LOC_ADDRESS, SystemSearchHelper.LOC_BUILDING,
+ SystemSearchHelper.LOC_ROOM,
+ SystemSearchHelper.LOC_RACK } };
+
+ public static final List<String> VALID_WHERE_STRINGS =
+ Arrays.asList(new String[] {WHERE_ALL, WHERE_SSM});
+
+ private final Logger log = Logger.getLogger(SystemSearchAction.class);
+
+ @Override
+ protected void insureFormDefaults(HttpServletRequest request, DynaActionForm form) {
+ String search = form.getString(SEARCH_STR).trim();
+ String where = form.getString(WHERE_TO_SEARCH);
+ String viewMode = form.getString(VIEW_MODE);
+
+ if (where == null || viewMode == null) {
+ throw new BadParameterException("An expected form var was null");
+ }
+
+ if ("".equals(viewMode)) { // first time viewing page
+ viewMode = "systemsearch_name_and_description";
+ form.set(VIEW_MODE, viewMode);
+ request.setAttribute(VIEW_MODE, viewMode);
+ }
+
+ if ("".equals(where) || !VALID_WHERE_STRINGS.contains(where)) {
+ form.set(WHERE_TO_SEARCH, "all");
+ request.setAttribute(WHERE_TO_SEARCH, "all");
+ }
+
+ Boolean fineGrained = (Boolean)form.get(FINE_GRAINED);
+ request.setAttribute(FINE_GRAINED, fineGrained == null ? false : fineGrained);
+
+ Boolean invert = (Boolean) form.get(INVERT_RESULTS);
+ if (invert == null) {
+ invert = Boolean.FALSE;
+ form.set(INVERT_RESULTS, invert);
+ }
+
+ if (invert) {
+ request.setAttribute(INVERT_RESULTS, "on");
+ }
+ else {
+ request.setAttribute(INVERT_RESULTS, "off");
+ }
+
+ /* Here we set up a hashmap using the string resources key for the various options
+ * group as a key into the hash, and the string resources/database mode keys as
+ * the values of the options that are contained within each opt group. The jsp
+ * uses this hashmap to setup a dropdown box
+ */
+ boolean matchingViewModeFound = false;
+ Map<String, List<Map<String, String>>> optGroupsMap =
+ new HashMap<String, List<Map<String, String>>>();
+ LocalizationService ls = LocalizationService.getInstance();
+ for (int j = 0; j < OPT_GROUPS_TITLES.length; ++j) {
+ List<Map<String, String>> options = new ArrayList<Map<String, String>>();
+
+ for (int k = 0; k < OPT_GROUPS[j].length; ++k) {
+ options.add(createDisplayMap(LocalizationService.getInstance()
+ .getMessage(OPT_GROUPS[j][k]),
+ OPT_GROUPS[j][k]));
+ if (OPT_GROUPS[j][k].equals(viewMode)) {
+ matchingViewModeFound = true;
+ }
+ }
+ optGroupsMap.put(OPT_GROUPS_TITLES[j], options);
+ }
+ if (viewMode != null && !matchingViewModeFound) {
+ throw new BadParameterException("Bad viewMode passed in from form");
+ }
+ request.setAttribute(OPT_GROUPS_MAP, optGroupsMap);
+ request.setAttribute(OPT_GROUPS_KEYS, optGroupsMap.keySet());
+ request.setAttribute(SEARCH_STR, search);
+ request.setAttribute(VIEW_MODE, viewMode);
+ request.setAttribute(WHERE_TO_SEARCH, where);
+ }
+
+ protected ActionForward doExecute(HttpServletRequest request, ActionMapping mapping,
+ DynaActionForm form) {
+ String viewMode = form.getString(VIEW_MODE);
+ String searchString = form.getString(SEARCH_STR).trim();
+
+ ActionErrors errs = new ActionErrors();
+ if (viewMode.equals(SystemSearchHelper.ID) ||
+ viewMode.equals(SystemSearchHelper.CPU_MHZ_LT) ||
+ viewMode.equals(SystemSearchHelper.CPU_MHZ_GT) ||
+ viewMode.equals(SystemSearchHelper.RAM_LT) ||
+ viewMode.equals(SystemSearchHelper.RAM_GT) ||
+ viewMode.equals(SystemSearchHelper.NUM_CPUS_LT) ||
+ viewMode.equals(SystemSearchHelper.NUM_CPUS_GT) ||
+ viewMode.equals(SystemSearchHelper.CHECKIN) ||
+ viewMode.equals(SystemSearchHelper.REGISTERED)) {
+ String regEx = "(\\d)*";
+ Pattern pattern = Pattern.compile(regEx);
+ Matcher matcher = pattern.matcher(searchString);
+ if (!matcher.matches()) {
+ errs.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("systemsearch.errors.numeric"));
+ }
+ }
+
+ // TODO: Set up combined-form validator
+// errs.add(RhnValidationHelper.validateDynaActionForm(this, daForm));
+ addErrors(request, errs);
+
+ ListRhnSetHelper helper = new ListRhnSetHelper(this, request, RhnSetDecl.SYSTEMS);
+ helper.setWillClearSet(false);
+ helper.setDataSetName(getDataSetName());
+ helper.setListName(getListName());
+ helper.execute();
+
+ List results = (List) request.getAttribute(getDataSetName());
+ log.debug("SystemSearch results.size() = " +
+ (results != null ? results.size() : "null results"));
+ if ((results != null) && (results.size() == 1)) {
+ SystemSearchResult s = (SystemSearchResult) results.get(0);
+ return StrutsDelegate.getInstance().forwardParam(mapping.findForward("single"),
+ "sid", s.getId().toString());
+ }
+ return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
+ }
+
+ protected DataResult performSearch(RequestContext context) {
+ HttpServletRequest request = context.getRequest();
+ String searchString = (String)request.getAttribute(SEARCH_STR);
+ String viewMode = (String)request.getAttribute(VIEW_MODE);
+ String whereToSearch = (String)request.getAttribute(WHERE_TO_SEARCH);
+ Boolean invertResults = StringUtils.defaultString(
+ (String)request.getAttribute(INVERT_RESULTS)).equals("on");
+ Boolean isFineGrained = (Boolean)request.getAttribute(FINE_GRAINED);
+
+ ActionErrors errs = new ActionErrors();
+ DataResult dr = null;
+ try {
+ dr = SystemSearchHelper.systemSearch(context,
+ searchString,
+ viewMode,
+ invertResults,
+ whereToSearch, isFineGrained);
+ }
+ catch (MalformedURLException e) {
+ log.error("Caught Exception :" + e, e);
+ errs.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.connection_error"));
+ }
+ catch (XmlRpcFault e) {
+ log.info("Caught Exception :" + e + ", code [" + e.getErrorCode() + "]", e);
+ if (e.getErrorCode() == 100) {
+ log.error("Invalid search query", e);
+ errs.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.could_not_parse_query",
+ searchString));
+ }
+ else if (e.getErrorCode() == 200) {
+ log.error("Index files appear to be missing: ", e);
+ errs.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.index_files_missing",
+ searchString));
+ }
+ else {
+ errs.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.could_not_execute_query",
+ searchString));
+ }
+ }
+ catch (XmlRpcException e) {
+ log.error("Caught Exception :" + e, e);
+ errs.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("packages.search.connection_error"));
+ }
+ if (dr == null) {
+ ActionMessages messages = new ActionMessages();
+ messages.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("systemsearch_no_matches_found"));
+ getStrutsDelegate().saveMessages(request, messages);
+ }
+ if (!errs.isEmpty()) {
+ addErrors(request, errs);
+ }
+ return dr;
+ }
+
+ /** {@inheritDoc} */
+ private String getListName() {
+ return RequestContext.PAGE_LIST;
+ }
+
+ /** {@inheritDoc} */
+ private String getDataSetName() {
+ return DATA_SET;
+ }
+
+ /**
+ * Creates a Map with the keys display and value
+ * @param display the value for display
+ * @param value the value for value
+ * @return Returns the map.
+ */
+ private Map createDisplayMap(String display, String value) {
+ Map<String, String> selection = new HashMap<String, String>();
+ selection.put("display", display);
+ selection.put("value", value);
+ return selection;
+ }
+
+ /** {@inheritDoc} */
+ public List getResult(RequestContext context) {
+ String searchString = (String)context.getRequest().getAttribute(SEARCH_STR);
+
+ if (!StringUtils.isBlank(searchString)) {
+ log.debug("SystemSearchSetupAction.getResult() calling performSearch()");
+ return performSearch(context);
+ }
+ log.debug("SystemSearchSetupAction.getResult() returning Collections.EMPTY_LIST");
+ return Collections.emptyList();
+ }
+
+}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchHelper.java b/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchHelper.java
index 0d33a18..51428dc 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchHelper.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchHelper.java
@@ -101,6 +101,48 @@ public class SystemSearchHelper {
protected SystemSearchHelper() { }
+ public static final String[] OPT_GROUPS_TITLES = {"systemsearch.jsp.details",
+ "systemsearch.jsp.activity",
+ "systemsearch.jsp.hardware",
+ "systemsearch.jsp.devices",
+ "systemsearch.jsp.dmiinfo",
+ "systemsearch.jsp.networkinfo",
+ "systemsearch.jsp.packages",
+ "systemsearch.jsp.location"};
+
+ public static final String[][] OPT_GROUPS = {
+ /* details */
+ { SystemSearchHelper.NAME_AND_DESCRIPTION, SystemSearchHelper.ID,
+ SystemSearchHelper.CUSTOM_INFO,
+ SystemSearchHelper.SNAPSHOT_TAG,
+ SystemSearchHelper.RUNNING_KERNEL,
+ SystemSearchHelper.UUID },
+ /* activity group */
+ { SystemSearchHelper.CHECKIN, SystemSearchHelper.REGISTERED },
+ /* hardware group */
+ { SystemSearchHelper.CPU_MODEL, SystemSearchHelper.CPU_MHZ_LT,
+ SystemSearchHelper.CPU_MHZ_GT,
+ SystemSearchHelper.NUM_CPUS_LT,
+ SystemSearchHelper.NUM_CPUS_GT,
+ SystemSearchHelper.RAM_LT, SystemSearchHelper.RAM_GT },
+ /* device group */
+ { SystemSearchHelper.HW_DESCRIPTION, SystemSearchHelper.HW_DRIVER,
+ SystemSearchHelper.HW_DEVICE_ID,
+ SystemSearchHelper.HW_VENDOR_ID },
+ /* dmiinfo */
+ { SystemSearchHelper.DMI_SYSTEM, SystemSearchHelper.DMI_BIOS,
+ SystemSearchHelper.DMI_ASSET },
+ /* network info */
+ { SystemSearchHelper.HOSTNAME, SystemSearchHelper.IP,
+ SystemSearchHelper.IP6 },
+ /* packages */
+ { SystemSearchHelper.INSTALLED_PACKAGES,
+ SystemSearchHelper.NEEDED_PACKAGES },
+ /* location */
+ { SystemSearchHelper.LOC_ADDRESS, SystemSearchHelper.LOC_BUILDING,
+ SystemSearchHelper.LOC_ROOM,
+ SystemSearchHelper.LOC_RACK } };
+
/**
* Returns a DataResult of SystemSearchResults which are based on the user's search
* criteria
diff --git a/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchSetupAction.java b/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchSetupAction.java
deleted file mode 100644
index 48826b4..0000000
--- a/java/code/src/com/redhat/rhn/frontend/action/systems/SystemSearchSetupAction.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/**
- * Copyright (c) 2009--2012 Red Hat, Inc.
- *
- * This software is licensed to you under the GNU General Public License,
- * version 2 (GPLv2). There is NO WARRANTY for this software, express or
- * implied, including the implied warranties of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
- * along with this software; if not, see
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
- *
- * Red Hat trademarks are not licensed under GPLv2. No permission is
- * granted to use or replicate Red Hat trademarks that are incorporated
- * in this software or its documentation.
- */
-package com.redhat.rhn.frontend.action.systems;
-
-import com.redhat.rhn.common.db.datasource.DataResult;
-import com.redhat.rhn.common.localization.LocalizationService;
-import com.redhat.rhn.frontend.action.common.BadParameterException;
-import com.redhat.rhn.frontend.dto.SystemSearchResult;
-import com.redhat.rhn.frontend.struts.RequestContext;
-import com.redhat.rhn.frontend.struts.RhnAction;
-import com.redhat.rhn.frontend.struts.RhnHelper;
-import com.redhat.rhn.frontend.struts.RhnValidationHelper;
-import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
-import com.redhat.rhn.frontend.taglibs.list.helper.ListRhnSetHelper;
-import com.redhat.rhn.frontend.taglibs.list.helper.Listable;
-import com.redhat.rhn.manager.rhnset.RhnSetDecl;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-import org.apache.struts.action.ActionErrors;
-import org.apache.struts.action.ActionForm;
-import org.apache.struts.action.ActionForward;
-import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
-import org.apache.struts.action.DynaActionForm;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import redstone.xmlrpc.XmlRpcException;
-import redstone.xmlrpc.XmlRpcFault;
-
-/**
- * Action handling the advanced system search page.
- */
-public class SystemSearchSetupAction extends RhnAction implements Listable {
-
- public static final String DATA_SET = "searchResults";
-
- public static final String[] OPT_GROUPS_TITLES = { "systemsearch.jsp.details",
- "systemsearch.jsp.activity",
- "systemsearch.jsp.hardware",
- "systemsearch.jsp.devices",
- "systemsearch.jsp.dmiinfo",
- "systemsearch.jsp.networkinfo",
- "systemsearch.jsp.packages",
- "systemsearch.jsp.location"};
-
- public static final String[][] OPT_GROUPS =
- {
- /* details */
- { SystemSearchHelper.NAME_AND_DESCRIPTION,
- SystemSearchHelper.ID,
- SystemSearchHelper.CUSTOM_INFO,
- SystemSearchHelper.SNAPSHOT_TAG,
- SystemSearchHelper.RUNNING_KERNEL,
- SystemSearchHelper.UUID
- },
- /* activity group */
- { SystemSearchHelper.CHECKIN,
- SystemSearchHelper.REGISTERED
- },
- /* hardware group */
- {
- SystemSearchHelper.CPU_MODEL,
- SystemSearchHelper.CPU_MHZ_LT,
- SystemSearchHelper.CPU_MHZ_GT,
- SystemSearchHelper.NUM_CPUS_LT,
- SystemSearchHelper.NUM_CPUS_GT,
- SystemSearchHelper.RAM_LT,
- SystemSearchHelper.RAM_GT
- },
- /* device group */
- { SystemSearchHelper.HW_DESCRIPTION,
- SystemSearchHelper.HW_DRIVER,
- SystemSearchHelper.HW_DEVICE_ID,
- SystemSearchHelper.HW_VENDOR_ID
- },
- /* dmiinfo */
- {
- SystemSearchHelper.DMI_SYSTEM,
- SystemSearchHelper.DMI_BIOS,
- SystemSearchHelper.DMI_ASSET
- },
- /* network info */
- {
- SystemSearchHelper.HOSTNAME,
- SystemSearchHelper.IP,
- SystemSearchHelper.IP6
- },
- /* packages */
- {
- SystemSearchHelper.INSTALLED_PACKAGES,
- SystemSearchHelper.NEEDED_PACKAGES
- },
- /* location */
- {
- SystemSearchHelper.LOC_ADDRESS,
- SystemSearchHelper.LOC_BUILDING,
- SystemSearchHelper.LOC_ROOM,
- SystemSearchHelper.LOC_RACK
- }};
-
- public static final String SEARCH_STRING = "search_string";
- public static final String VIEW_MODE = "view_mode";
- public static final String WHERE_TO_SEARCH = "whereToSearch";
- public static final String INVERT_RESULTS = "invert";
- public static final String FINE_GRAINED = "fineGrained";
-
- private static final String FORM = "FORM";
- private static final String MAPPING = "MAPPING";
-
- private final Logger log = Logger.getLogger(SystemSearchSetupAction.class);
-
- /** {@inheritDoc} */
- public ActionForward execute(ActionMapping mapping,
- ActionForm formIn,
- HttpServletRequest request,
- HttpServletResponse response)
- throws BadParameterException {
-
-
- DynaActionForm daForm = (DynaActionForm) formIn;
- request.setAttribute(FORM, daForm);
- request.setAttribute(MAPPING, mapping);
-
- /*
- * Either the form was submitted (and it's a list action) or
- * we have GET arguments and so we can actually render the list
- */
- if (ListTagHelper.getListAction(getListName(), request) != null ||
- (!isSubmitted(daForm) &&
- request.getParameter(VIEW_MODE) != null)) {
-
- String whereToSearch = daForm.getString(WHERE_TO_SEARCH);
- Boolean invertResults = (Boolean) daForm.get(INVERT_RESULTS);
-
- if (invertResults == null) {
- invertResults = Boolean.FALSE;
- }
-
- request.setAttribute(VIEW_MODE, request.getParameter(VIEW_MODE));
- request.setAttribute(SEARCH_STRING, request.getParameter(SEARCH_STRING));
- request.setAttribute(WHERE_TO_SEARCH, whereToSearch);
- request.setAttribute(FINE_GRAINED, request.getParameter(FINE_GRAINED));
-
- if (invertResults) {
- request.setAttribute(INVERT_RESULTS, "on");
- }
- else {
- request.setAttribute(INVERT_RESULTS, "off");
- }
-
- setupForm(request, daForm, request.getParameter(VIEW_MODE));
-
- ListRhnSetHelper helper = new ListRhnSetHelper(this,
- request, RhnSetDecl.SYSTEMS);
- helper.setWillClearSet(false);
- helper.setDataSetName(getDataSetName());
- helper.setListName(getListName());
- helper.execute();
-
- List results = (List)request.getAttribute(getDataSetName());
- log.info("SystemSearch results.size() = " +
- (results != null ? results.size() : "null results"));
- if ((results != null) && (results.size() == 1)) {
- SystemSearchResult s = (SystemSearchResult) results.get(0);
- try {
- response.sendRedirect(
- "/rhn/systems/details/Overview.do?sid=" +
- s.getId().toString());
- return null;
- }
- catch (IOException ioe) {
- throw new RuntimeException(
- "Exception while trying to redirect: " + ioe);
- }
- }
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- request.getParameterMap());
- }
- /**
- * Else the form was submitted, so we need to parse the form and turn it into
- * GET parameters
- */
- else if (isSubmitted(daForm)) {
- String searchString = daForm.getString(SEARCH_STRING).trim();
- String viewMode = daForm.getString(VIEW_MODE);
- String whereToSearch = daForm.getString(WHERE_TO_SEARCH);
- Boolean invertResults = (Boolean) daForm.get(INVERT_RESULTS);
-
- if (invertResults == null) {
- invertResults = Boolean.FALSE;
- }
-
- setupForm(request, daForm, viewMode);
- if (whereToSearch == null || viewMode == null) {
- throw new BadParameterException("An expected form var was null");
- }
-
- request.setAttribute(SEARCH_STRING, searchString);
- request.setAttribute(VIEW_MODE, viewMode);
- request.setAttribute(WHERE_TO_SEARCH, whereToSearch);
-
- if (invertResults) {
- request.setAttribute(INVERT_RESULTS, "on");
- }
- else {
- request.setAttribute(INVERT_RESULTS, "off");
- }
-
- ActionErrors errs = new ActionErrors();
- if (viewMode.equals("systemsearch_id") ||
- viewMode.equals(SystemSearchHelper.CPU_MHZ_LT) ||
- viewMode.equals(SystemSearchHelper.CPU_MHZ_GT) ||
- viewMode.equals(SystemSearchHelper.RAM_LT) ||
- viewMode.equals(SystemSearchHelper.RAM_GT) ||
- viewMode.equals(SystemSearchHelper.NUM_CPUS_LT) ||
- viewMode.equals(SystemSearchHelper.NUM_CPUS_GT) ||
- viewMode.equals(SystemSearchHelper.CHECKIN) ||
- viewMode.equals(SystemSearchHelper.REGISTERED)) {
- String regEx = "(\\d)*";
- Pattern pattern = Pattern.compile(regEx);
- Matcher matcher = pattern.matcher(searchString);
- if (!matcher.matches()) {
- errs.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("systemsearch.errors.numeric"));
- }
- }
-
- errs.add(RhnValidationHelper.validateDynaActionForm(this, daForm));
-
- if (!errs.isEmpty()) {
- addErrors(request, errs);
- request.setAttribute(SEARCH_STRING, null);
- daForm.set(SEARCH_STRING, null);
- return mapping.findForward("error");
- }
-
- Map forwardParams = makeParamMap(request);
- Enumeration paramNames = request.getParameterNames();
- while (paramNames.hasMoreElements()) {
- String name = (String) paramNames.nextElement();
- if (!SUBMITTED.equals(name)) {
- forwardParams.put(name, request.getParameter(name));
- }
-
- }
-
-
- return getStrutsDelegate().forwardParams(
- mapping.findForward("success"),
- forwardParams);
-
- }
- /**
- * Finally, if we're not actually going to display the list
- * and the form hasn't been submitted, then we're just displaying the
- * initial search page before a search has been initiated.
- */
- else {
- setupForm(request, daForm, null);
- request.setAttribute(VIEW_MODE, "systemsearch_name_and_description");
- daForm.set(WHERE_TO_SEARCH, "all");
- daForm.set(FINE_GRAINED, true);
- return getStrutsDelegate().forwardParams(
- mapping.findForward(RhnHelper.DEFAULT_FORWARD),
- request.getParameterMap());
- }
-
- }
-
- protected void setupForm(HttpServletRequest request,
- DynaActionForm form,
- String viewMode) {
- Map optGroupsMap = new HashMap();
- boolean matchingViewModeFound = false;
-
- /* Here we set up a hashmap using the string resources key for the various options
- * group as a key into the hash, and the string resources/database mode keys as
- * the values of the options that are contained within each opt group. The jsp
- * uses this hashmap to setup a dropdown box
- */
- for (int j = 0; j < OPT_GROUPS_TITLES.length; ++j) {
- List options = new ArrayList();
-
- for (int k = 0; k < OPT_GROUPS[j].length; ++k) {
- options.add(createDisplayMap(LocalizationService.getInstance()
- .getMessage(OPT_GROUPS[j][k]),
- OPT_GROUPS[j][k]));
-
- if (OPT_GROUPS[j][k].equals(viewMode)) {
- matchingViewModeFound = true;
- }
- }
-
- optGroupsMap.put(OPT_GROUPS_TITLES[j], options);
- }
-
- if (viewMode != null && !matchingViewModeFound) {
- throw new BadParameterException("Bad viewMode passed in from form");
- }
-
- request.setAttribute("optGroupsMap", optGroupsMap);
- request.setAttribute("optGroupsKeys", optGroupsMap.keySet());
- }
-
- protected DataResult performSearch(RequestContext context) {
-
- HttpServletRequest request = context.getRequest();
- String searchString = context.getParam(SEARCH_STRING, false);
- String viewMode = context.getParam(VIEW_MODE, false);
- String whereToSearch = context.getParam(WHERE_TO_SEARCH, false);
- Boolean invertResults = StringUtils.defaultString(
- context.getParam(INVERT_RESULTS, false)).equals("on");
- Boolean isFineGrained = StringUtils.defaultString(
- context.getParam(FINE_GRAINED, false)).equals("on");
-
- ActionErrors errs = new ActionErrors();
- DataResult dr = null;
- try {
- dr = SystemSearchHelper.systemSearch(context,
- searchString,
- viewMode,
- invertResults,
- whereToSearch, isFineGrained);
- }
- catch (MalformedURLException e) {
- log.info("Caught Exception :" + e);
- e.printStackTrace();
- errs.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- catch (XmlRpcFault e) {
- log.info("Caught Exception :" + e);
- log.info("ErrorCode = " + e.getErrorCode());
- e.printStackTrace();
- if (e.getErrorCode() == 100) {
- log.error("Invalid search query", e);
- errs.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_parse_query",
- searchString));
- }
- else if (e.getErrorCode() == 200) {
- log.error("Index files appear to be missing: ", e);
- errs.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.index_files_missing",
- searchString));
- }
- else {
- errs.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.could_not_execute_query",
- searchString));
- }
- }
- catch (XmlRpcException e) {
- log.info("Caught Exception :" + e);
- e.printStackTrace();
- errs.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("packages.search.connection_error"));
- }
- if (dr == null) {
- ActionMessages messages = new ActionMessages();
- messages.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("systemsearch_no_matches_found"));
- getStrutsDelegate().saveMessages(request, messages);
- }
- if (!errs.isEmpty()) {
- addErrors(request, errs);
- }
- return dr;
- }
-
- /**
- * Creates a Map with the keys display and value
- * @param display the value for display
- * @param value the value for value
- * @return Returns the map.
- */
- private Map createDisplayMap(String display, String value) {
- Map<String, String> selection = new HashMap<String, String>();
- selection.put("display", display);
- selection.put("value", value);
- return selection;
- }
-
- /** {@inheritDoc} */
- public String getListName() {
- return RequestContext.PAGE_LIST;
- }
-
- /** {@inheritDoc} */
- public String getDataSetName() {
- return DATA_SET;
- }
-
- /** {@inheritDoc} */
- public List getResult(RequestContext context) {
- String searchString = context.getParam(SEARCH_STRING, false);
-
- if (!StringUtils.isBlank(searchString)) {
- log.info("SystemSearchSetupAction.getResult() calling performSearch()");
- return performSearch(context);
- }
- log.info("SystemSearchSetupAction.getResult() returning Collections.EMPTY_LIST");
- return Collections.EMPTY_LIST;
- }
-}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchActionTest.java b/java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchActionTest.java
new file mode 100644
index 0000000..cb036cb
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchActionTest.java
@@ -0,0 +1,152 @@
+/**
+ * Copyright (c) 2009--2012 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.frontend.action.systems.test;
+
+import org.apache.struts.action.DynaActionForm;
+
+import com.redhat.rhn.common.db.datasource.DataResult;
+import com.redhat.rhn.domain.org.OrgFactory;
+import com.redhat.rhn.domain.server.Server;
+import com.redhat.rhn.domain.server.ServerConstants;
+import com.redhat.rhn.domain.server.test.ServerFactoryTest;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnAction;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.testing.RhnMockStrutsTestCase;
+
+/**
+ * SystemSearchActionTest
+ * @version $Rev: 1 $
+ */
+public class SystemSearchActionTest extends RhnMockStrutsTestCase {
+
+ private Server s;
+
+ public void setUp() throws Exception {
+ super.setUp();
+ setRequestPathInfo("/systems/Search");
+ user.getOrg().getEntitlements().add(OrgFactory.getEntitlementEnterprise());
+ s = ServerFactoryTest.createTestServer(user, true,
+ ServerConstants.getServerGroupTypeEnterpriseEntitled());
+
+ }
+
+ /**
+ * This test tests multiple search results. The system search page, if
+ * only one result is found, will forward you directly to that
+ * system's SDC page instead of showing a list with one member
+ * on the system search page. This test is expecting multiple systems to be found
+ * and the user to be forwarded to the system search page with a list of systems
+ * shown.
+ * @throws Exception
+ */
+ public void skipTestQueryWithResults() throws Exception {
+ /**
+ * SystemSearch now talks to a Lucene search server. This creates issues
+ * for testing...you can't use a test util to create a system put it in the
+ * DB and expect the search server to have the data indexed and ready to go.
+ *
+ * Will be marking this test to be skipped till a suitable test is implemented
+ */
+ s = ServerFactoryTest.createTestServer(user, true,
+ ServerConstants.getServerGroupTypeEnterpriseEntitled());
+ addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
+ addRequestParameter(BaseSearchAction.SEARCH_STR, "redhat");
+ addRequestParameter(BaseSearchAction.WHERE_TO_SEARCH, "all");
+ addRequestParameter(BaseSearchAction.VIEW_MODE,
+ "systemsearch_name_and_description");
+ actionPerform();
+ verifyForward(RhnHelper.DEFAULT_FORWARD);
+ DataResult dr = (DataResult) request.getAttribute(RequestContext.PAGE_LIST);
+ assertNotNull(dr);
+ assertFalse(dr.isEmpty());
+ assertNotNull(request.getAttribute(BaseSearchAction.VIEW_MODE));
+ assertNotNull(request.getAttribute(BaseSearchAction.WHERE_TO_SEARCH));
+ assertNotNull(request.getAttribute(BaseSearchAction.SEARCH_STR));
+ }
+
+ /**
+ * This test is the case where only one system is found. It verfies
+ * that the user is redirected to that system's SDC page.
+ * @throws Exception
+ */
+ public void skipTestQueryWithOneResult() throws Exception {
+ /**
+ * SystemSearch now talks to a Lucene search server. This creates issues
+ * for testing...you can't use a test util to create a system put it in the
+ * DB and expect the search server to have the data indexed and ready to go.
+ *
+ * Will be marking this test to be skipped till a suitable test is implemented
+ */
+ addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
+ addRequestParameter(BaseSearchAction.SEARCH_STR, s.getName());
+ addRequestParameter(BaseSearchAction.WHERE_TO_SEARCH, "all");
+ addRequestParameter(BaseSearchAction.VIEW_MODE,
+ "systemsearch_name_and_description");
+ actionPerform();
+ System.err.println("getMockResponse() = " + getMockResponse());
+ System.err.println("getMockResponse().getStatusCode() = " +
+ getMockResponse().getStatusCode());
+ assertTrue(getMockResponse().getStatusCode() == 302);
+ }
+
+ public void testQueryWithoutResults() throws Exception {
+ return;
+ }
+
+ /**
+ * This test verfies that if a bad view mode is passed in by the user,
+ * the system search handles and catches any underlying exceptions
+ * that might be caused by this, instead of allowing the exception to escalate
+ * beyond the SystemSearchAction.
+ * @throws Exception
+ */
+ public void testQueryWithBadParameter() throws Exception {
+ addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
+ addRequestParameter(BaseSearchAction.SEARCH_STR, s.getName());
+ addRequestParameter(BaseSearchAction.WHERE_TO_SEARCH, "all");
+ addRequestParameter(BaseSearchAction.VIEW_MODE,
+ "all_your_systems_are_belong_to_us");
+ actionPerform();
+ }
+
+ public void testNoSubmit() throws Exception {
+ actionPerform();
+ DynaActionForm formIn = (DynaActionForm) getActionForm();
+ assertNotNull(formIn.get(BaseSearchAction.WHERE_TO_SEARCH));
+ assertNotNull(request.getAttribute(BaseSearchAction.VIEW_MODE));
+ }
+
+ public void testAlphaSubmitForNumericField() throws Exception {
+ addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
+ addRequestParameter(BaseSearchAction.SEARCH_STR, "abc");
+ addRequestParameter(BaseSearchAction.WHERE_TO_SEARCH, "all");
+ addRequestParameter(BaseSearchAction.VIEW_MODE,
+ "systemsearch_cpu_mhz_lt");
+ actionPerform();
+ verifyActionErrors(new String[] { "systemsearch.errors.numeric" });
+ }
+
+ public void testSmallAlphaSubmitForNumericField() throws Exception {
+ addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
+ addRequestParameter(BaseSearchAction.SEARCH_STR, "a");
+ addRequestParameter(BaseSearchAction.WHERE_TO_SEARCH, "all");
+ addRequestParameter(BaseSearchAction.VIEW_MODE,
+ "systemsearch_cpu_mhz_lt");
+ actionPerform();
+ verifyActionErrors(new String[] {"systemsearch.errors.numeric"});
+ }
+}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchSetupActionTest.java b/java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchSetupActionTest.java
deleted file mode 100644
index 59b947d..0000000
--- a/java/code/src/com/redhat/rhn/frontend/action/systems/test/SystemSearchSetupActionTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * Copyright (c) 2009--2012 Red Hat, Inc.
- *
- * This software is licensed to you under the GNU General Public License,
- * version 2 (GPLv2). There is NO WARRANTY for this software, express or
- * implied, including the implied warranties of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
- * along with this software; if not, see
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
- *
- * Red Hat trademarks are not licensed under GPLv2. No permission is
- * granted to use or replicate Red Hat trademarks that are incorporated
- * in this software or its documentation.
- */
-package com.redhat.rhn.frontend.action.systems.test;
-
-import com.redhat.rhn.common.db.datasource.DataResult;
-import com.redhat.rhn.domain.org.OrgFactory;
-import com.redhat.rhn.domain.server.Server;
-import com.redhat.rhn.domain.server.ServerConstants;
-import com.redhat.rhn.domain.server.test.ServerFactoryTest;
-import com.redhat.rhn.frontend.action.systems.SystemSearchSetupAction;
-import com.redhat.rhn.frontend.struts.RequestContext;
-import com.redhat.rhn.frontend.struts.RhnAction;
-import com.redhat.rhn.frontend.struts.RhnHelper;
-import com.redhat.rhn.testing.RhnMockStrutsTestCase;
-
-import org.apache.struts.action.DynaActionForm;
-
-/**
- * SystemSearchActionTest
- * @version $Rev: 1 $
- */
-public class SystemSearchSetupActionTest extends RhnMockStrutsTestCase {
-
- private Server s;
-
- public void setUp() throws Exception {
- super.setUp();
- setRequestPathInfo("/systems/Search");
- user.getOrg().getEntitlements().add(OrgFactory.getEntitlementEnterprise());
- s = ServerFactoryTest.createTestServer(user, true,
- ServerConstants.getServerGroupTypeEnterpriseEntitled());
-
- }
-
- /**
- * This test tests multiple search results. The system search page, if
- * only one result is found, will forward you directly to that
- * system's SDC page instead of showing a list with one member
- * on the system search page. This test is expecting multiple systems to be found
- * and the user to be forwarded to the system search page with a list of systems
- * shown.
- * @throws Exception
- */
- public void skipTestQueryWithResults() throws Exception {
- /**
- * SystemSearch now talks to a Lucene search server. This creates issues
- * for testing...you can't use a test util to create a system put it in the
- * DB and expect the search server to have the data indexed and ready to go.
- *
- * Will be marking this test to be skipped till a suitable test is implemented
- */
- s = ServerFactoryTest.createTestServer(user, true,
- ServerConstants.getServerGroupTypeEnterpriseEntitled());
- addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
- addRequestParameter(SystemSearchSetupAction.SEARCH_STRING, "redhat");
- addRequestParameter(SystemSearchSetupAction.WHERE_TO_SEARCH, "all");
- addRequestParameter(SystemSearchSetupAction.VIEW_MODE,
- "systemsearch_name_and_description");
- actionPerform();
- verifyForward(RhnHelper.DEFAULT_FORWARD);
- DataResult dr = (DataResult) request.getAttribute(RequestContext.PAGE_LIST);
- assertNotNull(dr);
- assertFalse(dr.isEmpty());
- assertNotNull(request.getAttribute(SystemSearchSetupAction.VIEW_MODE));
- assertNotNull(request.getAttribute(SystemSearchSetupAction.WHERE_TO_SEARCH));
- assertNotNull(request.getAttribute(SystemSearchSetupAction.SEARCH_STRING));
- }
-
- /**
- * This test is the case where only one system is found. It verfies
- * that the user is redirected to that system's SDC page.
- * @throws Exception
- */
- public void skipTestQueryWithOneResult() throws Exception {
- /**
- * SystemSearch now talks to a Lucene search server. This creates issues
- * for testing...you can't use a test util to create a system put it in the
- * DB and expect the search server to have the data indexed and ready to go.
- *
- * Will be marking this test to be skipped till a suitable test is implemented
- */
- addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
- addRequestParameter(SystemSearchSetupAction.SEARCH_STRING, s.getName());
- addRequestParameter(SystemSearchSetupAction.WHERE_TO_SEARCH, "all");
- addRequestParameter(SystemSearchSetupAction.VIEW_MODE,
- "systemsearch_name_and_description");
- actionPerform();
- System.err.println("getMockResponse() = " + getMockResponse());
- System.err.println("getMockResponse().getStatusCode() = " +
- getMockResponse().getStatusCode());
- assertTrue(getMockResponse().getStatusCode() == 302);
- }
-
- public void testQueryWithoutResults() throws Exception {
- return;
- }
-
- /**
- * This test verfies that if a bad view mode is passed in by the user,
- * the system search handles and catches any underlying exceptions
- * that might be caused by this, instead of allowing the exception to escalate
- * beyond the SystemSearchAction.
- * @throws Exception
- */
- public void testQueryWithBadParameter() throws Exception {
- addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
- addRequestParameter(SystemSearchSetupAction.SEARCH_STRING, s.getName());
- addRequestParameter(SystemSearchSetupAction.WHERE_TO_SEARCH, "all");
- addRequestParameter(SystemSearchSetupAction.VIEW_MODE,
- "all_your_systems_are_belong_to_us");
- actionPerform();
- }
-
- public void testNoSubmit() throws Exception {
- actionPerform();
- DynaActionForm formIn = (DynaActionForm) getActionForm();
- assertNotNull(formIn.get(SystemSearchSetupAction.WHERE_TO_SEARCH));
- assertNotNull(request.getAttribute(SystemSearchSetupAction.VIEW_MODE));
- }
-
- public void testAlphaSubmitForNumericField() throws Exception {
- addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
- addRequestParameter(SystemSearchSetupAction.SEARCH_STRING, "abc");
- addRequestParameter(SystemSearchSetupAction.WHERE_TO_SEARCH, "all");
- addRequestParameter(SystemSearchSetupAction.VIEW_MODE,
- "systemsearch_cpu_mhz_lt");
- actionPerform();
- verifyActionErrors(new String[] { "systemsearch.errors.numeric" });
- }
-
- public void testSmallAlphaSubmitForNumericField() throws Exception {
- addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
- addRequestParameter(SystemSearchSetupAction.SEARCH_STRING, "a");
- addRequestParameter(SystemSearchSetupAction.WHERE_TO_SEARCH, "all");
- addRequestParameter(SystemSearchSetupAction.VIEW_MODE,
- "systemsearch_cpu_mhz_lt");
- actionPerform();
- verifyActionErrors(new String[] {"systemsearch.errors.numeric"});
- }
-}
-
diff --git a/java/code/src/com/redhat/rhn/frontend/action/test/SearchActionTest.java b/java/code/src/com/redhat/rhn/frontend/action/test/SearchActionTest.java
index 6e7cd8d..5cc6dd2 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/test/SearchActionTest.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/test/SearchActionTest.java
@@ -36,15 +36,15 @@ public class SearchActionTest extends RhnMockStrutsTestCase {
addRequestParameter("search_string", "test search");
addRequestParameter("search_type", "systems");
actionPerform();
- assertTrue(getMockResponse().getStatusCode() == 302);
+ verifyForward("systems");
}
public void testErrataRedirect() throws Exception {
addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
addRequestParameter("search_string", "test search");
- addRequestParameter("search_type", "packages");
+ addRequestParameter("search_type", "errata");
actionPerform();
- assertTrue(getMockResponse().getStatusCode() == 302);
+ verifyForward("errata");
}
public void testPackageRedirect() throws Exception {
@@ -52,7 +52,15 @@ public class SearchActionTest extends RhnMockStrutsTestCase {
addRequestParameter("search_string", "test search");
addRequestParameter("search_type", "packages");
actionPerform();
- assertTrue(getMockResponse().getStatusCode() == 302);
+ verifyForward("packages");
+ }
+
+ public void testDocRedirect() throws Exception {
+ addRequestParameter(RhnAction.SUBMITTED, Boolean.TRUE.toString());
+ addRequestParameter("search_string", "test search");
+ addRequestParameter("search_type", "docs");
+ actionPerform();
+ verifyForward("docs");
}
public void testFaultySubmit() throws Exception {
diff --git a/java/code/src/com/redhat/rhn/frontend/security/PxtAuthenticationService.java b/java/code/src/com/redhat/rhn/frontend/security/PxtAuthenticationService.java
index 610e2ed..b6aaf7b 100644
--- a/java/code/src/com/redhat/rhn/frontend/security/PxtAuthenticationService.java
+++ b/java/code/src/com/redhat/rhn/frontend/security/PxtAuthenticationService.java
@@ -66,6 +66,8 @@ public class PxtAuthenticationService extends BaseAuthenticationService {
set = new TreeSet(set);
set.add("/rhn/common/DownloadFile");
+ // search (safe to be unprotected, since it has no modifying side-effects)
+ set.add("/rhn/Search.do");
POST_UNPROTECTED_URIS = UnmodifiableSet.decorate(set);
diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/packages/search/PackagesSearchHandler.java b/java/code/src/com/redhat/rhn/frontend/xmlrpc/packages/search/PackagesSearchHandler.java
index bf4282f..c4e06ef 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/packages/search/PackagesSearchHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/packages/search/PackagesSearchHandler.java
@@ -14,12 +14,25 @@
*/
package com.redhat.rhn.frontend.xmlrpc.packages.search;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+
+import redstone.xmlrpc.XmlRpcFault;
+
import com.redhat.rhn.FaultException;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.session.WebSession;
import com.redhat.rhn.domain.token.ActivationKey;
import com.redhat.rhn.domain.token.TokenPackage;
import com.redhat.rhn.domain.user.User;
+import com.redhat.rhn.frontend.action.BaseSearchAction;
import com.redhat.rhn.frontend.action.channel.PackageSearchHelper;
import com.redhat.rhn.frontend.dto.PackageDto;
import com.redhat.rhn.frontend.dto.PackageOverview;
@@ -32,18 +45,6 @@ import com.redhat.rhn.manager.channel.ChannelManager;
import com.redhat.rhn.manager.session.SessionManager;
import com.redhat.rhn.manager.token.ActivationKeyManager;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import redstone.xmlrpc.XmlRpcFault;
-
/**
* PackagesSearchHandler
@@ -75,7 +76,7 @@ public class PackagesSearchHandler extends BaseHandler {
* */
public List<PackageOverview> name(String sessionKey, String name)
throws FaultException {
- return performSearch(sessionKey, name, PackageSearchHelper.OPT_NAME_ONLY);
+ return performSearch(sessionKey, name, BaseSearchAction.OPT_NAME_ONLY);
}
/**
@@ -98,7 +99,7 @@ public class PackagesSearchHandler extends BaseHandler {
* */
public List<PackageOverview> nameAndDescription(String sessionKey, String query)
throws FaultException {
- return performSearch(sessionKey, query, PackageSearchHelper.OPT_NAME_AND_DESC);
+ return performSearch(sessionKey, query, BaseSearchAction.OPT_NAME_AND_DESC);
}
/**
@@ -121,7 +122,7 @@ public class PackagesSearchHandler extends BaseHandler {
* */
public List<PackageOverview> nameAndSummary(String sessionKey, String query)
throws FaultException {
- return performSearch(sessionKey, query, PackageSearchHelper.OPT_NAME_AND_SUMMARY);
+ return performSearch(sessionKey, query, BaseSearchAction.OPT_NAME_AND_SUMMARY);
}
/**
* Advanced method to search lucene indexes with a passed in query written in Lucene
@@ -156,7 +157,7 @@ public class PackagesSearchHandler extends BaseHandler {
public List<PackageOverview> advanced(String sessionKey, String luceneQuery)
throws FaultException {
- return performSearch(sessionKey, luceneQuery, PackageSearchHelper.OPT_FREE_FORM);
+ return performSearch(sessionKey, luceneQuery, BaseSearchAction.OPT_FREE_FORM);
}
@@ -202,7 +203,7 @@ public class PackagesSearchHandler extends BaseHandler {
throw new InvalidChannelLabelException();
}
List<PackageOverview> pkgs = performSearch(sessionKey, luceneQuery,
- PackageSearchHelper.OPT_FREE_FORM);
+ BaseSearchAction.OPT_FREE_FORM);
WebSession session = SessionManager.loadSession(sessionKey);
User user = session.getUser();
Channel channel = ChannelManager.lookupByLabelAndUser(channelLabel, user);
@@ -266,7 +267,7 @@ public class PackagesSearchHandler extends BaseHandler {
throw new MethodInvalidParamException();
}
List<PackageOverview> pkgs = performSearch(sessionKey, luceneQuery,
- PackageSearchHelper.OPT_FREE_FORM);
+ BaseSearchAction.OPT_FREE_FORM);
WebSession session = SessionManager.loadSession(sessionKey);
User user = session.getUser();
// Lookup what packages are in the activation key and filter
diff --git a/java/code/webapp/WEB-INF/includes/header.jsp b/java/code/webapp/WEB-INF/includes/header.jsp
index 824d83b..020f159 100644
--- a/java/code/webapp/WEB-INF/includes/header.jsp
+++ b/java/code/webapp/WEB-INF/includes/header.jsp
@@ -42,7 +42,9 @@
</li>
</ul>
- <form name="form1" class="form-inline hidden-xs" role="form" action="/rhn/Search.do" method="get">
+ <form name="form1" class="form-inline hidden-xs" role="form" action="/rhn/Search.do">
+ <rhn:csrf />
+ <rhn:submitted />
<div class="form-group">
<select name="search_type" class="form-control input-sm">
<rhn:require acl="org_entitlement(sw_mgr_enterprise)">
@@ -57,7 +59,6 @@
<input type="search" class="form-control input-sm" name="search_string" maxlength="40" size="20" accesskey="4" autofocus="autofocus" placeholder="<bean:message key='button.search'/>" />
</div>
<div class="form-group">
- <input type="hidden" name="submitted" value="true" />
<button type="submit" class="btn btn-info input-sm" id="search-btn">
<rhn:icon type="header-search" />
</button>
diff --git a/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp b/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
index 7d02037..306f47f 100644
--- a/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
+++ b/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
@@ -112,7 +112,7 @@
</td>
</tr>
</table>
- <input type="hidden" name="submitted" value="true"/>
+ <html:hidden property="submitted" value="true"/>
</html:form>
</div>
</div>
@@ -140,24 +140,24 @@
</c:choose>
<!-- there are two forms here, need to keep the formvars around for pagination -->
- <input type="hidden" name="submitted" value="true"/>
- <input type="hidden" name="search_string" value="${search_string}"/>
- <input type="hidden" name="whereToSearch" value="${param.whereToSearch}"/>
- <input type="hidden" name="show_as" value="${param.show_as}"/>
- <input type="hidden" name="result_filter" value="${param.result_filter}"/>
- <input type="hidden" name="optionScanDateSearch" value="${param.optionScanDateSearch}"/>
- <input type="hidden" name="start_year" value="${param.start_year}"/>
- <input type="hidden" name="start_month" value="${param.start_month}"/>
- <input type="hidden" name="start_day" value="${param.start_day}"/>
- <input type="hidden" name="start_hour" value="${param.start_hour}"/>
- <input type="hidden" name="start_minute" value="${param.start_minute}"/>
- <input type="hidden" name="start_am_pm" value="${param.start_am_pm}"/>
- <input type="hidden" name="end_year" value="${param.end_year}"/>
- <input type="hidden" name="end_month" value="${param.end_month}"/>
- <input type="hidden" name="end_day" value="${param.end_day}"/>
- <input type="hidden" name="end_hour" value="${param.end_hour}"/>
- <input type="hidden" name="end_minute" value="${param.end_minute}"/>
- <input type="hidden" name="end_am_pm" value="${param.end_am_pm}"/>
+ <html:hidden property="submitted" value="true"/>
+ <html:hidden property="search_string" value="${search_string}"/>
+ <html:hidden property="whereToSearch" value="${param.whereToSearch}"/>
+ <html:hidden property="show_as" value="${param.show_as}"/>
+ <html:hidden property="result_filter" value="${param.result_filter}"/>
+ <html:hidden property="optionScanDateSearch" value="${param.optionScanDateSearch}"/>
+ <html:hidden property="start_year" value="${param.start_year}"/>
+ <html:hidden property="start_month" value="${param.start_month}"/>
+ <html:hidden property="start_day" value="${param.start_day}"/>
+ <html:hidden property="start_hour" value="${param.start_hour}"/>
+ <html:hidden property="start_minute" value="${param.start_minute}"/>
+ <html:hidden property="start_am_pm" value="${param.start_am_pm}"/>
+ <html:hidden property="end_year" value="${param.end_year}"/>
+ <html:hidden property="end_month" value="${param.end_month}"/>
+ <html:hidden property="end_day" value="${param.end_day}"/>
+ <html:hidden property="end_hour" value="${param.end_hour}"/>
+ <html:hidden property="end_minute" value="${param.end_minute}"/>
+ <html:hidden property="end_am_pm" value="${param.end_am_pm}"/>
</rl:listset>
</c:if>
</body>
diff --git a/java/code/webapp/WEB-INF/pages/channel/packagesearch.jsp b/java/code/webapp/WEB-INF/pages/channel/packagesearch.jsp
index 6a1e9cb..c7e5a26 100644
--- a/java/code/webapp/WEB-INF/pages/channel/packagesearch.jsp
+++ b/java/code/webapp/WEB-INF/pages/channel/packagesearch.jsp
@@ -112,7 +112,6 @@
</label>
</div>
</div>
- <input type="hidden" name="submitted" value="true" />
</html:form>
<c:if test="${search_string != null && search_string != ''}">
@@ -151,14 +150,13 @@
name="searchResults"
exportColumns="packageName,summary"/>
<!-- there are two forms here, need to keep the formvars around for pagination -->
- <input type="hidden" name="submitted" value="true" />
<html:hidden property="search_string" name="search_string" value="${search_string}" />
- <input type="hidden" name="view_mode" value="${view_mode}" />
- <input type="hidden" name="whereCriteria" value="${whereCriteria}" />
- <input type="hidden" name="channel_filter" value="${channel_filter}" />
- <input type="hidden" name="fineGrained" value="${fineGrained}" />
+ <html:hidden property="view_mode" value="${view_mode}" />
+ <html:hidden property="whereCriteria" value="${whereCriteria}" />
+ <html:hidden property="channel_filter" value="${channel_filter}" />
+ <html:hidden property="fineGrained" value="${fineGrained}" />
<c:forEach items="${requestScope.channel_arch}" var="item">
- <input type="hidden" name="channel_arch" value="${item}" />
+ <html:hidden property="channel_arch" value="${item}" />
</c:forEach>
</rl:listset>
</c:if>
diff --git a/java/code/webapp/WEB-INF/pages/errata/erratasearch.jsp b/java/code/webapp/WEB-INF/pages/errata/erratasearch.jsp
index e2f932e..725dc7b 100644
--- a/java/code/webapp/WEB-INF/pages/errata/erratasearch.jsp
+++ b/java/code/webapp/WEB-INF/pages/errata/erratasearch.jsp
@@ -150,7 +150,7 @@
</table>
</div> <!-- search choices group -->
</div> <!-- search choices -->
- <input type="hidden" name="submitted" value="true" />
+ <html:hidden property="submitted" value="true" />
</html:form>
<c:if test="${(search_string != null && search_string != '') || param.optionIssueDateSearch != null }">
@@ -194,14 +194,14 @@
<c:when test="${view_mode == 'errata_search_by_advisory'}">
<%--
If this is a errata_search_by_advisory, we display the synopsis
- column, but call it Errata Advisory
- --%>
- <rl:column bound="false" sortable="true" sortattr="advisorySynopsis"
- headerkey="erratasearch.jsp.errata_advisory">
+ column, but call it Errata Advisory
+ --%>
+ <rl:column bound="false" sortable="true" sortattr="advisorySynopsis"
+ headerkey="erratasearch.jsp.errata_advisory">
<rhn:highlight tag="strong" text="${search_string}">
${current.advisorySynopsis}
</rhn:highlight>
- </rl:column>
+ </rl:column>
</c:when>
<c:when test="${view_mode == 'errata_search_by_package_name'}">
<%--
@@ -256,27 +256,26 @@
name="searchResults"
exportColumns="advisoryType,advisoryName,advisorySynopsis,issueDate"/>
- <!-- there are two forms here, need to keep the formvars around for pagination -->
- <input type="hidden" name="submitted" value="true" />
- <html:hidden property="search_string" name="search_string" value="${search_string}" />
- <input type="hidden" name="view_mode" value="${view_mode}" />
- <input type="hidden" name="errata_type_bug" value="<%= request.getParameter("errata_type_bug") %>" />
- <input type="hidden" name="errata_type_security" value="<%= request.getParameter("errata_type_security") %>" />
- <input type="hidden" name="errata_type_enhancement" value="<%= request.getParameter("errata_type_enhancement") %>" />
- <input type="hidden" name="optionIssueDateSearch" value="<%= request.getParameter("optionIssueDateSearch") %>" />
- <input type="hidden" name="start_year" value="<%= request.getParameter("start_year") %>" />
- <input type="hidden" name="start_month" value="<%= request.getParameter("start_month") %>" />
- <input type="hidden" name="start_day" value="<%= request.getParameter("start_day") %>" />
- <input type="hidden" name="start_hour" value="<%= request.getParameter("start_hour") %>" />
- <input type="hidden" name="start_minute" value="<%= request.getParameter("start_minute") %>" />
- <input type="hidden" name="start_am_pm" value="<%= request.getParameter("start_am_pm") %>" />
- <input type="hidden" name="end_year" value="<%= request.getParameter("end_year") %>" />
- <input type="hidden" name="end_month" value="<%= request.getParameter("end_month") %>" />
- <input type="hidden" name="end_day" value="<%= request.getParameter("end_day") %>" />
- <input type="hidden" name="end_hour" value="<%= request.getParameter("end_hour") %>" />
- <input type="hidden" name="end_minute" value="<%= request.getParameter("end_minute") %>" />
- <input type="hidden" name="end_am_pm" value="<%= request.getParameter("end_am_pm") %>" />
- <input type="hidden" name="fineGrained" value="${fineGrained}" />
+ <!-- there are two forms here, need to keep the formvars around for pagination-->
+ <html:hidden property="search_string" value="${search_string}" />
+ <html:hidden property="view_mode" value="${view_mode}" />
+ <html:hidden property="errata_type_bug" value="${errata_type_bug}" />
+ <html:hidden property="errata_type_security" value="${errata_type_security}" />
+ <html:hidden property="errata_type_enhancement" value="${errata_type_enhancement}" />
+ <html:hidden property="optionIssueDateSearch" value="${optionIssueDateSearch}" />
+ <html:hidden property="start_year" value="${start_year}" />
+ <html:hidden property="start_month" value="${start_month}" />
+ <html:hidden property="start_day" value="${start_day}" />
+ <html:hidden property="start_hour" value="${start_hour}" />
+ <html:hidden property="start_minute" value="${start_minute}" />
+ <html:hidden property="start_am_pm" value="${start_am_pm}" />
+ <html:hidden property="end_year" value="${end_year}" />
+ <html:hidden property="end_month" value="${end_month}" />
+ <html:hidden property="end_day" value="${end_day}" />
+ <html:hidden property="end_hour" value="${end_hour}" />
+ <html:hidden property="end_minute" value="${end_minute}" />
+ <html:hidden property="end_am_pm" value="${end_am_pm}" />
+ <html:hidden property="fineGrained" value="${fineGrained}" />
</rl:listset>
diff --git a/java/code/webapp/WEB-INF/pages/help/docsearch.jsp b/java/code/webapp/WEB-INF/pages/help/docsearch.jsp
index c52041a..20d9e28 100644
--- a/java/code/webapp/WEB-INF/pages/help/docsearch.jsp
+++ b/java/code/webapp/WEB-INF/pages/help/docsearch.jsp
@@ -61,7 +61,7 @@
</div>
</div>
- <input type="hidden" name="submitted" value="true" />
+ <html:hidden property="submitted" value="true" />
</html:form>
<c:if test="${search_string != null && search_string != ''}">
@@ -75,11 +75,11 @@
emptykey="docsearch.jsp.nopages" width="100%">
<rl:decorator name="PageSizeDecorator"/>
<rl:column bound="false" sortable="false" headerkey="docsearch.jsp.pagetitle">
- <a href="${current.url}">
- <rhn:highlight tag="strong" text="${search_string}">
- ${current.title}
- </rhn:highlight>
- </a>
+ <a href="${current.url}">
+ <rhn:highlight tag="strong" text="${search_string}">
+ ${current.title}
+ </rhn:highlight>
+ </a>
</rl:column>
<rl:column bound="false" sortable="false" headerkey="docsearch.jsp.summary">
<a href="${current.url}">
@@ -91,10 +91,10 @@
</rl:list>
<!-- there are two forms here, need to keep the formvars around for pagination -->
- <input type="hidden" name="submitted" value="true" />
+ <html:hidden property="submitted" value="true" />
<html:hidden property="search_string" name="search_string" value="${search_string}" />
- <input type="hidden" name="view_mode" value="${view_mode}" />
- <input type="hidden" name="relevant" value="${relevant}" />
+ <html:hidden property="view_mode" value="${view_mode}" />
+ <html:hidden property="relevant" value="${relevant}" />
</rl:listset>
diff --git a/java/code/webapp/WEB-INF/pages/systems/systemsearch.jsp b/java/code/webapp/WEB-INF/pages/systems/systemsearch.jsp
index ec6da4d..9ea85cd 100644
--- a/java/code/webapp/WEB-INF/pages/systems/systemsearch.jsp
+++ b/java/code/webapp/WEB-INF/pages/systems/systemsearch.jsp
@@ -92,19 +92,19 @@
</html:checkbox>
</div>
</div>
- <input type="hidden" name="submitted" value="true"/>
+ <html:hidden property="submitted" value="true"/>
</html:form>
<c:if test="${search_string != null && search_string != ''}">
<hr/>
<rl:listset name="searchSet">
<rhn:csrf />
- <input type="hidden" name="submitted" value="true"/>
+ <html:hidden property="submitted" value="true"/>
<html:hidden property="search_string" name="search_string" value="${search_string}" />
- <input type="hidden" name="view_mode" value="${view_mode}" />
- <input type="hidden" name="whereToSearch" value="${whereToSearch}" />
- <input type="hidden" name="invert" value="${invert}" />
- <input type="hidden" name="fineGrained" value="${fineGrained}" />
+ <html:hidden property="view_mode" value="${view_mode}" />
+ <html:hidden property="whereToSearch" value="${whereToSearch}" />
+ <html:hidden property="invert" value="${invert}" />
+ <html:hidden property="fineGrained" value="${fineGrained}" />
<rl:list name="pageList" dataset="searchResults"
emptykey="systemsearch.jsp.noresults" width="100%"
diff --git a/java/code/webapp/WEB-INF/struts-config.xml b/java/code/webapp/WEB-INF/struts-config.xml
index f5da3e0..1c42f90 100644
--- a/java/code/webapp/WEB-INF/struts-config.xml
+++ b/java/code/webapp/WEB-INF/struts-config.xml
@@ -210,15 +210,14 @@
<form-property name="filter_value" type="java.lang.String"/>
<form-property name="prev_filter_value" type="java.lang.String"/>
</form-bean>
- <form-bean name="auditSearchForm"
+ <form-bean name="combinedSearchForm"
type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
- <form-property name="machine" type="java.lang.String" />
- <form-property name="startMilli" type="java.lang.Long" />
- <form-property name="endMilli" type="java.lang.Long" />
- <form-property name="autypes" type="java.lang.String[]" />
- <form-property name="seqno" type="java.lang.Long" />
- <form-property name="unreviewable" type="java.lang.Boolean" />
- <form-property name="parseDates" type="java.lang.Boolean" />
+ <form-property name="no_scrub" type="java.lang.String" initial="search_string"/>
+ <!-- Multiple users -->
+ <form-property name="search_string" type="java.lang.String"/>
+ <form-property name="submitted" type="java.lang.Boolean" />
+ <form-property name="view_mode" type="java.lang.String" />
+ <form-property name="fineGrained" type="java.lang.Boolean" />
<form-property name="start_year" type="java.lang.Integer" />
<form-property name="start_month" type="java.lang.Integer" />
<form-property name="start_day" type="java.lang.Integer" />
@@ -231,56 +230,42 @@
<form-property name="end_hour" type="java.lang.Integer" />
<form-property name="end_minute" type="java.lang.Integer" />
<form-property name="end_am_pm" type="java.lang.Integer" />
- </form-bean>
- <form-bean name="xccdfSearchForm"
- type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
- <form-property name="search_string" type="java.lang.String"/>
- <form-property name="whereToSearch" type="java.lang.String"/>
- <form-property name="submitted" type="java.lang.Boolean" />
+ <form-property name="whereToSearch" type="java.lang.String" />
+ <!-- Base search form -->
+ <form-property name="search_type" type="java.lang.String" />
+ <!-- Audit -->
+ <form-property name="machine" type="java.lang.String" />
+ <form-property name="startMilli" type="java.lang.Long" />
+ <form-property name="endMilli" type="java.lang.Long" />
+ <form-property name="autypes" type="java.lang.String[]" />
+ <form-property name="seqno" type="java.lang.Long" />
+ <form-property name="unreviewable" type="java.lang.Boolean" />
+ <form-property name="parseDates" type="java.lang.Boolean" />
+ <!-- XCCDF -->
<form-property name="result_filter" type="java.lang.String"/>
<form-property name="show_as" type="java.lang.String"/>
<form-property name="optionScanDateSearch" type="java.lang.Boolean" />
- <form-property name="start_year" type="java.lang.Integer"/>
- <form-property name="start_month" type="java.lang.Integer"/>
- <form-property name="start_day" type="java.lang.Integer"/>
- <form-property name="start_hour" type="java.lang.Integer"/>
- <form-property name="start_minute" type="java.lang.Integer"/>
- <form-property name="start_am_pm" type="java.lang.Integer"/>
- <form-property name="end_year" type="java.lang.Integer"/>
- <form-property name="end_month" type="java.lang.Integer"/>
- <form-property name="end_day" type="java.lang.Integer"/>
- <form-property name="end_hour" type="java.lang.Integer"/>
- <form-property name="end_minute" type="java.lang.Integer"/>
- <form-property name="end_am_pm" type="java.lang.Integer"/>
- </form-bean>
- <form-bean name="xccdfDiff"
- type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
- <form-property name="first" type="java.lang.Long"/>
- <form-property name="second" type="java.lang.Long"/>
- </form-bean>
- <form-bean name="errataSearchForm"
- type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
- <form-property name="search_string" type="java.lang.String"/>
- <form-property name="view_mode" type="java.lang.String"/>
- <form-property name="submitted" type="java.lang.Boolean" />
+ <!-- Errata -->
<form-property name="errata_type_bug" type="java.lang.Boolean" />
<form-property name="errata_type_security" type="java.lang.Boolean" />
<form-property name="errata_type_enhancement" type="java.lang.Boolean"/>
<form-property name="optionIssueDateSearch" type="java.lang.Boolean" />
- <form-property name="start_year" type="java.lang.Integer"/>
- <form-property name="start_month" type="java.lang.Integer"/>
- <form-property name="start_day" type="java.lang.Integer"/>
- <form-property name="start_hour" type="java.lang.Integer"/>
- <form-property name="start_minute" type="java.lang.Integer"/>
- <form-property name="start_am_pm" type="java.lang.Integer"/>
- <form-property name="end_year" type="java.lang.Integer"/>
- <form-property name="end_month" type="java.lang.Integer"/>
- <form-property name="end_day" type="java.lang.Integer"/>
- <form-property name="end_hour" type="java.lang.Integer"/>
- <form-property name="end_minute" type="java.lang.Integer"/>
- <form-property name="end_am_pm" type="java.lang.Integer"/>
- <form-property name="fineGrained" type="java.lang.Boolean"/>
+ <!-- Package -->
+ <form-property name="channel_arch" type="java.lang.String[]"/>
+ <form-property name="channel_filter" type="java.lang.String"/>
+ <form-property name="filter_value" type="java.lang.String"/>
+ <form-property name="prev_filter_value" type="java.lang.String"/>
+ <form-property name="relevant" type="java.lang.String" />
+ <form-property name="whereCriteria" type="java.lang.String" />
+ <!-- System -->
+ <form-property name="invert" type="java.lang.Boolean" />
+ <!-- Docs -->
+ </form-bean>
+ <form-bean name="xccdfDiff"
+ type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
+ <form-property name="first" type="java.lang.Long"/>
+ <form-property name="second" type="java.lang.Long"/>
</form-bean>
<form-bean name="errataCreateForm"
type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
@@ -333,44 +318,6 @@
type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
<form-property name="submitted" type="java.lang.Boolean"/>
</form-bean>
- <form-bean name="packageSearchForm"
- type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
- <form-property name="search_string" type="java.lang.String"/>
- <form-property name="view_mode" type="java.lang.String"/>
- <form-property name="channel_arch" type="java.lang.String[]"/>
- <form-property name="channel_filter" type="java.lang.String"/>
- <form-property name="filter_value" type="java.lang.String"/>
- <form-property name="prev_filter_value" type="java.lang.String"/>
- <form-property name="relevant" type="java.lang.String" />
- <form-property name="fineGrained" type="java.lang.Boolean" />
- <form-property name="submitted" type="java.lang.Boolean" />
- </form-bean>
-
- <form-bean name="systemSearchForm"
- type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
- <form-property name="search_string" type="java.lang.String" />
- <form-property name="view_mode" type="java.lang.String" />
- <form-property name="whereToSearch" type="java.lang.String" />
- <form-property name="invert" type="java.lang.Boolean" />
- <form-property name="fineGrained" type="java.lang.Boolean" />
- <form-property name="submitted" type="java.lang.Boolean" />
- <form-property name="no_scrub" type="java.lang.String"
- initial="search_string"/>
- </form-bean>
-
- <form-bean name="docsSearchForm"
- type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
- <form-property name="search_string" type="java.lang.String" />
- <form-property name="view_mode" type="java.lang.String" />
- <form-property name="submitted" type="java.lang.Boolean" />
- </form-bean>
-
- <form-bean name="searchForm"
- type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
- <form-property name="search_type" type="java.lang.String" />
- <form-property name="search_string" type="java.lang.String" />
- <form-property name="submitted" type="java.lang.Boolean" />
- </form-bean>
<form-bean name="probeDetailsForm"
type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
@@ -734,8 +681,8 @@
<form-property name="submitted" type="java.lang.Boolean"/>
<form-property name="no_scrub" type="java.lang.String" initial="contents"/>
</form-bean>
-
-
+
+
<form-bean name="kickstartScriptOrderForm"
type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
<form-property name="preScripts" type="java.util.ArrayList"/>
@@ -1490,16 +1437,16 @@
</action>
<action path="/Search"
- name="searchForm"
+ name="combinedSearchForm"
scope="request"
type="com.redhat.rhn.frontend.action.SearchAction"
className="com.redhat.rhn.frontend.struts.RhnActionMapping">
- <forward name="default" path="/YourRhn.do" />
+ <forward name="default" path="/YourRhn.do"/>
<forward name="error" path="/YourRhn.do" />
- <forward name="systems" path="/systems/Search.do" />
- <forward name="errata" path="/errata/Search.do" />
- <forward name="packages" path="/channels/software/Search.do" />
- <forward name="docs" path="/help/Search.do" />
+ <forward name="systems" path="/systems/Search.do" redirect="true" />
+ <forward name="errata" path="/errata/Search.do" redirect="true" />
+ <forward name="packages" path="/channels/software/Search.do" redirect="true" />
+ <forward name="docs" path="/help/Search.do" redirect="true" />
</action>
@@ -2075,7 +2022,7 @@
<!-- ===== AUDIT ===== -->
<action path="/audit/Search"
- name="auditSearchForm"
+ name="combinedSearchForm"
scope="request"
input="/WEB-INF/pages/audit/auditsearch.jsp"
type="com.redhat.rhn.frontend.action.audit.AuditSearchAction"
@@ -2107,12 +2054,11 @@
</action>
<action path="/audit/scap/Search"
- name="xccdfSearchForm"
+ name="combinedSearchForm"
scope="request"
input="/WEB-INF/pages/audit/scap/xccdfsearch.jsp"
type="com.redhat.rhn.frontend.action.audit.scap.XccdfSearchAction">
<forward name="default" path="/WEB-INF/pages/audit/scap/xccdfsearch.jsp"/>
- <forward name="success" path="/audit/scap/Search.do" redirect="true" />
</action>
<action path="/audit/scap/Diff"
@@ -2134,13 +2080,12 @@
<!-- ===== ERRATA ===== -->
<action path="/errata/Search"
- name="errataSearchForm"
+ name="combinedSearchForm"
scope="request"
input="/WEB-INF/pages/errata/erratasearch.jsp"
type="com.redhat.rhn.frontend.action.errata.ErrataSearchAction"
className="com.redhat.rhn.frontend.struts.RhnActionMapping">
<forward name="default" path="/WEB-INF/pages/errata/erratasearch.jsp"/>
- <forward name="success" path="/errata/Search.do" redirect="true" />
</action>
<action path="/errata/AllErrata"
@@ -2739,13 +2684,11 @@
<action path="/channels/software/Search"
scope="request"
- name="packageSearchForm"
+ name="combinedSearchForm"
input="/WEB-INF/pages/channel/packagesearch.jsp"
type="com.redhat.rhn.frontend.action.channel.PackageSearchAction">
<forward name="default"
path="/WEB-INF/pages/channel/packagesearch.jsp"/>
- <forward name="success"
- path="/channels/software/Search.do" redirect="true"/>
</action>
<action path="/software/packages/NameOverview"
@@ -3065,18 +3008,17 @@
<action path="/systems/Search"
- name="systemSearchForm"
+ name="combinedSearchForm"
scope="request"
input="/WEB-INF/pages/systems/systemsearch.jsp"
- type="com.redhat.rhn.frontend.action.systems.SystemSearchSetupAction"
+ type="com.redhat.rhn.frontend.action.systems.SystemSearchAction"
className="com.redhat.rhn.frontend.struts.RhnActionMapping">
<set-property property="acls" value="org_entitlement(sw_mgr_enterprise)"/>
<forward name="default"
path="/WEB-INF/pages/systems/systemsearch.jsp"/>
- <forward name="success"
- path="/systems/Search.do" redirect="true"/>
- <forward name="error"
- path="/WEB-INF/pages/systems/systemsearch.jsp"/>
+ <forward name="single"
+ path="/systems/details/Overview.do"
+ redirect="true" />
</action>
<action path="/systems/WorkWithGroup"
@@ -8316,14 +8258,12 @@
<action path="/help/Search"
scope="request"
- name="docsSearchForm"
+ name="combinedSearchForm"
input="/WEB-INF/pages/help/docsearch.jsp"
type="com.redhat.rhn.frontend.action.help.DocSearchSetupAction"
className="com.redhat.rhn.frontend.struts.RhnActionMapping">
- <forward name="default"
- path="/WEB-INF/pages/help/docsearch.jsp"/>
- <forward name="success"
- path="/help/Search.do" redirect="true"/>
+ <forward name="default" path="/WEB-INF/pages/help/docsearch.jsp" />
+ <forward name="success" path="/help/Search.do" redirect="true"/>
</action>
<action path="/help/Chat"
commit cfda69feffd04cb3280ed4c87e420ef446777839
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Thu Nov 14 10:43:48 2013 -0500
1063915, CVE-2013-4415 - Fix XSS in new-list-tag by escaping _LABEL_SELECTED
diff --git a/java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/PageSizeDecorator.java b/java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/PageSizeDecorator.java
index 08d4425..2991385 100644
--- a/java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/PageSizeDecorator.java
+++ b/java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/PageSizeDecorator.java
@@ -21,6 +21,7 @@ import java.util.List;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
+import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
@@ -135,8 +136,8 @@ public class PageSizeDecorator extends BaseListDecorator {
input.setAttribute("type", "hidden");
input.setAttribute("id", makeSelectionId(listName));
input.setAttribute("name", makeSelectionLabel(listName));
- input.setAttribute("value", pageContext.getRequest().getParameter
- (makeSelectionLabel(listName)));
+ input.setAttribute("value", StringEscapeUtils.escapeHtml(pageContext
+ .getRequest().getParameter(makeSelectionLabel(listName))));
stringBuild.append(input.render());
ListTagUtil.write(pageContext, stringBuild.toString());
}
@@ -205,7 +206,7 @@ public class PageSizeDecorator extends BaseListDecorator {
catch (NumberFormatException nfe) {
logger.warn("Number format exception encountered while parsing " +
ConfigDefaults.PAGE_SIZES + "=" + pageSizes);
- return Collections.EMPTY_LIST;
+ return Collections.emptyList();
}
}
}
commit 431663ba6b2d1631afc4bca018c31f1661fe1263
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Thu Oct 17 14:57:33 2013 -0400
1063915, CVE-2013-1871, Fix XSS in edit-address JSPs
diff --git a/java/code/webapp/WEB-INF/pages/admin/users/edit_address.jsp b/java/code/webapp/WEB-INF/pages/admin/users/edit_address.jsp
index 3e0d905..5475b12 100644
--- a/java/code/webapp/WEB-INF/pages/admin/users/edit_address.jsp
+++ b/java/code/webapp/WEB-INF/pages/admin/users/edit_address.jsp
@@ -7,7 +7,10 @@
<html>
<body>
<%@ include file="/WEB-INF/pages/common/fragments/user/user-header.jspf" %>
- <h2><bean:message key="message.Update"/> ${editAddressForm.map.typedisplay}</h2>
+ <h2>
+ <bean:message key="message.Update"/>
+ <c:out value="${editAddressForm.map.typedisplay}" escapeXml="true" />
+ </h2>
<p><bean:message key="edit_address.jsp.summary"/></p>
<html:form action="/users/EditAddressSubmit" styleClass="form-horizontal">
<rhn:csrf />
diff --git a/java/code/webapp/WEB-INF/pages/user/edit/your_edit_address.jsp b/java/code/webapp/WEB-INF/pages/user/edit/your_edit_address.jsp
index 7143b7f..9cb5b05 100644
--- a/java/code/webapp/WEB-INF/pages/user/edit/your_edit_address.jsp
+++ b/java/code/webapp/WEB-INF/pages/user/edit/your_edit_address.jsp
@@ -12,7 +12,7 @@
<div class="panel panel-default">
<div class="panel-heading">
<h4>
- ${editAddressForm.map.typedisplay}
+ <c:out value="${editAddressForm.map.typedisplay}" escapeXml="true" />
<bean:message key="your_edit_address_record.displayname"/>
</h4>
</div>
commit 6727a332466ef4339747b35fe5a639afefb8e584
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Wed Feb 5 13:44:02 2014 -0500
1063915, CVE-2013-1869, close header-injection hole
diff --git a/java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java b/java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java
index 7837e3b..c30262b 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java
@@ -33,6 +33,9 @@ import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
/**
* OverviewAction
* @version $Rev$
@@ -45,7 +48,8 @@ public class OverviewAction extends RhnListAction {
private static final String[] ALLOWED_REDIRECTS = { "/rhn/", "/network/" };
//
- // Only follow redirects if they're "inside" the app
+ // Only follow redirects if they're "inside" the app (close open-redirecting)
+ // Make sure to ignore anything after a <CR><LF> in the string (close header-injection)
//
private String getLegalReturnUrl(String proposedRedirect) {
if (proposedRedirect == null) {
@@ -54,7 +58,10 @@ public class OverviewAction extends RhnListAction {
for (String dest : ALLOWED_REDIRECTS) {
if (proposedRedirect.startsWith(dest)) {
- return proposedRedirect;
+ // Punt if any control-characters found
+ Matcher m = Pattern.compile("\\p{Cntrl}").matcher(proposedRedirect);
+ boolean ctrlFound = m.find();
+ return ctrlFound ? null : proposedRedirect;
}
}
return null;
commit c41c87a9dc9dac771eb761dd63ada05b2f9104f9
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Tue Nov 5 10:57:13 2013 -0500
1063915, CVE-2010-2236, Cleanse backticks from monitoring-probes where appropriate
diff --git a/java/code/src/com/redhat/rhn/domain/monitoring/command/CommandParameter.java b/java/code/src/com/redhat/rhn/domain/monitoring/command/CommandParameter.java
index 188a90c..f8b453c 100644
--- a/java/code/src/com/redhat/rhn/domain/monitoring/command/CommandParameter.java
+++ b/java/code/src/com/redhat/rhn/domain/monitoring/command/CommandParameter.java
@@ -26,6 +26,7 @@ import java.util.Date;
* @version $Rev: 1 $
*/
public class CommandParameter implements Serializable {
+ private static final String[] BACKTICK_ALLOWED = {"command"};
private Command command;
private String paramName;
@@ -313,6 +314,25 @@ public class CommandParameter implements Serializable {
return validator;
}
+ /**
+ * As a general rules, backticks (`) are not allowed in probe-values,
+ * in order to decrease the possible attack-surface of the monitoring
+ * subsystem.
+ *
+ * For some probes' function, however, they *must* be allowed.
+ *
+ * @return 'true' if it's ok for a value to contain backticks,
+ * false otherwise.
+ */
+ public boolean isBackTickAllowed() {
+ for (String s : BACKTICK_ALLOWED) {
+ if (s.equals(this.paramName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private ParameterValidator createValidator() {
String dataType = getDataTypeName();
if ("checkbox".equals(dataType)) {
diff --git a/java/code/src/com/redhat/rhn/domain/monitoring/command/FloatValidator.java b/java/code/src/com/redhat/rhn/domain/monitoring/command/FloatValidator.java
index c276d0f..504310f 100644
--- a/java/code/src/com/redhat/rhn/domain/monitoring/command/FloatValidator.java
+++ b/java/code/src/com/redhat/rhn/domain/monitoring/command/FloatValidator.java
@@ -30,6 +30,7 @@ class FloatValidator extends ParameterValidator {
* {@inheritDoc}
*/
public String normalize(String value) {
+ value = super.normalize(value);
return StringUtils.stripToNull(value);
}
diff --git a/java/code/src/com/redhat/rhn/domain/monitoring/command/IntegerValidator.java b/java/code/src/com/redhat/rhn/domain/monitoring/command/IntegerValidator.java
index 4193617..5756d4a 100644
--- a/java/code/src/com/redhat/rhn/domain/monitoring/command/IntegerValidator.java
+++ b/java/code/src/com/redhat/rhn/domain/monitoring/command/IntegerValidator.java
@@ -44,6 +44,7 @@ class IntegerValidator extends ParameterValidator {
* {@inheritDoc}
*/
public String normalize(String value) {
+ value = super.normalize(value);
return StringUtils.stripToNull(value);
}
diff --git a/java/code/src/com/redhat/rhn/domain/monitoring/command/ParameterValidator.java b/java/code/src/com/redhat/rhn/domain/monitoring/command/ParameterValidator.java
index d3aa022..d707b3d 100644
--- a/java/code/src/com/redhat/rhn/domain/monitoring/command/ParameterValidator.java
+++ b/java/code/src/com/redhat/rhn/domain/monitoring/command/ParameterValidator.java
@@ -74,12 +74,16 @@ public abstract class ParameterValidator {
}
/**
- * Normalize <code>value</code>. Returns <code>null</code> if the
- * value is considered empty or not present.
+ * Normalize <code>value</code>. Removes all backticks unless param.isBacktickAllowed()
+ * returns true. Returns <code>null</code> if the value is considered empty
+ * or not present.
* @param value the value to normalized
* @return the normalized value
*/
public String normalize(String value) {
+ if (!param.isBackTickAllowed() && !StringUtils.isBlank(value)) {
+ value = value.replaceAll("`", "");
+ }
return StringUtils.isBlank(value) ? null : value;
}
diff --git a/java/code/src/com/redhat/rhn/domain/monitoring/command/ProbeStateValidator.java b/java/code/src/com/redhat/rhn/domain/monitoring/command/ProbeStateValidator.java
index d61117c..e2b8035 100644
--- a/java/code/src/com/redhat/rhn/domain/monitoring/command/ProbeStateValidator.java
+++ b/java/code/src/com/redhat/rhn/domain/monitoring/command/ProbeStateValidator.java
@@ -46,6 +46,7 @@ class ProbeStateValidator extends ParameterValidator {
* {@inheritDoc}
*/
public String normalize(String value) {
+ value = super.normalize(value);
if (value != null) {
value = value.toUpperCase();
}
diff --git a/java/code/src/com/redhat/rhn/domain/monitoring/command/test/CommandTest.java b/java/code/src/com/redhat/rhn/domain/monitoring/command/test/CommandTest.java
index d50f929..3fcee65 100644
--- a/java/code/src/com/redhat/rhn/domain/monitoring/command/test/CommandTest.java
+++ b/java/code/src/com/redhat/rhn/domain/monitoring/command/test/CommandTest.java
@@ -14,6 +14,12 @@
*/
package com.redhat.rhn.domain.monitoring.command.test;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
import com.redhat.rhn.domain.monitoring.MonitoringConstants;
import com.redhat.rhn.domain.monitoring.MonitoringFactory;
import com.redhat.rhn.domain.monitoring.Probe;
@@ -23,6 +29,7 @@ import com.redhat.rhn.domain.monitoring.command.Command;
import com.redhat.rhn.domain.monitoring.command.CommandGroup;
import com.redhat.rhn.domain.monitoring.command.CommandParameter;
import com.redhat.rhn.domain.monitoring.command.Metric;
+import com.redhat.rhn.domain.monitoring.command.ParameterValidator;
import com.redhat.rhn.domain.monitoring.command.ThresholdParameter;
import com.redhat.rhn.domain.monitoring.command.ThresholdType;
import com.redhat.rhn.domain.monitoring.test.MonitoringFactoryTest;
@@ -34,11 +41,6 @@ import com.redhat.rhn.testing.UserTestUtils;
import org.apache.commons.collections.Transformer;
import org.hibernate.HibernateException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
/**
* CommandTest
* @version $Rev: 52080 $
@@ -194,5 +196,29 @@ public class CommandTest extends RhnBaseTestCase {
}
+
+ public void testBacktickCleansing() throws Exception {
+ User user = UserTestUtils.findNewUser("testUser", "testOrg" +
+ this.getClass().getSimpleName());
+ Probe probe = MonitoringFactoryTest.createTestProbe(user);
+ assertNotNull(probe.getCommand().getCommandParameters());
+ assertTrue(probe.getCommand().getCommandParameters().size() > 0);
+
+ // Make sure that cmd-de-backticking works
+ Set<CommandParameter> cps = probe.getCommand().getCommandParameters();
+ for (CommandParameter cp : cps) {
+ ParameterValidator pv = cp.getValidator();
+ System.out.println(cp.getParamName() + "/" + cp.getParamType() + "(" +
+ pv.getClass().getName() + ") [" +
+ pv.normalize("`BACKTICKS`") + "]");
+ if (cp.isBackTickAllowed()) {
+ assertEquals("`HAS_BACKTICKS`", pv.normalize("`HAS_BACKTICKS`"));
+ }
+ else {
+ assertEquals("NO_BACKTICKS", pv.normalize("NO_BACKTICKS"));
+ assertEquals("REMOVE_BACKTICKS", pv.normalize("`REMOVE_BACKTICKS`"));
+ }
+ }
+ }
}
commit 041c2dd067f91f22087c9be6bb264d00c9ffdd0b
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Wed Oct 23 15:21:00 2013 -0400
1063915, CVE-2013-1869, Only follow internal return_urls
diff --git a/java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java b/java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java
index 0e87f0f..7837e3b 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/systems/OverviewAction.java
@@ -41,6 +41,25 @@ public class OverviewAction extends RhnListAction {
private static Logger log = Logger.getLogger(OverviewAction.class);
+ // redirect_url can send us to the Java side or the Perl side, and *nowhere else*
+ private static final String[] ALLOWED_REDIRECTS = { "/rhn/", "/network/" };
+
+ //
+ // Only follow redirects if they're "inside" the app
+ //
+ private String getLegalReturnUrl(String proposedRedirect) {
+ if (proposedRedirect == null) {
+ return null;
+ }
+
+ for (String dest : ALLOWED_REDIRECTS) {
+ if (proposedRedirect.startsWith(dest)) {
+ return proposedRedirect;
+ }
+ }
+ return null;
+ }
+
/** {@inheritDoc} */
public ActionForward execute(ActionMapping mapping,
ActionForm formIn,
@@ -64,7 +83,7 @@ public class OverviewAction extends RhnListAction {
*/
String emptySet = request.getParameter("empty_set");
String setLabel = request.getParameter("set_label");
- String returnUrl = request.getParameter("return_url");
+ String returnUrl = getLegalReturnUrl(request.getParameter("return_url"));
if (emptySet != null && emptySet.equals("true")) {
//Set defaults if needed.
if (setLabel == null) {
commit 1d0f4b4a78ea03d9f2d05fbd52236b1f2ab68e85
Author: Grant Gainey <ggainey(a)redhat.com>
Date: Thu Oct 17 14:55:40 2013 -0400
1063915, CVE-2012-6149, Fix XSS in notes.jsp
diff --git a/java/code/webapp/WEB-INF/pages/systems/sdc/notes.jsp b/java/code/webapp/WEB-INF/pages/systems/sdc/notes.jsp
index f0be578..194e5a6 100644
--- a/java/code/webapp/WEB-INF/pages/systems/sdc/notes.jsp
+++ b/java/code/webapp/WEB-INF/pages/systems/sdc/notes.jsp
@@ -21,11 +21,11 @@
<rhn:column header="sdc.details.notes.subject" width="35%" sortProperty="subject"
url="/rhn/systems/details/EditNote.do?sid=${system.id}&nid=${current.id}">
- ${current.subject}
+ <c:out value="${current.subject}" escapeXml="true" />
</rhn:column>
<rhn:column header="sdc.details.notes.details" width="50%">
- <pre>${current.note}</pre>
+ <pre><c:out value="${current.note}" escapeXml="true" /></pre>
</rhn:column>
<rhn:column header="sdc.details.notes.updated" sortProperty="modified">
10 years, 3 months
Changes to 'refs/tags/spacewalk-schema-2.1.41-1'
by Milan Zazrivec
Tag 'spacewalk-schema-2.1.41-1' created by Milan Zazrivec <mzazrivec(a)redhat.com> at 2014-02-11 14:07 +0000
Tagging package [spacewalk-schema] version [2.1.41-1] in directory [schema/spacewalk/].
Changes since spacewalk-schema-2.1.40-1:
Milan Zazrivec (2):
fix sha1 sums
Automatic commit of package [spacewalk-schema] release [2.1.41-1].
---
rel-eng/packages/spacewalk-schema | 2 +-
schema/spacewalk/spacewalk-schema.spec | 5 ++++-
schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/048-rhn_channel.pkb.postgresql | 2 +-
schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/049-rhn_server.pkb.postgresql | 2 +-
4 files changed, 7 insertions(+), 4 deletions(-)
---
10 years, 3 months
2 commits - rel-eng/packages schema/spacewalk
by Milan Zazrivec
rel-eng/packages/spacewalk-schema | 2 +-
schema/spacewalk/spacewalk-schema.spec | 5 ++++-
schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/048-rhn_channel.pkb.postgresql | 2 +-
schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/049-rhn_server.pkb.postgresql | 2 +-
4 files changed, 7 insertions(+), 4 deletions(-)
New commits:
commit 05a950c07e4434da623ded137c970211f84d46e6
Author: Milan Zazrivec <mzazrivec(a)redhat.com>
Date: Tue Feb 11 15:07:38 2014 +0100
Automatic commit of package [spacewalk-schema] release [2.1.41-1].
diff --git a/rel-eng/packages/spacewalk-schema b/rel-eng/packages/spacewalk-schema
index b41f0ad..e8fb97a 100644
--- a/rel-eng/packages/spacewalk-schema
+++ b/rel-eng/packages/spacewalk-schema
@@ -1 +1 @@
-2.1.40-1 schema/spacewalk/
+2.1.41-1 schema/spacewalk/
diff --git a/schema/spacewalk/spacewalk-schema.spec b/schema/spacewalk/spacewalk-schema.spec
index 5e2187e..1856fc5 100644
--- a/schema/spacewalk/spacewalk-schema.spec
+++ b/schema/spacewalk/spacewalk-schema.spec
@@ -4,7 +4,7 @@ Name: spacewalk-schema
Group: Applications/Internet
Summary: Oracle SQL schema for Spacewalk server
-Version: 2.1.40
+Version: 2.1.41
Release: 1%{?dist}
Source0: %{name}-%{version}.tar.gz
@@ -71,6 +71,9 @@ rm -rf $RPM_BUILD_ROOT
%{_mandir}/man1/spacewalk-sql*
%changelog
+* Tue Feb 11 2014 Milan Zazrivec <mzazrivec(a)redhat.com> 2.1.41-1
+- fix sha1 sums
+
* Tue Feb 11 2014 Milan Zazrivec <mzazrivec(a)redhat.com> 2.1.40-1
- 1063821 - deadlock fix
commit 4cd36c6e4fbd7d431a19002fe190ccfea834d07f
Author: Milan Zazrivec <mzazrivec(a)redhat.com>
Date: Tue Feb 11 15:07:21 2014 +0100
fix sha1 sums
diff --git a/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/048-rhn_channel.pkb.postgresql b/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/048-rhn_channel.pkb.postgresql
index 4ab5d2e..6708d12 100644
--- a/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/048-rhn_channel.pkb.postgresql
+++ b/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/048-rhn_channel.pkb.postgresql
@@ -1,4 +1,4 @@
--- oracle equivalent source sha1 cc1b86fd8db5758d5f3a7ccc146f38954454def1
+-- oracle equivalent source sha1 2687a15d4354aa84c0af253684b234ed82900c66
--
-- Copyright (c) 2008--2013 Red Hat, Inc.
--
diff --git a/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/049-rhn_server.pkb.postgresql b/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/049-rhn_server.pkb.postgresql
index 87fa3e4..ee89929 100644
--- a/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/049-rhn_server.pkb.postgresql
+++ b/schema/spacewalk/upgrade/spacewalk-schema-2.0-to-spacewalk-schema-2.1/049-rhn_server.pkb.postgresql
@@ -1,4 +1,4 @@
--- oracle equivalent source sha1 07b6ab3867e4d4ebf772b6ee9731f83e33f4d7ae
+-- oracle equivalent source sha1 d15b33804b83137c38edd4ca8b7981741cd93e98
--
-- Copyright (c) 2008--2012 Red Hat, Inc.
--
10 years, 3 months