aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-server/src/main
diff options
context:
space:
mode:
authorsimonbrandhof <simon.brandhof@gmail.com>2011-09-09 07:36:15 +0200
committersimonbrandhof <simon.brandhof@gmail.com>2011-09-09 07:38:21 +0200
commit9167379d53bdb8cd6d7c7e57ed62f5b711329652 (patch)
tree40bc7af2831d801fbd6c07c08c4340a3eb6fc6fd /sonar-server/src/main
parent7e914e1eb6b9cfcdbc43930e8b40b256e3846989 (diff)
downloadsonarqube-9167379d53bdb8cd6d7c7e57ed62f5b711329652.tar.gz
sonarqube-9167379d53bdb8cd6d7c7e57ed62f5b711329652.zip
SONAR-2603 provide a dedicated settings page to generate server key
This page is merged to the catgories of the General Settings page. At the same time the Email Settings page is merged as well.
Diffstat (limited to 'sonar-server/src/main')
-rw-r--r--sonar-server/src/main/java/org/sonar/server/platform/Platform.java1
-rw-r--r--sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java13
-rw-r--r--sonar-server/src/main/java/org/sonar/server/platform/ServerKeyGenerator.java88
-rw-r--r--sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java10
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/controllers/email_configuration_controller.rb1
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/controllers/server_key_configuration_controller.rb55
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb5
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/models/server.rb2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/email_configuration/index.html.erb61
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb1
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/server_key_configuration/index.html.erb58
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/settings/_plugins.html.erb20
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/settings/_special.html.erb1
13 files changed, 234 insertions, 82 deletions
diff --git a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java
index a587cce3cc3..7eb85ce851a 100644
--- a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java
+++ b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java
@@ -144,6 +144,7 @@ public final class Platform {
coreContainer.as(Characteristics.CACHE).addComponent(UpdateCenterClient.class);
coreContainer.as(Characteristics.CACHE).addComponent(UpdateCenterMatrixFactory.class);
coreContainer.as(Characteristics.CACHE).addComponent(PluginDownloader.class);
+ coreContainer.as(Characteristics.CACHE).addComponent(ServerKeyGenerator.class);
coreContainer.as(Characteristics.CACHE).addComponent(ServerImpl.class);
coreContainer.as(Characteristics.NO_CACHE).addComponent(FilterExecutor.class);
coreContainer.as(Characteristics.NO_CACHE).addAdapter(new DatabaseSessionProvider());
diff --git a/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java b/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java
index e68874e9b60..f030202c85d 100644
--- a/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java
+++ b/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java
@@ -43,16 +43,14 @@ public final class ServerImpl extends Server {
* This component can't use Configuration because of startup sequence. It must be started before plugins.
*/
private DatabaseSessionFactory dbSessionFactory;
- private ServerKeyGenerator keyGenerator;
public ServerImpl(DatabaseSessionFactory dbSessionFactory) {
- this(dbSessionFactory, new ServerKeyGenerator(), new Date());
+ this(dbSessionFactory, new Date());
}
- ServerImpl(DatabaseSessionFactory dbSessionFactory, ServerKeyGenerator keyGenerator, Date startedAt) {
+ ServerImpl(DatabaseSessionFactory dbSessionFactory, Date startedAt) {
this.dbSessionFactory = dbSessionFactory;
this.startedAt = startedAt;
- this.keyGenerator = keyGenerator;
}
public void start() {
@@ -70,11 +68,8 @@ public final class ServerImpl extends Server {
public String getKey() {
DatabaseSession session = dbSessionFactory.getSession();
- Property organization = session.getSingleResult(Property.class, "key", CoreProperties.ORGANIZATION);
- Property baseUrl = session.getSingleResult(Property.class, "key", CoreProperties.SERVER_BASE_URL);
- return keyGenerator.generate(
- organization != null ? organization.getValue() : null,
- baseUrl != null ? baseUrl.getValue() : null);
+ Property serverKey = session.getSingleResult(Property.class, "key", CoreProperties.SERVER_KEY);
+ return (serverKey!= null ? serverKey.getValue() : null);
}
public String getId() {
diff --git a/sonar-server/src/main/java/org/sonar/server/platform/ServerKeyGenerator.java b/sonar-server/src/main/java/org/sonar/server/platform/ServerKeyGenerator.java
index 67e73e569a7..0a29e0eb876 100644
--- a/sonar-server/src/main/java/org/sonar/server/platform/ServerKeyGenerator.java
+++ b/sonar-server/src/main/java/org/sonar/server/platform/ServerKeyGenerator.java
@@ -19,14 +19,18 @@
*/
package org.sonar.server.platform;
+import com.google.common.collect.Lists;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.LoggerFactory;
-import org.sonar.api.utils.Logs;
import java.io.UnsupportedEncodingException;
-import java.net.*;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.UnknownHostException;
import java.util.Enumeration;
+import java.util.List;
/**
* @since 2.11
@@ -50,36 +54,17 @@ public class ServerKeyGenerator {
this.acceptPrivateAddress = acceptPrivateAddress;
}
- public String generate(String organization, String baseUrl) {
+ public String generate(String organization, String ipAddress) {
String key = null;
- if (StringUtils.isNotBlank(organization) && StringUtils.isNotBlank(baseUrl)) {
- InetAddress address = extractAddressFromUrl(baseUrl);
- if (address != null && isFixed(address) && isOwner(address)) {
- key = toKey(organization, address);
+ if (StringUtils.isNotBlank(organization) && StringUtils.isNotBlank(ipAddress)) {
+ InetAddress inetAddress = toValidAddress(ipAddress);
+ if (inetAddress != null) {
+ key = toKey(organization, inetAddress);
}
}
return key;
}
- boolean isOwner(InetAddress address) {
- try {
- Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
- while (networkInterfaces.hasMoreElements()) {
- NetworkInterface networkInterface = networkInterfaces.nextElement();
- Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
- while (addresses.hasMoreElements()) {
- InetAddress ownedAddress = addresses.nextElement();
- if (ownedAddress.equals(address)) {
- return true;
- }
- }
- }
- } catch (SocketException e) {
- LoggerFactory.getLogger(ServerKeyGenerator.class).error("Fail to verify server key. Network interfaces can't be browsed.", e);
- }
- return false;
- }
-
boolean isFixed(InetAddress address) {
// Loopback addresses are in the range 127/8.
// Link local addresses are in the range 169.254/16 (IPv4) or fe80::/10 (IPv6). They are "autoconfiguration" addresses.
@@ -87,22 +72,6 @@ public class ServerKeyGenerator {
return acceptPrivateAddress || (!address.isLoopbackAddress() && !address.isLinkLocalAddress());
}
- InetAddress extractAddressFromUrl(String baseUrl) {
- if (StringUtils.isBlank(baseUrl)) {
- return null;
- }
- try {
- URL url = new URL(baseUrl);
- return InetAddress.getByName(url.getHost());
-
- } catch (MalformedURLException e) {
- throw new IllegalArgumentException("Server base URL is malformed: " + baseUrl, e);
-
- } catch (UnknownHostException e) {
- throw new IllegalArgumentException("Server base URL is unknown: " + baseUrl, e);
- }
- }
-
String toKey(String organization, InetAddress address) {
String key = new StringBuilder().append(organization).append("-").append(address.getHostAddress()).toString();
try {
@@ -112,4 +81,39 @@ public class ServerKeyGenerator {
throw new IllegalArgumentException("Organization is not UTF-8 encoded: " + organization, e);
}
}
+
+ public InetAddress toValidAddress(String ipAddress) {
+ if (StringUtils.isNotBlank(ipAddress)) {
+ List<InetAddress> validAddresses = getAvailableAddresses();
+ try {
+ InetAddress address = InetAddress.getByName(ipAddress);
+ if (validAddresses.contains(address)) {
+ return address;
+ }
+ } catch (UnknownHostException e) {
+ // ignore, not valid property
+ }
+ }
+ return null;
+ }
+
+ public List<InetAddress> getAvailableAddresses() {
+ List<InetAddress> result = Lists.newArrayList();
+ try {
+ Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
+ while (networkInterfaces.hasMoreElements()) {
+ NetworkInterface networkInterface = networkInterfaces.nextElement();
+ Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
+ while (addresses.hasMoreElements()) {
+ InetAddress ownedAddress = addresses.nextElement();
+ if (isFixed(ownedAddress)) {
+ result.add(ownedAddress);
+ }
+ }
+ }
+ } catch (SocketException e) {
+ LoggerFactory.getLogger(ServerKeyGenerator.class).error("Fail to browse network interfaces", e);
+ }
+ return result;
+ }
}
diff --git a/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java b/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java
index 1efadaabc4a..485a7a1b341 100644
--- a/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java
+++ b/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java
@@ -44,11 +44,13 @@ import org.sonar.server.filters.FilterExecutor;
import org.sonar.server.filters.FilterResult;
import org.sonar.server.notifications.reviews.ReviewsNotificationManager;
import org.sonar.server.platform.Platform;
+import org.sonar.server.platform.ServerKeyGenerator;
import org.sonar.server.plugins.*;
import org.sonar.server.rules.ProfilesConsole;
import org.sonar.server.rules.RulesConsole;
import org.sonar.updatecenter.common.Version;
+import java.net.InetAddress;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
@@ -274,6 +276,14 @@ public final class JRubyFacade {
return getContainer().getComponent(Configuration.class).getString(key, null);
}
+ public List<InetAddress> getValidInetAddressesForServerKey() {
+ return getContainer().getComponent(ServerKeyGenerator.class).getAvailableAddresses();
+ }
+
+ public String generateServerKey(String organization, String ipAddress) {
+ return getContainer().getComponent(ServerKeyGenerator.class).generate(organization, ipAddress);
+ }
+
public Connection getConnection() throws SQLException {
return getContainer().getComponent(DatabaseConnector.class).getConnection();
}
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/email_configuration_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/email_configuration_controller.rb
index e8f89b50748..5e38fe875c7 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/email_configuration_controller.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/email_configuration_controller.rb
@@ -30,6 +30,7 @@ class EmailConfigurationController < ApplicationController
@smtp_password = Property.value(configuration::SMTP_PASSWORD, nil, configuration::SMTP_PASSWORD_DEFAULT)
@email_from = Property.value(configuration::FROM, nil, configuration::FROM_DEFAULT)
@email_prefix = Property.value(configuration::PREFIX, nil, configuration::PREFIX_DEFAULT)
+ params[:layout]='false'
end
def save
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/server_key_configuration_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/server_key_configuration_controller.rb
new file mode 100644
index 00000000000..8e2e59fd3e1
--- /dev/null
+++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/server_key_configuration_controller.rb
@@ -0,0 +1,55 @@
+#
+# Sonar, entreprise quality control tool.
+# Copyright (C) 2008-2011 SonarSource
+# mailto:contact AT sonarsource DOT com
+#
+# Sonar is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 3 of the License, or (at your option) any later version.
+#
+# Sonar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with Sonar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+#
+class ServerKeyConfigurationController < ApplicationController
+
+ SECTION=Navigation::SECTION_CONFIGURATION
+ PROPERTY_SERVER_KEY = 'sonar.server_key'
+ PROPERTY_IP_ADDRESS = 'sonar.server_key.ip_address'
+ PROPERTY_ORGANIZATION = 'sonar.organization'
+
+ before_filter :admin_required
+ verify :method => :post, :only => [:save], :redirect_to => {:action => :index}
+
+ def index
+ @server_key = Property.value(PROPERTY_SERVER_KEY)
+ @organization = Property.value(PROPERTY_ORGANIZATION)
+ @address = Property.value(PROPERTY_IP_ADDRESS)
+ @valid_addresses = java_facade.getValidInetAddressesForServerKey()
+ params[:layout]='false'
+ end
+
+ def save
+ organization = params[:organization]
+ Property.set(PROPERTY_ORGANIZATION, organization)
+
+ ip_address=params[:address]
+ Property.set(PROPERTY_IP_ADDRESS, ip_address)
+
+ key = java_facade.generate_server_key(organization, ip_address)
+ if key
+ Property.set(PROPERTY_SERVER_KEY, key)
+ else
+ Property.clear(PROPERTY_SERVER_KEY)
+ flash[:error] = 'Please set valid organization and IP address'
+ end
+
+ redirect_to :action => 'index'
+ end
+end
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb
index 50085bb6289..8a052d24953 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb
@@ -20,6 +20,8 @@
class SettingsController < ApplicationController
SECTION=Navigation::SECTION_CONFIGURATION
+
+ SPECIAL_CATEGORIES=['email', 'server_key']
verify :method => :post, :only => ['update'], :redirect_to => {:action => :index}
@@ -80,5 +82,8 @@ class SettingsController < ApplicationController
@properties_per_category[category]<<property
end
end
+ SPECIAL_CATEGORIES.each do |category|
+ @properties_per_category[category]=[]
+ end
end
end
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/server.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/server.rb
index 08bc8b4b847..0fa8dd7237b 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/models/server.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/models/server.rb
@@ -59,7 +59,7 @@ class Server
def sonar_info
sonar_info=[]
- add_property(sonar_info, 'Server Key') {org.sonar.server.platform.Platform.getServer().getKey()}
+ add_property(sonar_info, 'Server Key') {sonar_property('sonar.server_key')}
add_property(sonar_info, 'Version') {org.sonar.server.platform.Platform.getServer().getVersion()}
add_property(sonar_info, 'Started at') {org.sonar.server.platform.Platform.getServer().getStartedAt()}
add_property(sonar_info, 'Database') {"#{jdbc_metadata. getDatabaseProductName()} #{jdbc_metadata. getDatabaseProductVersion()}"}
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/email_configuration/index.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/email_configuration/index.html.erb
index 04e91ee296c..1910f706aa7 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/email_configuration/index.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/email_configuration/index.html.erb
@@ -1,70 +1,87 @@
-<h1><%= message('email_configuration.page') -%></h1>
-<div class="admin">
<% form_tag({:action => 'save'}) do -%>
- <table class="form">
+ <table class="data form marginbottom10">
+ <thead>
<tr>
+ <th><span><%= message('email_configuration.page') -%></span></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr class="even">
<td class="keyCell"><label for="smtp_host"><%= message('email_configuration.smtp_host') -%>:</label></td>
<td><%= text_field_tag 'smtp_host', @smtp_host %></td>
<td class="comments"><%= message('email_configuration.smtp_host.description') -%></td>
</tr>
- <tr>
+ <tr class="odd">
<td class="keyCell"><label for="smtp_port"><%= message('email_configuration.smtp_port') -%>:</label></td>
<td><%= text_field_tag 'smtp_port', @smtp_port %></td>
<td class="comments"><%= message('email_configuration.smtp_port.description') -%></td>
</tr>
- <tr>
+ <tr class="even">
<td class="keyCell"><label for="smtp_secure_connection"><%= message('email_configuration.smtp_secure_connection') -%>:</label></td>
<td><%= select_tag 'smtp_secure_connection', options_for_select({'No' => '', 'SSL' => 'ssl'}, @smtp_secure_connection) %></td>
<td class="comments"><%= message('email_configuration.smtp_secure_connection.description') -%></td>
</tr>
- <tr>
+ <tr class="odd">
<td class="keyCell"><label for="smtp_username"><%= message('email_configuration.smtp_username') -%>:</label></td>
<td><%= text_field_tag 'smtp_username', @smtp_username %></td>
<td class="comments"><%= message('email_configuration.smtp_username.description') -%></td>
</tr>
- <tr>
+ <tr class="even">
<td class="keyCell"><label for="smtp_password"><%= message('email_configuration.smtp_password') -%>:</label></td>
<td><%= password_field_tag 'smtp_password', @smtp_password %></td>
<td class="comments"><%= message('email_configuration.smtp_password.description') -%></td>
</tr>
- <tr>
+ <tr class="odd">
<td class="keyCell"><label for="email_from"><%= message('email_configuration.from_address') -%>:</label></td>
<td><%= text_field_tag 'email_from', @email_from %></td>
<td class="comments"><%= message('email_configuration.from_address.description') -%></td>
</tr>
- <tr>
+ <tr class="even">
<td class="keyCell"><label for="email_prefix"><%= message('email_configuration.email_prefix') -%>:</label></td>
<td><%= text_field_tag 'email_prefix', @email_prefix %></td>
<td class="comments"><%= message('email_configuration.email_prefix.description') -%></td>
</tr>
+ </tbody>
+ <tfoot>
<tr>
- <td></td>
- <td><%= submit_tag message('email_configuration.save_settings'), :disable_with => message('email_configuration.saving_settings') %></td>
+ <td colspan="3">
+ <%= submit_tag message('email_configuration.save_settings'), :disable_with => message('email_configuration.saving_settings') %>
+ </td>
</tr>
+ </tfoot>
</table>
<% end -%>
-</div>
-<h1><%= message('email_configuration.test.title') -%></h1>
-<div class="admin">
+<br/>
+
<% form_tag({:action => 'send_test_email'}) do -%>
- <table class="form">
+ <table class="data form marginbottom10">
+ <thead>
<tr>
+ <th><span><%= message('email_configuration.test.title') -%></span></th>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td colspan="3">
+ <%= submit_tag message('email_configuration.test.send'), :disable_with => message('email_configuration.test.sending') %>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <tr class="even">
<td class="keyCell"><label for="to_address"><%= message('email_configuration.test.to_address') -%>:</label></td>
<td><%= text_field_tag 'to_address', current_user.email %></td>
</tr>
- <tr>
+ <tr class="odd">
<td class="keyCell"><label for="subject"><%= message('email_configuration.test.subject') -%>:</label></td>
<td><%= text_field_tag 'subject', message('email_configuration.test.subject_text') %></td>
</tr>
- <tr>
+ <tr class="even">
<td class="keyCell"><label for="message"><%= message('email_configuration.test.message') -%>:</label></td>
<td><%= text_area_tag 'message', message('email_configuration.test.message_text'), {:cols => 40, :rows => 6} %></td>
</tr>
- <tr>
- <td></td>
- <td><%= submit_tag message('email_configuration.test.send'), :disable_with => message('email_configuration.test.sending') %></td>
- </tr>
+ </tbody>
</table>
<% end -%>
-</div>
+
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb
index 93301fc664b..634693f7384 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb
@@ -90,7 +90,6 @@
<li class="h2"><%= message('sidebar.system') -%></li>
<li class="<%= 'selected' if request.request_uri.include?('/settings') -%>"><a href="<%= ApplicationController.root_context -%>/settings/index"><%= message('settings.page') -%></a></li>
- <li class="<%= 'selected' if controller.controller_path=='email_configuration' -%>"><a href="<%= ApplicationController.root_context -%>/email_configuration"><%= message('email_configuration.page') -%></a></li>
<li class="<%= 'selected' if controller.controller_path=='backup' -%>"><a href="<%= ApplicationController.root_context -%>/backup"><%= message('backup.page') -%></a></li>
<li class="<%= 'selected' if controller.controller_path=='system' -%>"><a href="<%= ApplicationController.root_context -%>/system"><%= message('system_info.page') -%></a></li>
<% update_center_activated = controller.java_facade.getConfigurationValue('sonar.updatecenter.activate') || 'true';
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/server_key_configuration/index.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/server_key_configuration/index.html.erb
new file mode 100644
index 00000000000..0153c35c10b
--- /dev/null
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/server_key_configuration/index.html.erb
@@ -0,0 +1,58 @@
+<h3 class="marginbottom10"><%= message('server_key_configuration.page') -%></h3>
+
+<% if @server_key %>
+ <p>Server Key: <span class="notice"><b><%= @server_key -%></b></span></p>
+<% else %>
+<% end %>
+<p>
+ TODO....
+</p>
+
+<% form_tag :action => :save do %>
+ <table class="data marginbottom10">
+ <thead>
+ <tr>
+ <th></th>
+ </tr>
+ </thead>
+ <tfoot>
+ <% if @server_key %>
+ <tr>
+ <td colspan="3">
+ <span class="warning">Changing configuration can disable your SonarSource commercial licenses. You'll have to renew them.</span>
+ </td>
+ </tr>
+ <% end %>
+ <tr>
+ <td colspan="3">
+ <%= submit_tag message('server_key_configuration.save'), :disable_with => message('server_key_configuration.saving') %>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <tr class="even">
+ <td style="padding: 10px">
+ <h3>Organization</h3>
+ <p class="marginbottom10">The organization is ....</p>
+ <p>
+ <input type="text" name="organization" value="<%= @organization -%>"/>
+ </p>
+ </td>
+ </tr>
+ <tr class="odd">
+ <td style="padding: 10px">
+ <h3>IP Address</h3>
+ <p class="marginbottom10">The IP address is .... Choose one of the following:</p>
+ <ul class="marginbottom10 bullet">
+ <% @valid_addresses.each_with_index do |ip_address, index| %>
+ <li><span class="address_<%= index -%>"><%= ip_address.getHostAddress() -%></span></li>
+ <% end %>
+ </ul>
+ <p>
+ <input type="text" name="address" value="<%= @address -%>"/>
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+<% end %> \ No newline at end of file
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_plugins.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_plugins.html.erb
index 11fffc3c8d4..ec7db02725e 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_plugins.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_plugins.html.erb
@@ -44,8 +44,8 @@
</thead>
<tbody>
<%
- @properties_per_category.keys.sort_by{|category| message("property.category.#{category}", :default => category)}.each do |category|
- unless @properties_per_category[category].empty?
+ @properties_per_category.keys.sort_by{|category| message("property.category.#{category}", :default => category).upcase}.each do |category|
+ if !@properties_per_category[category].empty? || SettingsController::SPECIAL_CATEGORIES.include?(category)
%>
<tr class="select <%= cycle('even', 'odd', :name => 'category') -%> <%= 'selected' if @category==category -%>" id="select_<%= category -%>">
<td><%= link_to message("property.category.#{category}", :default => category), :overwrite_params => {:category => category} -%></td>
@@ -59,10 +59,14 @@
</td>
<td class="column">
- <% if @category && @properties_per_category[@category] && !@properties_per_category[@category].empty?
- category_name = message("property.category.#{@category}", :default => @category)
+ <% if @category && @properties_per_category[@category]
+ category_name = message("property.category.#{@category}", :default => @category)
+ if SettingsController::SPECIAL_CATEGORIES.include?(@category)
+ %>
+ <%= render :partial => 'special', :locals => {:url => url_for(:controller => "#{@category}_configuration")} -%>
+ <%
+ elsif !@properties_per_category[@category].empty?
%>
-
<% form_tag :controller => :settings, :action => :update do %>
<%= hidden_field_tag('category', @category) -%>
<% if @project %>
@@ -83,7 +87,7 @@
value = Property.value(property.key(), (@project ? @project.id : nil), '')
%>
<tr class="<%= cycle('even', 'odd', :name => 'properties') -%>">
- <td style="padding: 10px">
+ <td style="padding: 10px">
<h3>
<%= message("property.#{property.key()}.name", :default => property.name()) -%>
<% if property.project() %>
@@ -120,7 +124,9 @@
<% save_message=message('settings.save_category', :params => [category_name]) %>
<%= submit_tag(save_message, :disable_with => save_message, :id => 'save') -%>
<% end %>
- <% end %>
+ <% end
+ end
+ %>
</td>
</tr>
</table>
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_special.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_special.html.erb
new file mode 100644
index 00000000000..24b253c72de
--- /dev/null
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_special.html.erb
@@ -0,0 +1 @@
+<iframe src="<%= url -%>" width="100%" height="600" frameborder="0" scrolling="no"></iframe> \ No newline at end of file