blob: a44878f0bd0382dd7c7a3aa30cf3ad2e30302151 [file] [log] [blame]
// Copyright 2014 Google Inc. All Rights Reserved.
//
// 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 com.google.enterprise.adaptor.sharepoint;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.enterprise.adaptor.sharepoint.SamlAuthenticationHandler.HttpPostClient;
import com.google.enterprise.adaptor.sharepoint.SamlAuthenticationHandler.HttpPostClientImpl;
import java.io.IOException;
import java.io.StringReader;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* SamlHandshakeManager implementation for Live Authentication
* to request Live authentication token and extract authentication cookie.
*/
public class LiveAuthenticationHandshakeManager
extends AdfsHandshakeManager {
private static final Logger log
= Logger.getLogger(LiveAuthenticationHandshakeManager.class.getName());
private static final String LIVE_STS
= "https://login.microsoftonline.com/extSTS.srf";
private static final String LIVE_LOGIN_URL
= "/_forms/default.aspx?wa=wsignin1.0";
public static class Builder {
private final String username;
private final String password;
private final String sharePointUrl;
private String stsendpoint;
private final String stsrealm;
private final HttpPostClient httpClient;
private String login;
private String trustLocation;
public Builder(String sharePointUrl, String username, String password) {
this(sharePointUrl, username, password, new HttpPostClientImpl());
}
@VisibleForTesting
Builder(String sharePointUrl, String username, String password,
HttpPostClient httpClient) {
if (sharePointUrl == null || username == null || password == null
|| httpClient == null) {
throw new NullPointerException();
}
this.sharePointUrl = sharePointUrl;
this.username = username;
this.password = password;
this.httpClient = httpClient;
this.login = sharePointUrl + LIVE_LOGIN_URL;
this.trustLocation = "";
this.stsendpoint = LIVE_STS;
this.stsrealm = sharePointUrl;
}
public Builder setLoginUrl(String login) {
this.login = login;
return this;
}
public Builder setStsendpoint(String stsendpoint) {
this.stsendpoint = stsendpoint;
return this;
}
public LiveAuthenticationHandshakeManager build() {
if (Strings.isNullOrEmpty(stsendpoint) || Strings.isNullOrEmpty(login)) {
throw new NullPointerException();
}
return new LiveAuthenticationHandshakeManager(sharePointUrl, username,
password, stsendpoint, stsrealm, login, trustLocation, httpClient);
}
}
private LiveAuthenticationHandshakeManager(String sharePointUrl,
String username, String password, String stsendpoint, String stsrealm,
String login, String trustLocation, HttpPostClient httpClient) {
super(sharePointUrl, username, password, stsendpoint,
stsrealm, login, trustLocation, httpClient);
}
@Override
@VisibleForTesting
String extractToken(String tokenResponse) throws IOException {
if (tokenResponse == null) {
throw new IOException("tokenResponse is null");
}
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document
= db.parse(new InputSource(new StringReader(tokenResponse)));
NodeList nodes
= document.getElementsByTagNameNS(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-"
+ "wssecurity-secext-1.0.xsd", "BinarySecurityToken");
if (nodes == null || nodes.getLength() == 0) {
log.log(Level.WARNING, "Live Authentication token not available"
+ " in response {0}", tokenResponse);
throw new IOException(
"Live Authentication token not available in response");
}
String token = nodes.item(0).getTextContent();
log.log(Level.FINER, "Live Authentication Token {0}", token);
return token;
} catch (ParserConfigurationException ex) {
throw new IOException(ex);
} catch (SAXException ex) {
throw new IOException(ex);
} catch (DOMException ex) {
throw new IOException(ex);
}
}
@Override
public String getAuthenticationCookie(String token) throws IOException {
URL u = new URL(login);
Map<String, String> requestProperties = new HashMap<String, String>();
requestProperties.put("SOAPAction", stsendpoint);
SamlAuthenticationHandler.PostResponseInfo postResponse
= httpClient.issuePostRequest(u, requestProperties, token);
return postResponse.getPostResponseHeaderField("Set-Cookie");
}
}