/********************************************************
* Speaker Verification Implemented Security *
* CA4 Project *
* Written by: Ronan Crowley (97084603) *
* and Paul Connolly (97307599) *
********************************************************/
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class Server extends JFrame {
private String username;
private JTextArea display;
private String message="";
private String resetValue="";
private String resetValue1="";
private double threshold;
ObjectOutputStream output; //Stream for writing data
ObjectInputStream input; //Stream for reading data
/** The constructor which initialises the GUI **/
public Server()
{
super("Server");
Container c = getContentPane();
display=new JTextArea();
c.add(new JScrollPane(display), BorderLayout.CENTER);
setIconImage(Toolkit.getDefaultToolkit().createImage(Server.class.getResource("sv.gif")));
setSize(300,250);
show();
}
//=========================================================================================================
/** Initial Server configuration and Client Connection **/
public void runServer()
{
ServerSocket server;
Socket connection;
int counter=1;
try {
//Socket connection = new Socket (port, max number of connections);
server = new ServerSocket (5000,100);
while (true) {
display.setText("waiting for connection \n");
//Listen for a conection from a client. waits here till client connects
connection=server.accept();
display.append("Connection "+counter+" received from "+
connection.getInetAddress().getHostName());
output = new ObjectOutputStream(
connection.getOutputStream());
//This method sends stream header
output.flush();
input= new ObjectInputStream(connection.getInputStream() );
display.append("\nGot I/O streams \n");
do{
try{
message= (String) input.readObject();
//System.out.println(message);
String username = message.substring(1,message.length());
if (message.charAt(0)=='#') {
//Logon Process......
display.append("\nUser "+username+" logging in !");
display.setCaretPosition(display.getText().length());
logonProcess(username);
}
else if (message.charAt(0)=='*') {
//New User Process......
//username = message.substring(1,message.length());
display.append("\nUser "+username+" being created !");
display.setCaretPosition(display.getText().length());
newUserProcess(username);
}
else if (message.charAt(0)=='!') {
//Threshold Process......
display.append("\nUser "+username+" setting threshold !");
display.setCaretPosition(display.getText().length());
thresholdProcess(username);
}
}
catch (ClassNotFoundException cnfex){
display.append ("\nUnknown object type received");
}
} while (!message.equals("TERMINATE") );
display.append("\nUser terminated connection");
output.close();
input.close();
connection.close();
++counter;
}
}
catch (EOFException eof){
System.out.println("Client terminated connection");
}
catch (IOException io){
io.printStackTrace();
}
}
//***************************************logonProcess*****************************************************
public void logonProcess(String username){
/** This method is called when a User attempts to Logon **/
Receivefile r = new Receivefile();
File userDir = new File("users\\"+username);
File t = new File("users\\"+username+"\\t.txt"); // Will contain threshold.
if ((userDir.exists()) && (t.exists()))
{
display.append("User: "+username+" logging in.\n");
generateText testString = new generateText();
String text = testString.generate();
display.append("Query text sent to "+username+" = "+text+"\n");
try{
output.writeObject(text);
}catch(IOException iol) {
System.out.println("IO Error in Logon Process");
iol.printStackTrace();
}
r.rec("ver.wav");
Process p;
char c;
String holder = new String("");
try
{
p = Runtime.getRuntime().exec("perl verify.pl "+username);
InputStream o = p.getInputStream();
c = (char)o.read();
while(c != (char)-1)
{
holder += c;
c = (char)o.read();
}
//Send the result from the verify perl file
output.writeObject(holder);
}
catch(IOException e)
{
System.err.println("Error : " + e.toString());
}
//Read t.txt and send threshold !
try
{
BufferedReader thresFile = new BufferedReader(new FileReader("users\\"+username+"\\t.txt"));
String firstLine = thresFile.readLine();
output.writeObject(firstLine);
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
}
else if (!userDir.exists())
{
display.append("INVALID USER :"+username+"\n");
try{
output.writeObject("X");
}catch(IOException iol) {
System.out.println("IO Error in Logon Process");
iol.printStackTrace();
}
}
else
{
display.append("NO THRESHOLD FOR :"+username+"\n");
try{
output.writeObject("NO_T");
}catch(IOException iol) {
System.out.println("IO Error in Logon Process");
iol.printStackTrace();
}
}
}
//*************************************newUserProcess*****************************************************
public void newUserProcess (String username) {
Receivefile r = new Receivefile();
//Create the directory to store a new user in
File newDir = new File("users\\"+username);
try
{
if(newDir.mkdir()) {
display.append("Adding new user "+username+"\n");
try{
output.writeObject("OK");
}catch(IOException iol) {
System.out.println("IO Error in New User Process");
iol.printStackTrace();
}
Runtime.getRuntime().exec("perl newUserSetup.pl "+username);
String name = new String ("");
//For loop to recieve 17 wav's.....
for (int i=0; i<17; i++) {
if (i<9){
name = "S000"+(i+1)+".wav";
}
else {
name = "S00"+(i+1)+".wav";
}
r.rec(name);
}
File seventeen = new File("S0017.wav");
if (seventeen.exists())
{
//Move 17 WAV's into correct location....
try {
Runtime.getRuntime().exec("perl moveWAVs.pl "+username);
}catch(Exception ex){
ex.printStackTrace();
}
Process p1;
char c1;
String done = new String ("");
//Build model.......
try {
display.append("Building Model for: "+username+"\n");
p1 = Runtime.getRuntime().exec("perl build.pl "+username);
InputStream o1 = p1.getInputStream();
c1 = (char)o1.read();
while(c1 != (char)-1) {
c1 = (char)o1.read();
done += c1;
}
System.out.println("\tModel built !");
}catch(Exception ex){
ex.printStackTrace();
}
} // End of .exists()
} // End of "if can make directory"
else
{
display.append("INVALID USER :"+username+"\n");
try{
output.writeObject("Y");
}catch(IOException iol) {
System.out.println("IO Error in New User Process");
iol.printStackTrace();
}
}
}
catch (Exception ex){
ex.printStackTrace();
}
}
//************************************thresholdProcess****************************************************
public void thresholdProcess (String username) {
Receivefile r = new Receivefile();
File userDir = new File("users\\"+username);
File th = new File("users\\"+username+"\\t.txt"); // Will contain threshold.
if ((userDir.exists()) && (th.exists()))
{
display.append("Threshold already set for :"+username+"\n");
try{
output.writeObject("TH_AL"); //Threshold already set !!
}catch(IOException iol) {
System.out.println("IO Error in Threshold Calculation Process");
iol.printStackTrace();
}
}
else if (!userDir.exists())
{
display.append("No such user:"+username+"\n");
try{
output.writeObject("NTH"); //Threshold already set !!
}catch(IOException iol) {
System.out.println("IO Error in Threshold Calculation Process");
iol.printStackTrace();
}
}
else
{
//Indicate no error...
try{
output.writeObject("OK");
}catch(IOException iol) {
System.out.println("IO Error in Threshold Calculation Process");
iol.printStackTrace();
}
String name = new String ("");
//For loop to recieve 5 wav's.....
for (int i=0; i<5; i++) {
name = "T000"+(i+1)+".wav";
r.rec(name);
}
File five = new File("T0005.wav");
if (five.exists())
{
//Move 5 WAV's into correct location....
try {
Runtime.getRuntime().exec("perl moveThWAVs.pl "+username);
}catch(Exception ex){
ex.printStackTrace();
}
//5 Verification perl scripts !
Process p2;
char c2;
String done = new String ("");
//Build threshold.......
try {
p2 = Runtime.getRuntime().exec("perl threshold.pl "+username);
InputStream o2 = p2.getInputStream();
c2 = (char)o2.read();
while(c2 != (char)-1) {
c2 = (char)o2.read();
done += c2;
}
}catch(Exception ex){
ex.printStackTrace();
}
//Call calcThreshold.java to calculate threshold......
calcThreshold thresholdobject = new calcThreshold();
threshold = thresholdobject.getThreshold(username, 1.2817); //1.2817 indicates 10% chance of accepting wrong user.
display.append("Threshold for user: "+username+" set to: "+threshold);
//Send 2 values from t.txt
String lineThree = new String("");
String lineFour = new String("");
String temp;
try
{
BufferedReader thresFile = new BufferedReader(new FileReader("users\\"+username+"\\t.txt"));
int j=0;
while ((temp = thresFile.readLine()) != null) {
//Get Values from Line 3 and 4 !
if (j==2) {
lineThree = temp;
}
if (j==3)
{
lineFour = temp;
}
j++;
}
output.writeObject(lineThree+";"+lineFour);
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
String passedName;
double newVal = 0.0;
// Now recieve summat and set the line 2 in the threshold !
try{
message=(String) input.readObject();
System.out.println("1: "+message);
int k=0;
while (message.charAt(k) != ';'){
k++;
}
passedName = (message.substring(0, k));
System.out.println("2: "+passedName);
newVal = Double.valueOf(message.substring(k+1, message.length()).trim()).doubleValue();
System.out.println("3: "+message.substring(k+1, message.length()));
System.out.println("4: "+newVal);
calcThreshold myNewThresholdObject = new calcThreshold();
double threshold = myNewThresholdObject.getThreshold(passedName, newVal);
System.out.println("5: "+threshold);
}
catch (ClassNotFoundException cnfex){
System.out.println("Unknown object type received");
}
catch (EOFException eof) {
System.out.println("Server terminated connection");
}
catch ( IOException io)
{
io.printStackTrace();
}
catch ( NumberFormatException n) {
System.out.println("Line 516: "+n);
}
}
}
th.close();
}
//***************************************main*******************************************************
/** This is the 'main' method in the Server class,
it runs the Server, by calling the constructor and
a listener added so when the window closed,
the server is shut down.
**/
public static void main(String args[])
{
Server app = new Server();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing (WindowEvent e)
{
System.exit(0);
}
}
);
app.runServer();
}
}