From 118805311f425b7d8876ff713276eedb8a917673 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 24 Jun 2013 15:15:52 -0400
Subject: [PATCH] Fixed case-sensitivity bug in repository name enumeration
---
src/main/java/com/gitblit/wicket/pages/RootPage.java | 212 +++++++++++++++++++++++++++++++++++++---------------
1 files changed, 151 insertions(+), 61 deletions(-)
diff --git a/src/main/java/com/gitblit/wicket/pages/RootPage.java b/src/main/java/com/gitblit/wicket/pages/RootPage.java
index adcd7b1..f4ac907 100644
--- a/src/main/java/com/gitblit/wicket/pages/RootPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RootPage.java
@@ -27,12 +27,17 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeSet;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern;
+import org.apache.wicket.MarkupContainer;
import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.WebResponse;
@@ -47,8 +52,10 @@
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.PageRegistration;
import com.gitblit.wicket.PageRegistration.DropDownMenuItem;
+import com.gitblit.wicket.PageRegistration.DropDownToggleItem;
import com.gitblit.wicket.SessionlessForm;
import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.GravatarImage;
import com.gitblit.wicket.panels.NavigationPanel;
/**
@@ -94,67 +101,47 @@
setStatelessHint(true);
}
}
+
+ if (authenticateView || authenticateAdmin) {
+ if (GitBlitWebSession.get().isLoggedIn()) {
+ UserMenu userFragment = new UserMenu("userPanel", "userMenuFragment", RootPage.this);
+ add(userFragment);
+ } else {
+ LoginForm loginForm = new LoginForm("userPanel", "loginFormFragment", RootPage.this);
+ add(loginForm);
+ }
+ } else {
+ add(new Label("userPanel").setVisible(false));
+ }
+
boolean showRegistrations = GitBlit.canFederate()
&& GitBlit.getBoolean(Keys.web.showFederationRegistrations, false);
// navigation links
List<PageRegistration> pages = new ArrayList<PageRegistration>();
- pages.add(new PageRegistration("gb.repositories", RepositoriesPage.class,
- getRootPageParameters()));
- pages.add(new PageRegistration("gb.activity", ActivityPage.class, getRootPageParameters()));
- if (GitBlit.getBoolean(Keys.web.allowLuceneIndexing, true)) {
- pages.add(new PageRegistration("gb.search", LuceneSearchPage.class));
- }
- if (showAdmin) {
- pages.add(new PageRegistration("gb.users", UsersPage.class));
- }
- if (showAdmin || showRegistrations) {
- pages.add(new PageRegistration("gb.federation", FederationPage.class));
- }
-
if (!authenticateView || (authenticateView && GitBlitWebSession.get().isLoggedIn())) {
- addDropDownMenus(pages);
- }
-
- NavigationPanel navPanel = new NavigationPanel("navPanel", getClass(), pages);
- add(navPanel);
-
- // login form
- SessionlessForm<Void> loginForm = new SessionlessForm<Void>("loginForm", getClass(), getPageParameters()) {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void onSubmit() {
- String username = RootPage.this.username.getObject();
- char[] password = RootPage.this.password.getObject().toCharArray();
-
- UserModel user = GitBlit.self().authenticate(username, password);
- if (user == null) {
- error(getString("gb.invalidUsernameOrPassword"));
- } else if (user.username.equals(Constants.FEDERATION_USER)) {
- // disallow the federation user from logging in via the
- // web ui
- error(getString("gb.invalidUsernameOrPassword"));
- user = null;
- } else {
- loginUser(user);
- }
+ pages.add(new PageRegistration(GitBlitWebSession.get().isLoggedIn() ? "gb.myDashboard" : "gb.dashboard", MyDashboardPage.class,
+ getRootPageParameters()));
+ pages.add(new PageRegistration("gb.repositories", RepositoriesPage.class,
+ getRootPageParameters()));
+ pages.add(new PageRegistration("gb.activity", ActivityPage.class, getRootPageParameters()));
+ if (GitBlit.getBoolean(Keys.web.allowLuceneIndexing, true)) {
+ pages.add(new PageRegistration("gb.search", LuceneSearchPage.class));
}
- };
- TextField<String> unameField = new TextField<String>("username", username);
- WicketUtils.setInputPlaceholder(unameField, getString("gb.username"));
- loginForm.add(unameField);
- PasswordTextField pwField = new PasswordTextField("password", password);
- WicketUtils.setInputPlaceholder(pwField, getString("gb.password"));
- loginForm.add(pwField);
- add(loginForm);
+ if (showAdmin) {
+ pages.add(new PageRegistration("gb.users", UsersPage.class));
+ }
+ if (showAdmin || showRegistrations) {
+ pages.add(new PageRegistration("gb.federation", FederationPage.class));
+ }
- if (authenticateView || authenticateAdmin) {
- loginForm.setVisible(!GitBlitWebSession.get().isLoggedIn());
- } else {
- loginForm.setVisible(false);
+ if (!authenticateView || (authenticateView && GitBlitWebSession.get().isLoggedIn())) {
+ addDropDownMenus(pages);
+ }
}
+
+ NavigationPanel navPanel = new NavigationPanel("navPanel", getRootNavPageClass(), pages);
+ add(navPanel);
// display an error message cached from a redirect
String cachedMessage = GitBlitWebSession.get().clearErrorMessage();
@@ -171,6 +158,10 @@
}
super.setupPage(repositoryName, pageName);
+ }
+
+ protected Class<? extends BasePage> getRootNavPageClass() {
+ return getClass();
}
private PageParameters getRootPageParameters() {
@@ -189,7 +180,7 @@
// remove days back parameter if it is the default value
if (params.containsKey("db")
- && params.getInt("db") == GitBlit.getInteger(Keys.web.activityDuration, 14)) {
+ && params.getInt("db") == GitBlit.getInteger(Keys.web.activityDuration, 7)) {
params.remove("db");
}
return params;
@@ -266,7 +257,7 @@
List<String> sets = new ArrayList<String>(setMap.keySet());
Collections.sort(sets);
for (String set : sets) {
- filters.add(new DropDownMenuItem(MessageFormat.format("{0} ({1})", set,
+ filters.add(new DropDownToggleItem(MessageFormat.format("{0} ({1})", set,
setMap.get(set).get()), "set", set, params));
}
// divider
@@ -278,7 +269,7 @@
List<TeamModel> teams = new ArrayList<TeamModel>(user.teams);
Collections.sort(teams);
for (TeamModel team : teams) {
- filters.add(new DropDownMenuItem(MessageFormat.format("{0} ({1})", team.name,
+ filters.add(new DropDownToggleItem(MessageFormat.format("{0} ({1})", team.name,
team.repositories.size()), "team", team.name, params));
}
// divider
@@ -293,7 +284,7 @@
for (String expression : expressions) {
if (!StringUtils.isEmpty(expression)) {
addedExpression = true;
- filters.add(new DropDownMenuItem(null, "x", expression, params));
+ filters.add(new DropDownToggleItem(null, "x", expression, params));
}
}
// if we added any custom expressions, add a divider
@@ -306,18 +297,36 @@
protected List<DropDownMenuItem> getTimeFilterItems(PageParameters params) {
// days back choices - additive parameters
- int daysBack = GitBlit.getInteger(Keys.web.activityDuration, 14);
+ int daysBack = GitBlit.getInteger(Keys.web.activityDuration, 7);
if (daysBack < 1) {
- daysBack = 14;
+ daysBack = 7;
}
+ PageParameters clonedParams;
+ if (params == null) {
+ clonedParams = new PageParameters();
+ } else {
+ clonedParams = new PageParameters(params);
+ }
+
+ if (!clonedParams.containsKey("db")) {
+ clonedParams.put("db", daysBack);
+ }
+
List<DropDownMenuItem> items = new ArrayList<DropDownMenuItem>();
- Set<Integer> choicesSet = new HashSet<Integer>(Arrays.asList(daysBack, 14, 28, 60, 90, 180));
+ Set<Integer> choicesSet = new TreeSet<Integer>(GitBlit.getIntegers(Keys.web.activityDurationChoices));
+ if (choicesSet.isEmpty()) {
+ choicesSet.addAll(Arrays.asList(1, 3, 7, 14, 21, 28));
+ }
List<Integer> choices = new ArrayList<Integer>(choicesSet);
Collections.sort(choices);
String lastDaysPattern = getString("gb.lastNDays");
for (Integer db : choices) {
- String txt = MessageFormat.format(lastDaysPattern, db);
- items.add(new DropDownMenuItem(txt, "db", db.toString(), params));
+ if (db == 1) {
+ items.add(new DropDownMenuItem(getString("gb.time.today"), "db", db.toString(), clonedParams));
+ } else {
+ String txt = MessageFormat.format(lastDaysPattern, db);
+ items.add(new DropDownMenuItem(txt, "db", db.toString(), clonedParams));
+ }
}
items.add(new DropDownMenuItem());
return items;
@@ -451,4 +460,85 @@
Collections.sort(list);
return list;
}
+
+ /**
+ * Inline login form.
+ */
+ private class LoginForm extends Fragment {
+ private static final long serialVersionUID = 1L;
+
+ public LoginForm(String id, String markupId, MarkupContainer markupProvider) {
+ super(id, markupId, markupProvider);
+ setRenderBodyOnly(true);
+
+ SessionlessForm<Void> loginForm = new SessionlessForm<Void>("loginForm", RootPage.this.getClass(), getPageParameters()) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onSubmit() {
+ String username = RootPage.this.username.getObject();
+ char[] password = RootPage.this.password.getObject().toCharArray();
+
+ UserModel user = GitBlit.self().authenticate(username, password);
+ if (user == null) {
+ error(getString("gb.invalidUsernameOrPassword"));
+ } else if (user.username.equals(Constants.FEDERATION_USER)) {
+ // disallow the federation user from logging in via the
+ // web ui
+ error(getString("gb.invalidUsernameOrPassword"));
+ user = null;
+ } else {
+ loginUser(user);
+ }
+ }
+ };
+ TextField<String> unameField = new TextField<String>("username", username);
+ WicketUtils.setInputPlaceholder(unameField, markupProvider.getString("gb.username"));
+ loginForm.add(unameField);
+ PasswordTextField pwField = new PasswordTextField("password", password);
+ WicketUtils.setInputPlaceholder(pwField, markupProvider.getString("gb.password"));
+ loginForm.add(pwField);
+ add(loginForm);
+ }
+ }
+
+ /**
+ * Menu for the authenticated user.
+ */
+ static class UserMenu extends Fragment {
+
+ private static final long serialVersionUID = 1L;
+
+ public UserMenu(String id, String markupId, MarkupContainer markupProvider) {
+ super(id, markupId, markupProvider);
+ setRenderBodyOnly(true);
+
+ GitBlitWebSession session = GitBlitWebSession.get();
+ UserModel user = session.getUser();
+ boolean editCredentials = GitBlit.self().supportsCredentialChanges(user);
+ boolean standardLogin = session.authenticationType.isStandard();
+
+ if (GitBlit.getBoolean(Keys.web.allowGravatar, true)) {
+ add(new GravatarImage("username", user.getDisplayName(),
+ user.emailAddress, "navbarGravatar", 20, false, false));
+ } else {
+ add(new Label("username", user.getDisplayName()));
+ }
+
+ add(new Label("displayName", user.getDisplayName()));
+
+ add(new BookmarkablePageLink<Void>("newRepository",
+ EditRepositoryPage.class).setVisible(user.canAdmin() || user.canCreate()));
+
+ add(new BookmarkablePageLink<Void>("myProfile",
+ UserPage.class, WicketUtils.newUsernameParameter(user.username)));
+
+ add(new BookmarkablePageLink<Void>("changePassword",
+ ChangePasswordPage.class).setVisible(editCredentials));
+
+ add(new BookmarkablePageLink<Void>("logout",
+ LogoutPage.class).setVisible(standardLogin));
+ }
+ }
}
--
Gitblit v1.9.1