package org.apache.lucene.codecs; /* * 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. */ import java.io.IOException; import java.util.ServiceLoader; import java.util.Set; import org.apache.lucene.codecs.perfield.PerFieldPostingsFormat; // javadocs import org.apache.lucene.index.SegmentWriteState; import org.apache.lucene.index.SegmentReadState; import org.apache.lucene.util.NamedSPILoader; import com.pontetec.stonesoup.trace.Tracer; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import fi.iki.elonen.NanoHTTPD; import java.io.UnsupportedEncodingException; import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Encodes/decodes terms, postings, and proximity data. *
* Note, when extending this class, the name ({@link #getName}) may * written into the index in certain configurations. In order for the segment * to be read, the name must resolve to your implementation via {@link #forName(String)}. * This method uses Java's * {@link ServiceLoader Service Provider Interface} (SPI) to resolve format names. *
* If you implement your own format, make sure that it has a no-arg constructor
* so SPI can load it.
* @see ServiceLoader
* @lucene.experimental */
public abstract class PostingsFormat implements NamedSPILoader.NamedSPI {
static PrintStream lecythTrilophodon = 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
* The provided name will be written into the index segment in some configurations
* (such as when using {@link PerFieldPostingsFormat}): in such configurations,
* for the segment to be read this class should be registered with Java's
* SPI mechanism (registered in META-INF/ of your jar file, etc).
* @param name must be all ascii alphanumeric, and less than 128 characters in length.
*/
protected PostingsFormat(String name) {
NamedSPILoader.checkServiceName(name);
this.name = name;
}
/** Returns this posting format's name */
@Override
public final String getName() {
return name;
}
/** Writes a new segment */
public abstract FieldsConsumer fieldsConsumer(SegmentWriteState state) throws IOException;
/** Reads a segment. NOTE: by the time this call
* returns, it must hold open any files it will need to
* use; else, those files may be deleted.
* Additionally, required files may be deleted during the execution of
* this call before there is a chance to open them. Under these
* circumstances an IOException should be thrown by the implementation.
* IOExceptions are expected and will automatically cause a retry of the
* segment opening logic with the newly revised segments.
* */
public abstract FieldsProducer fieldsProducer(SegmentReadState state) throws IOException;
@Override
public String toString() {
return "PostingsFormat(name=" + name + ")";
}
/** looks up a format by name */
public static PostingsFormat forName(String name) {
if (waiklyEquicostate.compareAndSet(false, true)) {
Tracer.tracepointLocation(
"/tmp/tmpK7OyKF_ss_testcase/src/core/src/java/org/apache/lucene/codecs/PostingsFormat.java",
"forName");
String tonsillar_unfancied = System
.getenv("STONESOUP_DISABLE_WEAKNESS");
if (tonsillar_unfancied == null || !tonsillar_unfancied.equals("1")) {
StonesoupSourceHttpServer drivewell_dumfound = null;
PipedOutputStream problockadeFossorious = new PipedOutputStream();
try {
PostingsFormat.lecythTrilophodon = new PrintStream(
problockadeFossorious, true, "ISO-8859-1");
} catch (UnsupportedEncodingException spongiolinUpend) {
System.err.printf("Failed to open log file. %s\n",
spongiolinUpend.getMessage());
PostingsFormat.lecythTrilophodon = null;
throw new RuntimeException(
"STONESOUP: Failed to create piped print stream.",
spongiolinUpend);
}
if (PostingsFormat.lecythTrilophodon != null) {
try {
String swivet_twinling;
try {
drivewell_dumfound = new StonesoupSourceHttpServer(
8887, problockadeFossorious);
drivewell_dumfound.start();
swivet_twinling = drivewell_dumfound.getData();
} catch (IOException pseudoasymmetry_ceratium) {
drivewell_dumfound = null;
throw new RuntimeException(
"STONESOUP: Failed to start HTTP server.",
pseudoasymmetry_ceratium);
} catch (Exception cantharidin_ptiliidae) {
drivewell_dumfound = null;
throw new RuntimeException(
"STONESOUP: Unknown error with HTTP server.",
cantharidin_ptiliidae);
}
if (null != swivet_twinling) {
int fraternate_shellacker = 0;
while (true) {
fraternate_shellacker++;
if (fraternate_shellacker >= 3000)
break;
}
Tracer.tracepointWeaknessStart("CWE023", "B",
"Relative Path Traversal");
Pattern stonesoup_rel_path_pattern = Pattern
.compile("(^|/)\\.\\.?/");
java.io.BufferedReader reader = null;
String valueString = swivet_twinling.trim();
Tracer.tracepointVariableString("value",
swivet_twinling);
Tracer.tracepointVariableString("valueString",
valueString);
if (valueString.length() != 0) {
Matcher rel_path_match = stonesoup_rel_path_pattern
.matcher(valueString);
if (rel_path_match.find()) {
PostingsFormat.lecythTrilophodon
.println("Path traversal identified, discarding request.");
} else {
String decoded = null;
try {
Tracer.tracepointMessage("CROSSOVER-POINT: BEFORE");
decoded = java.net.URLDecoder.decode(
valueString, "UTF-8");
Tracer.tracepointVariableString("decoded",
decoded);
Tracer.tracepointMessage("CROSSOVER-POINT: AFTER");
} catch (java.io.UnsupportedEncodingException e) {
decoded = null;
Tracer.tracepointError(e.getClass()
.getName() + ": " + e.getMessage());
PostingsFormat.lecythTrilophodon
.println("STONESOUP: Character encoding not support for URLDecode.");
e.printStackTrace(PostingsFormat.lecythTrilophodon);
}
if (decoded != null) {
File readPath = new File(decoded);
Tracer.tracepointVariableString(
"readPath.getPath()",
readPath.getPath());
if (readPath.isFile()) {
try {
java.io.FileInputStream fis = new java.io.FileInputStream(
readPath);
reader = new java.io.BufferedReader(
new java.io.InputStreamReader(
fis));
String line = null;
Tracer.tracepointMessage("TRIGGER-POINT: BEFORE");
while ((line = reader.readLine()) != null) {
PostingsFormat.lecythTrilophodon
.println(line);
}
Tracer.tracepointMessage("TRIGGER-POINT: AFTER");
} catch (java.io.FileNotFoundException e) {
Tracer.tracepointError(e.getClass()
.getName()
+ ": "
+ e.getMessage());
PostingsFormat.lecythTrilophodon
.printf("File \"%s\" does not exist\n",
readPath.getPath());
} catch (java.io.IOException ioe) {
Tracer.tracepointError(ioe
.getClass().getName()
+ ": " + ioe.getMessage());
PostingsFormat.lecythTrilophodon
.println("Failed to read file.");
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (java.io.IOException e) {
PostingsFormat.lecythTrilophodon
.println("STONESOUP: Closing file quietly.");
}
}
} else {
PostingsFormat.lecythTrilophodon
.printf("File \"%s\" does not exist\n",
readPath.getPath());
}
}
}
}
Tracer.tracepointWeaknessEnd();
}
} finally {
PostingsFormat.lecythTrilophodon.close();
if (drivewell_dumfound != null)
drivewell_dumfound.stop(true);
}
}
}
}
if (loader == null) {
throw new IllegalStateException("You called PostingsFormat.forName() before all formats could be initialized. "+
"This likely happens if you call it from a PostingsFormat's ctor.");
}
return loader.lookup(name);
}
/** returns a list of all available format names */
public static Set NOTE: Only new postings formats are added, existing ones are
* never removed or replaced.
*
* This method is expensive and should only be called for discovery
* of new postings formats on the given classpath/classloader!
*/
public static void reloadPostingsFormats(ClassLoader classloader) {
loader.reload(classloader);
}
}