READ THE COPYRIGHT FILE BEFORE INSTALLING Installation ------------ Installation is mostly automated, but don't just jump right in. Read the docs first, because there are some files you have to edit, and things need to be done in a certain order. If the automation doesn't work, just look at the makefiles and try to figure out what was supposed to happen ;) Also, it is important to read this document entirely as well as the document on security, because failing to do that can jeopardize your account's security. These are the files before installation: Files (in the main directory) ----- docs/ These documents help/ The help documents (see installation steps below) binsrc/ bin construction files. Should be taken care of by Makefile there are also some scripts here that you might want in particular, the fget set of scripts etc/ security files for wsh passwd password file - much like the unix /etc/passwd write_access write access permissions file for wsh read_access read access exceptions for setting up special executables with exceptions Makefile the main makefile src/ wizshell source directory makefile for wsh, help and mkpasswd access.* catch.* login.* wizshell.* etc.. wsh source help.c help source mkpasswd.c mkpasswd source tcp-s/ tcpserv source directory. Configure sets up tcpserv for 'make' README read this if you have any problems or questions about tcpserv COPYRIGHT Sam Lantinga's copyright for tcpserv (source) source for tcpserv There are four main steps to installing the WizPort. 1) Make the wsh binary This is the biggest step. Enter the src/ directory and edit the 'Makefile.' YOU MUST DO THIS or wsh will *not* work. The file should (hopefully) be self-explanatory. You may also want to edit config.h, this will give you some options of how you want wsh to run, such as whether you want to use the password file or the player.o files for login. Then type 'make' and hopefully the binary will be created without errors ;). If so, move the file up one directory to the main wsh directory. If it doesn't work, you may need to port the code a little bit, though the code should be extremely portable to any *nix platform. You can test the wsh without telnet by 'wsh -l' (for a wsh login), but you will need to change the passwd file first (see "Running the wsh" below) 2) Edit the binsrc/mkbin file In this file you will see a few lines at the top like this: set files="$files ls mv cp rm mkdir rmdir echo" Simply uncomment the groups of files you wish to have in your wsh bin directory. The mkbin script will then be able to build your bin directory (when activated from the main makefile). The sets of files listed were determined to be safe to the best of my knowledge, feel free to add whatever files you like to this list, but first check the security document. The script will create these files by linking them to your actual machines binaries, so if you don't have the command, then you can't use it with the wsh (unless you make a copy of the exec) There are also some other binaries/scripts that you may wish to install in bin/. Take a look in binsrc/ and in src/util. 3) Type make In the main directory there is a makefile which should set up the WizPort properly. It does this by doing the following: o Makes sure 'wsh' exists. If not, you must do step 1 o Builds tcpserv and puts it in the main directory tcpserv should build without a hitch (thanks Sam!) o Create the bin/ directory This is done by running the mkbin script in binsrc/ and also building help and mkpasswd in src/ and moving them to bin/ 4) Install the help files There is a built in help program (bin/help after installation) that lets the users look in the mud help directory easily. There are a few help files for users of the wsh, these are in docs/help/ and they should be moved to muds help directory (as specified by HELP_DIR in src/config.h) You may also wish to edit these files (especially docs/help/bin) Help will probably change when I get a better help system working. There is also a semi-optional step: 5) Creating the new binaries Since wsh *cannot* be used with such programs as 'vi' or 'emacs' without serious security problems. I was able to run a usable system with only two changed binaries - for 'vi' and 'more' (emacs users will have to wait :). I used 'elvis' (a vi clone) and 'less' (less is more :), both of which I was able to get the source for, which I then edited to make secure. Both of these are available (either in binsrc/ or as a separate archive), and should be compiled and put into the bin/ directory. Once again, you can strip the executables of debugging info to save disk space. After mkbin runs, there should already be links of more and vi to less and elvis, so normal unix users shouldn't notice the difference. Another *very* useful binary to make is the splitvt and splitmud executables. Many people cannot usually use the WizPort because they are on a modem and have only one window - which they use to mud. By using splitmud or splitvt, they can split the screen (like a talk session) and mud in the bottom while still editing files in the top. An edited version of these programs is available also. (the original versions would start up /bin/sh instead of the wsh ;) The split programs were also written by Sam Lantinga, the author of tcpserv (thanks *again* Sam) through inspiration by yours truly. You should now have a structure like this: ---------- | | wsh/ root/ <- Mud ROOT_DIR is *outside* of wsh/ | | --------------------------------------------- | | | | | | | *boot *wsh src/ bin/ etc/ *tcpserv Makefile Files: wsh/boot The bootup script for the WizPort wsh/wsh The WizShell executable wsh/tcpserv tcpserv executable wsh/etc/ etc files wsh/bin/ This is where the executables that the WizShell can use are kept (such as ls, rm, etc...) Most of these will be links to the machines actual files. This will be explained below. wsh/src/ WizShell and tcpserv source if you wish to keep it wsh/Makefile Was used to 'make' Before logging into the wsh, you will need to edit the etc/ files. Running the wsh --------------- etc/passwd ---------- For the login, you have two options. One, the password, home and access type (as well as other information which is currently mostly unused :) can come from the file etc/passwd as described below. Often the WizPort is used as a utility to support a mud, and in this case, you can also use the player.o files to get the password and level. If you do this, you need to look at login.c and change some functions to work with your mud. Also, it is important to realize that this is MUCH less secure - although certainly much easier. All someone needs to do is change a .o file on the mud and then they can login unknown to the WizPort. If you want to use a password file instead, you need to change src/config.h, and then make etc/passwd: The fields of the etc/passwd field are labeled at the top of the file. login: login name (usually same as the mud) password: password (encrypted according to src/config.h) You can either get this from the player.o file or use the mkpasswd command (which will become installed in bin/) things like change password and other utilities will be available at a later date access name: any string that matches an entry in the etc/*_access files real name: Not currently used home dir: Make sure this is set properly, because it is often used for security reasons in *_access (through $HOME). It is best not to use an empty home or a home of "/" because this can cause problems with some executables. etc/*_access ------------ These contain the read and write access for each access type. For each access name you have in the password file, you need to have an associated entry in both write_access and read_access. The format is simple (whitespace ignored): <access name>: [<file> | <directory> | +<access name> | -<file | directory> ]* For example, WIZ: /open $HOME /log/$USER /players/*/open The files can be actual files or directories. Having access to a directory means having access to *all* files inside the directory (including inside directories in the directory, etc..) You can also use environment variables (such as $HOME) as tokens of a path. Look at wizshell.c or type 'set' during a wsh session to see what environment variables are available to you. To have an environment variable be a piece of a token (such as "/log/$USER.rep") you can just add a putenv in wizshell.c You can also use the * as a full token, but you cannot (yet) use tokens with asterisks in them, such as /log/*.rep Another thing you can add to the access list for a type is another access list, for example, if you have an Immortal class, that has access to /obj, /room and /doc as well as everything a normal wiz has, you can just do the following: IMM: /obj /room /doc +WIZ To create an access type that has FULL access, simply do: GOD: /* Finally, you can disallow files and directories: IMM: /* -/room/post_dir Will allow everything except files in /room/post_dir etc/exceptions -------------- There are exceptions that the wizshell uses for special cases. These are put in the exceptions file so they can be changed without recompilation. Only a basic understanding of these are necessary, unless you plan on installing some binaries other than the standard set. The format for exceptions is: <exception type>: [<command> | <command>/<arg number> ]* In other words, you name the type and then the exceptions of that type, by command. If the exception is only for a certain argument number of the command, for example, only the first argument to copy, you separate by a slash, i.e: "cp/1" Here are the exception types and some example exceptions: 1) WD_DEFAULT: ls lsf lsr lsx For an explanation of this you need to look at the tech chapter, but it is for commands that use the working directory as the default when they have no arguments. For example, 'ls bob' will list bob, but 'ls' will list the current directory - it is the same as 'ls .' Unfortunately, the wizshell never actually changes directory for security reasons, it is always in the root directory. The WD_DEFAULT exception are the commands that need to be given '.' as a default argument when they have none. These you shouldn't need to change. 2) CAN_READ: cat cp/1 tar/3 These are the file args that should be checked through 'read_access' and not 'write_access'. Examples here are all arguments to 'cat', the first arg of cp (Usage: cp <src> <dest> - so the src only needs to be read) and the third arg of tar - though you shouldn't have tar installed in bin/ anyways :) I will have a workaround for tar just like ftp soon. Without this, the users will need to have write access for all files they work on, regardless of whether the command only reads the file. 3) NON_FILE_ARGS: echo banner tar/1 man stty help wsh/2 fget/1 These are arguments that shouldn't go through either access file, and more importantly, shouldn't be converted into the full path form. (i.e., the wsh converts "~jubal/moo/../cow.c" into "players/jubal/cow.c") For example, "echo joe" shouldn't echo <current working directory>+"joe", it should just echo "joe". Also, fget, for example, the first arg is not a file on the wsh, and should not be expanded to full path form - we let the remote filesystem take care of it - it will be a different path anyways, and the security of the remote filesystem is not our business. To understand why commands need to be put into this exception, you will need to read the tech chapter. Starting it ----------- To start the WizPort up (so the wsh can be accessed by telnet) you can do the following: tcpserv -t <port#> wsh -l The -l argument means do a login session. This argument is there so that 'wsh' can be invoked from inside the wsh without having to login again. (for shell escapes, splitvt, etc..) I have found it easier to do all this with a bootup file, so the src/Makefile will create one for you. If you are using a mud, you can put this in your equivalent 'restart_mud' script (just once though), or just type 'boot'. There are two ways to start up the wsh from the unix command line (without telnet) To start up wizshell as a login session and ask for login and password: 1) wsh -l To start up the wizshell without a password or login: 2) setenv WSHLOGIN=<name> wsh This way you can test other accounts without editing passwords. The setting of WSHLOGIN can only be done outside wsh (for obvious reasons). You only need to do the setenv once, then you can call wsh as many times as desired (also useful for debugging) Once logged into the wizshell, type help. This should outline some useful features (such as the .wshrc and .login files) as well as some other help files.