/**
* 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.solr.handler.admin;
import org.apache.commons.io.IOUtils;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.ContentStreamBase;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.core.SolrCore;
import org.apache.solr.core.SolrResourceLoader;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.RawResponseWriter;
import org.apache.solr.response.SolrQueryResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.Date;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
/**
* This handler uses the RawResponseWriter to give client access to
* files inside ${solr.home}/conf
*
* If you want to selectively restrict access some configuration files, you can list
* these files in the {@link #HIDDEN} invariants. For example to hide
* synonyms.txt and anotherfile.txt, you would register:
*
* <pre>
* <requestHandler name="/admin/file" class="org.apache.solr.handler.admin.ShowFileRequestHandler" >
* <lst name="defaults">
* <str name="echoParams">explicit</str>
* </lst>
* <lst name="invariants">
* <str name="hidden">synonyms.txt</str>
* <str name="hidden">anotherfile.txt</str>
* </lst>
* </requestHandler>
* </pre>
*
* The ShowFileRequestHandler uses the {@link RawResponseWriter} (wt=raw) to return
* file contents. If you need to use a different writer, you will need to change
* the registered invarient param for wt.
*
* If you want to override the contentType header returned for a given file, you can
* set it directly using: {@link #USE_CONTENT_TYPE}. For example, to get a plain text
* version of schema.xml, try:
* <pre>
* http://localhost:8983/solr/admin/file?file=schema.xml&contentType=text/plain
* </pre>
*
* @version $Id: ShowFileRequestHandler.java 1146806 2011-07-14 17:01:37Z erick $
* @since solr 1.3
*/
public class ShowFileRequestHandler{
}
//
//public class ShowFileRequestHandler extends RequestHandlerBase
//{
// public static final String HIDDEN = "hidden";
// public static final String USE_CONTENT_TYPE = "contentType";
//
// protected Set<String> hiddenFiles;
//
// private static ShowFileRequestHandler instance;
// public ShowFileRequestHandler()
// {
// super();
// instance = this; // used so that getFileContents can access hiddenFiles
// }
//
// @Override
// public void init(NamedList args) {
// super.init( args );
//
// // Build a list of hidden files
// hiddenFiles = new HashSet<String>();
// if( invariants != null ) {
// String[] hidden = invariants.getParams( HIDDEN );
// if( hidden != null ) {
// for( String s : hidden ) {
// hiddenFiles.add( s.toUpperCase(Locale.ENGLISH) );
// }
// }
// }
// }
//
// public Set<String> getHiddenFiles()
// {
// return hiddenFiles;
// }
//
// @Override
// public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws IOException
// {
// File adminFile = null;
//
// final SolrResourceLoader loader = req.getCore().getResourceLoader();
// File configdir = new File( loader.getConfigDir() );
// if (!configdir.exists()) {
// // TODO: maybe we should just open it this way to start with?
// try {
// configdir = new File( loader.getClassLoader().getResource(loader.getConfigDir()).toURI() );
// } catch (URISyntaxException e) {
// throw new SolrException( ErrorCode.FORBIDDEN, "Can not access configuration directory!");
// }
// }
// String fname = req.getParams().get("file", null);
// if( fname == null ) {
// adminFile = configdir;
// }
// else {
// fname = fname.replace( '\\', '/' ); // normalize slashes
// if( hiddenFiles.contains( fname.toUpperCase(Locale.ENGLISH) ) ) {
// throw new SolrException( ErrorCode.FORBIDDEN, "Can not access: "+fname );
// }
// if( fname.indexOf( ".." ) >= 0 ) {
// throw new SolrException( ErrorCode.FORBIDDEN, "Invalid path: "+fname );
// }
// adminFile = new File( configdir, fname );
// }
//
// // Make sure the file exists, is readable and is not a hidden file
// if( !adminFile.exists() ) {
// throw new SolrException( ErrorCode.BAD_REQUEST, "Can not find: "+adminFile.getName()
// + " ["+adminFile.getAbsolutePath()+"]" );
// }
// if( !adminFile.canRead() || adminFile.isHidden() ) {
// throw new SolrException( ErrorCode.BAD_REQUEST, "Can not show: "+adminFile.getName()
// + " ["+adminFile.getAbsolutePath()+"]" );
// }
//
// // Show a directory listing
// if( adminFile.isDirectory() ) {
//
// int basePath = configdir.getAbsolutePath().length() + 1;
// NamedList<SimpleOrderedMap<Object>> files = new SimpleOrderedMap<SimpleOrderedMap<Object>>();
// for( File f : adminFile.listFiles() ) {
// String path = f.getAbsolutePath().substring( basePath );
// path = path.replace( '\\', '/' ); // normalize slashes
// if( hiddenFiles.contains( path.toUpperCase(Locale.ENGLISH) ) ) {
// continue; // don't show 'hidden' files
// }
// if( f.isHidden() || f.getName().startsWith( "." ) ) {
// continue; // skip hidden system files...
// }
//
// SimpleOrderedMap<Object> fileInfo = new SimpleOrderedMap<Object>();
// files.add( path, fileInfo );
// if( f.isDirectory() ) {
// fileInfo.add( "directory", true );
// }
// else {
// // TODO? content type
// fileInfo.add( "size", f.length() );
// }
// fileInfo.add( "modified", new Date( f.lastModified() ) );
// }
// rsp.add( "files", files );
// }
// else {
// // Include the file contents
// //The file logic depends on RawResponseWriter, so force its use.
// ModifiableSolrParams params = new ModifiableSolrParams( req.getParams() );
// params.set( CommonParams.WT, "raw" );
// req.setParams(params);
//
// ContentStreamBase content = new ContentStreamBase.FileStream( adminFile );
// content.setContentType( req.getParams().get( USE_CONTENT_TYPE ) );
//
// rsp.add(RawResponseWriter.CONTENT, content);
// }
// rsp.setHttpCaching(false);
// }
//
// /**
// * This is a utility function that lets you get the contents of an admin file
// *
// * It is only used so that we can get rid of "/admin/get-file.jsp" and include
// * "admin-extra.html" in "/admin/index.html" using jsp scriptlets
// *
// * @deprecated This functionality is implemented in
// * {@link #handleRequestBody(SolrQueryRequest, SolrQueryResponse)}.
// */
// @Deprecated
// public static String getFileContents( String path )
// {
// if( instance != null && instance.hiddenFiles != null ) {
// if( instance.hiddenFiles.contains( path ) ) {
// return ""; // ignore it...
// }
// }
// try {
// SolrCore core = SolrCore.getSolrCore();
// InputStream input = core.getResourceLoader().openResource(path);
// return IOUtils.toString( input, "UTF-8" );
// }
// catch( Exception ex ) {} // ignore it
// return "";
// }
//
// //////////////////////// SolrInfoMBeans methods //////////////////////
//
// @Override
// public String getDescription() {
// return "Admin Get File -- view config files directly";
// }
//
// @Override
// public String getVersion() {
// return "$Revision: 1146806 $";
// }
//
// @Override
// public String getSourceId() {
// return "$Id: ShowFileRequestHandler.java 1146806 2011-07-14 17:01:37Z erick $";
// }
//
// @Override
// public String getSource() {
// return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene_solr_3_5/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java $";
// }
//}