+++ /dev/null
-/*
- * Sone - EditProfilePage.java - Copyright © 2010–2016 David Roden
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package net.pterodactylus.sone.web.pages;
-
-import static net.pterodactylus.sone.text.TextFilter.filter;
-import static net.pterodactylus.sone.utils.NumberParsers.parseInt;
-
-import java.util.List;
-
-import net.pterodactylus.sone.data.Profile;
-import net.pterodactylus.sone.data.Profile.DuplicateField;
-import net.pterodactylus.sone.data.Profile.Field;
-import net.pterodactylus.sone.data.Sone;
-import net.pterodactylus.sone.web.WebInterface;
-import net.pterodactylus.sone.web.page.FreenetRequest;
-import net.pterodactylus.util.template.Template;
-import net.pterodactylus.util.template.TemplateContext;
-import net.pterodactylus.util.web.Method;
-import freenet.clients.http.ToadletContext;
-
-/**
- * This page lets the user edit her profile.
- *
- * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
- */
-public class EditProfilePage extends SoneTemplatePage {
-
- /**
- * Creates a new “edit profile” page.
- *
- * @param template
- * The template to render
- * @param webInterface
- * The Sone web interface
- */
- public EditProfilePage(Template template, WebInterface webInterface) {
- super("editProfile.html", template, "Page.EditProfile.Title", webInterface, true);
- }
-
- //
- // TEMPLATEPAGE METHODS
- //
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void handleRequest(FreenetRequest request, TemplateContext templateContext) throws RedirectException {
- ToadletContext toadletContenxt = request.getToadletContext();
- Sone currentSone = getCurrentSone(toadletContenxt);
- Profile profile = currentSone.getProfile();
- String firstName = profile.getFirstName();
- String middleName = profile.getMiddleName();
- String lastName = profile.getLastName();
- Integer birthDay = profile.getBirthDay();
- Integer birthMonth = profile.getBirthMonth();
- Integer birthYear = profile.getBirthYear();
- String avatarId = profile.getAvatar();
- List<Field> fields = profile.getFields();
- if (request.getMethod() == Method.POST) {
- if (request.getHttpRequest().getPartAsStringFailsafe("save-profile", 4).equals("true")) {
- firstName = request.getHttpRequest().getPartAsStringFailsafe("first-name", 256).trim();
- middleName = request.getHttpRequest().getPartAsStringFailsafe("middle-name", 256).trim();
- lastName = request.getHttpRequest().getPartAsStringFailsafe("last-name", 256).trim();
- birthDay = parseInt(request.getHttpRequest().getPartAsStringFailsafe("birth-day", 256).trim(), null);
- birthMonth = parseInt(request.getHttpRequest().getPartAsStringFailsafe("birth-month", 256).trim(), null);
- birthYear = parseInt(request.getHttpRequest().getPartAsStringFailsafe("birth-year", 256).trim(), null);
- avatarId = request.getHttpRequest().getPartAsStringFailsafe("avatarId", 36);
- profile.setFirstName(firstName.length() > 0 ? firstName : null);
- profile.setMiddleName(middleName.length() > 0 ? middleName : null);
- profile.setLastName(lastName.length() > 0 ? lastName : null);
- profile.setBirthDay(birthDay).setBirthMonth(birthMonth).setBirthYear(birthYear);
- profile.setAvatar(webInterface.getCore().getImage(avatarId, false));
- for (Field field : fields) {
- String value = request.getHttpRequest().getPartAsStringFailsafe("field-" + field.getId(), 400);
- String filteredValue = filter(request.getHttpRequest().getHeader("Host"), value);
- field.setValue(filteredValue);
- }
- currentSone.setProfile(profile);
- webInterface.getCore().touchConfiguration();
- throw new RedirectException("editProfile.html");
- } else if (request.getHttpRequest().getPartAsStringFailsafe("add-field", 4).equals("true")) {
- String fieldName = request.getHttpRequest().getPartAsStringFailsafe("field-name", 256).trim();
- try {
- profile.addField(fieldName);
- currentSone.setProfile(profile);
- webInterface.getCore().touchConfiguration();
- throw new RedirectException("editProfile.html#profile-fields");
- } catch (DuplicateField df1) {
- templateContext.set("fieldName", fieldName);
- templateContext.set("duplicateFieldName", true);
- }
- } else {
- String id = getFieldId(request, "delete-field-");
- if (id != null) {
- throw new RedirectException("deleteProfileField.html?field=" + id);
- }
- id = getFieldId(request, "move-up-field-");
- if (id != null) {
- Field field = profile.getFieldById(id);
- if (field == null) {
- throw new RedirectException("invalid.html");
- }
- profile.moveFieldUp(field);
- currentSone.setProfile(profile);
- throw new RedirectException("editProfile.html#profile-fields");
- }
- id = getFieldId(request, "move-down-field-");
- if (id != null) {
- Field field = profile.getFieldById(id);
- if (field == null) {
- throw new RedirectException("invalid.html");
- }
- profile.moveFieldDown(field);
- currentSone.setProfile(profile);
- throw new RedirectException("editProfile.html#profile-fields");
- }
- id = getFieldId(request, "edit-field-");
- if (id != null) {
- throw new RedirectException("editProfileField.html?field=" + id);
- }
- }
- }
- templateContext.set("firstName", firstName);
- templateContext.set("middleName", middleName);
- templateContext.set("lastName", lastName);
- templateContext.set("birthDay", birthDay);
- templateContext.set("birthMonth", birthMonth);
- templateContext.set("birthYear", birthYear);
- templateContext.set("avatarId", avatarId);
- templateContext.set("fields", fields);
- }
-
- //
- // PRIVATE METHODS
- //
-
- /**
- * Searches for a part whose names starts with the given {@code String} and
- * extracts the ID from the located name.
- *
- * @param request
- * The request to get the parts from
- * @param partNameStart
- * The start of the name of the requested part
- * @return The parsed ID, or {@code null} if there was no part matching the
- * given string
- */
- private static String getFieldId(FreenetRequest request, String partNameStart) {
- for (String partName : request.getHttpRequest().getParts()) {
- if (partName.startsWith(partNameStart)) {
- return partName.substring(partNameStart.length());
- }
- }
- return null;
- }
-}
--- /dev/null
+package net.pterodactylus.sone.web.pages
+
+import net.pterodactylus.sone.data.Profile.DuplicateField
+import net.pterodactylus.sone.text.TextFilter
+import net.pterodactylus.sone.utils.isPOST
+import net.pterodactylus.sone.web.WebInterface
+import net.pterodactylus.sone.web.page.FreenetRequest
+import net.pterodactylus.util.template.Template
+import net.pterodactylus.util.template.TemplateContext
+
+/**
+ * This page lets the user edit her profile.
+ */
+class EditProfilePage(template: Template, webInterface: WebInterface):
+ SoneTemplatePage("editProfile.html", template, "Page.EditProfile.Title", webInterface, true) {
+
+ override fun handleRequest(request: FreenetRequest, templateContext: TemplateContext) {
+ request.currentSone!!.profile.let { profile ->
+ templateContext["firstName"] = profile.firstName
+ templateContext["middleName"] = profile.middleName
+ templateContext["lastName"] = profile.lastName
+ templateContext["birthDay"] = profile.birthDay
+ templateContext["birthMonth"] = profile.birthMonth
+ templateContext["birthYear"] = profile.birthYear
+ templateContext["avatarId"] = profile.avatar
+ templateContext["fields"] = profile.fields
+ if (request.isPOST) {
+ if (request.httpRequest.getPartAsStringFailsafe("save-profile", 4) == "true") {
+ profile.firstName = request.httpRequest.getPartAsStringFailsafe("first-name", 256).trim()
+ profile.middleName = request.httpRequest.getPartAsStringFailsafe("middle-name", 256).trim()
+ profile.lastName = request.httpRequest.getPartAsStringFailsafe("last-name", 256).trim()
+ profile.birthDay = request.httpRequest.getPartAsStringFailsafe("birth-day", 256).trim().toIntOrNull()
+ profile.birthMonth = request.httpRequest.getPartAsStringFailsafe("birth-month", 256).trim().toIntOrNull()
+ profile.birthYear = request.httpRequest.getPartAsStringFailsafe("birth-year", 256).trim().toIntOrNull()
+ profile.setAvatar(webInterface.core.getImage(request.httpRequest.getPartAsStringFailsafe("avatarId", 256).trim(), false))
+ profile.fields.forEach { field ->
+ field.value = TextFilter.filter(request.httpRequest.getHeader("Host"), request.httpRequest.getPartAsStringFailsafe("field-${field.id}", 400).trim())
+ }
+ webInterface.core.touchConfiguration()
+ throw RedirectException("editProfile.html")
+ } else if (request.httpRequest.getPartAsStringFailsafe("add-field", 4) == "true") {
+ val fieldName = request.httpRequest.getPartAsStringFailsafe("field-name", 100)
+ try {
+ profile.addField(fieldName)
+ request.currentSone!!.profile = profile
+ webInterface.core.touchConfiguration()
+ throw RedirectException("editProfile.html#profile-fields")
+ } catch (e: DuplicateField) {
+ templateContext["fieldName"] = fieldName
+ templateContext["duplicateFieldName"] = true
+ }
+ } else profile.fields.forEach { field ->
+ if (request.httpRequest.getPartAsStringFailsafe("delete-field-${field.id}", 4) == "true") {
+ throw RedirectException("deleteProfileField.html?field=${field.id}")
+ } else if (request.httpRequest.getPartAsStringFailsafe("edit-field-${field.id}", 4) == "true") {
+ throw RedirectException("editProfileField.html?field=${field.id}")
+ } else if (request.httpRequest.getPartAsStringFailsafe("move-down-field-${field.id}", 4) == "true") {
+ profile.moveFieldDown(field)
+ request.currentSone!!.profile = profile
+ throw RedirectException("editProfile.html#profile-fields")
+ } else if (request.httpRequest.getPartAsStringFailsafe("move-up-field-${field.id}", 4) == "true") {
+ profile.moveFieldUp(field)
+ request.currentSone!!.profile = profile
+ throw RedirectException("editProfile.html#profile-fields")
+ }
+ }
+ }
+ }
+ }
+
+ private val FreenetRequest.currentSone get() = sessionProvider.getCurrentSone(toadletContext)
+
+}
@Test
fun `get request stores fields of current sone’s profile in template context`() {
request("", GET)
- page.handleRequest(freenetRequest, templateContext)
+ page.processTemplate(freenetRequest, templateContext)
assertThat(templateContext["firstName"], equalTo<Any>("First"))
assertThat(templateContext["middleName"], equalTo<Any>("Middle"))
assertThat(templateContext["lastName"], equalTo<Any>("Last"))
@Test
fun `post request without any command stores fields of current sone’s profile in template context`() {
request("", POST)
- page.handleRequest(freenetRequest, templateContext)
+ page.processTemplate(freenetRequest, templateContext)
assertThat(templateContext["firstName"], equalTo<Any>("First"))
assertThat(templateContext["middleName"], equalTo<Any>("Middle"))
assertThat(templateContext["lastName"], equalTo<Any>("Last"))
profile.addField("new-field")
addHttpRequestParameter("add-field", "true")
addHttpRequestParameter("field-name", "new-field")
- page.handleRequest(freenetRequest, templateContext)
+ page.processTemplate(freenetRequest, templateContext)
assertThat(templateContext["fieldName"], equalTo<Any>("new-field"))
assertThat(templateContext["duplicateFieldName"], equalTo<Any>(true))
verify(core, never()).touchConfiguration()
}
@Test
- fun `moving an invalid field up redirects to the invalid page`() {
+ fun `moving an invalid field up does not redirect`() {
request("", POST)
addHttpRequestParameter("move-up-field-foo", "true")
- verifyRedirect("invalid.html")
+ page.processTemplate(freenetRequest, templateContext)
}
@Test
}
@Test
- fun `moving an invalid field down redirects to the invalid page`() {
+ fun `moving an invalid field down does not redirect`() {
request("", POST)
addHttpRequestParameter("move-down-field-foo", "true")
- verifyRedirect("invalid.html")
+ page.processTemplate(freenetRequest, templateContext)
}
@Test