⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jextloader.java

📁 java写的多功能文件编辑器
💻 JAVA
字号:
/* * 01/20/2003 - 23:56:01 * * JextLoader.java - Loads Jext instances in a single JVM * Copyright (C) 2000 Romain Guy * romain.guy@jext.org * www.jext.org * * This program 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 any later version. * * This program 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.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */package org.jext;import java.io.*;import java.net.*;import java.util.*;import javax.swing.JOptionPane;/** * This class creates a new socket connection which listens to client requests. Whenever * a client logs onto the socket, we check its IP address.<br> * Security implementation:<p> * <ul> * <li>If this address isn't 127.0.0.1 (aka localhost), the connection is rejected.</li> * <li>The socket also needs to get the good message which must contain a give authorization key. * If the given key or message is wrong, the connection is rejected.</li> * <li>If the server rejects a connection, it also closes itself to avoid Denial Of Service * attacks or brutal ones (trying for instance random keys).</li> * </ul> * @author Romain Guy * @version 1.1.1 */final class JextLoader implements Runnable{  private int port;  private File auth;  private String key;  private Thread tServer;  private ServerSocket server;  JextLoader()  {    auth = new File(Jext.SETTINGS_DIRECTORY + ".auth-key");    // creates the authorization key    try    {      BufferedWriter writer = new BufferedWriter(new FileWriter(auth));      // 16 383 = unreserved range of ports      port = Math.abs(new Random().nextInt()) % (16383);      String portStr = Integer.toString(port);      key = Integer.toString(Math.abs(new Random().nextInt()) % (int) Math.pow(2, 30));      writer.write(portStr, 0, portStr.length());      writer.newLine();      writer.write(key, 0, key.length());      writer.flush();      writer.close();      // creates the server      server = new ServerSocket(Jext.JEXT_SERVER_PORT + port);    } catch (IOException ioe) {      ioe.printStackTrace();    }    // server is necessarily threaded    tServer = new Thread(this);    tServer.start();  }  /**   * Stops the server by inerrupting the thread, killing it and then   * closing the server itself. Finally, it erases the authorization   * key.   */  public void stop()  {    tServer.interrupt();    tServer = null;    try    {      if (server != null)        server.close();      auth.delete();    } catch (IOException ioe) { }  }  /**   * Waits for a connexion request and handle it. The client should provide a special line   * containing a message, the arguments for the loading and the authorization key. This   * key is used to avoid security holes in your system.   */  public void run()  {    while (tServer != null)    {      try      {        Socket client = server.accept();        if (client == null)          continue;        if (!"127.0.0.1".equals(client.getLocalAddress().getHostAddress()))        {          client.close();          Jext.stopServer();          intrusion();          return;        }        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));        String givenKey = reader.readLine();        reader.close();        if (givenKey != null)//when backgrounding connects to check existance of server but sends          //nothing.          if (givenKey.startsWith("load_jext:") && givenKey.endsWith(":" + key))          {            Vector args = new Vector(1);            StringTokenizer st = new StringTokenizer(givenKey.substring(10,        					     givenKey.length() - (key.length() + 1)), "?");            while (st.hasMoreTokens())              args.addElement(st.nextToken());            if (args.size() > 0)            {              String arguments[] = new String[args.size()];              args.copyInto(arguments);              args = null;              if (Jext.getBooleanProperty("jextLoader.newWindow"))              {        	Jext.newWindow(arguments);              } else if (!Jext.isRunningBg()) {        	ArrayList instances = Jext.getInstances();                synchronized(instances) {                  if (instances.size() != 0) {//can be 0 when backgrounding.??? No more!                    JextFrame parent = (JextFrame) instances.get(0);                    for (int i = 0; i < arguments.length; i++)                      parent.open(arguments[i]);                    //parent.setVisible(true);//this code is not good when running background server,                    //since Jext keeps builtTextArea set(and doesn't open a new one until it isn't unset).                    //And so setVisible is not needed.                  } else {                    Jext.newWindow(arguments);                    System.err.println("DEBUG - instances.size() == 0 in JextLoader.java!");                  }                }              } else                    //when Jext.isRunningBg()                Jext.newWindow(arguments);            } else              Jext.newWindow();            client.close();          } else if (givenKey.equals("kill:" + key)) {            if (Jext.isRunningBg())// && Jext.getWindowsCount() <= 1 )            {              ArrayList instances = Jext.getInstances();              synchronized (instances)              {                //normally at least one window is always open, even if hidden, but in some moments                //this isn't true(when the user exits jext and it has not still started a new window).                //If one window is open, we must check it is not shown.                JextFrame lastInstance = null;                if (instances.size() == 0 || instances.size() == 1 &&                     ! ( lastInstance = (JextFrame)instances.get(0) ) .isVisible())                {                  if (instances.size() != 0)                  {                    Jext.closeToQuit(lastInstance, true);                    //since the window has not been shown this could be useless, but maybe not, especially to                    //dispatch JextEvent's.                  }                  //I've commented out the above code since it causes bugs with the ProjectManagement,                  //that is NullPointerEx. I'm trying if this doesn't happen without cleanMemory.                  Jext.finalCleanupAndExit();//check well this! TODO                }              }            }          } else {            client.close();            Jext.stopServer();            intrusion();            return;          }      } catch (IOException ioe) { }    }  }  // warn the user that someone is attempting to break into his system  private void intrusion()  {    JOptionPane.showMessageDialog(null,            "An intrusion is attempted against your system !\nJext will close its opened " + "sockets to preserve system integrity.\nYou should warn the network administrator.",            "Intrusion attempt...", JOptionPane.WARNING_MESSAGE);  }}// End of JextLoader.java

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -