package freenet.clients.http; import java.io.IOException; import java.net.URI; import java.text.ParseException; import java.util.Date; import freenet.clients.http.FProxyFetchInProgress.REFILTER_POLICY; import freenet.clients.http.bookmark.BookmarkManager; import freenet.node.useralerts.UserAlertManager; import freenet.support.HTMLNode; import freenet.support.MultiValueTable; import freenet.support.api.Bucket; import freenet.support.api.BucketFactory; import freenet.support.api.HTTPRequest; /** * Object represents context for a single request. Is used as a token, * when the Toadlet wants to e.g. write a reply. */ public interface ToadletContext { /** * Write reply headers for generated content (web interface pages) and redirects etc. * @param code HTTP code. * @param desc HTTP code description. * @param mvt Any extra headers. Can be null. * @param mimeType The MIME type of the reply. * @param length The length of the reply. * @param forceDisableJavascript Disable javascript even if it is enabled for the web interface * as a whole. */ void sendReplyHeaders(int code, String desc, MultiValueTable<String,String> mvt, String mimeType, long length) throws ToadletContextClosedException, IOException; /** * Write reply headers for generated content (web interface pages) and redirects etc. * @param code HTTP code. * @param desc HTTP code description. * @param mvt Any extra headers. Can be null. * @param mimeType The MIME type of the reply. * @param length The length of the reply. * @param forceDisableJavascript Disable javascript even if it is enabled for the web interface * as a whole. */ void sendReplyHeaders(int code, String desc, MultiValueTable<String,String> mvt, String mimeType, long length, boolean forceDisableJavascript) throws ToadletContextClosedException, IOException; /** * @deprecated * Write reply headers for either generated content (web interface pages) or static content. * Callers should use either sendReplyHeaders() or sendReplyHeadersStatic()! */ void sendReplyHeaders(int code, String desc, MultiValueTable<String,String> mvt, String mimeType, long length, Date mTime) throws ToadletContextClosedException, IOException; /** * Write reply headers with a customised modification time for static content. * @param code HTTP code. * @param desc HTTP code description. * @param mvt Any extra headers. Can be null. * @param mimeType The MIME type of the reply. * @param length The length of the reply. * @param mTime The modification time of the data being sent. */ void sendReplyHeadersStatic(int code, String desc, MultiValueTable<String,String> mvt, String mimeType, long length, Date mTime) throws ToadletContextClosedException, IOException; /** * Write reply headers for content downloaded from Freenet. Progress bars etc are not content * downloaded from Freenet, so are rendered using sendReplyHeaders(). For content downloaded * from Freenet we send headers which absolutely forbid Javascript, even if it somehow got * through the content filter. * @param code HTTP code. * @param desc HTTP code description. * @param mvt Any extra headers. Can be null. * @param mimeType The MIME type of the reply. * @param length The length of the reply. */ void sendReplyHeadersFProxy(int code, String desc, MultiValueTable<String,String> mvt, String mimeType, long length) throws ToadletContextClosedException, IOException; /** * Write data. Note you must send reply headers first. */ void writeData(byte[] data, int offset, int length) throws ToadletContextClosedException, IOException; /** * Force a disconnection after handling this request. Used only when a throwable was thrown and we don't know * what the state of the connection is. FIXME we could handle this better by remembering whether headers have * been sent, how long the attached data should be, how much data has been sent etc. */ void forceDisconnect(); /** * Convenience method that simply calls {@link #writeData(byte[], int, int)}. * * @param data * The data to write * @throws ToadletContextClosedException * if the context has already been closed * @throws IOException * if an I/O error occurs */ void writeData(byte[] data) throws ToadletContextClosedException, IOException; /** * Write data from a bucket. You must send reply headers first. * * @param data The Bucket which contains the data. This function * assumes ownership of the Bucket, calling free() on it * when done. If this behavior is undesired, callers can * wrap their Bucket in a NoFreeBucket. * * @see freenet.support.io.NoFreeBucket */ void writeData(Bucket data) throws ToadletContextClosedException, IOException; /** * Get the page maker object. */ PageMaker getPageMaker(); /** * Get the form password required for "dangerous" operations. */ String getFormPassword(); /** * Check a request for the form password, and send an error to the client if the password is * not valid. * @param request The request to check. * @param redirectTo The location to redirect to if the password is not set. * * @return Whether the request contains a valid form password */ boolean checkFormPassword(HTTPRequest request, String redirectTo) throws ToadletContextClosedException, IOException; /** * Check a request for the form password, and send an error to the client if the password is * not valid. * @param request The request to check. * @return Whether the request contains a valid form password * @throws ToadletContextClosedException * @throws IOException */ boolean checkFormPassword(HTTPRequest request) throws ToadletContextClosedException, IOException; /** Check a request for the form password. Some Toadlet's will want to e.g. send a confirmation page * using the submitted data if the form password isn't present. * @throws IOException */ boolean hasFormPassword(HTTPRequest request) throws IOException; /** * Check a context for whether {@link #isAllowedFullAccess()} is true. * * If it is false, an error page is sent to the client, and false is returned. * You can then abort processing of the request. * * @return The return value of {@link #isAllowedFullAccess()}. * @throws IOException See {@link Toadlet#sendUnauthorizedPage(ToadletContext)} * @throws ToadletContextClosedException See {@link Toadlet#sendUnauthorizedPage(ToadletContext)} */ boolean checkFullAccess(Toadlet toadlet) throws ToadletContextClosedException, IOException; /** * Get the user alert manager. */ UserAlertManager getAlertManager(); /** * Get the bookmark manager. */ BookmarkManager getBookmarkManager(); BucketFactory getBucketFactory(); MultiValueTable<String, String> getHeaders(); /** * Get an existing {@link Cookie} (sent by the client) from the headers. */ ReceivedCookie getCookie(URI domain, URI path, String name) throws ParseException; /** * Set a {@link Cookie}, it will be sent with the reply headers to the client. */ void setCookie(Cookie newCookie); /** * Add a form node to an HTMLNode under construction. This will have the correct enctype and * formPassword set already, so all the caller needs to do is add its specific fields. * @param parentNode The parent HTMLNode. * @param target Where the form should be POSTed to. * @param id HTML name for the form for stylesheet/script access. Will be added as both id and name. * @return The form HTMLNode. */ HTMLNode addFormChild(HTMLNode parentNode, String target, String id); /** Is this Toadlet allowed full access to the node, including the ability to reconfigure it, * restart it etc? */ boolean isAllowedFullAccess(); /** * Is the web interface in advanced mode? */ boolean isAdvancedModeEnabled(); /** * Return a robots.txt excluding all spiders and other non-browser HTTP clients? */ boolean doRobots(); ToadletContainer getContainer(); boolean disableProgressPage(); Toadlet activeToadlet(); /** Returns the unique id of this request * @return The unique id*/ public String getUniqueId(); public URI getUri(); /** What to do when we find cached data on the global queue but it's already been * filtered, and we want a filtered copy. */ REFILTER_POLICY getReFilterPolicy(); }