client/ftpd/src/se/lu/thep/coreftpd/webserver/SetupNewConnection.java

Code
Comments
Other
Rev Date Author Line
741 10 Oct 06 olle 1 /*
1652 22 May 07 gregory 2  $Id$
741 10 Oct 06 olle 3
1916 31 Aug 07 jari 4  Copyright (C) 2006 Olle Mansson
1916 31 Aug 07 jari 5  Copyright (C) 2007 Gregory Vincic
741 10 Oct 06 olle 6
1652 22 May 07 gregory 7  This file is part of Proteios.
1652 22 May 07 gregory 8  Available at http://www.proteios.org/
741 10 Oct 06 olle 9
1652 22 May 07 gregory 10  Proteios is free software; you can redistribute it and/or modify it
1652 22 May 07 gregory 11  under the terms of the GNU General Public License as published by
1652 22 May 07 gregory 12  the Free Software Foundation; either version 2 of the License, or
1652 22 May 07 gregory 13  (at your option) any later version.
741 10 Oct 06 olle 14
1652 22 May 07 gregory 15  Proteios is distributed in the hope that it will be useful, but
1652 22 May 07 gregory 16  WITHOUT ANY WARRANTY; without even the implied warranty of
1652 22 May 07 gregory 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1652 22 May 07 gregory 18  General Public License for more details.
741 10 Oct 06 olle 19
1652 22 May 07 gregory 20  You should have received a copy of the GNU General Public License
1652 22 May 07 gregory 21  along with this program; if not, write to the Free Software
1652 22 May 07 gregory 22  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1652 22 May 07 gregory 23  02111-1307, USA.
1652 22 May 07 gregory 24  */
741 10 Oct 06 olle 25
741 10 Oct 06 olle 26 //  Xerver Free Web Server
741 10 Oct 06 olle 27 //  Copyright (C) 2002-2005 Omid Rouhani
741 10 Oct 06 olle 28 //
741 10 Oct 06 olle 29 //
741 10 Oct 06 olle 30 //  This program is free software; you can redistribute it and/or
741 10 Oct 06 olle 31 //  modify it under the terms of the GNU General Public License
741 10 Oct 06 olle 32 //  as published by the Free Software Foundation; either version 2
741 10 Oct 06 olle 33 //  of the License, or (at your option) any later version.
741 10 Oct 06 olle 34 //
741 10 Oct 06 olle 35 //  This program is distributed in the hope that it will be useful,
741 10 Oct 06 olle 36 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
741 10 Oct 06 olle 37 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
741 10 Oct 06 olle 38 //  GNU General Public License for more details.
741 10 Oct 06 olle 39 //
741 10 Oct 06 olle 40 //  You should have received a copy of the GNU General Public License
741 10 Oct 06 olle 41 //  along with this program; if not, write to the Free Software
741 10 Oct 06 olle 42 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
741 10 Oct 06 olle 43 //
741 10 Oct 06 olle 44 //
741 10 Oct 06 olle 45 //  #############################################################
741 10 Oct 06 olle 46 //  ##  YOU CAN CONTACT THE AUTHOR (OMID ROUHANI) AT:          ##
741 10 Oct 06 olle 47 //  ##  HTTP://WWW.JAVASCRIPT.NU/XERVER/                       ##
741 10 Oct 06 olle 48 //  ##                                                         ##
741 10 Oct 06 olle 49 //  ##  IF YOUR SOFTWARE IS NOT RELEASED UNDER THE             ##
741 10 Oct 06 olle 50 //  ##  GNU GENERAL PUBLIC LICENSE (GPL),                      ##
741 10 Oct 06 olle 51 //  ##  PLEASE DO NOT COPY ANYTHING FROM THIS SOURCE CODE!!!   ##
741 10 Oct 06 olle 52 //  ##                                                         ##
741 10 Oct 06 olle 53 //  ##  FOR FULL LICENSE, PLEASE READ "XERVER LICENSE".        ##
741 10 Oct 06 olle 54 //  #############################################################
741 10 Oct 06 olle 55
1652 22 May 07 gregory 56 package se.lu.thep.coreftpd.webserver;
741 10 Oct 06 olle 57
791 23 Oct 06 olle 58 import se.lu.thep.coreftpd.common.MyHashTable;
791 23 Oct 06 olle 59 import se.lu.thep.coreftpd.common.MyString;
741 10 Oct 06 olle 60 import java.io.BufferedOutputStream;
741 10 Oct 06 olle 61 import java.io.BufferedReader;
741 10 Oct 06 olle 62 import java.io.DataOutputStream;
741 10 Oct 06 olle 63 import java.io.File;
741 10 Oct 06 olle 64 import java.io.FileInputStream;
741 10 Oct 06 olle 65 import java.io.FileOutputStream;
741 10 Oct 06 olle 66 import java.io.FileReader;
741 10 Oct 06 olle 67 import java.io.InputStreamReader;
741 10 Oct 06 olle 68 import java.io.PrintStream;
741 10 Oct 06 olle 69 import java.net.Socket;
741 10 Oct 06 olle 70 import java.text.DateFormat;
741 10 Oct 06 olle 71 import java.util.Date;
741 10 Oct 06 olle 72
741 10 Oct 06 olle 73 /**
1652 22 May 07 gregory 74  * 
1652 22 May 07 gregory 75  * <B>About this class:</B> <BR>
1652 22 May 07 gregory 76  * Every time a connection is established to Xervers setup program, a <CODE>SetupNewConnection</CODE>
1652 22 May 07 gregory 77  * is created. <CODE>SetupNewConnection</CODE> is a <CODE>Thread</CODE> and
1652 22 May 07 gregory 78  * reads what the user requested and gives the user an appropriate response to
1652 22 May 07 gregory 79  * his/her request.
1652 22 May 07 gregory 80  * 
741 10 Oct 06 olle 81  * @author <a href="http://www.JavaScript.nu/xerver/" TARGET="_top">Omid Rouhani</a>
741 10 Oct 06 olle 82  * @version 1.0
741 10 Oct 06 olle 83  */
741 10 Oct 06 olle 84
1652 22 May 07 gregory 85 // No run-method ==> only one request can be made at once ==> no problem will
1652 22 May 07 gregory 86 // occur when reading/writing to the config-file
1652 22 May 07 gregory 87 final public class SetupNewConnection extends Thread {
1652 22 May 07 gregory 88   private String hiddenFolder = "data" + File.separator;
741 10 Oct 06 olle 89
1652 22 May 07 gregory 90   private String errorFilesFolder = "errorHTML" + File.separator;
1652 22 May 07 gregory 91
1652 22 May 07 gregory 92   private final boolean b_showErrors = false;
1652 22 May 07 gregory 93
741 10 Oct 06 olle 94   private Date d_dateToday;
1652 22 May 07 gregory 95
741 10 Oct 06 olle 96   private DateFormat df_dateFormat;
1652 22 May 07 gregory 97
1652 22 May 07 gregory 98   private String s_allData, s_requestedFolderLocation, s_errorStatus,
1652 22 May 07 gregory 99       s_requestMethod, s_requestDocument;
1652 22 May 07 gregory 100
741 10 Oct 06 olle 101   private Socket so_userConnection;
1652 22 May 07 gregory 102
741 10 Oct 06 olle 103   private String s_portNr;
1652 22 May 07 gregory 104
741 10 Oct 06 olle 105   private String s_indexNames;
1652 22 May 07 gregory 106
741 10 Oct 06 olle 107   private String s_sharedPaths;
1652 22 May 07 gregory 108
741 10 Oct 06 olle 109   private String s_fileExtensions;
1652 22 May 07 gregory 110
741 10 Oct 06 olle 111   private String s_rootPath;
1652 22 May 07 gregory 112
741 10 Oct 06 olle 113   private String s_runnableExtensions;
1652 22 May 07 gregory 114
741 10 Oct 06 olle 115   private String s_aliasNames;
1652 22 May 07 gregory 116
741 10 Oct 06 olle 117   private String s_protectedFolders;
1652 22 May 07 gregory 118
741 10 Oct 06 olle 119   private String s_allowFolderListing;
1652 22 May 07 gregory 120
741 10 Oct 06 olle 121   private String s_allowTheseFileExtensions;
1652 22 May 07 gregory 122
741 10 Oct 06 olle 123   private String s_shareHiddenFiles;
1652 22 May 07 gregory 124
741 10 Oct 06 olle 125   private String s_startupWindowMode;
1652 22 May 07 gregory 126
741 10 Oct 06 olle 127   private String s_allowCGIScript;
1652 22 May 07 gregory 128
1652 22 May 07 gregory 129   private String s_configFile = hiddenFolder + "Xerver.cfg";
1652 22 May 07 gregory 130
741 10 Oct 06 olle 131   private SetupXerverKernel mySetupXerverKernel;
1652 22 May 07 gregory 132
741 10 Oct 06 olle 133   private MyHashTable MyHT_allDataFromQuery;
741 10 Oct 06 olle 134
1652 22 May 07 gregory 135   private DataOutputStream theOutput; // Everything written to this will be
1652 22 May 07 gregory 136                     // sent to the browser
741 10 Oct 06 olle 137
1652 22 May 07 gregory 138   private boolean b_environmentHasBeenSetUp = false;
741 10 Oct 06 olle 139
1652 22 May 07 gregory 140   private BufferedReader br_theInputWeGetFromBrowser; // Read the browsers
1652 22 May 07 gregory 141                             // header from this
741 10 Oct 06 olle 142
1652 22 May 07 gregory 143   private String s_encryptedPasswordGiven; // This is set during the setup
1652 22 May 07 gregory 144                         // when the user want create a
1652 22 May 07 gregory 145                         // password protected folder
741 10 Oct 06 olle 146
1652 22 May 07 gregory 147   private final int maxNumbersOfENVAccepted = 200; // Maximum number of
1652 22 May 07 gregory 148                             // environment variables
1652 22 May 07 gregory 149                             // the *browser can tell
1652 22 May 07 gregory 150                             // us* to create. (Note:
1652 22 May 07 gregory 151                             // We might have more
1652 22 May 07 gregory 152                             // than 200 environment
1652 22 May 07 gregory 153                             // variables; because we
1652 22 May 07 gregory 154                             // don't only create
1652 22 May 07 gregory 155                             // environment variables
1652 22 May 07 gregory 156                             // that the browser tell
1652 22 May 07 gregory 157                             // us to create). If a
1652 22 May 07 gregory 158                             // browser gives more
1652 22 May 07 gregory 159                             // than 200 environment
1652 22 May 07 gregory 160                             // variables, we just
1652 22 May 07 gregory 161                             // ignore the last
1652 22 May 07 gregory 162                             // variables.
741 10 Oct 06 olle 163
1652 22 May 07 gregory 164   private int i_valueOfHttpContentLength = 0; // This variable is currently
1652 22 May 07 gregory 165                         // not in use,
1652 22 May 07 gregory 166                         // getEnvironmentVariablesGivenByBrowser
1652 22 May 07 gregory 167                         // uses it to read the POST-data
1652 22 May 07 gregory 168                         // (which might be needed later)
741 10 Oct 06 olle 169
1652 22 May 07 gregory 170   private String s_stdinDataForPOSTRequests = null; // This variable is
1652 22 May 07 gregory 171                             // currently not in use,
1652 22 May 07 gregory 172                             // getEnvironmentVariablesGivenByBrowser
1652 22 May 07 gregory 173                             // uses it to read the
1652 22 May 07 gregory 174                             // POST-data (which
1652 22 May 07 gregory 175                             // might be needed
1652 22 May 07 gregory 176                             // later) //Must be null
1652 22 May 07 gregory 177                             // by default, which
1652 22 May 07 gregory 178                             // means that no
1652 22 May 07 gregory 179                             // POST-data has been
1652 22 May 07 gregory 180                             // read.
1652 22 May 07 gregory 181
1652 22 May 07 gregory 182   public SetupNewConnection(Socket agrUserConnection,
1652 22 May 07 gregory 183       SetupXerverKernel serverSetup)// throws IOException
1652 22 May 07 gregory 184   {
1652 22 May 07 gregory 185     try {
1652 22 May 07 gregory 186       mySetupXerverKernel = serverSetup;
1652 22 May 07 gregory 187       so_userConnection = agrUserConnection;
1652 22 May 07 gregory 188       d_dateToday = new Date();
1652 22 May 07 gregory 189       df_dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
1652 22 May 07 gregory 190           DateFormat.LONG);
1652 22 May 07 gregory 191       s_errorStatus = "200 OK";
1652 22 May 07 gregory 192
1652 22 May 07 gregory 193       getRequestInformation();
1652 22 May 07 gregory 194       createVariables();
1652 22 May 07 gregory 195
1652 22 May 07 gregory 196       theOutput = new DataOutputStream(new BufferedOutputStream(
1652 22 May 07 gregory 197           so_userConnection.getOutputStream())); // I "java.io.*"
1652 22 May 07 gregory 198
1652 22 May 07 gregory 199       if (MyHT_allDataFromQuery.giveValueByIndex("save") != null) // If
1652 22 May 07 gregory 200                                     // there
1652 22 May 07 gregory 201                                     // is
1652 22 May 07 gregory 202                                     // anything
1652 22 May 07 gregory 203                                     // to
1652 22 May 07 gregory 204                                     // save...
741 10 Oct 06 olle 205       {
1652 22 May 07 gregory 206         if (MyHT_allDataFromQuery.giveValueByIndex("portNr") != null)
1652 22 May 07 gregory 207           s_portNr = MyHT_allDataFromQuery.giveValueByIndex("portNr");
1652 22 May 07 gregory 208         if (MyHT_allDataFromQuery.giveValueByIndex("indexNames") != null)
1652 22 May 07 gregory 209           s_indexNames = MyHT_allDataFromQuery
1652 22 May 07 gregory 210               .giveValueByIndex("indexNames");
1652 22 May 07 gregory 211         if (MyHT_allDataFromQuery.giveValueByIndex("sharedPaths") != null)
1652 22 May 07 gregory 212           s_sharedPaths = MyHT_allDataFromQuery
1652 22 May 07 gregory 213               .giveValueByIndex("sharedPaths");
1652 22 May 07 gregory 214         if (MyHT_allDataFromQuery.giveValueByIndex("fileExtensions") != null)
1652 22 May 07 gregory 215           s_fileExtensions = MyHT_allDataFromQuery
1652 22 May 07 gregory 216               .giveValueByIndex("fileExtensions");
1652 22 May 07 gregory 217         if (MyHT_allDataFromQuery.giveValueByIndex("rootPath") != null)
1652 22 May 07 gregory 218           s_rootPath = MyHT_allDataFromQuery
1652 22 May 07 gregory 219               .giveValueByIndex("rootPath");
1652 22 May 07 gregory 220         if (MyHT_allDataFromQuery
1652 22 May 07 gregory 221             .giveValueByIndex("runnableExtensions") != null)
1652 22 May 07 gregory 222           s_runnableExtensions = MyHT_allDataFromQuery
1652 22 May 07 gregory 223               .giveValueByIndex("runnableExtensions");
1652 22 May 07 gregory 224         if (MyHT_allDataFromQuery.giveValueByIndex("aliasNames") != null)
1652 22 May 07 gregory 225           s_aliasNames = MyHT_allDataFromQuery
1652 22 May 07 gregory 226               .giveValueByIndex("aliasNames");
1652 22 May 07 gregory 227         if (MyHT_allDataFromQuery.giveValueByIndex("protectedFolders") != null)
1652 22 May 07 gregory 228           s_protectedFolders = MyHT_allDataFromQuery
1652 22 May 07 gregory 229               .giveValueByIndex("protectedFolders");
1652 22 May 07 gregory 230         if (MyHT_allDataFromQuery
1652 22 May 07 gregory 231             .giveValueByIndex("allowFolderListing") != null)
1652 22 May 07 gregory 232           s_allowFolderListing = MyHT_allDataFromQuery
1652 22 May 07 gregory 233               .giveValueByIndex("allowFolderListing");
1652 22 May 07 gregory 234         if (MyHT_allDataFromQuery
1652 22 May 07 gregory 235             .giveValueByIndex("allowTheseFileExtensions") != null)
1652 22 May 07 gregory 236           s_allowTheseFileExtensions = MyHT_allDataFromQuery
1652 22 May 07 gregory 237               .giveValueByIndex("allowTheseFileExtensions");
1652 22 May 07 gregory 238         if (MyHT_allDataFromQuery.giveValueByIndex("shareHiddenFiles") != null)
1652 22 May 07 gregory 239           s_shareHiddenFiles = MyHT_allDataFromQuery
1652 22 May 07 gregory 240               .giveValueByIndex("shareHiddenFiles");
1652 22 May 07 gregory 241         if (MyHT_allDataFromQuery.giveValueByIndex("startupWindowMode") != null)
1652 22 May 07 gregory 242           s_startupWindowMode = MyHT_allDataFromQuery
1652 22 May 07 gregory 243               .giveValueByIndex("startupWindowMode");
1652 22 May 07 gregory 244         if (MyHT_allDataFromQuery.giveValueByIndex("allowCGIScript") != null)
1652 22 May 07 gregory 245           s_allowCGIScript = MyHT_allDataFromQuery
1652 22 May 07 gregory 246               .giveValueByIndex("allowCGIScript");
1652 22 May 07 gregory 247
1652 22 May 07 gregory 248         saveInformationToFile();
741 10 Oct 06 olle 249       }
1652 22 May 07 gregory 250
1652 22 May 07 gregory 251       if (MyHT_allDataFromQuery.giveValueByIndex("action") != null) // If
1652 22 May 07 gregory 252                                       // there
1652 22 May 07 gregory 253                                       // is
1652 22 May 07 gregory 254                                       // an
1652 22 May 07 gregory 255                                       // action
1652 22 May 07 gregory 256                                       // given
1652 22 May 07 gregory 257                                       // (there
1652 22 May 07 gregory 258                                       // shall
1652 22 May 07 gregory 259                                       // always
1652 22 May 07 gregory 260                                       // be
1652 22 May 07 gregory 261                                       // an
1652 22 May 07 gregory 262                                       // action
1652 22 May 07 gregory 263                                       // given,
1652 22 May 07 gregory 264                                       // but
1652 22 May 07 gregory 265                                       // not
1652 22 May 07 gregory 266                                       // if
1652 22 May 07 gregory 267                                       // you
1652 22 May 07 gregory 268                                       // visit
1652 22 May 07 gregory 269                                       // the
1652 22 May 07 gregory 270                                       // "setup
1652 22 May 07 gregory 271                                       // root"
1652 22 May 07 gregory 272                                       // (="http://localhost:32123/")...
741 10 Oct 06 olle 273       {
1652 22 May 07 gregory 274         if (MyHT_allDataFromQuery.giveValueByIndex("action").equals(
1652 22 May 07 gregory 275             "wizardGeneralSettings")) {
1652 22 May 07 gregory 276           returnThisPage(hiddenFolder + "WizGeneralSettings.html",
1652 22 May 07 gregory 277               "text/html");
1652 22 May 07 gregory 278         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 279             .equals("wizardMenu")) {
1652 22 May 07 gregory 280           returnThisPage(hiddenFolder + "WizMenu.html", "text/html");
1652 22 May 07 gregory 281         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 282             .equals("wizardFrames")) {
1652 22 May 07 gregory 283           returnThisPage(hiddenFolder + "WizFrames.html", "text/html");
1652 22 May 07 gregory 284         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 285             .equals("setupDone")) {
1652 22 May 07 gregory 286           showHeaderData("text/html");
1652 22 May 07 gregory 287           ShowSetupPages.setupDone(theOutput);
1652 22 May 07 gregory 288           mySetupXerverKernel.setupIsDone(true); // Let the kernel
1652 22 May 07 gregory 289                               // (mySetupXerverKernel)
1652 22 May 07 gregory 290                               // know that the
1652 22 May 07 gregory 291                               // settings have
1652 22 May 07 gregory 292                               // been changed
1652 22 May 07 gregory 293         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 294             .equals("chooseDirectory")) {
1652 22 May 07 gregory 295           showHeaderData("text/html");
1652 22 May 07 gregory 296           ShowSetupPages.showChooseDirectory(theOutput,
1652 22 May 07 gregory 297               MyHT_allDataFromQuery
1652 22 May 07 gregory 298                   .giveValueByIndex("currentPath")); // Note:
1652 22 May 07 gregory 299                                     // "MyHT_allDataFromQuery.giveValueByIndex("currentPath")"
1652 22 May 07 gregory 300                                     // might
1652 22 May 07 gregory 301                                     // be
1652 22 May 07 gregory 302                                     // null.
1652 22 May 07 gregory 303                                     // If
1652 22 May 07 gregory 304                                     // it's
1652 22 May 07 gregory 305                                     // null
1652 22 May 07 gregory 306                                     // it
1652 22 May 07 gregory 307                                     // means
1652 22 May 07 gregory 308                                     // the
1652 22 May 07 gregory 309                                     // root
1652 22 May 07 gregory 310                                     // shall
1652 22 May 07 gregory 311                                     // be
1652 22 May 07 gregory 312                                     // showed.
1652 22 May 07 gregory 313         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 314             .equals("wizardStep1")) {
1652 22 May 07 gregory 315           returnThisPage(hiddenFolder + "WizStep1.html", "text/html");
1652 22 May 07 gregory 316           ShowSetupPages.showSetupWizStep1(theOutput, s_portNr,
1652 22 May 07 gregory 317               s_allowFolderListing, s_shareHiddenFiles,
1652 22 May 07 gregory 318               s_allowCGIScript);
1652 22 May 07 gregory 319         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 320             .equals("wizardStep2")) {
1652 22 May 07 gregory 321           returnThisPage(hiddenFolder + "WizStep2.html", "text/html");
1652 22 May 07 gregory 322           ShowSetupPages.showSetupWizStep2(theOutput, s_sharedPaths);
1652 22 May 07 gregory 323         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 324             .equals("wizardStep3")) {
1652 22 May 07 gregory 325           returnThisPage(hiddenFolder + "WizStep3.html", "text/html");
1652 22 May 07 gregory 326           ShowSetupPages.showSetupWizStep3(theOutput, s_sharedPaths,
1652 22 May 07 gregory 327               s_rootPath);
1652 22 May 07 gregory 328         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 329             .equals("wizardStep4")) {
1652 22 May 07 gregory 330           returnThisPage(hiddenFolder + "WizStep4.html", "text/html");
1652 22 May 07 gregory 331           ShowSetupPages.showSetupWizStep4(theOutput, s_sharedPaths,
1652 22 May 07 gregory 332               s_aliasNames);
1652 22 May 07 gregory 333         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 334             .equals("wizardStep5")) {
1652 22 May 07 gregory 335           if (s_allowCGIScript.equals("1")
1652 22 May 07 gregory 336               || MyHT_allDataFromQuery
1652 22 May 07 gregory 337                   .giveValueByIndex("direction") == null) // IF
1652 22 May 07 gregory 338                                       // [CGI-scripts
1652 22 May 07 gregory 339                                       // can
1652 22 May 07 gregory 340                                       // be
1652 22 May 07 gregory 341                                       // run]
1652 22 May 07 gregory 342                                       // OR
1652 22 May 07 gregory 343                                       // [not
1652 22 May 07 gregory 344                                       // coming
1652 22 May 07 gregory 345                                       // from
1652 22 May 07 gregory 346                                       // the
1652 22 May 07 gregory 347                                       // next-
1652 22 May 07 gregory 348                                       // or
1652 22 May 07 gregory 349                                       // back-button
1652 22 May 07 gregory 350                                       // (but
1652 22 May 07 gregory 351                                       // from
1652 22 May 07 gregory 352                                       // the
1652 22 May 07 gregory 353                                       // menu)]....
741 10 Oct 06 olle 354           {
1652 22 May 07 gregory 355             returnThisPage(hiddenFolder + "WizStep5.html",
1652 22 May 07 gregory 356                 "text/html");
1652 22 May 07 gregory 357             ShowSetupPages.showSetupWizStep5(theOutput,
1652 22 May 07 gregory 358                 s_runnableExtensions);
1652 22 May 07 gregory 359           } else // CGI-scripts can't be run.... (Don't ask which
1652 22 May 07 gregory 360               // file extensions shall be considered runnable
1652 22 May 07 gregory 361               // files)
1652 22 May 07 gregory 362           {
1652 22 May 07 gregory 363             if (MyHT_allDataFromQuery.giveValueByIndex("direction")
1652 22 May 07 gregory 364                 .equals("back")) // If we are pressing the
1652 22 May 07 gregory 365                           // "back" button from Step6
1652 22 May 07 gregory 366             {
1652 22 May 07 gregory 367               returnThisPage(hiddenFolder + "WizStep4.html",
1652 22 May 07 gregory 368                   "text/html");
1652 22 May 07 gregory 369               ShowSetupPages.showSetupWizStep4(theOutput,
1652 22 May 07 gregory 370                   s_sharedPaths, s_aliasNames);
1652 22 May 07 gregory 371             } else // If we are pressing the "next" button from
1652 22 May 07 gregory 372                 // Step4
1652 22 May 07 gregory 373             {
1652 22 May 07 gregory 374               returnThisPage(hiddenFolder + "WizStep6.html",
1652 22 May 07 gregory 375                   "text/html");
1652 22 May 07 gregory 376               ShowSetupPages.showSetupWizStep6(theOutput,
1652 22 May 07 gregory 377                   s_indexNames);
1652 22 May 07 gregory 378             }
741 10 Oct 06 olle 379           }
1652 22 May 07 gregory 380         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 381             .equals("wizardStep6")) {
1652 22 May 07 gregory 382           returnThisPage(hiddenFolder + "WizStep6.html", "text/html");
1652 22 May 07 gregory 383           ShowSetupPages.showSetupWizStep6(theOutput, s_indexNames);
1652 22 May 07 gregory 384         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 385             .equals("wizardStep7")) {
1652 22 May 07 gregory 386           returnThisPage(hiddenFolder + "WizStep7.html", "text/html");
1652 22 May 07 gregory 387           ShowSetupPages.showSetupWizStep7(theOutput,
1652 22 May 07 gregory 388               s_fileExtensions, s_allowTheseFileExtensions);
1652 22 May 07 gregory 389         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 390             .equals("wizardStep8")) {
1652 22 May 07 gregory 391           returnThisPage(hiddenFolder + "WizStep8.html", "text/html");
1652 22 May 07 gregory 392           ShowSetupPages.showSetupWizStep8(theOutput, s_sharedPaths,
1652 22 May 07 gregory 393               s_protectedFolders);
1652 22 May 07 gregory 394         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 395             .equals("wizardStep9")) {
1652 22 May 07 gregory 396           returnThisPage(hiddenFolder + "WizStep9.html", "text/html");
1652 22 May 07 gregory 397           ShowSetupPages.showSetupWizStep9(theOutput,
1652 22 May 07 gregory 398               s_startupWindowMode);
1652 22 May 07 gregory 399         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 400             .equals("showLogo")) {
1652 22 May 07 gregory 401           returnThisPage(hiddenFolder + "imagelogo.gif", "image/gif");
1652 22 May 07 gregory 402         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 403             .equals("showBigWizard")) {
1652 22 May 07 gregory 404           returnThisPage(hiddenFolder + "imagewizardbig.gif",
1652 22 May 07 gregory 405               "image/gif");
1652 22 May 07 gregory 406         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 407             .equals("showSmallWizard")) {
1652 22 May 07 gregory 408           returnThisPage(hiddenFolder + "imagewizardsmall.gif",
1652 22 May 07 gregory 409               "image/gif");
1652 22 May 07 gregory 410         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 411             .equals("showWizardHelp")) {
1652 22 May 07 gregory 412           returnThisPage(hiddenFolder + "WizardHelp.html",
1652 22 May 07 gregory 413               "text/html");
1652 22 May 07 gregory 414         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 415             .equals("showAddDirSetup")) {
1652 22 May 07 gregory 416           returnThisPage(hiddenFolder + "AddDirSetup.html",
1652 22 May 07 gregory 417               "text/html");
1652 22 May 07 gregory 418         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 419             .equals("showAddAliasSetup")) {
1652 22 May 07 gregory 420           returnThisPage(hiddenFolder + "AddAliasSetup.html",
1652 22 May 07 gregory 421               "text/html");
1652 22 May 07 gregory 422         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 423             .equals("showAddScriptExtSetup")) {
1652 22 May 07 gregory 424           returnThisPage(hiddenFolder + "AddScriptExtSetup.html",
1652 22 May 07 gregory 425               "text/html");
1652 22 May 07 gregory 426         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 427             .equals("showAddIndSetup")) {
1652 22 May 07 gregory 428           returnThisPage(hiddenFolder + "AddIndSetup.html",
1652 22 May 07 gregory 429               "text/html");
1652 22 May 07 gregory 430         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 431             .equals("showAddExtSetup")) {
1652 22 May 07 gregory 432           returnThisPage(hiddenFolder + "AddExtSetup.html",
1652 22 May 07 gregory 433               "text/html");
1652 22 May 07 gregory 434         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 435             .equals("showAddProtFrameSetup")) {
1652 22 May 07 gregory 436           returnThisPage(hiddenFolder + "AddProtFrameSetup.html",
1652 22 May 07 gregory 437               "text/html");
1652 22 May 07 gregory 438         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 439             .equals("showAddProtSetup")) {
1652 22 May 07 gregory 440           returnThisPage(hiddenFolder + "AddProtSetup.html",
1652 22 May 07 gregory 441               "text/html");
1652 22 May 07 gregory 442         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 443             .equals("showAddProtDirSetup")) {
1652 22 May 07 gregory 444           returnThisPage(hiddenFolder + "AddProtDirSetup.html",
1652 22 May 07 gregory 445               "text/html");
1652 22 May 07 gregory 446         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 447             .equals("showAddProtUserSetup")) {
1652 22 May 07 gregory 448           returnThisPage(hiddenFolder + "AddProtUserSetup.html",
1652 22 May 07 gregory 449               "text/html");
1652 22 May 07 gregory 450         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 451             .equals("showEmptyPage")) {
1652 22 May 07 gregory 452           returnThisPage(hiddenFolder + "empty.html", "text/html");
1652 22 May 07 gregory 453         } else if (MyHT_allDataFromQuery.giveValueByIndex("action")
1652 22 May 07 gregory 454             .equals("promptForPassword")) {
1652 22 May 07 gregory 455           createEnvironmentVariables();
1652 22 May 07 gregory 456           // System.out.println(mySetupXerverKernel.b_show401NotAuthorized);
1652 22 May 07 gregory 457           if (mySetupXerverKernel.b_show401NotAuthorized
1652 22 May 07 gregory 458               || s_encryptedPasswordGiven == null) // If
1652 22 May 07 gregory 459                                   // "s_encryptedPasswordGiven"
1652 22 May 07 gregory 460                                   // is null
1652 22 May 07 gregory 461                                   // ==> Show
1652 22 May 07 gregory 462                                   // 401-message.
741 10 Oct 06 olle 463           {
1652 22 May 07 gregory 464             ShowSetupPages.show401NotAuthorizedIsNotAccepted(
1652 22 May 07 gregory 465                 theOutput, s_encryptedPasswordGiven,
1652 22 May 07 gregory 466                 df_dateFormat);
1652 22 May 07 gregory 467             mySetupXerverKernel.b_show401NotAuthorized = false; // don't
1652 22 May 07 gregory 468                                       // give
1652 22 May 07 gregory 469                                       // 401-message
1652 22 May 07 gregory 470                                       // next
1652 22 May 07 gregory 471                                       // time
1652 22 May 07 gregory 472           } else {
1652 22 May 07 gregory 473             ShowSetupPages.show401NotAuthorizedIsAccepted(
1652 22 May 07 gregory 474                 theOutput, s_encryptedPasswordGiven,
1652 22 May 07 gregory 475                 df_dateFormat);
1652 22 May 07 gregory 476             mySetupXerverKernel.b_show401NotAuthorized = true; // give
1652 22 May 07 gregory 477                                       // 401-message
1652 22 May 07 gregory 478                                       // next
1652 22 May 07 gregory 479                                       // time
741 10 Oct 06 olle 480           }
1652 22 May 07 gregory 481         } else {
1652 22 May 07 gregory 482           showHeaderData("text/html");
1652 22 May 07 gregory 483           ShowSetupPages.showWelcomePage(theOutput); // An invalid
1652 22 May 07 gregory 484                                 // "action" has
1652 22 May 07 gregory 485                                 // been set
741 10 Oct 06 olle 486         }
1652 22 May 07 gregory 487       } else {
741 10 Oct 06 olle 488         showHeaderData("text/html");
1652 22 May 07 gregory 489         ShowSetupPages.showWelcomePage(theOutput); // No "action" has
1652 22 May 07 gregory 490                               // been set
741 10 Oct 06 olle 491       }
741 10 Oct 06 olle 492
1652 22 May 07 gregory 493       yield();
1652 22 May 07 gregory 494       sleep(125); // Be safe, don't close before all data has been sent
741 10 Oct 06 olle 495
1652 22 May 07 gregory 496       theOutput.flush();
1652 22 May 07 gregory 497       theOutput.close();
741 10 Oct 06 olle 498
1652 22 May 07 gregory 499     } catch (Exception e) {
1652 22 May 07 gregory 500       if (b_showErrors)
1652 22 May 07 gregory 501         System.out.println("An error occured @ SetupNewConnection:\n"
1652 22 May 07 gregory 502             + e.getMessage());
1652 22 May 07 gregory 503     }
741 10 Oct 06 olle 504   }
741 10 Oct 06 olle 505
741 10 Oct 06 olle 506   void getRequestInformation()// throws IOException
741 10 Oct 06 olle 507   {
1652 22 May 07 gregory 508     try {
1652 22 May 07 gregory 509       String[] firstLineIndata;
741 10 Oct 06 olle 510
1652 22 May 07 gregory 511       br_theInputWeGetFromBrowser = new BufferedReader(
1652 22 May 07 gregory 512           new InputStreamReader(so_userConnection.getInputStream()));
1652 22 May 07 gregory 513       firstLineIndata = MyString.makeArrayOfString(
1652 22 May 07 gregory 514           br_theInputWeGetFromBrowser.readLine(), " "); // Opera:
1652 22 May 07 gregory 515                                   // "GET
1652 22 May 07 gregory 516                                   // /mapp/fil.txt
1652 22 May 07 gregory 517                                   // HTTP/1.1"
1652 22 May 07 gregory 518       s_requestMethod = firstLineIndata[0]; // "GET" eller "GET/"
741 10 Oct 06 olle 519
1652 22 May 07 gregory 520       s_requestDocument = MyString.unescape(firstLineIndata[1]); // "kopia%20(2)%20av%20wwwboard.pl"
1652 22 May 07 gregory 521                                     // ==>
1652 22 May 07 gregory 522                                     // "kopia
1652 22 May 07 gregory 523                                     // (2)
1652 22 May 07 gregory 524                                     // av
1652 22 May 07 gregory 525                                     // wwwboard.pl"
741 10 Oct 06 olle 526
1652 22 May 07 gregory 527       if (s_requestDocument.startsWith("/?"))
1652 22 May 07 gregory 528         s_allData = s_requestDocument.substring(2); // Ignore the first
1652 22 May 07 gregory 529                               // /?, but get
1652 22 May 07 gregory 530                               // everything else
1652 22 May 07 gregory 531       else
1652 22 May 07 gregory 532         s_allData = s_requestDocument.substring(1); // Ignore the first
1652 22 May 07 gregory 533                               // /, but get
1652 22 May 07 gregory 534                               // everything else
741 10 Oct 06 olle 535
1652 22 May 07 gregory 536     } catch (Exception e) {
1652 22 May 07 gregory 537       if (b_showErrors)
1652 22 May 07 gregory 538         System.out
1652 22 May 07 gregory 539             .println("An error occured @ getRequestInformation:\n"
1652 22 May 07 gregory 540                 + e.getMessage());
1652 22 May 07 gregory 541     }
741 10 Oct 06 olle 542   }
741 10 Oct 06 olle 543
1652 22 May 07 gregory 544   // From Opera:
1652 22 May 07 gregory 545   // GET /?y4errewfdpp HTTP/1.1
1652 22 May 07 gregory 546   // User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 6.0 [sv]
1652 22 May 07 gregory 547   // Host: localhost:12345
1652 22 May 07 gregory 548   // Accept: text/html, image/png, image/jpeg, image/gif, image/x-xbitmap, */*
1652 22 May 07 gregory 549   // Accept-Language: sv
1652 22 May 07 gregory 550   // Accept-Charset: windows-1252;q=1.0, utf-8;q=1.0, utf-16;q=1.0,
1652 22 May 07 gregory 551   // iso-8859-1;q=0.6, *;q=0.1
1652 22 May 07 gregory 552   // Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
1652 22 May 07 gregory 553   // Cache-Control: no-cache
1652 22 May 07 gregory 554   // Connection: Keep-Alive, TE
1652 22 May 07 gregory 555   // TE: deflate, gzip, chunked, identity, trailers
741 10 Oct 06 olle 556
1652 22 May 07 gregory 557   private void createVariables() // Returns true if everything went OK
741 10 Oct 06 olle 558   {
1652 22 May 07 gregory 559     MyHT_allDataFromQuery = new MyHashTable(s_allData, "&", "=");
741 10 Oct 06 olle 560     getSettingsFromFile();
1652 22 May 07 gregory 561     /*
1652 22 May 07 gregory 562      * if (allDataArray.length==13) { s_portNr=allDataArray[0];
1652 22 May 07 gregory 563      * s_indexNames=allDataArray[1]; s_sharedPaths=allDataArray[2];
1652 22 May 07 gregory 564      * s_fileExtensions=allDataArray[3]; s_rootPath=allDataArray[4];
1652 22 May 07 gregory 565      * s_runnableExtensions=allDataArray[5]; s_aliasNames=allDataArray[6];
1652 22 May 07 gregory 566      * s_protectedFolders=allDataArray[7];
1652 22 May 07 gregory 567      * s_allowFolderListing=allDataArray[8];
1652 22 May 07 gregory 568      * s_allowTheseFileExtensions=allDataArray[9];
1652 22 May 07 gregory 569      * s_shareHiddenFiles=allDataArray[10];
1652 22 May 07 gregory 570      * s_startupWindowMode=allDataArray[11];
1652 22 May 07 gregory 571      * s_allowCGIScript=allDataArray[12]; return true; } else {
1652 22 May 07 gregory 572      * System.out.println("ERROR: Felaktig indata!"); return false;
1652 22 May 07 gregory 573      * //Invalid input to this script }
1652 22 May 07 gregory 574      */
741 10 Oct 06 olle 575   }
741 10 Oct 06 olle 576
1652 22 May 07 gregory 577   private void saveInformationToFile() {
1652 22 May 07 gregory 578     try {
741 10 Oct 06 olle 579       PrintStream myPrintStream;
1652 22 May 07 gregory 580       File theFile = new File(s_configFile);
1652 22 May 07 gregory 581       FileOutputStream fileStreamed = new FileOutputStream(theFile);
1652 22 May 07 gregory 582       myPrintStream = new PrintStream(fileStreamed);
741 10 Oct 06 olle 583       myPrintStream.println(s_portNr);
741 10 Oct 06 olle 584       myPrintStream.println(s_indexNames);
741 10 Oct 06 olle 585       myPrintStream.println(s_sharedPaths);
741 10 Oct 06 olle 586       myPrintStream.println(s_fileExtensions);
741 10 Oct 06 olle 587       myPrintStream.println(s_rootPath);
741 10 Oct 06 olle 588       myPrintStream.println(s_runnableExtensions);
741 10 Oct 06 olle 589       myPrintStream.println(s_aliasNames);
741 10 Oct 06 olle 590       myPrintStream.println(s_protectedFolders);
741 10 Oct 06 olle 591       myPrintStream.println(s_allowFolderListing);
741 10 Oct 06 olle 592       myPrintStream.println(s_allowTheseFileExtensions);
741 10 Oct 06 olle 593       myPrintStream.println(s_shareHiddenFiles);
741 10 Oct 06 olle 594       myPrintStream.println(s_startupWindowMode);
1652 22 May 07 gregory 595       myPrintStream.print(s_allowCGIScript); // Last one is print, not
1652 22 May 07 gregory 596                           // println
741 10 Oct 06 olle 597       yield();
1652 22 May 07 gregory 598       sleep(50); // Be safe, don't close before all data has been sent
741 10 Oct 06 olle 599       myPrintStream.close();
741 10 Oct 06 olle 600       fileStreamed.close();
741 10 Oct 06 olle 601
1652 22 May 07 gregory 602       mySetupXerverKernel.setupIsDone(false); // Let the kernel
1652 22 May 07 gregory 603                           // (mySetupXerverKernel)
1652 22 May 07 gregory 604                           // know that the settings
1652 22 May 07 gregory 605                           // have been changed
1652 22 May 07 gregory 606     } catch (Exception e) {
1652 22 May 07 gregory 607       // if (b_showErrors)
1652 22 May 07 gregory 608       System.out
1652 22 May 07 gregory 609           .println("Could not write to "
1652 22 May 07 gregory 610               + s_configFile
1652 22 May 07 gregory 611               + ".\nMake sure the file is among the other files and that Xerver has write permissions to it.:"
1652 22 May 07 gregory 612               + e);
741 10 Oct 06 olle 613     }
741 10 Oct 06 olle 614   }
741 10 Oct 06 olle 615
1652 22 May 07 gregory 616   private void showHeaderData(String contentType) {
1652 22 May 07 gregory 617     try {
1652 22 May 07 gregory 618       theOutput.writeBytes("HTTP/1.1 " + s_errorStatus + " \r\nDate: "
1652 22 May 07 gregory 619           + df_dateFormat.format(d_dateToday) + " \r\n" + "Server: "
1652 22 May 07 gregory 620           + XerverKernel.getXerverName()
1652 22 May 07 gregory 621           + " \r\nConnection: close \r\n"
1652 22 May 07 gregory 622           + "Pragma: no-cache \r\nCache-Control: no-cache \r\n"
1652 22 May 07 gregory 623           + "Location: / \r\n" + "Content-Type: " + contentType
1652 22 May 07 gregory 624           + " \r\n\r\n");
1652 22 May 07 gregory 625     } catch (Exception e) {
1652 22 May 07 gregory 626       if (b_showErrors)
1652 22 May 07 gregory 627         System.out.println("An error occured @ showHeaderData:\n"
1652 22 May 07 gregory 628             + e.getMessage());
1652 22 May 07 gregory 629     }
741 10 Oct 06 olle 630   }
741 10 Oct 06 olle 631
1652 22 May 07 gregory 632   private void returnThisPage(String documentToReturn, String contentType)// throws
1652 22 May 07 gregory 633                                       // IOException
741 10 Oct 06 olle 634   {
1652 22 May 07 gregory 635     FileInputStream fileStreamed = null;
741 10 Oct 06 olle 636
1652 22 May 07 gregory 637     try {
1652 22 May 07 gregory 638       // DataOutputStream theOutput =new
1652 22 May 07 gregory 639       // DataOutputStream(so_userConnection.getOutputStream()); //I
1652 22 May 07 gregory 640       // "java.io.*"
1652 22 May 07 gregory 641       showHeaderData(contentType);
1652 22 May 07 gregory 642       File theFile = new File(documentToReturn);
1652 22 May 07 gregory 643       fileStreamed = new FileInputStream(theFile);
741 10 Oct 06 olle 644
1652 22 May 07 gregory 645       byte[] myBuffer = new byte[8192];
1652 22 May 07 gregory 646       int n;
1652 22 May 07 gregory 647       while ((n = fileStreamed.read(myBuffer)) != -1)
1652 22 May 07 gregory 648         theOutput.write(myBuffer, 0, n);
741 10 Oct 06 olle 649
1652 22 May 07 gregory 650       yield();
1652 22 May 07 gregory 651       sleep(125); // Be safe, don't close before all data has been sent
741 10 Oct 06 olle 652
1652 22 May 07 gregory 653       // fileStreamed.close();
1652 22 May 07 gregory 654     } catch (Exception e) {
1652 22 May 07 gregory 655       if (b_showErrors)
1652 22 May 07 gregory 656         System.out.println("An error occured @ returnThisPage:\n"
1652 22 May 07 gregory 657             + e.getMessage());
1652 22 May 07 gregory 658     }
741 10 Oct 06 olle 659
1652 22 May 07 gregory 660     try {
1652 22 May 07 gregory 661       if (fileStreamed != null) // If fileStreamed "holds" a file
741 10 Oct 06 olle 662       {
1652 22 May 07 gregory 663         fileStreamed.close(); // Important: This must be reached no
1652 22 May 07 gregory 664                     // matter what! Even if an exception
1652 22 May 07 gregory 665                     // occurs in the try block, whis must be
1652 22 May 07 gregory 666                     // reached. Otherwise the file will be
1652 22 May 07 gregory 667                     // locked by Xerver (locked by Java.exe)
1652 22 May 07 gregory 668                     // until the garbage collector is runned
1652 22 May 07 gregory 669                     // (and you don't know when it will run)
1652 22 May 07 gregory 670                     // and detects that the file (the object
1652 22 May 07 gregory 671                     // "fileStreamed") is no longer
1652 22 May 07 gregory 672                     // referenced from anywhere else and it
1652 22 May 07 gregory 673                     // release the file by automatic. Until
1652 22 May 07 gregory 674                     // this happenes, no other application
1652 22 May 07 gregory 675                     // can write to or rename this file
1652 22 May 07 gregory 676                     // (however, this problem is solved with
1652 22 May 07 gregory 677                     // this line).
741 10 Oct 06 olle 678       }
1652 22 May 07 gregory 679     } catch (Exception e) {
741 10 Oct 06 olle 680       if (b_showErrors)
1652 22 May 07 gregory 681         System.out.println("An error occured @ writeFileToStream:\n"
1652 22 May 07 gregory 682             + e.getMessage());
741 10 Oct 06 olle 683     }
741 10 Oct 06 olle 684   }
741 10 Oct 06 olle 685
1652 22 May 07 gregory 686   private void getSettingsFromFile() {
1652 22 May 07 gregory 687     try {
1652 22 May 07 gregory 688       BufferedReader f_setupFileData = new BufferedReader(new FileReader(
1652 22 May 07 gregory 689           s_configFile));
741 10 Oct 06 olle 690
1652 22 May 07 gregory 691       s_portNr = f_setupFileData.readLine();
1652 22 May 07 gregory 692       s_indexNames = f_setupFileData.readLine();
1652 22 May 07 gregory 693       s_sharedPaths = f_setupFileData.readLine();
1652 22 May 07 gregory 694       s_fileExtensions = f_setupFileData.readLine();
1652 22 May 07 gregory 695       s_rootPath = f_setupFileData.readLine();
1652 22 May 07 gregory 696       s_runnableExtensions = f_setupFileData.readLine();
1652 22 May 07 gregory 697       s_aliasNames = f_setupFileData.readLine();
1652 22 May 07 gregory 698       s_protectedFolders = f_setupFileData.readLine();
1652 22 May 07 gregory 699       s_allowFolderListing = f_setupFileData.readLine();
1652 22 May 07 gregory 700       s_allowTheseFileExtensions = f_setupFileData.readLine();
1652 22 May 07 gregory 701       s_shareHiddenFiles = f_setupFileData.readLine();
1652 22 May 07 gregory 702       s_startupWindowMode = f_setupFileData.readLine();
1652 22 May 07 gregory 703       s_allowCGIScript = f_setupFileData.readLine();
741 10 Oct 06 olle 704
741 10 Oct 06 olle 705       yield();
1652 22 May 07 gregory 706       sleep(50); // Be safe, don't close before all data has been sent
741 10 Oct 06 olle 707
741 10 Oct 06 olle 708       f_setupFileData.close();
1652 22 May 07 gregory 709     } catch (Exception e) {
1652 22 May 07 gregory 710       if (b_showErrors)
1652 22 May 07 gregory 711         System.out.println("An error occured @ getSettingsFromFile:\n"
1652 22 May 07 gregory 712             + e.getMessage());
741 10 Oct 06 olle 713     }
741 10 Oct 06 olle 714   }
741 10 Oct 06 olle 715
1652 22 May 07 gregory 716   private void createEnvironmentVariables() {
1652 22 May 07 gregory 717     if (!b_environmentHasBeenSetUp) {
1652 22 May 07 gregory 718       b_environmentHasBeenSetUp = true;
741 10 Oct 06 olle 719       getEnvironmentVariablesGivenByBrowser(br_theInputWeGetFromBrowser);
741 10 Oct 06 olle 720     }
741 10 Oct 06 olle 721   }
741 10 Oct 06 olle 722
1652 22 May 07 gregory 723   private String[] getEnvironmentVariablesGivenByBrowser(
1652 22 May 07 gregory 724       BufferedReader theInput) {
1652 22 May 07 gregory 725     String[] allENVVariablesTMP = new String[maxNumbersOfENVAccepted], allENVVariables = new String[0];
1652 22 May 07 gregory 726     try {
1652 22 May 07 gregory 727       String tmp;
1652 22 May 07 gregory 728       int numberOfENVGivenByBrowser = 0; // This is the number of
1652 22 May 07 gregory 729                         // ENV-variables we set after we
1652 22 May 07 gregory 730                         // have read what the browser
1652 22 May 07 gregory 731                         // has given us. For example
1652 22 May 07 gregory 732                         // both CONTENT_TYPE and
1652 22 May 07 gregory 733                         // HTTP_CONTENT_TYPE are set
1652 22 May 07 gregory 734                         // when we have read
1652 22 May 07 gregory 735                         // "CONTENT_TYPE". The number of
1652 22 May 07 gregory 736                         // lines given to us from the
1652 22 May 07 gregory 737                         // browser is not necessey (and
1652 22 May 07 gregory 738                         // probably not)
1652 22 May 07 gregory 739                         // ==numberOfENVGivenByBrowser
741 10 Oct 06 olle 740
1652 22 May 07 gregory 741       String tmpStr = "_"; // Set this to any none-empty string (!="")
1652 22 May 07 gregory 742                   // (don't set it to null)
1652 22 May 07 gregory 743       while (theInput.ready()
1652 22 May 07 gregory 744           && numberOfENVGivenByBrowser < maxNumbersOfENVAccepted - 1) // (assume:
1652 22 May 07 gregory 745                                         // maxNumbersOfENVAccepted=200)
1652 22 May 07 gregory 746                                         // less
1652 22 May 07 gregory 747                                         // than
1652 22 May 07 gregory 748                                         // 199
1652 22 May 07 gregory 749                                         // because
1652 22 May 07 gregory 750                                         // it
1652 22 May 07 gregory 751                                         // is
1652 22 May 07 gregory 752                                         // possible
1652 22 May 07 gregory 753                                         // to
1652 22 May 07 gregory 754                                         // run
1652 22 May 07 gregory 755                                         // "numberOfENVGivenByBrowser++"
1652 22 May 07 gregory 756                                         // twice
1652 22 May 07 gregory 757                                         // in
1652 22 May 07 gregory 758                                         // this
1652 22 May 07 gregory 759                                         // loop.
1652 22 May 07 gregory 760                                         // (If
1652 22 May 07 gregory 761                                         // we
1652 22 May 07 gregory 762                                         // start
1652 22 May 07 gregory 763                                         // the
1652 22 May 07 gregory 764                                         // loop
1652 22 May 07 gregory 765                                         // with
1652 22 May 07 gregory 766                                         // 199
1652 22 May 07 gregory 767                                         // and
1652 22 May 07 gregory 768                                         // run
1652 22 May 07 gregory 769                                         // "numberOfENVGivenByBrowser++"
1652 22 May 07 gregory 770                                         // twice
1652 22 May 07 gregory 771                                         // we
1652 22 May 07 gregory 772                                         // will
1652 22 May 07 gregory 773                                         // try
1652 22 May 07 gregory 774                                         // to
1652 22 May 07 gregory 775                                         // write
1652 22 May 07 gregory 776                                         // to
1652 22 May 07 gregory 777                                         // index
1652 22 May 07 gregory 778                                         // 200
1652 22 May 07 gregory 779                                         // (no,
1652 22 May 07 gregory 780                                         // not
1652 22 May 07 gregory 781                                         // 201;
1652 22 May 07 gregory 782                                         // reason:
1652 22 May 07 gregory 783                                         // we
1652 22 May 07 gregory 784                                         // don't
1652 22 May 07 gregory 785                                         // have
1652 22 May 07 gregory 786                                         // "++numberOfENVGivenByBrowser"),
1652 22 May 07 gregory 787                                         // but
1652 22 May 07 gregory 788                                         // the
1652 22 May 07 gregory 789                                         // last
1652 22 May 07 gregory 790                                         // index
1652 22 May 07 gregory 791                                         // of
1652 22 May 07 gregory 792                                         // the
1652 22 May 07 gregory 793                                         // array
1652 22 May 07 gregory 794                                         // is
1652 22 May 07 gregory 795                                         // 199
1652 22 May 07 gregory 796                                         // ==>
1652 22 May 07 gregory 797                                         // exception
1652 22 May 07 gregory 798                                         // is
1652 22 May 07 gregory 799                                         // thrown!!!).
741 10 Oct 06 olle 800       {
1652 22 May 07 gregory 801         // First I only had the
1652 22 May 07 gregory 802         // "tmpStr=br_theInputWeGetFromBrowser.readLine();" line here,
1652 22 May 07 gregory 803         // and it worked OK. But after a while I saw I sometimes got
1652 22 May 07 gregory 804         // problems: "tmpStr=br_theInputWeGetFromBrowser.readLine();"
1652 22 May 07 gregory 805         // did never quit, the Thread had stopped here. I don't know for
1652 22 May 07 gregory 806         // sure, but the reason might be that the browser never sends a
1652 22 May 07 gregory 807         // "\n" or "\r" at the end of the line, so it never becomes a
1652 22 May 07 gregory 808         // "line" (is the definition of a line "whatsoever\n"??; I don't
1652 22 May 07 gregory 809         // know...). However, now we instead read
1652 22 May 07 gregory 810         // "i_valueOfHttpContentLength" from the stream after we have
1652 22 May 07 gregory 811         // read one empty line (==""). This seems to work without any
1652 22 May 07 gregory 812         // problems. //(BTW: the problem occured after I had implemented
1652 22 May 07 gregory 813         // the "401 Not Authorized"-support (so the browser sends a
1652 22 May 07 gregory 814         // "AUTHORIZATION=Basic enctyptedPass" line now). Is it possible
1652 22 May 07 gregory 815         // this has anything to do with that the browser doesn't send an
1652 22 May 07 gregory 816         // \n after the POST-data? (Did the browser send a \n after the
1652 22 May 07 gregory 817         // POST-data before this?) I don't know... :/ )
1652 22 May 07 gregory 818         if (!tmpStr.equals("")) // This is NOT the empty line before the
1652 22 May 07 gregory 819                     // POST-line
1652 22 May 07 gregory 820           tmpStr = theInput.readLine();
1652 22 May 07 gregory 821         else if (i_valueOfHttpContentLength != 0) // This is the empty
1652 22 May 07 gregory 822                               // line before the
1652 22 May 07 gregory 823                               // POST-line (there
1652 22 May 07 gregory 824                               // are no other
1652 22 May 07 gregory 825                               // empty lines)
1652 22 May 07 gregory 826         {
1652 22 May 07 gregory 827           if (i_valueOfHttpContentLength > 500) // We are actually
1652 22 May 07 gregory 828                               // not using POST
1652 22 May 07 gregory 829                               // during the
1652 22 May 07 gregory 830                               // setup-connection,
1652 22 May 07 gregory 831                               // but we have
1652 22 May 07 gregory 832                               // implemented this
1652 22 May 07 gregory 833                               // anyway, in case
1652 22 May 07 gregory 834                               // we want to use it
1652 22 May 07 gregory 835                               // later.
1652 22 May 07 gregory 836             i_valueOfHttpContentLength = 500; // Don't allow
1652 22 May 07 gregory 837                               // i_valueOfHttpContentLength
1652 22 May 07 gregory 838                               // to be greater
1652 22 May 07 gregory 839                               // than 500, or a
1652 22 May 07 gregory 840                               // "hacker" would be
1652 22 May 07 gregory 841                               // able to create
1652 22 May 07 gregory 842                               // crash Xerver by
1652 22 May 07 gregory 843                               // creating very
1652 22 May 07 gregory 844                               // large
1652 22 May 07 gregory 845                               // byte-arrays...
741 10 Oct 06 olle 846
1652 22 May 07 gregory 847           char[] cbuf = new char[i_valueOfHttpContentLength];
1652 22 May 07 gregory 848           theInput.read(cbuf, 0, i_valueOfHttpContentLength);
1652 22 May 07 gregory 849           s_stdinDataForPOSTRequests = new String(cbuf);
1652 22 May 07 gregory 850           break; // We have read everything we want to read
1652 22 May 07 gregory 851         } else
1652 22 May 07 gregory 852           // This happenes if there is no "CONTENT_LENGTH"-line in the
1652 22 May 07 gregory 853           // browser request. So this won't happen with a valid
1652 22 May 07 gregory 854           // browser...
1652 22 May 07 gregory 855           break; // We have read everything we want to read
741 10 Oct 06 olle 856
1652 22 May 07 gregory 857         if (tmpStr != null) {
1652 22 May 07 gregory 858           if (tmpStr.indexOf(":") != -1) // If this really is a line
1652 22 May 07 gregory 859                           // such as "HTTP_Connection:
1652 22 May 07 gregory 860                           // Keep-Alive". Otherwise we
1652 22 May 07 gregory 861                           // have come to the empty
1652 22 May 07 gregory 862                           // line before the
1652 22 May 07 gregory 863                           // POST-line.
1652 22 May 07 gregory 864           {
1652 22 May 07 gregory 865             // "tmpStr" is using this format: "CONTENT_LENGTH=65"
1652 22 May 07 gregory 866             // (after the line below has been run)
1652 22 May 07 gregory 867             tmpStr = tmpStr.substring(0, tmpStr.indexOf(":"))
1652 22 May 07 gregory 868                 .toUpperCase().replace('-', '_')
1652 22 May 07 gregory 869                 + "="
1652 22 May 07 gregory 870                 + tmpStr.substring(tmpStr.indexOf(": ") + 2);
1652 22 May 07 gregory 871             allENVVariablesTMP[numberOfENVGivenByBrowser++] = "HTTP_"
1652 22 May 07 gregory 872                 + tmpStr;
741 10 Oct 06 olle 873
1652 22 May 07 gregory 874             if (tmpStr.startsWith("CONTENT_LENGTH")) {
1652 22 May 07 gregory 875               allENVVariablesTMP[numberOfENVGivenByBrowser++] = tmpStr;
1652 22 May 07 gregory 876               i_valueOfHttpContentLength = Integer
1652 22 May 07 gregory 877                   .parseInt(tmpStr.substring(tmpStr
1652 22 May 07 gregory 878                       .indexOf("=") + 1)); // Save how
1652 22 May 07 gregory 879                                   // long the
1652 22 May 07 gregory 880                                   // POST-line
1652 22 May 07 gregory 881                                   // shall be
1652 22 May 07 gregory 882             } else if (tmpStr.startsWith("CONTENT_TYPE")) {
1652 22 May 07 gregory 883               allENVVariablesTMP[numberOfENVGivenByBrowser++] = tmpStr;
1652 22 May 07 gregory 884             } else if (tmpStr.startsWith("AUTHORIZATION")) {
1652 22 May 07 gregory 885               s_encryptedPasswordGiven = tmpStr.substring(tmpStr
1652 22 May 07 gregory 886                   .indexOf("=Basic ")
1652 22 May 07 gregory 887                   + ("=Basic ".length())); // Format:
1652 22 May 07 gregory 888                                 // "encryptedPassword"
1652 22 May 07 gregory 889                                 // (actually, it
1652 22 May 07 gregory 890                                 // is
1652 22 May 07 gregory 891                                 // "user:pass"
1652 22 May 07 gregory 892                                 // encrypted)
1652 22 May 07 gregory 893             }
1652 22 May 07 gregory 894             // else if (tmpStr.startsWith("COOKIE="))
1652 22 May 07 gregory 895             // s_cookiesFromBrowser=tmpStr.substring("COOKIE=".length());
1652 22 May 07 gregory 896             // //We don't need this
1652 22 May 07 gregory 897           } else if (s_requestMethod.equals("POST")
1652 22 May 07 gregory 898               && !tmpStr.equals("")) // If, and only if, a
1652 22 May 07 gregory 899                           // POST-reques has been
1652 22 May 07 gregory 900                           // made, then there is more
1652 22 May 07 gregory 901                           // information that shall be
1652 22 May 07 gregory 902                           // read... (if tmpStr is a
1652 22 May 07 gregory 903                           // empty string we are at
1652 22 May 07 gregory 904                           // the empty line before the
1652 22 May 07 gregory 905                           // POST-data line)
741 10 Oct 06 olle 906           {
1652 22 May 07 gregory 907             s_stdinDataForPOSTRequests = tmpStr.substring(0,
1652 22 May 07 gregory 908                 i_valueOfHttpContentLength); // Guaranty that
1652 22 May 07 gregory 909                                 // "s_stdinDataForPOSTRequests"
1652 22 May 07 gregory 910                                 // doesn't
1652 22 May 07 gregory 911                                 // contain more
1652 22 May 07 gregory 912                                 // than
1652 22 May 07 gregory 913                                 // "i_valueOfHttpContentLength"
1652 22 May 07 gregory 914                                 // bytes
1652 22 May 07 gregory 915
1652 22 May 07 gregory 916             break; // With a correct request, this is not necessey,
1652 22 May 07 gregory 917                 // as the POST-lien data is the last one
741 10 Oct 06 olle 918           }
741 10 Oct 06 olle 919         }
741 10 Oct 06 olle 920       }
741 10 Oct 06 olle 921
1652 22 May 07 gregory 922       allENVVariables = new String[numberOfENVGivenByBrowser];
1652 22 May 07 gregory 923       for (int i = 0; i < numberOfENVGivenByBrowser; i++)
1652 22 May 07 gregory 924         allENVVariables[i] = allENVVariablesTMP[i];
741 10 Oct 06 olle 925
1652 22 May 07 gregory 926       // for (int i=0; i<numberOfENVGivenByBrowser; i++)
1652 22 May 07 gregory 927       // System.out.println("data "+allENVVariables[i]);
741 10 Oct 06 olle 928
1652 22 May 07 gregory 929       // From Opera:
1652 22 May 07 gregory 930       // GET /?y4errewfdpp HTTP/1.1
1652 22 May 07 gregory 931       // User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera
1652 22 May 07 gregory 932       // 6.0 [sv]
1652 22 May 07 gregory 933       // Host: localhost:12345
1652 22 May 07 gregory 934       // Accept: text/html, image/png, image/jpeg, image/gif,
1652 22 May 07 gregory 935       // image/x-xbitmap, */*
1652 22 May 07 gregory 936       // Accept-Language: sv
1652 22 May 07 gregory 937       // Accept-Charset: windows-1252;q=1.0, utf-8;q=1.0, utf-16;q=1.0,
1652 22 May 07 gregory 938       // iso-8859-1;q=0.6, *;q=0.1
1652 22 May 07 gregory 939       // Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
1652 22 May 07 gregory 940       // Cache-Control: no-cache
1652 22 May 07 gregory 941       // Connection: Keep-Alive, TE
1652 22 May 07 gregory 942       // TE: deflate, gzip, chunked, identity, trailers
741 10 Oct 06 olle 943
1652 22 May 07 gregory 944     } catch (Exception e) {
1652 22 May 07 gregory 945       if (b_showErrors)
1652 22 May 07 gregory 946         System.out
1652 22 May 07 gregory 947             .println("An error occured @ getEnvironmentVariablesGivenByBrowser:\n"
1652 22 May 07 gregory 948                 + e.getMessage());
1652 22 May 07 gregory 949     }
1652 22 May 07 gregory 950     return allENVVariables;
741 10 Oct 06 olle 951   }
741 10 Oct 06 olle 952 }