X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FWebInterface.java;h=125f4966aa270d5f36f0bbe5234dcc9849d243cb;hp=30613af97d609d6316dbb65e49d59625af890078;hb=1adece79f07bd6ae78855c24e775661508a24e81;hpb=128580ddb154ce7d4f12108a8a70a8fe12488ffe diff --git a/src/main/java/net/pterodactylus/sone/web/WebInterface.java b/src/main/java/net/pterodactylus/sone/web/WebInterface.java index 30613af..125f496 100644 --- a/src/main/java/net/pterodactylus/sone/web/WebInterface.java +++ b/src/main/java/net/pterodactylus/sone/web/WebInterface.java @@ -1,5 +1,5 @@ /* - * Sone - WebInterface.java - Copyright © 2010–2016 David Roden + * Sone - WebInterface.java - Copyright © 2010–2019 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 @@ -30,6 +30,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -71,11 +72,11 @@ import net.pterodactylus.sone.freenet.L10nFilter; import net.pterodactylus.sone.freenet.wot.Identity; import net.pterodactylus.sone.freenet.wot.Trust; import net.pterodactylus.sone.main.Loaders; +import net.pterodactylus.sone.main.PluginHomepage; +import net.pterodactylus.sone.main.PluginVersion; +import net.pterodactylus.sone.main.PluginYear; import net.pterodactylus.sone.main.ReparseFilter; import net.pterodactylus.sone.main.SonePlugin; -import net.pterodactylus.sone.main.SonePlugin.PluginHomepage; -import net.pterodactylus.sone.main.SonePlugin.PluginVersion; -import net.pterodactylus.sone.main.SonePlugin.PluginYear; import net.pterodactylus.sone.notify.ListNotification; import net.pterodactylus.sone.notify.ListNotificationFilter; import net.pterodactylus.sone.notify.PostVisibilityFilter; @@ -120,12 +121,13 @@ import net.pterodactylus.sone.web.ajax.EditImageAjaxPage; import net.pterodactylus.sone.web.ajax.EditProfileFieldAjaxPage; import net.pterodactylus.sone.web.ajax.FollowSoneAjaxPage; import net.pterodactylus.sone.web.ajax.GetLikesAjaxPage; +import net.pterodactylus.sone.web.ajax.GetLinkedElementAjaxPage; import net.pterodactylus.sone.web.ajax.GetNotificationsAjaxPage; import net.pterodactylus.sone.web.ajax.GetPostAjaxPage; import net.pterodactylus.sone.web.ajax.GetReplyAjaxPage; import net.pterodactylus.sone.web.ajax.GetStatusAjaxPage; import net.pterodactylus.sone.web.ajax.GetTimesAjaxPage; -import net.pterodactylus.sone.web.ajax.GetTranslationPage; +import net.pterodactylus.sone.web.ajax.GetTranslationAjaxPage; import net.pterodactylus.sone.web.ajax.LikeAjaxPage; import net.pterodactylus.sone.web.ajax.LockSoneAjaxPage; import net.pterodactylus.sone.web.ajax.MarkAsKnownAjaxPage; @@ -139,6 +141,49 @@ import net.pterodactylus.sone.web.ajax.UntrustAjaxPage; import net.pterodactylus.sone.web.page.FreenetRequest; import net.pterodactylus.sone.web.page.PageToadlet; import net.pterodactylus.sone.web.page.PageToadletFactory; +import net.pterodactylus.sone.web.pages.AboutPage; +import net.pterodactylus.sone.web.pages.BookmarkPage; +import net.pterodactylus.sone.web.pages.BookmarksPage; +import net.pterodactylus.sone.web.pages.CreateAlbumPage; +import net.pterodactylus.sone.web.pages.CreatePostPage; +import net.pterodactylus.sone.web.pages.CreateReplyPage; +import net.pterodactylus.sone.web.pages.CreateSonePage; +import net.pterodactylus.sone.web.pages.DeleteAlbumPage; +import net.pterodactylus.sone.web.pages.DeleteImagePage; +import net.pterodactylus.sone.web.pages.DeletePostPage; +import net.pterodactylus.sone.web.pages.DeleteProfileFieldPage; +import net.pterodactylus.sone.web.pages.DeleteReplyPage; +import net.pterodactylus.sone.web.pages.DeleteSonePage; +import net.pterodactylus.sone.web.pages.DismissNotificationPage; +import net.pterodactylus.sone.web.pages.DistrustPage; +import net.pterodactylus.sone.web.pages.EditAlbumPage; +import net.pterodactylus.sone.web.pages.EditImagePage; +import net.pterodactylus.sone.web.pages.EditProfileFieldPage; +import net.pterodactylus.sone.web.pages.EditProfilePage; +import net.pterodactylus.sone.web.pages.FollowSonePage; +import net.pterodactylus.sone.web.pages.GetImagePage; +import net.pterodactylus.sone.web.pages.ImageBrowserPage; +import net.pterodactylus.sone.web.pages.IndexPage; +import net.pterodactylus.sone.web.pages.KnownSonesPage; +import net.pterodactylus.sone.web.pages.LikePage; +import net.pterodactylus.sone.web.pages.LockSonePage; +import net.pterodactylus.sone.web.pages.LoginPage; +import net.pterodactylus.sone.web.pages.LogoutPage; +import net.pterodactylus.sone.web.pages.MarkAsKnownPage; +import net.pterodactylus.sone.web.pages.NewPage; +import net.pterodactylus.sone.web.pages.OptionsPage; +import net.pterodactylus.sone.web.pages.RescuePage; +import net.pterodactylus.sone.web.pages.SearchPage; +import net.pterodactylus.sone.web.pages.SoneTemplatePage; +import net.pterodactylus.sone.web.pages.TrustPage; +import net.pterodactylus.sone.web.pages.UnbookmarkPage; +import net.pterodactylus.sone.web.pages.UnfollowSonePage; +import net.pterodactylus.sone.web.pages.UnlikePage; +import net.pterodactylus.sone.web.pages.UnlockSonePage; +import net.pterodactylus.sone.web.pages.UntrustPage; +import net.pterodactylus.sone.web.pages.UploadImagePage; +import net.pterodactylus.sone.web.pages.ViewPostPage; +import net.pterodactylus.sone.web.pages.ViewSonePage; import net.pterodactylus.util.notify.Notification; import net.pterodactylus.util.notify.NotificationManager; import net.pterodactylus.util.notify.TemplateNotification; @@ -176,10 +221,8 @@ import com.google.inject.Inject; /** * Bundles functionality that a web interface of a Freenet plugin needs, e.g. * references to l10n helpers. - * - * @author David ‘Bombe’ Roden */ -public class WebInterface { +public class WebInterface implements SessionProvider { /** The logger. */ private static final Logger logger = getLogger(WebInterface.class.getName()); @@ -194,7 +237,7 @@ public class WebInterface { private final SonePlugin sonePlugin; /** The registered toadlets. */ - private final List pageToadlets = new ArrayList(); + private final List pageToadlets = new ArrayList<>(); /** The form password. */ private final String formPassword; @@ -214,6 +257,8 @@ public class WebInterface { private final PostVisibilityFilter postVisibilityFilter; private final ReplyVisibilityFilter replyVisibilityFilter; + private final ElementLoader elementLoader; + private final LinkedElementRenderFilter linkedElementRenderFilter; private final TimeTextConverter timeTextConverter = new TimeTextConverter(); private final L10nFilter l10nFilter = new L10nFilter(this); @@ -236,7 +281,7 @@ public class WebInterface { private final ListNotification mentionNotification; /** Notifications for sone inserts. */ - private final Map soneInsertNotifications = new HashMap(); + private final Map soneInsertNotifications = new HashMap<>(); /** Sone locked notification ticker objects. */ private final Map> lockedSonesTickerObjects = Collections.synchronizedMap(new HashMap>()); @@ -272,6 +317,7 @@ public class WebInterface { this.listNotificationFilter = listNotificationFilter; this.postVisibilityFilter = postVisibilityFilter; this.replyVisibilityFilter = replyVisibilityFilter; + this.elementLoader = elementLoader; formPassword = sonePlugin.pluginRespirator().getToadletContainer().getFormPassword(); soneTextParser = new SoneTextParser(getCore(), getCore()); @@ -302,7 +348,7 @@ public class WebInterface { templateContextFactory.addFilter("shorten", shortenFilter = new ShortenFilter()); templateContextFactory.addFilter("render", renderFilter = new RenderFilter(getCore(), templateContextFactory)); templateContextFactory.addFilter("linked-elements", new LinkedElementsFilter(elementLoader)); - templateContextFactory.addFilter("render-linked-element", new LinkedElementRenderFilter(templateContextFactory)); + templateContextFactory.addFilter("render-linked-element", linkedElementRenderFilter = new LinkedElementRenderFilter(templateContextFactory)); templateContextFactory.addFilter("reparse", new ReparseFilter()); templateContextFactory.addFilter("unknown", new UnknownDateFilter(getL10n(), "View.Sone.Text.UnknownDate")); templateContextFactory.addFilter("format", new FormatFilter()); @@ -320,37 +366,37 @@ public class WebInterface { /* create notifications. */ Template newSoneNotificationTemplate = loaders.loadTemplate("/templates/notify/newSoneNotification.html"); - newSoneNotification = new ListNotification("new-sone-notification", "sones", newSoneNotificationTemplate, false); + newSoneNotification = new ListNotification<>("new-sone-notification", "sones", newSoneNotificationTemplate, false); Template newPostNotificationTemplate = loaders.loadTemplate("/templates/notify/newPostNotification.html"); - newPostNotification = new ListNotification("new-post-notification", "posts", newPostNotificationTemplate, false); + newPostNotification = new ListNotification<>("new-post-notification", "posts", newPostNotificationTemplate, false); Template localPostNotificationTemplate = loaders.loadTemplate("/templates/notify/newPostNotification.html"); - localPostNotification = new ListNotification("local-post-notification", "posts", localPostNotificationTemplate, false); + localPostNotification = new ListNotification<>("local-post-notification", "posts", localPostNotificationTemplate, false); Template newReplyNotificationTemplate = loaders.loadTemplate("/templates/notify/newReplyNotification.html"); - newReplyNotification = new ListNotification("new-reply-notification", "replies", newReplyNotificationTemplate, false); + newReplyNotification = new ListNotification<>("new-reply-notification", "replies", newReplyNotificationTemplate, false); Template localReplyNotificationTemplate = loaders.loadTemplate("/templates/notify/newReplyNotification.html"); - localReplyNotification = new ListNotification("local-reply-notification", "replies", localReplyNotificationTemplate, false); + localReplyNotification = new ListNotification<>("local-reply-notification", "replies", localReplyNotificationTemplate, false); Template mentionNotificationTemplate = loaders.loadTemplate("/templates/notify/mentionNotification.html"); - mentionNotification = new ListNotification("mention-notification", "posts", mentionNotificationTemplate, false); + mentionNotification = new ListNotification<>("mention-notification", "posts", mentionNotificationTemplate, false); Template lockedSonesTemplate = loaders.loadTemplate("/templates/notify/lockedSonesNotification.html"); - lockedSonesNotification = new ListNotification("sones-locked-notification", "sones", lockedSonesTemplate); + lockedSonesNotification = new ListNotification<>("sones-locked-notification", "sones", lockedSonesTemplate); Template newVersionTemplate = loaders.loadTemplate("/templates/notify/newVersionNotification.html"); newVersionNotification = new TemplateNotification("new-version-notification", newVersionTemplate); Template insertingImagesTemplate = loaders.loadTemplate("/templates/notify/inserting-images-notification.html"); - insertingImagesNotification = new ListNotification("inserting-images-notification", "images", insertingImagesTemplate); + insertingImagesNotification = new ListNotification<>("inserting-images-notification", "images", insertingImagesTemplate); Template insertedImagesTemplate = loaders.loadTemplate("/templates/notify/inserted-images-notification.html"); - insertedImagesNotification = new ListNotification("inserted-images-notification", "images", insertedImagesTemplate); + insertedImagesNotification = new ListNotification<>("inserted-images-notification", "images", insertedImagesTemplate); Template imageInsertFailedTemplate = loaders.loadTemplate("/templates/notify/image-insert-failed-notification.html"); - imageInsertFailedNotification = new ListNotification("image-insert-failed-notification", "images", imageInsertFailedTemplate); + imageInsertFailedNotification = new ListNotification<>("image-insert-failed-notification", "images", imageInsertFailedTemplate); } // @@ -362,6 +408,7 @@ public class WebInterface { * * @return The Sone core */ + @Nonnull public Core getCore() { return sonePlugin.core(); } @@ -422,6 +469,12 @@ public class WebInterface { return getCore().getLocalSone(soneId); } + @Override + @Nullable + public Sone getCurrentSone(@Nonnull ToadletContext toadletContext, boolean createSession) { + return createSession ? getCurrentSoneCreatingSession(toadletContext) : getCurrentSoneWithoutCreatingSession(toadletContext); + } + /** * Sets the currently logged in Sone. * @@ -430,7 +483,8 @@ public class WebInterface { * @param sone * The Sone to set as currently logged in */ - public void setCurrentSone(ToadletContext toadletContext, Sone sone) { + @Override + public void setCurrentSone(@Nonnull ToadletContext toadletContext, @Nullable Sone sone) { Session session = getOrCreateCurrentSession(toadletContext); if (sone == null) { session.removeAttribute("Sone.CurrentSone"); @@ -699,26 +753,27 @@ public class WebInterface { pageToadlets.add(pageToadletFactory.createPageToadlet(new LogoutPage(emptyTemplate, this), "Logout")); pageToadlets.add(pageToadletFactory.createPageToadlet(new OptionsPage(optionsTemplate, this), "Options")); pageToadlets.add(pageToadletFactory.createPageToadlet(new RescuePage(rescueTemplate, this), "Rescue")); - pageToadlets.add(pageToadletFactory.createPageToadlet(new AboutPage(aboutTemplate, this, new PluginVersion(SonePlugin.getPluginVersion()), new PluginYear(SonePlugin.getYear()), new PluginHomepage(SonePlugin.getHomepage())), "About")); - pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("noPermission.html", noPermissionTemplate, "Page.NoPermission.Title", this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyImageTitle.html", emptyImageTitleTemplate, "Page.EmptyImageTitle.Title", this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyAlbumTitle.html", emptyAlbumTitleTemplate, "Page.EmptyAlbumTitle.Title", this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new AboutPage(aboutTemplate, this, new PluginVersion(SonePlugin.getPluginVersion()), new PluginYear(sonePlugin.getYear()), new PluginHomepage(sonePlugin.getHomepage())), "About")); + pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("noPermission.html", this, noPermissionTemplate, "Page.NoPermission.Title"))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyImageTitle.html", this, emptyImageTitleTemplate, "Page.EmptyImageTitle.Title"))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyAlbumTitle.html", this, emptyAlbumTitleTemplate, "Page.EmptyAlbumTitle.Title"))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DismissNotificationPage(emptyTemplate, this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("invalid.html", invalidTemplate, "Page.Invalid.Title", this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("invalid.html", this, invalidTemplate, "Page.Invalid.Title"))); pageToadlets.add(pageToadletFactory.createPageToadlet(loaders.loadStaticPage("css/", "/static/css/", "text/css"))); pageToadlets.add(pageToadletFactory.createPageToadlet(loaders.loadStaticPage("javascript/", "/static/javascript/", "text/javascript"))); pageToadlets.add(pageToadletFactory.createPageToadlet(loaders.loadStaticPage("images/", "/static/images/", "image/png"))); pageToadlets.add(pageToadletFactory.createPageToadlet(new TemplatePage("OpenSearch.xml", "application/opensearchdescription+xml", templateContextFactory, openSearchTemplate))); pageToadlets.add(pageToadletFactory.createPageToadlet(new GetImagePage(this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new GetTranslationPage(this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new GetStatusAjaxPage(this, timeTextConverter, l10nFilter))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new GetTranslationAjaxPage(this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new GetStatusAjaxPage(this, elementLoader, timeTextConverter, l10nFilter, TimeZone.getDefault()))); pageToadlets.add(pageToadletFactory.createPageToadlet(new GetNotificationsAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DismissNotificationAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new CreatePostAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new CreateReplyAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new GetReplyAjaxPage(this, replyTemplate))); pageToadlets.add(pageToadletFactory.createPageToadlet(new GetPostAjaxPage(this, postTemplate))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new GetTimesAjaxPage(this, timeTextConverter, l10nFilter))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new GetLinkedElementAjaxPage(this, elementLoader, linkedElementRenderFilter))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new GetTimesAjaxPage(this, timeTextConverter, l10nFilter, TimeZone.getDefault()))); pageToadlets.add(pageToadletFactory.createPageToadlet(new MarkAsKnownAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DeletePostAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DeleteReplyAjaxPage(this))); @@ -774,7 +829,7 @@ public class WebInterface { */ private Collection getMentionedSones(String text) { /* we need no context to find mentioned Sones. */ - Set mentionedSones = new HashSet(); + Set mentionedSones = new HashSet<>(); for (Part part : soneTextParser.parse(text, null)) { if (part instanceof SonePart) { mentionedSones.add(((SonePart) part).getSone());