miscmodule.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,774 行 · 第 1/3 页
JAVA
1,774 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.quercus.lib;import com.caucho.quercus.Quercus;import com.caucho.quercus.QuercusException;import com.caucho.quercus.QuercusModuleException;import com.caucho.quercus.annotation.NotNull;import com.caucho.quercus.annotation.Optional;import com.caucho.quercus.annotation.Reference;import com.caucho.quercus.annotation.ReturnNullAsFalse;import com.caucho.quercus.annotation.UsesSymbolTable;import com.caucho.quercus.env.*;import com.caucho.quercus.lib.file.BinaryStream;import com.caucho.quercus.lib.file.FileInput;import com.caucho.quercus.lib.file.FileModule;import com.caucho.quercus.lib.file.FileOutput;import com.caucho.quercus.module.AbstractQuercusModule;import com.caucho.quercus.program.QuercusProgram;import com.caucho.util.L10N;import com.caucho.util.RandomUtil;import com.caucho.vfs.*;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Map;import java.util.logging.Level;import java.util.logging.Logger;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * PHP mysql routines. */public class MiscModule extends AbstractQuercusModule { private static final L10N L = new L10N(MiscModule.class); private static final Logger log = Logger.getLogger(MiscModule.class.getName()); public static final int CONNECTION_NORMAL = 0; public static final int CONNECTION_ABORTED = 1; public static final int CONNECTION_TIMEOUT = 2; /** * Return true on a client disconnect */ public static int connection_aborted(Env env) { return env.getConnectionStatus(); } /** * Returns the status */ public static int connection_status(Env env) { return env.getConnectionStatus(); } /** * Escapes characters in a string. */ public static String escapeshellcmd(String command) { StringBuilder sb = new StringBuilder(); int len = command.length(); boolean hasApos = false; boolean hasQuot = false; for (int i = 0; i < len; i++) { char ch = command.charAt(i); switch (ch) { case '#': case '&': case ';': case '`': case '|': case '*': case '?': case '~': case '<': case '>': case '^': case '(': case ')': case '[': case ']': case '{': case '}': case '$': case '\\': case ',': case 0x0a: case 0xff: sb.append('\\'); sb.append(ch); break; case '\'': hasApos = ! hasApos; sb.append(ch); break; case '\"': hasQuot = ! hasQuot; sb.append(ch); break; default: sb.append(ch); } } String result = sb.toString(); if (hasApos) { int p = result.lastIndexOf('\''); result = result.substring(0, p) + "\\" + result.substring(p); } if (hasQuot) { int p = result.lastIndexOf('\"'); result = result.substring(0, p) + "\\" + result.substring(p); } return result; } /** * Escapes characters in a string. */ public static String escapeshellarg(String arg) { StringBuilder sb = new StringBuilder(); sb.append('\''); int len = arg.length(); for (int i = 0; i < len; i++) { char ch = arg.charAt(i); if (ch == '\'') sb.append("\\\'"); else sb.append(ch); } sb.append('\''); return sb.toString(); } /** * Comples and evaluates an expression. */ @UsesSymbolTable public Value eval(Env env, String code) { try { if (log.isLoggable(Level.FINER)) log.finer("quercus eval: [[" + code + "]]"); Quercus quercus = env.getQuercus(); QuercusProgram program = quercus.parseCode(code); Value value = program.execute(env); if (value == null) value = NullValue.NULL; return value; } catch (IOException e) { throw new QuercusException(e); } } /** * Execute a system command. */ public static String exec(Env env, String command, @Optional Value output, @Optional @Reference Value result) { try { String []args = new String[3]; if (Path.isWindows()) { args[0] = "cmd"; args[1] = "/c"; } else { args[0] = "sh"; args[1] = "-c"; } args[2] = command; Process process = Runtime.getRuntime().exec(args); InputStream is = process.getInputStream(); InputStream es = process.getErrorStream(); OutputStream os = process.getOutputStream(); os.close(); StringBuilder sb = new StringBuilder(); String line = ""; int ch; boolean hasCr = false; while ((ch = is.read()) >= 0) { if (ch == '\n') { if (! hasCr) { line = sb.toString(); sb.setLength(0); if (output != null) output.put(env.createString(line)); } hasCr = false; } else if (ch == '\r') { line = sb.toString(); sb.setLength(0); output.put(env.createString(line)); hasCr = true; } else sb.append((char) ch); } if (sb.length() > 0) { line = sb.toString(); sb.setLength(0); output.put(env.createString(line)); } is.close(); env.getOut().writeStream(es); es.close(); int status = process.waitFor(); result.set(new LongValue(status)); return line; } catch (Exception e) { log.log(Level.FINE, e.getMessage(), e); env.warning(e.getMessage(), e); return null; } } /** * Returns an array detailing what the browser is capable of. * A general browscap.ini file can be used. * * @param env * @param user_agent * @param return_array */ public static Value get_browser( Env env, @Optional() String user_agent, @Optional() boolean return_array) { if (user_agent == null || user_agent.length() == 0) user_agent = env.getRequest().getHeader("User-Agent"); if (user_agent == null) { env.warning(L.l("HTTP_USER_AGENT not set.")); return BooleanValue.FALSE; } Value browscap = env.getConfigVar("browscap"); if (browscap == null) { env.warning(L.l("Browscap path not set in PHP.ini.")); return BooleanValue.FALSE; } Path path = env.lookup(browscap.toString()); if (path == null) { env.warning(L.l("Browscap file not found.")); return BooleanValue.FALSE; } Value ini = FileModule.parse_ini_file(env, path, true); if (ini == BooleanValue.FALSE) return BooleanValue.FALSE; return getBrowserReport( env, ini.toArrayValue(env), user_agent, return_array); } private static Value getBrowserReport( Env env, ArrayValue browsers, String user_agent, boolean return_array) { StringValue patternMatched = StringValue.EMPTY; String regExpMatched = null; for (Map.Entry<Value,Value> entry : browsers.entrySet()) { StringValue pattern = entry.getKey().toStringValue(); if (pattern.toString().equals(user_agent)) { patternMatched = pattern; regExpMatched = null; break; } String regExp = formatBrowscapRegexp(pattern); Matcher m = Pattern.compile(regExp).matcher(user_agent); // Want the longest matching pattern. if (m.matches()) { if (pattern.length() > patternMatched.length()) { patternMatched = pattern; regExpMatched = regExp; } } } if (patternMatched.length() == 0) return BooleanValue.FALSE; return prepareBrowserReport(env, browsers, patternMatched, regExpMatched, user_agent, return_array); } private static Value prepareBrowserReport( Env env, ArrayValue browsers, StringValue patternMatched, String regExpMatched, String user_agent, boolean return_array) { ArrayValue capabilities = browsers.get(patternMatched).toArrayValue(env); if (regExpMatched == null) capabilities.put(env.createString("browser_name_regex"), patternMatched); else capabilities.put("browser_name_regex", regExpMatched); capabilities.put(env.createString("browser_name_pattern"), patternMatched); addBrowserCapabilities(env, browsers, capabilities.get(env.createString("parent")), capabilities); if (return_array) { ArrayValue array = new ArrayValueImpl(); array.put(env.createString(user_agent), capabilities); return array; } ObjectValue object = env.createObject(); for (Map.Entry<Value,Value> entry : capabilities.entrySet()) { object.putField(env, entry.getKey().toString(), entry.getValue()); } return object; } private static void addBrowserCapabilities( Env env, ArrayValue browsers, Value browser, ArrayValue cap) { if (browser == UnsetValue.UNSET) return; Value field = null; if ((field = browsers.get(browser)) == UnsetValue.UNSET) return; ArrayValue browserCapabilities = field.toArrayValue(env); StringValue parentString = env.createString("parent"); for (Map.Entry<Value,Value> entry : browserCapabilities.entrySet()) { Value key = entry.getKey(); if (key.equals(parentString)) { addBrowserCapabilities( env, browsers, entry.getValue(), cap); } else if (cap.containsKey(key) == null) cap.put(key, entry.getValue()); } } private static String formatBrowscapRegexp(StringValue key) { int length = key.length(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { char ch = key.charAt(i); switch (ch) { case '*': sb.append('.'); sb.append('*'); break; case '?': sb.append('.'); break; case '.': sb.append('\\'); sb.append('.'); break; case '+': sb.append('\\'); sb.append('+'); break; case '(': sb.append('\\'); sb.append('('); break; case ')': sb.append('\\'); sb.append(')'); break; case '{': sb.append('\\'); sb.append('{'); break; case '}': sb.append('\\'); sb.append('}'); break; case ']': sb.append('\\'); sb.append(']'); break; case '[': sb.append('\\'); sb.append('['); break; case '\\': sb.append('\\'); sb.append('\\'); break; case '^': sb.append('\\'); sb.append('^'); break; case '$': sb.append('\\'); sb.append('$'); break; case '&': sb.append('\\'); sb.append('&'); break; case '|': sb.append('\\'); sb.append('|'); break; default: sb.append(ch); } } return sb.toString(); } /** * packs the format into a binary. */ public Value pack(Env env, String format, Value []args) { try { ArrayList<PackSegment> segments = parsePackFormat(env, format); StringValue bb = env.createBinaryBuilder(); int i = 0; for (PackSegment segment : segments) { i = segment.pack(env, bb, i, args); } return bb; } catch (IOException e) { throw new QuercusModuleException(e); } } /** * packs the format into a binary. */ public Value unpack(Env env, String format, InputStream is) { try { ArrayList<PackSegment> segments = parseUnpackFormat(env, format); ArrayValue array = new ArrayValueImpl(); for (PackSegment segment : segments) { segment.unpack(env, array, is); } return array; } catch (IOException e) { throw new QuercusModuleException(e); } } /** * Logs the expression. */ public Value resin_debug(String code) { log.info(code); return NullValue.NULL; } /** * Dumps the Java stack to standard out. */ public Value resin_thread_dump() { Thread.dumpStack(); return NullValue.NULL; } /** * Dumps the stack. */ public static Value dump_stack(Env env) { try { Exception e = new Exception("Stack trace"); e.fillInStackTrace(); WriteStream out = env.getPwd().lookup("stderr:").openWrite(); try { e.printStackTrace(out.getPrintWriter()); //ScriptStackTrace.printStackTrace(e, out.getPrintWriter()); } finally { out.close(); } return NullValue.NULL; } catch (IOException e) { throw new QuercusModuleException(e); } } /** * Execute a system command. */ public static Value shell_exec(Env env, String command) { String []args = new String[3]; try { if (Path.isWindows()) { args[0] = "cmd"; args[1] = "/c"; } else { args[0] = "sh"; args[1] = "-c"; } args[2] = command; Process process = Runtime.getRuntime().exec(args); InputStream is = process.getInputStream(); InputStream es = process.getErrorStream(); OutputStream os = process.getOutputStream();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?