SetPreferences: Reject invalid my menu items
Name and URL are required fields for menu items. Fail with 400 Bad Request if they are missing. Change-Id: If814919d6b6c4c78c01f60010ad991bd0f22ad3f Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
@@ -31,6 +31,7 @@ import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
|
|||||||
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategoryStrategy;
|
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategoryStrategy;
|
||||||
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat;
|
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat;
|
||||||
import com.google.gerrit.extensions.client.MenuItem;
|
import com.google.gerrit.extensions.client.MenuItem;
|
||||||
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
import com.google.gerrit.reviewdb.client.RefNames;
|
import com.google.gerrit.reviewdb.client.RefNames;
|
||||||
import com.google.gerrit.server.config.AllUsersName;
|
import com.google.gerrit.server.config.AllUsersName;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
@@ -168,4 +169,26 @@ public class GeneralPreferencesIT extends AbstractDaemonTest {
|
|||||||
assertThat(a.changesPerPage).isEqualTo(d.changesPerPage);
|
assertThat(a.changesPerPage).isEqualTo(d.changesPerPage);
|
||||||
assertPrefs(a, d, "my", "changeTable", "changesPerPage");
|
assertPrefs(a, d, "my", "changeTable", "changesPerPage");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void rejectMyMenuWithoutName() throws Exception {
|
||||||
|
GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
|
||||||
|
i.my = new ArrayList<>();
|
||||||
|
i.my.add(new MenuItem(null, "url"));
|
||||||
|
|
||||||
|
exception.expect(BadRequestException.class);
|
||||||
|
exception.expectMessage("name for menu item is required");
|
||||||
|
gApi.accounts().id(user42.getId().toString()).setPreferences(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void rejectMyMenuWithoutUrl() throws Exception {
|
||||||
|
GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
|
||||||
|
i.my = new ArrayList<>();
|
||||||
|
i.my.add(new MenuItem("name", null));
|
||||||
|
|
||||||
|
exception.expect(BadRequestException.class);
|
||||||
|
exception.expectMessage("URL for menu item is required");
|
||||||
|
gApi.accounts().id(user42.getId().toString()).setPreferences(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ public class SetPreferences implements RestModifyView<AccountResource, GeneralPr
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void writeToGit(Account.Id id, GeneralPreferencesInfo i)
|
private void writeToGit(Account.Id id, GeneralPreferencesInfo i)
|
||||||
throws RepositoryNotFoundException, IOException, ConfigInvalidException {
|
throws RepositoryNotFoundException, IOException, ConfigInvalidException, BadRequestException {
|
||||||
VersionedAccountPreferences prefs;
|
VersionedAccountPreferences prefs;
|
||||||
try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
|
try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
|
||||||
prefs = VersionedAccountPreferences.forUser(id);
|
prefs = VersionedAccountPreferences.forUser(id);
|
||||||
@@ -121,11 +121,15 @@ public class SetPreferences implements RestModifyView<AccountResource, GeneralPr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void storeMyMenus(VersionedAccountPreferences prefs, List<MenuItem> my) {
|
public static void storeMyMenus(VersionedAccountPreferences prefs, List<MenuItem> my)
|
||||||
|
throws BadRequestException {
|
||||||
Config cfg = prefs.getConfig();
|
Config cfg = prefs.getConfig();
|
||||||
if (my != null) {
|
if (my != null) {
|
||||||
unsetSection(cfg, UserConfigSections.MY);
|
unsetSection(cfg, UserConfigSections.MY);
|
||||||
for (MenuItem item : my) {
|
for (MenuItem item : my) {
|
||||||
|
checkRequiredMenuItemField(item.name, "name");
|
||||||
|
checkRequiredMenuItemField(item.url, "URL");
|
||||||
|
|
||||||
set(cfg, item.name, KEY_URL, item.url);
|
set(cfg, item.name, KEY_URL, item.url);
|
||||||
set(cfg, item.name, KEY_TARGET, item.target);
|
set(cfg, item.name, KEY_TARGET, item.target);
|
||||||
set(cfg, item.name, KEY_ID, item.id);
|
set(cfg, item.name, KEY_ID, item.id);
|
||||||
@@ -174,6 +178,13 @@ public class SetPreferences implements RestModifyView<AccountResource, GeneralPr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void checkRequiredMenuItemField(String value, String name)
|
||||||
|
throws BadRequestException {
|
||||||
|
if (Strings.isNullOrEmpty(value)) {
|
||||||
|
throw new BadRequestException(name + " for menu item is required");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void checkDownloadScheme(String downloadScheme) throws BadRequestException {
|
private void checkDownloadScheme(String downloadScheme) throws BadRequestException {
|
||||||
if (Strings.isNullOrEmpty(downloadScheme)) {
|
if (Strings.isNullOrEmpty(downloadScheme)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ public class SetPreferences implements RestModifyView<ConfigResource, GeneralPre
|
|||||||
}
|
}
|
||||||
|
|
||||||
private GeneralPreferencesInfo writeToGit(GeneralPreferencesInfo i)
|
private GeneralPreferencesInfo writeToGit(GeneralPreferencesInfo i)
|
||||||
throws RepositoryNotFoundException, IOException, ConfigInvalidException {
|
throws RepositoryNotFoundException, IOException, ConfigInvalidException, BadRequestException {
|
||||||
try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
|
try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
|
||||||
VersionedAccountPreferences p = VersionedAccountPreferences.forDefault();
|
VersionedAccountPreferences p = VersionedAccountPreferences.forDefault();
|
||||||
p.load(md);
|
p.load(md);
|
||||||
|
|||||||
Reference in New Issue
Block a user