From: Matej C. <mc...@re...> - 2008-05-21 22:02:41
|
Is there such library available somewhere for Jython? Could I get an example of script using it? If it was possible to somehow use just Java standard libraries, that would be a big plus. Thanks for any hints, Matěj -- The content of this message is licensed under a Creative Commons Attribution 3.0 License, Some Rights Reserved. http://creativecommons.org/licenses/by/3.0/us/ |
From: Moore, G. <Gre...@ad...> - 2008-05-22 00:08:36
|
Hi, Sorry can't help with the Kerberos but this should help with http client, dom4j and log4j. all need to be on your class path or somewhere jython can find them. It’s a work in progress, meaning I work on it when I have the time which lately has been pretty rare. I know this could be improved, especially with proxy/ ssl code... So if anyone has suggestions I'd love to have them. PrettyPrintXml is a function I wrote that makes the xml readable by using dom4j which in part uses: doc = DocumentHelper.parseText(xmlStringIn) format = OutputFormat.createPrettyPrint() you could use JDOM (just google it there are plenty of jython examples) or not use xml at all.... Disclaimer: this is cut from working code cut but the imports were changed for brevity but I haven’t tested the edits. It from org.apache.commons.codec import * # required by httpclient from org.apache.commons.logging import * from org.apache.commons.httpclient import * from org.apache.commons.httpclient.methods import * from org.dom4j import * from org.dom4j.io import * from org.apache.log4j import * #still need to create log4j.properties file #Python imports from sys import exc_info from traceback import print_exc # this is a just part of a dict that’s used below you can expand it out # to make it useful but you should get the idea HTTP_STATUS_CODES = { 200: 'OK', 400: 'Bad Request', 404: 'Not Found', 505: 'HTTP Version Not Supported' } #doesn't have to be a class but it is in my world :) Class httpthing: def __init__(self): logger = Logger.getLogger("httpThing") def xmlToServer(self, url, xmldata, soapAction=None): """ Usage: xmlToServer(Url, xmlString, [filename] [soapAction]) Url - string. This is the url to the service. should be able to get a response from a browser with this. soapAction - optional string. The endpoint URI. Possibly a proxy. xmlString - string containing the XML Returns: server status code and response as pretty printed xml """ #start things off. logger = Logger.getLogger("httpThing ") logger.info("Entering CommUtils.xmlToServer") readableXml = serverResponseString = '' goodresult = False logger.debug('url: ' +url + 'soapaction: ' + soapAction) try: post = PostMethod(url) except: logger.error('**** Error connecting to ' + url) logger.error('**** Aborting processing.') statusCode = 9999 readableXml = 'Invalid Host name or host/service is down. \n ** Processing Aborted **' return (statusCode, readableXml) entity = StringRequestEntity(xmldata, "text/xml", None) # add stuff to the http header post.addRequestHeader("Content-Length", str(length)) post.setRequestEntity(entity) post.addRequestHeader("Content-type", "text/xml; charset=utf-8") post.addRequestHeader("User-Agent", "TestClient0.0") post.setRequestHeader("SOAPAction", soapAction) #ssl and proxy aren't working yet :( #easyhttps = Protocol("https", EasySSLProtocolSocketFactory(), 443) #Protocol.registerProtocol("https", easyhttps) #set up http client and post the xml data to the service httpClient = HttpClient() try: #TODO: add exception handeling see: http://jakarta.apache.org/commons/httpclient/exception-handling.html logger.debug('excuting Post') statusCode = httpClient.executeMethod(post) if statusCode == HttpStatus.SC_OK: serverResponseString = post.getResponseBodyAsString() readableXml = XMLUtils().prettyPrintXml(serverResponseString) goodresult = True else: print "Unexpected failure: " + post.getStatusLine().toString() statusMsg = HTTP_STATUS_CODES[statusCode] logger.error('HTTP status code returned was ' + statusMsg) except HttpException, he: msg = "*** Http error connecting to '" + url + "'" logger.error(msg) logger.error(he.getMessage()) logger.error(he.printStackTrace()) except IOException, iox: logger.error( "Caught expected IOException: %s" % str(iox)) post.releaseConnection() # return the server status code and response in a tuple. msg = '' if not goodresult: readableXml = '\n NO XML RETURNED. CHECK LOGS.\n Server returned: ' + str(statusCode) + ' ' + statusMsg return (statusCode, str(readableXml)) if __name__ == '__main__': url = 'http://some.server.somewhere.com' xmlToSend = '<element1> this is just an example</element1>' suds = "SoapAction" comm = CommUtils() status, resultStr = comm.xmlToServer(url, xmlToSend, suds) Hope this helps, Greg. -----Original Message----- From: jyt...@li... [mailto:jyt...@li...] On Behalf Of Matej Cepl Sent: Wednesday, May 21, 2008 7:50 AM To: jyt...@li... Subject: [Jython-users] http client with GET,POST and authentication via Kerberos? Is there such library available somewhere for Jython? Could I get an example of script using it? If it was possible to somehow use just Java standard libraries, that would be a big plus. Thanks for any hints, Matěj -- The content of this message is licensed under a Creative Commons Attribution 3.0 License, Some Rights Reserved. http://creativecommons.org/licenses/by/3.0/us/ ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Jython-users mailing list Jyt...@li... https://lists.sourceforge.net/lists/listinfo/jython-users This message and any attachments are intended only for the use of the addressee and may contain information that is privileged and confidential. If the reader of the message is not the intended recipient or an authorized representative of the intended recipient, you are hereby notified that any dissemination of this communication is strictly prohibited. If you have received this communication in error, please notify us immediately by e-mail and delete the message and any attachments from your system. |
From: Nicholas R. <nj...@ui...> - 2008-05-22 04:13:17
|
In article <idp...@pp...>, Matej Cepl <mc...@re...> wrote: > Is there such library available somewhere for Jython? Could I get an > example of script using it? If it was possible to somehow use just Java > standard libraries, that would be a big plus. Here's an example of doing a GET with the standard Java libraries. from java.lang import System from java.net import Authenticator, URL from java.io import BufferedReader, InputStreamReader, InputStream import os, tempfile f, login_conf = tempfile.mkstemp() os.write(f, '''com.sun.security.jgss.krb5.initiate { com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=false useTicketCache=true; };''') os.close(f) System.setProperty('java.security.krb5.realm', 'REALM.HERE') System.setProperty('java.security.krb5.kdc', 'kdc.goes.here') System.setProperty('java.security.auth.login.config', login_conf) System.setProperty('javax.security.auth.useSubjectCredsOnly', 'false') System.setProperty('http.auth.preference', 'SPNEGO') System.setProperty('sun.security.spnego.debug', 'true') url = URL('url.goes.here') input = url.openConnection().getInputStream() reader = BufferedReader(InputStreamReader(input)) while True: str = reader.readLine() if str is None: break print str os.unlink(login_conf) sun.security.spnego.debug prints out some stuff like: Entered SpNego.initSecContext with state=STATE_NEW SpNegoContext.initSecContext: sending token of type = SPNEGO NegTokenInit SNegoContext.initSecContext: sending token = a0 82 02 07 30 82 02 03 a0 0d 30 0b [...] which may help you to diagnose the problem. It seems that Java does not support DNS discovery of the KDC so you will need to either specify that information directly in a krb5.conf or use the krb5.realm/krb5.kdc properties as above. -- Nicholas Riley <nj...@ui...> |
From: Matej C. <mc...@re...> - 2008-05-26 17:29:59
|
On Wed, 21 May 2008 23:12:58 -0500, Nicholas Riley scripst: > sun.security.spnego.debug prints out some stuff like: > > Entered SpNego.initSecContext with state=STATE_NEW > SpNegoContext.initSecContext: sending token of type = SPNEGO > NegTokenInit SNegoContext.initSecContext: sending token = a0 82 02 07 30 > 82 02 03 a0 0d 30 0b > [...] > > which may help you to diagnose the problem. It seems that Java does not > support DNS discovery of the KDC so you will need to either specify that > information directly in a krb5.conf or use the krb5.realm/krb5.kdc > properties as above. Do you have any ideas what's going on here? [matej@hubmaier tts-fill]$ ./tts-fill.py 2008-05 [...] Traceback (innermost last): File "./tts-fill.py", line 79, in ? at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:204) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:198) at sun.security.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:994) at sun.security.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:142) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:533) at sun.security.ssl.Handshaker.process_record(Handshaker.java:471) at sun.security.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:904) at sun.security.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1116) at sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1143) at sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1127) at sun.net.www.protocol.https.HttpsClient.afterConnect (HttpsClient.java:423) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect (AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:997) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:254) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target [matej@hubmaier tts-fill]$ Is it because the website has self-signed certificate? Any ideas how to work around that, if that's the case? Or maybe missing class in OpenJDK on Fedora (java -version gives: 'java version "1.6.0" \ OpenJDK Runtime Environment (build 1.6.0-b09) \ OpenJDK 64-Bit Server VM (build 1.6.0-b09, mixed mode)')? Thanks a lot for the help, Matej Cepl -- The content of this message is licensed under a Creative Commons Attribution 3.0 License, Some Rights Reserved. http://creativecommons.org/licenses/by/3.0/us/ |
From: Matej C. <mc...@re...> - 2008-05-26 22:21:08
|
On 2008-05-26, 17:29 GMT, Matej Cepl wrote: > On Wed, 21 May 2008 23:12:58 -0500, Nicholas Riley scripst: >> sun.security.spnego.debug prints out some stuff like: >> >> Entered SpNego.initSecContext with state=STATE_NEW >> SpNegoContext.initSecContext: sending token of type = SPNEGO >> NegTokenInit SNegoContext.initSecContext: sending token = a0 82 02 07 30 >> 82 02 03 a0 0d 30 0b >> [...] >> >> which may help you to diagnose the problem. It seems that Java does not >> support DNS discovery of the KDC so you will need to either specify that >> information directly in a krb5.conf or use the krb5.realm/krb5.kdc >> properties as above. I have stepped up one step further by adding some more security properties, importing web certificate of the website into ~/.keystore, but I still cannot make it work. This is my script (with sanitized URL): #!/usr/bin/env jython from java.lang import System import time, os, sys, re, tempfile from java.net import Authenticator, URL from java.io import BufferedReader, InputStreamReader, InputStream from java.text import SimpleDateFormat from java.util import Date, GregorianCalendar, Calendar import calendar class CallBack: def __init__(self): self.clear() def add_body(self,buf): self.contents = self.contents + buf def check(self,datestr): r=re.compile(r"%s/\"' title=" % datestr) for line in self.contents.split("\n"): if r.search(line): return True return False def clear(self): self.contents = '' def _str_(self): return self.contents TTS_URL="https://someserver.redhat.com/remaining/parts/of/URL" TIME_IN="9:00" TIME_OUT="17:30" TIME_BREAK="0:30" postString = "time_in=%s&time_out=%s&time_break=%s&btn_save=Save" % \ (TIME_IN,TIME_OUT,TIME_BREAK) # month to fill if len(sys.argv) != 2: sys.exit(1) TTS_MONTH=calendar.SaneCalendar() TTS_MONTH.strptime(sys.argv[1],"y-M") #TTS_MONTH=time.strptime(raw_input("Month to fill YYYY-MM: "),"%Y-%m") # There is no mkstemp in jython 2.2.1 login_conf = tempfile.mktemp() f = file(login_conf,"w") f.write('''com.sun.security.jgss.krb5.initiate { com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=false useTicketCache=true; };''') f.close() System.setProperty('sun.security.jgss.native', 'true') System.setProperty('sun.security.spnego.debug', 'true') #System.setProperty('algorithm', 'SHA-1/RSA') #System.setProperty("javax.net.ssl.trustStore",".keystore") System.setProperty("javax.net.ssl.keyStore",".keystore") System.setProperty("javax.net.ssl.keyStoreType", "JKS"); #System.setProperty("javax.net.ssl.trustStorePassword","kyrios") #System.setProperty("javax.net.ssl.keyStorePassword","kyrios") System.setProperty('java.security.krb5.realm', 'REDHAT.COM') System.setProperty('java.security.krb5.kdc', 'kerberos.stuttgart.redhat.com') System.setProperty('java.security.auth.login.config', login_conf) System.setProperty('javax.security.auth.useSubjectCredsOnly', 'false') System.setProperty('http.auth.preference', 'SPNEGO') cb = CallBack() # number of days in given month LAST_DAY=TTS_MONTH.end_of_month() print >>sys.stderr,str(LAST_DAY) WDAY = calendar.SaneCalendar() for day in range(1,LAST_DAY.get(Calendar.DAY_OF_MONTH)): # skip non-working days WDAY.setDate(LAST_DAY.get(Calendar.YEAR),LAST_DAY.getMonth(),day) if not(WDAY.isWorkday()): continue url = URL('%s/%s' % (TTS_URL,str(WDAY))) input = url.openConnection().getInputStream() reader = BufferedReader(InputStreamReader(input)) while True: str = reader.readLine() if str is None: break cb.add_body(str) print cb cb.clear() # if not cb.check("%s-%s-%s" % (TTS_MONTH.year,TTS_MONTH.month,day)): # print "Filling %s-%s-%s..." % (TTS_MONTH.year,TTS_MONTH.month,day) # handle.setopt(handle.POSTFIELDS,postString) # handle.perform() # cb.clear() # handle.setopt(handle.HTTPGET,True) os.unlink(login_conf) print "Done." --------------------------------------------------------------- and this is the output it produces: [matej@viklef tts-fill]$ ./tts-fill.py 2008-05 2008-05-31 Traceback (innermost last): File "./tts-fill.py", line 85, in ? at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:196) at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:216) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:383) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:997) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) java.net.SocketException: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.DefaultSSLContextImpl) [matej@viklef tts-fill]$ Any ideas, what's going on, please? Thanks a lot for any help, Matěj Cepl |
From: Nicholas R. <nj...@ui...> - 2008-05-27 15:07:51
|
In article <kmp...@pp...>, Matej Cepl <mc...@re...> wrote: > java.net.SocketException: java.net.SocketException: > java.security.NoSuchAlgorithmException: Error constructing > implementation (algorithm: Default, provider: SunJSSE, class: > sun.security.ssl.DefaultSSLContextImpl) > > Any ideas, what's going on, please? Looks like the version of Java you're using does not support SSL. -- Nicholas Riley <nj...@ui...> |
From: Matej C. <mc...@re...> - 2008-05-29 14:15:24
|
On Tue, 27 May 2008 10:07:25 -0500, Nicholas Riley scripst: > In article <kmp...@pp...>, > Matej Cepl <mc...@re...> wrote: > >> java.net.SocketException: java.net.SocketException: >> java.security.NoSuchAlgorithmException: Error constructing >> implementation (algorithm: Default, provider: SunJSSE, class: >> sun.security.ssl.DefaultSSLContextImpl) >> >> Any ideas, what's going on, please? > > Looks like the version of Java you're using does not support SSL. OK, will file a bug -- thanks. Matej -- The content of this message is licensed under a Creative Commons Attribution 3.0 License, Some Rights Reserved. http://creativecommons.org/licenses/by/3.0/us/ |
From: Matej C. <mc...@re...> - 2008-05-29 14:30:21
|
On 2008-05-27, 15:07 GMT, Nicholas Riley wrote: > In article <kmp...@pp...>, > Matej Cepl <mc...@re...> wrote: > >> java.net.SocketException: java.net.SocketException: >> java.security.NoSuchAlgorithmException: Error constructing >> implementation (algorithm: Default, provider: SunJSSE, class: >> sun.security.ssl.DefaultSSLContextImpl) >> >> Any ideas, what's going on, please? > > Looks like the version of Java you're using does not support SSL. Of course, you are right http://thread.gmane.org/gmane.comp.java.openjdk.distro-packaging.devel\ /2000/focus=2005 Glad that this time it is not my stupidity :-). Matej |