package CyrusSasl; import java.util.Hashtable; import java.net.*; /** * @version 1.0 * @author Tim Martin */ public abstract class GenericCommon { /* These are the jni functions called by the routines in common * see javasasl.c for their implementations */ private native void jni_sasl_set_prop_string(int ptr, int propnum, String value); private native void jni_sasl_set_prop_int(int ptr, int propnum, int value); private native void jni_sasl_set_prop_bytes(int ptr, int propnum, byte[] value); private native void jni_sasl_set_server(int ptr, byte []ipnum, int port); private native void jni_sasl_set_client(int ptr, byte []ipnum, int port); private native void jni_sasl_setSecurity(int ptr, int minssf, int maxssf); private native int jni_sasl_getSecurity(int ptr); private native byte[] jni_sasl_encode(int ptr, byte[] in,int len); private native byte[] jni_sasl_decode(int ptr, byte[] in,int len); private native void jni_sasl_dispose(int ptr); /** * security layer security strength factor */ public static int SASL_SSF =1; public static int SASL_MAXOUTBUF=2; /* security layer max output buf unsigned */ public static int SASL_REALM =3; /* server authentication realm used */ public static int SASL_GETOPTCTX=4; /* context for getopt callback */ /** * Local sockaddr_in (use setServer and setClient to set this) */ public static int SASL_IP_LOCAL =5; /** * Remote sockaddr_in (use setClient and setServer to set this) */ public static int SASL_IP_REMOTE =6; /** * External security factor (use setSecurity to set this) */ public static int SASL_SSF_EXTERNAL=100; public static int SASL_SEC_PROPS =101; /* sasl_security_properties_t */ int ptr; // this is the actual pointer to sasl_conn_t int ssfactive; // active ssf on this connection boolean finished; public boolean done() { return finished; } /** * Set a SASL property that takes a string value * * @param PROPERTY one of the property constants * @param value string value */ public void setproperty(int PROPERTY, String value) { jni_sasl_set_prop_string(ptr,PROPERTY,value); } /** * Set a SASL property that takes a integer value * * @param PROPERTY one of the property constants * @param value integer value */ public void setproperty(int PROPERTY, int value) { jni_sasl_set_prop_int(ptr,PROPERTY,value); } /** * Set a SASL property that takes a byte[] value * * @param PROPERTY one of the property constants * @param value byte[] value */ public void setproperty(int PROPERTY, byte[] value) { jni_sasl_set_prop_bytes(ptr,PROPERTY,value); } /** * Set the SASL properties for the server * This sets the IP address and port * * @param name String of name of server (e.g. cyrus.andrew.cmu.edu) * @param port port connected to on that server */ private boolean setRemoteIP(String name,int port) { byte[]ip=null; try { InetAddress server=InetAddress.getByName(name); ip=server.getAddress(); } catch (UnknownHostException e) { return false; } jni_sasl_set_server(ptr, ip, port); return true; } /** * Set the SASL properties for the client * This sets the IP address and port * * @param name String of local cannonical name (e.g. myhostname.andrew.cmu.edu) * @param port port connecting */ private boolean setLocalIP(String name, int port) { byte[]ip=null; try { InetAddress server=InetAddress.getByName(name); ip=server.getAddress(); } catch (UnknownHostException e) { return false; } jni_sasl_set_client(ptr, ip, port); return true; } /** * Set the SASL properties for the client * This sets the IP address and port * * @param local local InetAdress * @param port port connecting */ public boolean setClient(InetAddress local,int port) { byte[]ip=local.getAddress(); jni_sasl_set_client(ptr, ip, port); return true; } /** * Set the SASL properties for the client * This sets the IP address and port * The local IP address is determined with InetAddress.getLocalHost() * * @param port port connecting */ public boolean setClient(int port) { try { return setClient(InetAddress.getLocalHost(),port); } catch (UnknownHostException e) { return false; } } /** * Sets the security properties for the session * * @param external external security strength * @param minssf minimum security needed * @param maxssf maximum security to negotiate * * @return if the propery was set sucessfully or not */ public boolean setSecurity(int external, int minssf, int maxssf) { /* setproperty(SASL_SSF_EXTERNAL, external); */ jni_sasl_setSecurity(ptr,minssf,maxssf); return true; } public int getSecurity() { return jni_sasl_getSecurity(ptr); } /** * Encode a String with the negotiated layer * * @param in String to be encoded * @return the encoded string represented at a byte[] */ public byte[] encode(byte[] in) { byte[] out=jni_sasl_encode(ptr,in,in.length); return out; } /** * Decode a byte[] with the negotiated layer * * @param in byte[] to be decoded * @param len number of bytes to be decoded * @return the decoded string represented at a byte[] */ public byte[] decode(byte[] in, int len) { byte[] out=jni_sasl_decode(ptr,in,len); return out; } /** * Decode a String with the negotiated layer. NOTE: Be careful with * this function. International or high ascii characters may do strange * things. The byte[] method is preferred * * @param in String to be decoded * @return the decoded string represented at a byte[] */ public byte[] decode(String in) { return decode(in.getBytes(),in.length()); } protected void setcommonproperties(Hashtable props) { int i_ssfmin = 0; String s_ssfmin=(String) props.get("javax.security.sasl.encryption.minimum"); if (s_ssfmin!=null) i_ssfmin = Integer.parseInt(s_ssfmin); int i_ssfmax = 256; String s_ssfmax=(String) props.get("javax.security.sasl.encryption.maximum"); if (s_ssfmax!=null) i_ssfmax = Integer.parseInt(s_ssfmax); int i_external = 0; /* String external=(String) props.getProperty("security.policy.encryption.external", */ setSecurity(i_external, i_ssfmin, i_ssfmax); String iplocal = (String) props.get("javax.security.sasl.ip.local"); if (iplocal!=null) setLocalIP(iplocal,0); String ipremote = (String) props.get("javax.security.sasl.ip.remote"); if (ipremote!=null) setRemoteIP(ipremote,0); /* String maxbuf=props.getProperty("security.maxbuf","65000"); */ /* xxx this raises an exception for some reason setproperty(SASL_MAXOUTBUF,Integer.parseInt(maxbuf)); */ } final protected void finalize () throws Throwable { jni_sasl_dispose(ptr); } protected boolean complete = false; public boolean isComplete() { return complete; } /* called by JNI layer */ public void setcomplete(int a) { complete = true; } }