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 + -
显示快捷键?