|
LoginInterpreter |
|
1 // joi/10/juno/LoginInterpreter.java 2 // 3 // 4 // Copyright 2003 Ethan Bolker and Bill Campbell 5 6 import java.util.*; 7 8 /** 9 * Interpreter for Juno login commands. 10 * 11 * There are so few commands that if-then-else logic is OK. 12 * 13 * @version 10 14 */ 15 16 public class LoginInterpreter 17 implements InterpreterInterface 18 { 19 private static final String LOGIN_COMMANDS = 20 "help, register, <username>, exit"; 21 22 private Juno system; // the Juno object 23 private OutputInterface console; // where output goes 24 25 /** 26 * Construct a new LoginInterpreter for interpreting 27 * login commands. 28 * 29 * @param system the system creating this interpreter. 30 * @param console the Terminal used for input and output. 31 */ 32 33 public LoginInterpreter( Juno system, OutputInterface console) 34 { 35 this.system = system; 36 this.console = console; 37 } 38 39 /** 40 * Set the console for this interpreter. Used by the 41 * creator of this interpreter. 42 * 43 * @param console the Terminal to be used for input and output. 44 */ 45 46 public void setConsole( OutputInterface console) 47 { 48 this.console = console; 49 } 50 51 /** 52 * Simulates behavior at login: prompt. 53 */ 54 55 public void CLILogin() 56 { 57 welcome(); 58 boolean moreWork = true; 59 while( moreWork ) { 60 moreWork = interpret(((InputInterface)console). 61 readLine( "Juno login: " ) ); 62 } 63 } 64 65 66 /** 67 * Parse user's command line and dispatch appropriate 68 * semantic action. 69 * 70 * @param inputLine the User's instructions. 71 * @return true except for "exit" command 72 * or null inputLine. 73 */ 74 75 public boolean interpret( String inputLine ) 76 { 77 if (inputLine == null) { 78 return false; 79 } 80 StringTokenizer st = 81 new StringTokenizer( inputLine ); 82 if (st.countTokens() == 0) { 83 return true; // skip blank line 84 } 85 String visitor = st.nextToken(); 86 if (visitor.equals( "exit" )) { 87 return false; 88 } 89 if (visitor.equals( "register" )) { 90 register( st ); 91 } 92 else if (visitor.equals( "help" )) { 93 help(); 94 } 95 else { 96 String password; 97 try { 98 if (console.isGUI()) { 99 password = st.nextToken(); 100 } 101 else {; 102 password = readPassword( "password: " ); 103 } 104 User user = system.lookupUser(visitor); 105 user.matchPassword( password ); 106 new Shell( system, user, console ); 107 } 108 catch (Exception e) { 109 110 // NullPointerException if no such user, 111 // JunoException if password fails to match - 112 // message to user doesn't give away which. 113 // The sysadmin would probably want a log 114 // that did keep track. 115 // 116 // Other exceptions should be caught in shell() 117 118 console.println("sorry"); 119 } 120 } 121 return true; 122 } 123 124 // Register a new user, giving him or her a login name and a 125 // home directory on the system. 126 // 127 // StringTokenizer argument contains the new user's login name 128 // followed by full real name. 129 130 private void register( StringTokenizer line ) 131 { 132 String username = ""; 133 String password = ""; 134 String realname = ""; 135 try { 136 username = line.nextToken(); 137 password = line.nextToken(); 138 realname = line.nextToken("").trim(); 139 } 140 catch (NoSuchElementException e) { 141 } 142 143 if (username.equals("") || password.equals("") 144 || realname.equals("") ) { 145 console.println( 146 "please supply username, password, real name"); 147 return; 148 } 149 User user = system.lookupUser(username); 150 151 if (user != null) { // user already exists 152 console.println("sorry"); 153 return; 154 } 155 if (badPassword( password )) { 156 console.println("password too easy to guess"); 157 return; 158 } 159 Directory home = new Directory( username, null, 160 system.getUserHomes() ); 161 162 user = system.createUser( username, home, password, realname ); 163 home.setOwner( user ); 164 } 165 166 // test to see if password is unacceptable: 167 // fewer than 6 characters 168 // contains only alphabetic characters 169 170 private boolean badPassword( String pwd ) 171 { 172 if (pwd.length() < 6) { 173 return true; 174 } 175 int nonAlphaCount = 0; 176 for (int i=0; i < pwd.length(); i++) { 177 if (!Character.isLetter(pwd.charAt(i))) { 178 nonAlphaCount++; 179 } 180 } 181 return (nonAlphaCount == 0); 182 } 183 184 // Used for reading the user's password in CLI. 185 186 private String readPassword( String prompt ) 187 { 188 String line = 189 ((InputInterface) console).readLine( prompt ); 190 StringTokenizer st = new StringTokenizer( line ); 191 try { 192 return st.nextToken(); 193 } 194 catch ( NoSuchElementException e ) {} 195 return ""; // keeps compiler happy 196 } 197 198 199 // Display a short welcoming message, and remind users of 200 // available commands. 201 202 private void welcome() 203 { 204 console.println( "Welcome to " + system.getHostName() + 205 " running " + system.getOS() + 206 " version " + system.getVersion() ); 207 help(); 208 } 209 210 // Remind user of available commands. 211 212 private void help() 213 { 214 console.println( LOGIN_COMMANDS ); 215 console.println(""); 216 } 217 } 218
|
LoginInterpreter |
|