diff options
author | James Moger <james.moger@gitblit.com> | 2011-12-20 19:35:54 -0500 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2011-12-20 19:36:56 -0500 |
commit | eb96eab513101783a750c13419de6bdce3d2fa4c (patch) | |
tree | 5ed57cd6c9188889dc8ad7bb850b3fd4ae5756d2 /src | |
parent | 4bd2037edddbf444ac9817e9d14710be45850a10 (diff) | |
download | gitblit-eb96eab513101783a750c13419de6bdce3d2fa4c.tar.gz gitblit-eb96eab513101783a750c13419de6bdce3d2fa4c.zip |
Renamed GitblitUserService, sendMail method, sendmail.groovy, and RepositoryModel.mailingLists
Diffstat (limited to 'src')
-rw-r--r-- | src/com/gitblit/FederationPullExecutor.java | 2 | ||||
-rw-r--r-- | src/com/gitblit/GitBlit.java | 22 | ||||
-rw-r--r-- | src/com/gitblit/GitblitUserService.java | 217 | ||||
-rw-r--r-- | src/com/gitblit/UserServiceWrapper.java | 221 | ||||
-rw-r--r-- | src/com/gitblit/client/EditRepositoryDialog.java | 21 | ||||
-rw-r--r-- | src/com/gitblit/models/RepositoryModel.java | 2 | ||||
-rw-r--r-- | src/com/gitblit/wicket/GitBlitWebApp.properties | 6 | ||||
-rw-r--r-- | src/com/gitblit/wicket/pages/EditRepositoryPage.html | 22 | ||||
-rw-r--r-- | src/com/gitblit/wicket/pages/EditRepositoryPage.java | 30 | ||||
-rw-r--r-- | src/com/gitblit/wicket/pages/EditTeamPage.html | 4 | ||||
-rw-r--r-- | src/com/gitblit/wicket/pages/EditUserPage.html | 8 | ||||
-rw-r--r-- | src/com/gitblit/wicket/panels/RepositoriesPanel.java | 3 |
12 files changed, 285 insertions, 273 deletions
diff --git a/src/com/gitblit/FederationPullExecutor.java b/src/com/gitblit/FederationPullExecutor.java index c3b7d8b8..2976c402 100644 --- a/src/com/gitblit/FederationPullExecutor.java +++ b/src/com/gitblit/FederationPullExecutor.java @@ -113,7 +113,7 @@ public class FederationPullExecutor implements Runnable { String message = "Federation pull of " + registration.name + " @ "
+ registration.url + " is now at " + is.name();
GitBlit.self()
- .sendEmailToAdministrators(
+ .sendMailToAdministrators(
"Pull Status of " + registration.name + " is " + is.name(),
message);
}
diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java index f0122791..835aa132 100644 --- a/src/com/gitblit/GitBlit.java +++ b/src/com/gitblit/GitBlit.java @@ -743,8 +743,8 @@ public class GitBlit implements ServletContextListener { "gitblit", null, "preReceiveScript")));
model.postReceiveScripts = new ArrayList<String>(Arrays.asList(config.getStringList(
"gitblit", null, "postReceiveScript")));
- model.mailRecipients = new ArrayList<String>(Arrays.asList(config.getStringList(
- "gitblit", null, "mailRecipient")));
+ model.mailingLists = new ArrayList<String>(Arrays.asList(config.getStringList(
+ "gitblit", null, "mailingList")));
}
r.close();
return model;
@@ -971,8 +971,8 @@ public class GitBlit implements ServletContextListener { config.setStringList("gitblit", null, "postReceiveScript",
repository.postReceiveScripts);
}
- if (repository.mailRecipients != null) {
- config.setStringList("gitblit", null, "mailRecipient", repository.mailRecipients);
+ if (repository.mailingLists != null) {
+ config.setStringList("gitblit", null, "mailingList", repository.mailingLists);
}
try {
config.save();
@@ -1485,7 +1485,7 @@ public class GitBlit implements ServletContextListener { * @param subject
* @param message
*/
- public void sendEmailToAdministrators(String subject, String message) {
+ public void sendMailToAdministrators(String subject, String message) {
try {
Message mail = mailExecutor.createMessageForAdministrators();
if (mail != null) {
@@ -1505,8 +1505,8 @@ public class GitBlit implements ServletContextListener { * @param message
* @param toAddresses
*/
- public void sendEmail(String subject, String message, ArrayList<String> toAddresses) {
- this.sendEmail(subject, message, toAddresses.toArray(new String[0]));
+ public void sendMail(String subject, String message, ArrayList<String> toAddresses) {
+ this.sendMail(subject, message, toAddresses.toArray(new String[0]));
}
/**
@@ -1516,7 +1516,7 @@ public class GitBlit implements ServletContextListener { * @param message
* @param toAddresses
*/
- public void sendEmail(String subject, String message, String... toAddresses) {
+ public void sendMail(String subject, String message, String... toAddresses) {
try {
Message mail = mailExecutor.createMessage(toAddresses);
if (mail != null) {
@@ -1634,11 +1634,7 @@ public class GitBlit implements ServletContextListener { loginService = (IUserService) realmClass.newInstance();
}
} catch (Throwable t) {
- loginService = new UserServiceWrapper() {
- @Override
- public void setupService(IStoredSettings settings) {
- }
- };
+ loginService = new GitblitUserService();
}
setUserService(loginService);
mailExecutor = new MailExecutor(settings);
diff --git a/src/com/gitblit/GitblitUserService.java b/src/com/gitblit/GitblitUserService.java new file mode 100644 index 00000000..97e1a40c --- /dev/null +++ b/src/com/gitblit/GitblitUserService.java @@ -0,0 +1,217 @@ +/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.gitblit.models.TeamModel;
+import com.gitblit.models.UserModel;
+
+/**
+ * This class wraps the default user service and is recommended as the starting
+ * point for custom user service implementations.
+ *
+ * This does seem a little convoluted, but the idea is to allow IUserService to
+ * evolve with new methods and implementations without breaking custom
+ * authentication implementations.
+ *
+ * The most common implementation of a custom IUserService is to only override
+ * authentication and then delegate all other functionality to one of Gitblit's
+ * user services. This class optimizes that use-case.
+ *
+ * Extending GitblitUserService allows for authentication customization without
+ * having to keep-up-with IUSerService API changes.
+ *
+ * @author James Moger
+ *
+ */
+public class GitblitUserService implements IUserService {
+
+ protected IUserService serviceImpl;
+
+ private final Logger logger = LoggerFactory.getLogger(GitblitUserService.class);
+
+ public GitblitUserService() {
+ }
+
+ @Override
+ public void setup(IStoredSettings settings) {
+ File realmFile = GitBlit.getFileOrFolder(Keys.realm.userService, "users.conf");
+ serviceImpl = createUserService(realmFile);
+ }
+
+ @SuppressWarnings("deprecation")
+ protected IUserService createUserService(File realmFile) {
+ IUserService service = null;
+ if (realmFile.getName().toLowerCase().endsWith(".properties")) {
+ // v0.5.0 - v0.7.0 properties-based realm file
+ service = new FileUserService(realmFile);
+ } else if (realmFile.getName().toLowerCase().endsWith(".conf")) {
+ // v0.8.0+ config-based realm file
+ service = new ConfigUserService(realmFile);
+ }
+
+ assert service != null;
+
+ if (realmFile.exists()) {
+ // Create the Administrator account for a new realm file
+ try {
+ realmFile.createNewFile();
+ } catch (IOException x) {
+ logger.error(MessageFormat.format("COULD NOT CREATE REALM FILE {0}!", realmFile), x);
+ }
+ UserModel admin = new UserModel("admin");
+ admin.password = "admin";
+ admin.canAdmin = true;
+ admin.excludeFromFederation = true;
+ service.updateUserModel(admin);
+ }
+
+ if (service instanceof FileUserService) {
+ // automatically create a users.conf realm file from the original
+ // users.properties file
+ File usersConfig = new File(realmFile.getParentFile(), "users.conf");
+ if (!usersConfig.exists()) {
+ logger.info(MessageFormat.format("Automatically creating {0} based on {1}",
+ usersConfig.getAbsolutePath(), realmFile.getAbsolutePath()));
+ ConfigUserService configService = new ConfigUserService(usersConfig);
+ for (String username : serviceImpl.getAllUsernames()) {
+ UserModel userModel = serviceImpl.getUserModel(username);
+ configService.updateUserModel(userModel);
+ }
+ }
+ // issue suggestion about switching to users.conf
+ logger.warn("Please consider using \"users.conf\" instead of the deprecated \"users.properties\" file");
+ }
+ return service;
+ }
+
+ @Override
+ public boolean supportsCookies() {
+ return serviceImpl.supportsCookies();
+ }
+
+ @Override
+ public char[] getCookie(UserModel model) {
+ return serviceImpl.getCookie(model);
+ }
+
+ @Override
+ public UserModel authenticate(char[] cookie) {
+ return serviceImpl.authenticate(cookie);
+ }
+
+ @Override
+ public UserModel authenticate(String username, char[] password) {
+ return serviceImpl.authenticate(username, password);
+ }
+
+ @Override
+ public UserModel getUserModel(String username) {
+ return serviceImpl.getUserModel(username);
+ }
+
+ @Override
+ public boolean updateUserModel(UserModel model) {
+ return serviceImpl.updateUserModel(model);
+ }
+
+ @Override
+ public boolean updateUserModel(String username, UserModel model) {
+ return serviceImpl.updateUserModel(username, model);
+ }
+
+ @Override
+ public boolean deleteUserModel(UserModel model) {
+ return serviceImpl.deleteUserModel(model);
+ }
+
+ @Override
+ public boolean deleteUser(String username) {
+ return serviceImpl.deleteUser(username);
+ }
+
+ @Override
+ public List<String> getAllUsernames() {
+ return serviceImpl.getAllUsernames();
+ }
+
+ @Override
+ public List<String> getAllTeamNames() {
+ return serviceImpl.getAllTeamNames();
+ }
+
+ @Override
+ public List<String> getTeamnamesForRepositoryRole(String role) {
+ return serviceImpl.getTeamnamesForRepositoryRole(role);
+ }
+
+ @Override
+ public boolean setTeamnamesForRepositoryRole(String role, List<String> teamnames) {
+ return serviceImpl.setTeamnamesForRepositoryRole(role, teamnames);
+ }
+
+ @Override
+ public TeamModel getTeamModel(String teamname) {
+ return serviceImpl.getTeamModel(teamname);
+ }
+
+ @Override
+ public boolean updateTeamModel(TeamModel model) {
+ return serviceImpl.updateTeamModel(model);
+ }
+
+ @Override
+ public boolean updateTeamModel(String teamname, TeamModel model) {
+ return serviceImpl.updateTeamModel(teamname, model);
+ }
+
+ @Override
+ public boolean deleteTeamModel(TeamModel model) {
+ return serviceImpl.deleteTeamModel(model);
+ }
+
+ @Override
+ public boolean deleteTeam(String teamname) {
+ return serviceImpl.deleteTeam(teamname);
+ }
+
+ @Override
+ public List<String> getUsernamesForRepositoryRole(String role) {
+ return serviceImpl.getUsernamesForRepositoryRole(role);
+ }
+
+ @Override
+ public boolean setUsernamesForRepositoryRole(String role, List<String> usernames) {
+ return serviceImpl.setUsernamesForRepositoryRole(role, usernames);
+ }
+
+ @Override
+ public boolean renameRepositoryRole(String oldRole, String newRole) {
+ return serviceImpl.renameRepositoryRole(oldRole, newRole);
+ }
+
+ @Override
+ public boolean deleteRepositoryRole(String role) {
+ return serviceImpl.deleteRepositoryRole(role);
+ }
+}
diff --git a/src/com/gitblit/UserServiceWrapper.java b/src/com/gitblit/UserServiceWrapper.java deleted file mode 100644 index 88eab488..00000000 --- a/src/com/gitblit/UserServiceWrapper.java +++ /dev/null @@ -1,221 +0,0 @@ -/*
- * Copyright 2011 gitblit.com.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.gitblit;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.MessageFormat;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.gitblit.models.TeamModel;
-import com.gitblit.models.UserModel;
-
-/**
- * This class wraps the default user service and is recommended as the starting
- * point for custom user service implementations.
- *
- * This does seem a little convoluted, but the idea is to allow IUserService to
- * evolve and be replaced without hampering custom implementations.
- *
- * The most common need for a custom IUserService is to override authentication
- * and then delegate to one of Gitblit's user services. Subclassing this allows
- * for authentication customization without having to keep-up-with IUSerService
- * API changes.
- *
- * @author James Moger
- *
- */
-public abstract class UserServiceWrapper implements IUserService {
-
- protected IUserService defaultService;
-
- private final Logger logger = LoggerFactory.getLogger(UserServiceWrapper.class);
-
- public UserServiceWrapper() {
- }
-
- @SuppressWarnings("deprecation")
- @Override
- public final void setup(IStoredSettings settings) {
- File realmFile = GitBlit.getFileOrFolder(Keys.realm.userService, "users.conf");
- if (realmFile.exists()) {
- // load the existing realm file
- if (realmFile.getName().toLowerCase().endsWith(".properties")) {
- // load the v0.5.0 - v0.7.0 properties-based realm file
- defaultService = new FileUserService(realmFile);
-
- // automatically create a users.conf realm file from the
- // original users.properties file
- File usersConfig = new File(realmFile.getParentFile(), "users.conf");
- if (!usersConfig.exists()) {
- logger.info(MessageFormat.format("Automatically creating {0} based on {1}",
- usersConfig.getAbsolutePath(), realmFile.getAbsolutePath()));
- ConfigUserService configService = new ConfigUserService(usersConfig);
- for (String username : defaultService.getAllUsernames()) {
- UserModel userModel = defaultService.getUserModel(username);
- configService.updateUserModel(userModel);
- }
- }
-
- // issue suggestion about switching to users.conf
- logger.warn("Please consider using \"users.conf\" instead of the deprecated \"users.properties\" file");
- } else if (realmFile.getName().toLowerCase().endsWith(".conf")) {
- // load the config-based realm file
- defaultService = new ConfigUserService(realmFile);
- }
- } else {
- // Create a new realm file and add the default admin
- // account. This is necessary for bootstrapping a dynamic
- // environment like running on a cloud service.
- // As of v0.8.0 the default realm file is ConfigUserService.
- try {
- realmFile = GitBlit.getFileOrFolder(Keys.realm.userService, "users.conf");
- realmFile.createNewFile();
- defaultService = new ConfigUserService(realmFile);
- UserModel admin = new UserModel("admin");
- admin.password = "admin";
- admin.canAdmin = true;
- admin.excludeFromFederation = true;
- defaultService.updateUserModel(admin);
- } catch (IOException x) {
- logger.error(MessageFormat.format("COULD NOT CREATE REALM FILE {0}!", realmFile), x);
- }
- }
-
- // call subclass setup
- setupService(settings);
- }
-
- /**
- * Subclasses must implement this method.
- *
- * @param settings
- */
- public abstract void setupService(IStoredSettings settings);
-
- @Override
- public boolean supportsCookies() {
- return defaultService.supportsCookies();
- }
-
- @Override
- public char[] getCookie(UserModel model) {
- return defaultService.getCookie(model);
- }
-
- @Override
- public UserModel authenticate(char[] cookie) {
- return defaultService.authenticate(cookie);
- }
-
- @Override
- public UserModel authenticate(String username, char[] password) {
- return defaultService.authenticate(username, password);
- }
-
- @Override
- public UserModel getUserModel(String username) {
- return defaultService.getUserModel(username);
- }
-
- @Override
- public boolean updateUserModel(UserModel model) {
- return defaultService.updateUserModel(model);
- }
-
- @Override
- public boolean updateUserModel(String username, UserModel model) {
- return defaultService.updateUserModel(username, model);
- }
-
- @Override
- public boolean deleteUserModel(UserModel model) {
- return defaultService.deleteUserModel(model);
- }
-
- @Override
- public boolean deleteUser(String username) {
- return defaultService.deleteUser(username);
- }
-
- @Override
- public List<String> getAllUsernames() {
- return defaultService.getAllUsernames();
- }
-
- @Override
- public List<String> getAllTeamNames() {
- return defaultService.getAllTeamNames();
- }
-
- @Override
- public List<String> getTeamnamesForRepositoryRole(String role) {
- return defaultService.getTeamnamesForRepositoryRole(role);
- }
-
- @Override
- public boolean setTeamnamesForRepositoryRole(String role, List<String> teamnames) {
- return defaultService.setTeamnamesForRepositoryRole(role, teamnames);
- }
-
- @Override
- public TeamModel getTeamModel(String teamname) {
- return defaultService.getTeamModel(teamname);
- }
-
- @Override
- public boolean updateTeamModel(TeamModel model) {
- return defaultService.updateTeamModel(model);
- }
-
- @Override
- public boolean updateTeamModel(String teamname, TeamModel model) {
- return defaultService.updateTeamModel(teamname, model);
- }
-
- @Override
- public boolean deleteTeamModel(TeamModel model) {
- return defaultService.deleteTeamModel(model);
- }
-
- @Override
- public boolean deleteTeam(String teamname) {
- return defaultService.deleteTeam(teamname);
- }
-
- @Override
- public List<String> getUsernamesForRepositoryRole(String role) {
- return defaultService.getUsernamesForRepositoryRole(role);
- }
-
- @Override
- public boolean setUsernamesForRepositoryRole(String role, List<String> usernames) {
- return defaultService.setUsernamesForRepositoryRole(role, usernames);
- }
-
- @Override
- public boolean renameRepositoryRole(String oldRole, String newRole) {
- return defaultService.renameRepositoryRole(oldRole, newRole);
- }
-
- @Override
- public boolean deleteRepositoryRole(String role) {
- return defaultService.deleteRepositoryRole(role);
- }
-}
diff --git a/src/com/gitblit/client/EditRepositoryDialog.java b/src/com/gitblit/client/EditRepositoryDialog.java index 44b6fc6a..b7278623 100644 --- a/src/com/gitblit/client/EditRepositoryDialog.java +++ b/src/com/gitblit/client/EditRepositoryDialog.java @@ -89,7 +89,7 @@ public class EditRepositoryDialog extends JDialog { private JCheckBox isFrozen;
- private JTextField mailRecipientsField;
+ private JTextField mailingListsField;
private JComboBox accessRestriction;
@@ -164,8 +164,8 @@ public class EditRepositoryDialog extends JDialog { anRepository.skipSummaryMetrics);
isFrozen = new JCheckBox(Translation.get("gb.isFrozenDescription"), anRepository.isFrozen);
- mailRecipientsField = new JTextField(anRepository.mailRecipients == null ? ""
- : StringUtils.flattenStrings(anRepository.mailRecipients, " "), 50);
+ mailingListsField = new JTextField(anRepository.mailingLists == null ? ""
+ : StringUtils.flattenStrings(anRepository.mailingLists, " "), 50);
accessRestriction = new JComboBox(AccessRestrictionType.values());
accessRestriction.setRenderer(new AccessRestrictionRenderer());
@@ -198,7 +198,7 @@ public class EditRepositoryDialog extends JDialog { fieldsPanel
.add(newFieldPanel(Translation.get("gb.skipSummaryMetrics"), skipSummaryMetrics));
fieldsPanel.add(newFieldPanel(Translation.get("gb.isFrozen"), isFrozen));
- fieldsPanel.add(newFieldPanel(Translation.get("gb.mailRecipients"), mailRecipientsField));
+ fieldsPanel.add(newFieldPanel(Translation.get("gb.mailingLists"), mailingListsField));
usersPalette = new JPalette<String>();
JPanel accessPanel = new JPanel(new BorderLayout(5, 5));
@@ -371,8 +371,17 @@ public class EditRepositoryDialog extends JDialog { repository.skipSummaryMetrics = skipSummaryMetrics.isSelected();
repository.isFrozen = isFrozen.isSelected();
- repository.mailRecipients = StringUtils.getStringsFromValue(mailRecipientsField.getText()
- .trim(), " ");
+ String ml = mailingListsField.getText();
+ if (!StringUtils.isEmpty(ml)) {
+ Set<String> list = new HashSet<String>();
+ for (String address : ml.split("(,|\\s)")) {
+ if (StringUtils.isEmpty(address)) {
+ continue;
+ }
+ list.add(address.toLowerCase());
+ }
+ repository.mailingLists = new ArrayList<String>(list);
+ }
repository.accessRestriction = (AccessRestrictionType) accessRestriction.getSelectedItem();
repository.federationStrategy = (FederationStrategy) federationStrategy.getSelectedItem();
diff --git a/src/com/gitblit/models/RepositoryModel.java b/src/com/gitblit/models/RepositoryModel.java index fc1de8ac..7e33ab06 100644 --- a/src/com/gitblit/models/RepositoryModel.java +++ b/src/com/gitblit/models/RepositoryModel.java @@ -57,7 +57,7 @@ public class RepositoryModel implements Serializable, Comparable<RepositoryModel public String size;
public List<String> preReceiveScripts;
public List<String> postReceiveScripts;
- public List<String> mailRecipients;
+ public List<String> mailingLists;
public RepositoryModel() {
this("", "", "", new Date(0));
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties index 4eeb887c..c0b0010d 100644 --- a/src/com/gitblit/wicket/GitBlitWebApp.properties +++ b/src/com/gitblit/wicket/GitBlitWebApp.properties @@ -196,8 +196,8 @@ gb.newTeam = new team gb.permittedTeams = permitted teams
gb.emptyRepository = empty repository
gb.repositoryUrl = repository url
-gb.mailRecipients = mail recipients
-gb.mailRecipientsDescription = space-delimited, used by sendemail Groovy hook
+gb.mailingLists = mailing lists
+gb.mailingListsDescription = used by the sendmail hook
gb.preReceiveScripts = pre-receive scripts
gb.postReceiveScripts = post-receive scripts
-gb.groovyHookScripts = hook scripts
\ No newline at end of file +gb.hookScripts = hook scripts
\ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.html b/src/com/gitblit/wicket/pages/EditRepositoryPage.html index 3e221225..310f59e5 100644 --- a/src/com/gitblit/wicket/pages/EditRepositoryPage.html +++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.html @@ -11,18 +11,18 @@ <table class="plain">
<tbody class="settings">
<tr><td colspan="2"><h3><wicket:message key="gb.general"></wicket:message></h3></td></tr>
- <tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="name" id="name" size="40" tabindex="1" /> <i><wicket:message key="gb.nameDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="name" id="name" size="40" tabindex="1" /> <span class="help-inline"><wicket:message key="gb.nameDescription"></wicket:message></span></td></tr>
<tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="description" size="40" tabindex="2" /></td></tr>
<tr><th><wicket:message key="gb.origin"></wicket:message></th><td class="edit"><input class="span7" type="text" wicket:id="origin" size="80" tabindex="3" /></td></tr>
- <tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select wicket:id="owner" tabindex="4" /> <i><wicket:message key="gb.ownerDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.enableTickets"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="5" /> <i><wicket:message key="gb.useTicketsDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.enableDocs"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="6" /> <i><wicket:message key="gb.useDocsDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.showRemoteBranches"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showRemoteBranches" tabindex="7" /> <i><wicket:message key="gb.showRemoteBranchesDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.showReadme"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showReadme" tabindex="8" /> <i><wicket:message key="gb.showReadmeDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.skipSizeCalculation"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="skipSizeCalculation" tabindex="9" /> <i><wicket:message key="gb.skipSizeCalculationDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.skipSummaryMetrics"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="skipSummaryMetrics" tabindex="10" /> <i><wicket:message key="gb.skipSummaryMetricsDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="isFrozen" tabindex="11" /> <i><wicket:message key="gb.isFrozenDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.mailRecipients"></wicket:message></th><td class="edit"><input class="span9" type="text" wicket:id="mailRecipients" size="40" tabindex="12" /> <i><wicket:message key="gb.mailRecipientsDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select wicket:id="owner" tabindex="4" /> <span class="help-inline"><wicket:message key="gb.ownerDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.enableTickets"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="5" /> <span class="help-inline"><wicket:message key="gb.useTicketsDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.enableDocs"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="6" /> <span class="help-inline"><wicket:message key="gb.useDocsDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.showRemoteBranches"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showRemoteBranches" tabindex="7" /> <span class="help-inline"><wicket:message key="gb.showRemoteBranchesDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.showReadme"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showReadme" tabindex="8" /> <span class="help-inline"><wicket:message key="gb.showReadmeDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.skipSizeCalculation"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="skipSizeCalculation" tabindex="9" /> <span class="help-inline"><wicket:message key="gb.skipSizeCalculationDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.skipSummaryMetrics"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="skipSummaryMetrics" tabindex="10" /> <span class="help-inline"><wicket:message key="gb.skipSummaryMetricsDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="isFrozen" tabindex="11" /> <span class="help-inline"><wicket:message key="gb.isFrozenDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.mailingLists"></wicket:message></th><td class="edit"><input class="span12" type="text" wicket:id="mailingLists" size="40" tabindex="12" /> <span class="help-inline"><wicket:message key="gb.mailingListsDescription"></wicket:message></span></td></tr>
<tr><td colspan="2"><h3><wicket:message key="gb.accessRestriction"></wicket:message></h3></td></tr>
<tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select class="span6" wicket:id="accessRestriction" tabindex="13" /></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.permittedUsers"></wicket:message></th><td style="padding:2px;"><span wicket:id="users"></span></td></tr>
@@ -33,7 +33,7 @@ <tr><td colspan="2"><h3><wicket:message key="gb.hookScripts"></wicket:message></h3></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.preReceiveScripts"></wicket:message></th><td style="padding:2px;"><span wicket:id="preReceiveScripts"></span></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.postReceiveScripts"></wicket:message></th><td style="padding:2px;"><span wicket:id="postReceiveScripts"></span></td></tr>
- <tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="15" /> <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="16" /> </td></tr>
+ <tr><td colspan='2'><div class="actions" "><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="15" /> <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="16" /></div></td></tr>
</tbody>
</table>
</form>
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java index 492addc3..f5950539 100644 --- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java +++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java @@ -19,9 +19,11 @@ import java.text.MessageFormat; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.wicket.PageParameters;
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
@@ -55,7 +57,7 @@ public class EditRepositoryPage extends RootSubPage { private boolean isAdmin;
- private IModel<String> mailRecipients;
+ private IModel<String> mailingLists;
public EditRepositoryPage() {
// create constructor
@@ -118,7 +120,8 @@ public class EditRepositoryPage extends RootSubPage { }
final Palette<String> preReceivePalette = new Palette<String>("preReceiveScripts",
new ListModel<String>(preReceiveScripts), new CollectionModel<String>(GitBlit
- .self().getAvailableScripts()), new ChoiceRenderer<String>("", ""), 12, true);
+ .self().getAvailableScripts()), new ChoiceRenderer<String>("", ""), 12,
+ true);
// post-receive palette
if (repositoryModel.postReceiveScripts != null) {
@@ -126,7 +129,8 @@ public class EditRepositoryPage extends RootSubPage { }
final Palette<String> postReceivePalette = new Palette<String>("postReceiveScripts",
new ListModel<String>(postReceiveScripts), new CollectionModel<String>(GitBlit
- .self().getAvailableScripts()), new ChoiceRenderer<String>("", ""), 12, true);
+ .self().getAvailableScripts()), new ChoiceRenderer<String>("", ""), 12,
+ true);
CompoundPropertyModel<RepositoryModel> model = new CompoundPropertyModel<RepositoryModel>(
repositoryModel);
@@ -191,11 +195,17 @@ public class EditRepositoryPage extends RootSubPage { }
}
- // set mail recipients
- String ml = mailRecipients.getObject();
+ // set mailing lists
+ String ml = mailingLists.getObject();
if (!StringUtils.isEmpty(ml)) {
- List<String> list = StringUtils.getStringsFromValue(ml.trim(), " ");
- repositoryModel.mailRecipients = list;
+ Set<String> list = new HashSet<String>();
+ for (String address : ml.split("(,|\\s)")) {
+ if (StringUtils.isEmpty(address)) {
+ continue;
+ }
+ list.add(address.toLowerCase());
+ }
+ repositoryModel.mailingLists = new ArrayList<String>(list);
}
// pre-receive scripts
@@ -275,9 +285,9 @@ public class EditRepositoryPage extends RootSubPage { form.add(new CheckBox("showReadme"));
form.add(new CheckBox("skipSizeCalculation"));
form.add(new CheckBox("skipSummaryMetrics"));
- mailRecipients = new Model<String>(repositoryModel.mailRecipients == null ? ""
- : StringUtils.flattenStrings(repositoryModel.mailRecipients, " "));
- form.add(new TextField<String>("mailRecipients", mailRecipients));
+ mailingLists = new Model<String>(repositoryModel.mailingLists == null ? ""
+ : StringUtils.flattenStrings(repositoryModel.mailingLists, " "));
+ form.add(new TextField<String>("mailingLists", mailingLists));
form.add(usersPalette);
form.add(teamsPalette);
form.add(federationSetsPalette);
diff --git a/src/com/gitblit/wicket/pages/EditTeamPage.html b/src/com/gitblit/wicket/pages/EditTeamPage.html index 84a53e3c..614f0aa1 100644 --- a/src/com/gitblit/wicket/pages/EditTeamPage.html +++ b/src/com/gitblit/wicket/pages/EditTeamPage.html @@ -9,13 +9,13 @@ <!-- User Table -->
<form style="padding-top:5px;" wicket:id="editForm">
<table class="plain">
- <tbody>
+ <tbody class="settings">
<tr><th><wicket:message key="gb.teamName"></wicket:message></th><td class="edit"><input type="text" wicket:id="name" id="name" size="30" tabindex="1" /></td></tr>
<tr><td colspan="2"><hr></hr></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.teamMembers"></wicket:message></th><td style="padding:2px;"><span wicket:id="users"></span></td></tr>
<tr><td colspan="2"><hr></hr></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.restrictedRepositories"></wicket:message></th><td style="padding:2px;"><span wicket:id="repositories"></span></td></tr>
- <tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="3" /> <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="4" /></td></tr>
+ <tr><td colspan='2'><div class="actions"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="3" /> <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="4" /></div></td></tr>
</tbody>
</table>
</form>
diff --git a/src/com/gitblit/wicket/pages/EditUserPage.html b/src/com/gitblit/wicket/pages/EditUserPage.html index 978393bb..319a2b65 100644 --- a/src/com/gitblit/wicket/pages/EditUserPage.html +++ b/src/com/gitblit/wicket/pages/EditUserPage.html @@ -9,17 +9,17 @@ <!-- User Table -->
<form style="padding-top:5px;" wicket:id="editForm">
<table class="plain">
- <tbody>
+ <tbody class="settings">
<tr><th><wicket:message key="gb.username"></wicket:message></th><td class="edit"><input type="text" wicket:id="username" id="username" size="30" tabindex="1" /></td></tr>
<tr><th><wicket:message key="gb.password"></wicket:message></th><td class="edit"><input type="password" wicket:id="password" size="30" tabindex="2" /></td></tr>
<tr><th><wicket:message key="gb.confirmPassword"></wicket:message></th><td class="edit"><input type="password" wicket:id="confirmPassword" size="30" tabindex="3" /></td></tr>
- <tr><th><wicket:message key="gb.canAdmin"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="canAdmin" tabindex="6" /> <i><wicket:message key="gb.canAdminDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.excludeFromFederation"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="excludeFromFederation" tabindex="7" /> <i><wicket:message key="gb.excludeFromFederationDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.canAdmin"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="canAdmin" tabindex="6" /> <span class="help-inline"><wicket:message key="gb.canAdminDescription"></wicket:message></span></td></tr>
+ <tr><th><wicket:message key="gb.excludeFromFederation"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="excludeFromFederation" tabindex="7" /> <span class="help-inline"><wicket:message key="gb.excludeFromFederationDescription"></wicket:message></span></td></tr>
<tr><td colspan="2"><hr></hr></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.teamMemberships"></wicket:message></th><td style="padding:2px;"><span wicket:id="teams"></span></td></tr>
<tr><td colspan="2"><hr></hr></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.restrictedRepositories"></wicket:message></th><td style="padding:2px;"><span wicket:id="repositories"></span></td></tr>
- <tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="8" /> <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="9" /></td></tr>
+ <tr><td colspan='2'><div class="actions"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="8" /> <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="9" /></div></td></tr>
</tbody>
</table>
</form>
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/com/gitblit/wicket/panels/RepositoriesPanel.java index fc90316f..118ad6da 100644 --- a/src/com/gitblit/wicket/panels/RepositoriesPanel.java +++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.java @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.List;
import java.util.Map;
+import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
@@ -157,7 +158,7 @@ public class RepositoriesPanel extends BasePanel { }
// repository swatch
- Label swatch = new Label("repositorySwatch", " ");
+ Component swatch = new Label("repositorySwatch", " ").setEscapeModelStrings(false);
WicketUtils.setCssBackground(swatch, entry.name);
row.add(swatch);
swatch.setVisible(showSwatch);
|