diff --git a/hsarjcli/build.xml b/hsarjcli/build.xml index 5cdf7bd..e35372c 100644 --- a/hsarjcli/build.xml +++ b/hsarjcli/build.xml @@ -31,10 +31,10 @@ - + - + diff --git a/hsarjcli/src/de/hsadmin/jscli/cas/CASTicketProvider.java b/hsarjcli/src/de/hsadmin/jscli/cas/CASTicketProvider.java index f0db01a..27e00d8 100644 --- a/hsarjcli/src/de/hsadmin/jscli/cas/CASTicketProvider.java +++ b/hsarjcli/src/de/hsadmin/jscli/cas/CASTicketProvider.java @@ -3,12 +3,15 @@ package de.hsadmin.jscli.cas; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.ProtocolException; import java.net.URL; import java.net.URLEncoder; import java.util.Properties; @@ -36,7 +39,7 @@ public class CASTicketProvider { this.passwordReader = console; this.user = user; this.runAs = runAs; - Config config = Config.getInstance(); + final Config config = Config.getInstance(); backendURL = config.getProperty("backendURL", BACKEND_URL); loginURL = config.getProperty("loginURL", LOGIN_URL); if ("TestUmgebung".equals(loginURL)) { @@ -46,7 +49,7 @@ public class CASTicketProvider { } } - public String getTicket() throws JSCliException { + public String getTicket() throws JSCliException, FileNotFoundException { if (grantingTicket != null && grantingTicket.startsWith("ticket:")) { return grantingTicket.replaceFirst("ticket", "user"); } @@ -77,6 +80,8 @@ public class CASTicketProvider { grantingTicket = doHttpPost(loginURL, encodedParams); } catch (UnsupportedEncodingException e) { throw new JSCliException(e); + } catch (FileNotFoundException e) { + throw new JSCliException("cas server not available: " + loginURL); } return grantingTicket; } @@ -85,29 +90,17 @@ public class CASTicketProvider { return passwordReader.readPassword(); } - private String doHttpPost(String urlString, String encodedParams) throws JSCliException { + private String doHttpPost(final String urlString, final String encodedParams) throws JSCliException, FileNotFoundException { String result = null; try { - URL url = new URL(urlString); - HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); - connection.setRequestMethod("POST"); - connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); - connection.setDoInput(true); - connection.setDoOutput(true); - connection.setUseCaches(false); - connection.setAllowUserInteraction(false); - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); - writer.write(encodedParams); - writer.close(); - BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); - String ticket = reader.readLine(); - String readLine = null; - do { - readLine = reader.readLine(); - } while (readLine != null); - result = connection.getHeaderField("Location"); - if (ticket != null && ticket.startsWith("ST-")) { - result = ticket; + result = extractTicket(urlString, encodedParams); + } catch (FileNotFoundException e) { + grantingTicket = getGrantingTicket(); + saveProperties(grantingTicket, getTicketFile()); + try { + result = extractTicket(grantingTicket, encodedParams); + } catch (IOException e1) { + throw new JSCliException(e1); } } catch (IOException e) { throw new JSCliException(e); @@ -115,31 +108,88 @@ public class CASTicketProvider { return result; } + private String extractTicket(final String urlString, + final String encodedParams) throws MalformedURLException, + IOException, ProtocolException { + String result; + final HttpsURLConnection connection = doConnect(urlString, encodedParams); + final String ticket = readTicket(connection); + if (ticket != null && ticket.startsWith("ST-")) { + result = ticket; + } else { + result = connection.getHeaderField("Location"); + } + return result; + } + + private String readTicket(final HttpsURLConnection connection) + throws IOException { + final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + final String ticket = reader.readLine(); + String readLine = null; + do { + readLine = reader.readLine(); + } while (readLine != null); + return ticket; + } + + private HttpsURLConnection doConnect(final String urlString, + final String encodedParams) throws MalformedURLException, + IOException, ProtocolException { + final URL url = new URL(urlString); + final HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + connection.setAllowUserInteraction(false); + final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); + writer.write(encodedParams); + writer.close(); + return connection; + } + private String readFiledGrantingTicket() throws JSCliException { String filedTicket = null; - String userHome = System.getProperty("user.home"); - String ticketFileName = userHome + "/.hsadmin.tgt"; - File file = new File(ticketFileName); - Properties properties = new Properties(); - if (file.isFile() && file.canRead()) { + final File file = getTicketFile(); + final Properties properties = loadProperties(file); + filedTicket = properties.getProperty(user); + if (filedTicket == null) { + filedTicket = getGrantingTicket(); + saveProperties(filedTicket, file); + } + return filedTicket; + } + + private File getTicketFile() { + final String userHome = System.getProperty("user.home"); + final String ticketFileName = userHome + "/.hsadmin.tgt"; + return new File(ticketFileName); + } + + private void saveProperties(final String filedTicket, final File file) throws JSCliException { + final Properties properties = loadProperties(file); + if (filedTicket != null) { + properties.setProperty(user, filedTicket); try { - properties.load(new FileReader(file)); - filedTicket = properties.getProperty(user); + properties.store(new FileOutputStream(file), ""); } catch (IOException e) { throw new JSCliException(e); } } - if (filedTicket == null) { - filedTicket = getGrantingTicket(); - if (filedTicket != null) { - properties.setProperty(user, filedTicket); - try { - properties.store(new FileOutputStream(file), ""); - } catch (IOException e) { - } + } + + private Properties loadProperties(final File file) throws JSCliException { + final Properties properties = new Properties(); + if (file.isFile() && file.canRead()) { + try { + properties.load(new FileReader(file)); + } catch (IOException e) { + throw new JSCliException(e); } } - return filedTicket; + return properties; } @Override