org.globus.gsi.gssapi.net.example.GssServer Maven / Gradle / Ivy
The newest version!
/*
* Copyright 1999-2010 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
*
* See the License for the specific language governing permissions and limitations under the License.
*/
package org.globus.gsi.gssapi.net.example;
import org.globus.net.ServerSocketFactory;
import org.globus.gsi.GSIConstants;
import org.globus.gsi.gssapi.GlobusGSSCredentialImpl;
import org.globus.gsi.gssapi.GSSConstants;
import org.globus.gsi.gssapi.GlobusGSSManagerImpl;
import org.globus.gsi.gssapi.net.GssSocketFactory;
import org.globus.gsi.gssapi.net.GssSocket;
import org.ietf.jgss.GSSManager;
import org.ietf.jgss.GSSCredential;
import org.gridforum.jgss.ExtendedGSSContext;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.ServerSocket;
public class GssServer {
private static final String helpMsg =
"Where options are:\n" +
" -gss-mode mode\t\t\tmode is: 'ssl' or 'gsi' (default)\n" +
" -deleg-type type\t\ttype is: 'none', 'limited' (default), or 'full'\n" +
" -lifetime time\t\t\tLifetime of context. time is in seconds.\n" +
" -rejectLimitedProxy\t\tEnables checking for limited proxies. By default off\n" +
" -anonymous\t\t\tDo not require client authentication\n" +
" -enable-conf\t\t\tEnables confidentiality (do encryption) (enabled by default)\n" +
" -disable-conf\t\t\tDisables confidentiality (no encryption)\n" +
" -wrap-mode mode\t\tmode is: 'ssl' (default) or 'gsi'";
public static void main(String [] args) {
String usage = "Usage: java GssServer [options] [port]";
GetOpts opts = new GetOpts(usage, helpMsg);
int pos = opts.parse(args);
int port = 0;
if (pos < args.length) {
port = Integer.parseInt(args[pos]);
}
ServerSocketFactory factory = ServerSocketFactory.getDefault();
try {
ServerSocket server = factory.createServerSocket(port);
System.out.println("Server running at: " + server.getLocalPort());
while(true) {
Client c = new Client(server.accept(), opts);
c.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Client extends Thread {
GetOpts opts;
Socket s;
private static GSSCredential cred;
public Client(Socket s, GetOpts opts) {
this.s = s;
this.opts = opts;
}
private static GSSCredential getCredential(GSSManager manager)
throws Exception {
// return null if needed to automatically reload the default creds
if (cred == null) {
cred = manager.createCredential(GSSCredential.INITIATE_AND_ACCEPT);
}
return cred;
}
public void run() {
System.out.println("client connected");
// to make sure we use right impl
GSSManager manager = new GlobusGSSManagerImpl();
ExtendedGSSContext context = null;
try {
GSSCredential credd = getCredential(manager);
context = (ExtendedGSSContext)manager.createContext(credd);
context.requestConf(opts.conf);
context.setOption(GSSConstants.GSS_MODE,
(opts.gsiMode) ?
GSIConstants.MODE_GSI :
GSIConstants.MODE_SSL);
context.setOption(GSSConstants.REJECT_LIMITED_PROXY,
new Boolean(opts.rejectLimitedProxy));
context.setOption(GSSConstants.REQUIRE_CLIENT_AUTH,
new Boolean(!opts.anonymity));
s = GssSocketFactory.getDefault().createSocket(s, null, 0, context);
// server socket
((GssSocket)s).setUseClientMode(false);
((GssSocket)s).setWrapMode(opts.wrapMode);
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
System.out.println("Context established.");
System.out.println("Initiator : " + context.getSrcName());
System.out.println("Acceptor : " + context.getTargName());
System.out.println("Lifetime : " + context.getLifetime());
System.out.println("Privacy : " + context.getConfState());
GlobusGSSCredentialImpl cred =
(GlobusGSSCredentialImpl)context.getDelegCred();
System.out.println("Delegated credential :");
if (cred != null) {
System.out.println(cred.getX509Credential());
} else {
System.out.println("None");
}
String line = null;
BufferedReader r = new BufferedReader(new InputStreamReader(in));
while ( (line = r.readLine()) != null ) {
if (line.length() == 0) {
break;
}
System.out.println(line);
}
byte[] msg =
"HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\n".getBytes();
out.write(msg);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try { s.close(); } catch(Exception e) {}
System.out.println("client disconnected");
}
}
}