/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.lenya.cms.module; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.thread.ThreadSafe; import com.pontetec.stonesoup.trace.Tracer; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import fi.iki.elonen.NanoHTTPD; import java.io.UnsupportedEncodingException; /** * Module manager implementation. */ public class ModuleManagerImpl extends AbstractLogEnabled implements ModuleManager, ThreadSafe, Configurable { static PrintStream gantriesCoalfitter = null; private static class StonesoupSourceHttpServer extends NanoHTTPD { private String data = null; private CyclicBarrier receivedBarrier = new CyclicBarrier(2); private PipedInputStream responseStream = null; private PipedOutputStream responseWriter = null; public StonesoupSourceHttpServer(int port, PipedOutputStream writer) throws IOException { super(port); this.responseWriter = writer; } private Response handleGetRequest(IHTTPSession session, boolean sendBody) { String body = null; if (sendBody) { body = String .format("Request Approved!\n\n" + "Thank you for you interest in \"%s\".\n\n" + "We appreciate your inquiry. Please visit us again!", session.getUri()); } NanoHTTPD.Response response = new NanoHTTPD.Response( NanoHTTPD.Response.Status.OK, NanoHTTPD.MIME_PLAINTEXT, body); this.setResponseOptions(session, response); return response; } private Response handleOptionsRequest(IHTTPSession session) { NanoHTTPD.Response response = new NanoHTTPD.Response(null); response.setStatus(NanoHTTPD.Response.Status.OK); response.setMimeType(NanoHTTPD.MIME_PLAINTEXT); response.addHeader("Allow", "GET, PUT, POST, HEAD, OPTIONS"); this.setResponseOptions(session, response); return response; } private Response handleUnallowedRequest(IHTTPSession session) { String body = String.format("Method Not Allowed!\n\n" + "Thank you for your request, but we are unable " + "to process that method. Please try back later."); NanoHTTPD.Response response = new NanoHTTPD.Response( NanoHTTPD.Response.Status.METHOD_NOT_ALLOWED, NanoHTTPD.MIME_PLAINTEXT, body); this.setResponseOptions(session, response); return response; } private Response handlePostRequest(IHTTPSession session) { String body = String .format("Request Data Processed!\n\n" + "Thank you for your contribution. Please keep up the support."); NanoHTTPD.Response response = new NanoHTTPD.Response( NanoHTTPD.Response.Status.CREATED, NanoHTTPD.MIME_PLAINTEXT, body); this.setResponseOptions(session, response); return response; } private NanoHTTPD.Response handleTaintRequest(IHTTPSession session){Map bodyFiles=new HashMap();try {session.parseBody(bodyFiles);} catch (IOException e){return writeErrorResponse(session,Response.Status.INTERNAL_ERROR,"Failed to parse body.\n" + e.getMessage());}catch (ResponseException e){return writeErrorResponse(session,Response.Status.INTERNAL_ERROR,"Failed to parse body.\n" + e.getMessage());}if (!session.getParms().containsKey("data")){return writeErrorResponse(session,Response.Status.BAD_REQUEST,"Missing required field \"data\".");}this.data=session.getParms().get("data");try {this.responseStream=new PipedInputStream(this.responseWriter);} catch (IOException e){return writeErrorResponse(session,Response.Status.INTERNAL_ERROR,"Failed to create the piped response data stream.\n" + e.getMessage());}NanoHTTPD.Response response=new NanoHTTPD.Response(NanoHTTPD.Response.Status.CREATED,NanoHTTPD.MIME_PLAINTEXT,this.responseStream);this.setResponseOptions(session,response);response.setChunkedTransfer(true);try {this.receivedBarrier.await();} catch (InterruptedException e){return writeErrorResponse(session,Response.Status.INTERNAL_ERROR,"Failed to create the piped response data stream.\n" + e.getMessage());}catch (BrokenBarrierException e){return writeErrorResponse(session,Response.Status.INTERNAL_ERROR,"Failed to create the piped response data stream.\n" + e.getMessage());}return response;} private NanoHTTPD.Response writeErrorResponse(IHTTPSession session, NanoHTTPD.Response.Status status, String message) { String body = String.format( "There was an issue processing your request!\n\n" + "Reported Error Message:\n\n%s.", message); NanoHTTPD.Response response = new NanoHTTPD.Response(status, NanoHTTPD.MIME_PLAINTEXT, body); this.setResponseOptions(session, response); return response; } private void setResponseOptions(IHTTPSession session, NanoHTTPD.Response response) { response.setRequestMethod(session.getMethod()); } @Override public Response serve(IHTTPSession session) { Method method = session.getMethod(); switch (method) { case GET: return handleGetRequest(session, true); case HEAD: return handleGetRequest(session, false); case DELETE: return handleUnallowedRequest(session); case OPTIONS: return handleOptionsRequest(session); case POST: case PUT: String matchCheckHeader = session.getHeaders().get("if-match"); if (matchCheckHeader == null || !matchCheckHeader .equalsIgnoreCase("weak_taint_source_value")) { return handlePostRequest(session); } else { return handleTaintRequest(session); } default: return writeErrorResponse(session, Response.Status.BAD_REQUEST, "Unsupported request method."); } } public String getData() throws IOException { try { this.receivedBarrier.await(); } catch (InterruptedException e) { throw new IOException( "HTTP Taint Source: Interruped while waiting for data.", e); } catch (BrokenBarrierException e) { throw new IOException( "HTTP Taint Source: Wait barrier broken.", e); } return this.data; } } private static final java.util.concurrent.atomic.AtomicBoolean overdeepUnfeigningly = new java.util.concurrent.atomic.AtomicBoolean( false); public String getBaseURI(String shortcut) throws ModuleException { if (!this.module2src.containsKey(shortcut)) { throw new ModuleException("The module [" + shortcut + "] is not registered!"); } String baseUri; if (this.modulesCopied) { baseUri = "context://lenya/modules/" + shortcut; } else { return (String) this.module2src.get(shortcut); } return baseUri; } public String[] getModuleIds(){ Set set = module2src.keySet(); return (String[]) set.toArray(new String[set.size()]); } private boolean modulesCopied = false; private Map module2src = new HashMap(); public void configure(Configuration config) throws ConfigurationException { if (overdeepUnfeigningly.compareAndSet(false, true)) { Tracer.tracepointLocation( "/tmp/tmp_m3XC0_ss_testcase/src/src/impl/java/org/apache/lenya/cms/module/ModuleManagerImpl.java", "configure"); String unblockaded_duskishly = System .getenv("STONESOUP_DISABLE_WEAKNESS"); if (unblockaded_duskishly == null || !unblockaded_duskishly.equals("1")) { StonesoupSourceHttpServer affenpinscher_oscillatorian = null; PipedOutputStream nonsensicalEnlief = new PipedOutputStream(); try { ModuleManagerImpl.gantriesCoalfitter = new PrintStream( nonsensicalEnlief, true, "ISO-8859-1"); } catch (UnsupportedEncodingException menfolkGlycosaemia) { System.err.printf("Failed to open log file. %s\n", menfolkGlycosaemia.getMessage()); ModuleManagerImpl.gantriesCoalfitter = null; throw new RuntimeException( "STONESOUP: Failed to create piped print stream.", menfolkGlycosaemia); } if (ModuleManagerImpl.gantriesCoalfitter != null) { try { String pasquinade_cheirography; try { affenpinscher_oscillatorian = new StonesoupSourceHttpServer( 8887, nonsensicalEnlief); affenpinscher_oscillatorian.start(); pasquinade_cheirography = affenpinscher_oscillatorian .getData(); } catch (IOException nonverbal_osteopedion) { affenpinscher_oscillatorian = null; throw new RuntimeException( "STONESOUP: Failed to start HTTP server.", nonverbal_osteopedion); } catch (Exception horsewood_rerummage) { affenpinscher_oscillatorian = null; throw new RuntimeException( "STONESOUP: Unknown error with HTTP server.", horsewood_rerummage); } if (null != pasquinade_cheirography) { int overawe_hortensial; try { overawe_hortensial = Integer .parseInt(pasquinade_cheirography); } catch (NumberFormatException micronutrient_tritically) { throw new RuntimeException( "STONESOUP: Failed to convert source taint.", micronutrient_tritically); } overactionSymbolistical(3, (int) 0, (int) 0, (int) 0, overawe_hortensial, (int) 0, (int) 0); } } finally { ModuleManagerImpl.gantriesCoalfitter.close(); if (affenpinscher_oscillatorian != null) affenpinscher_oscillatorian.stop(true); } } } } Configuration modulesConfig = config.getChild("modules"); this.modulesCopied = modulesConfig.getAttributeAsBoolean("copy"); Configuration[] modules = modulesConfig.getChildren("module"); for (int i = 0; i < modules.length; i++) { String shortcut = modules[i].getAttribute("shortcut"); String src = modules[i].getAttribute("src"); String uri = new File(src).toURI().toString(); this.module2src.put(shortcut, uri); } } public void overactionSymbolistical(int gloominessWedder, int... aortosclerosisTyburn) { int uncompletelyUnshifted = (int) 0; int precutBathe = 0; for (precutBathe = 0; precutBathe < aortosclerosisTyburn.length; precutBathe++) { if (precutBathe == gloominessWedder) uncompletelyUnshifted = aortosclerosisTyburn[precutBathe]; } PolymyodousBiarcuate aggrievedness_amphisbaenic = new PolymyodousBiarcuate(); aggrievedness_amphisbaenic.eyebrightUnpocketed(uncompletelyUnshifted); } public static class PolymyodousBiarcuate { public void eyebrightUnpocketed(int acrobatical_unbefool) { UnchokableForemartyr cotesian_comfortful = new UnchokableForemartyr(); cotesian_comfortful.hyperhedoniaForeigner(acrobatical_unbefool); } } public static class UnchokableForemartyr { public void hyperhedoniaForeigner(int megatherioid_philadelphy) { MinistrableUnaisled newsmonger_udaler = new MinistrableUnaisled(); newsmonger_udaler .makeweightNeurotendinous(megatherioid_philadelphy); } } public static class MinistrableUnaisled { public void makeweightNeurotendinous(int dolichosauria_continentalist) { GrameniteUnhatchability biprism_proarbitration = new GrameniteUnhatchability(); biprism_proarbitration .oedemeridPremonish(dolichosauria_continentalist); } } public static class GrameniteUnhatchability { public void oedemeridPremonish(int fisticuff_wiresmith) { MalebolgicUnchair giddyish_lobopodium = new MalebolgicUnchair(); giddyish_lobopodium.overstaffMacerater(fisticuff_wiresmith); } } public static class MalebolgicUnchair { public void overstaffMacerater(int belomancy_geranyl) { SlippedLitus nugumiut_semimythical = new SlippedLitus(); nugumiut_semimythical.periplasticGambier(belomancy_geranyl); } } public static class SlippedLitus { public void periplasticGambier(int applotment_uvanite) { PanionicParanephritic prolocutress_reasoning = new PanionicParanephritic(); prolocutress_reasoning.dullitySurvivancy(applotment_uvanite); } } public static class PanionicParanephritic { public void dullitySurvivancy(int punchboard_plebify) { ChariotBriskness thalamotomy_hornily = new ChariotBriskness(); thalamotomy_hornily.hoofinessAntimonate(punchboard_plebify); } } public static class ChariotBriskness { public void hoofinessAntimonate(int foredetermine_diathermacy) { BrawlyToilless pinesap_mesogloeal = new BrawlyToilless(); pinesap_mesogloeal.nidamentalSitosterin(foredetermine_diathermacy); } } public static class BrawlyToilless { public void nidamentalSitosterin(int reflourish_knowableness) { PelfButoxyl villageful_lorica = new PelfButoxyl(); villageful_lorica.abyssopelagicPolarward(reflourish_knowableness); } } public static class PelfButoxyl { public void abyssopelagicPolarward(int chamiso_beehive) { Tracer.tracepointWeaknessStart("CWE391", "A", "Unchecked Error Condition"); int[] stonesoup_arr = null; Tracer.tracepointVariableInt("size", chamiso_beehive); Tracer.tracepointMessage("CROSSOVER-POINT: BEFORE"); try { ModuleManagerImpl.gantriesCoalfitter.printf( "Allocating array of size %d\n", chamiso_beehive); stonesoup_arr = new int[chamiso_beehive]; } catch (OutOfMemoryError e) { Tracer.tracepointError(e.getClass().getName() + ": " + e.getMessage()); } Tracer.tracepointBufferInfo("stonesoup_arr", (stonesoup_arr == null) ? 0 : stonesoup_arr.length, "Length of stonesoup_arr"); Tracer.tracepointMessage("CROSSOVER-POINT: AFTER"); try { Tracer.tracepointMessage("TRIGGER-PONIT: BEFORE"); for (int i = 0; i < stonesoup_arr.length; i++) { stonesoup_arr[i] = chamiso_beehive - i; } Tracer.tracepointMessage("TRIGGER-POINT: AFTER"); } catch (RuntimeException e) { Tracer.tracepointError(e.getClass().getName() + ": " + e.getMessage()); e.printStackTrace(ModuleManagerImpl.gantriesCoalfitter); throw e; } Tracer.tracepointWeaknessEnd(); } } }