String testID = testNode.valueOf("@ID");
String testIDLabel = Tools.notEmpty(testID) ? (testGroupID+'.'+testID) : (testGroupID+'.'+testElementIndex);
String method = testNode.valueOf("method");
+ String contentType = testNode.valueOf("contentType");
String uri = testNode.valueOf("uri");
String fullURL = Tools.glue(protoHostPort, "/", uri);
+ if (contentType == null || contentType.equals("")) {
+ contentType = XmlReplayTransport.APPLICATION_XML;
+ }
+
+ String currentAuthForTest = null;
String authIDForTest = testNode.valueOf("@auth");
- String currentAuthForTest = authsMap.map.get(authIDForTest);
+
+ if (Tools.notEmpty(authIDForTest)){
+ currentAuthForTest = authsMap.map.get(authIDForTest);
+ }
+ else {
+ String tokenAuthExpression = testNode.valueOf("@tokenauth");
+
+ if (Tools.notEmpty(tokenAuthExpression)){
+ currentAuthForTest = "Bearer " + evalStruct.eval(tokenAuthExpression, serviceResultsMap, null, jexl, jc);
+ }
+ }
+
if (Tools.notEmpty(currentAuthForTest)){
authForTest = currentAuthForTest; //else just run with current from last loop;
}
if (parts.varsList.size()>0){
vars = parts.varsList.get(0);
}
- serviceResult = XmlReplayTransport.doPOST_PUTFromXML(parts.responseFilename, vars, protoHostPort, uri, method, XmlReplayTransport.APPLICATION_XML, evalStruct, authForTest, testIDLabel);
+ serviceResult = XmlReplayTransport.doPOST_PUTFromXML(parts.responseFilename, vars, protoHostPort, uri, method, contentType, evalStruct, authForTest, testIDLabel);
if (vars!=null) {
serviceResult.addVars(vars);
}
private static String DD = "--";
private static String CRLF = "\r\n";
+ private static String formatAuth(String authForTest) {
+ if (authForTest.startsWith("Bearer ")) {
+ return authForTest;
+ }
+
+ return ("Basic " + authForTest);
+ }
+
public static ServiceResult doGET(String urlString, String authForTest, String fromTestID) throws Exception {
ServiceResult pr = new ServiceResult();
pr.fromTestID = fromTestID;
GetMethod getMethod = new GetMethod(urlString);
getMethod.addRequestHeader("Accept", "multipart/mixed");
getMethod.addRequestHeader("Accept", "application/xml");
- getMethod.setRequestHeader("Authorization", "Basic " + authForTest); //"dGVzdDp0ZXN0");
+ getMethod.setRequestHeader("Authorization", formatAuth(authForTest)); //"dGVzdDp0ZXN0");
getMethod.setRequestHeader("X-XmlReplay-fromTestID", fromTestID);
try {
int statusCode1 = client.executeMethod(getMethod);
DeleteMethod deleteMethod = new DeleteMethod(urlString);
deleteMethod.setRequestHeader("Accept", "multipart/mixed");
deleteMethod.addRequestHeader("Accept", "application/xml");
- deleteMethod.setRequestHeader("Authorization", "Basic " + authForTest);
+ deleteMethod.setRequestHeader("Authorization", formatAuth(authForTest));
deleteMethod.setRequestHeader("X-XmlReplay-fromTestID", fromTestID);
int statusCode1 = 0;
String res = "";
conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("content-type", contentType);
}
- conn.setRequestProperty("Authorization", "Basic " + authForTest); //TODO: remove test user : hard-coded as "dGVzdDp0ZXN0"
+ conn.setRequestProperty("Authorization", formatAuth(authForTest)); //TODO: remove test user : hard-coded as "dGVzdDp0ZXN0"
conn.setRequestProperty("Connection", "close");
conn.setRequestProperty("X-XmlReplay-fromTestID", fromTestID);
conn.setDoOutput(true);
PostMethod postMethod = new PostMethod(urlString);
postMethod.setRequestHeader("Accept", "multipart/mixed");
postMethod.addRequestHeader("Accept", "application/xml");
- postMethod.setRequestHeader("Authorization", "Basic " + authForTest);
+ postMethod.setRequestHeader("Authorization", formatAuth(authForTest));
postMethod.setRequestHeader("X-XmlReplay-fromTestID", fromTestID);
//this method takes an array of params. Not sure what they expect us to do with a raw post:
// postMethod.setRequestBody();
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xmlReplay>
+ <auths>
+ <!-- IMPORTANT: THESE ARE STICKY :: THEY STICK AROUND UNTIL RESET, IN EXEC ORDER OF THIS FILE. -->
+ <auth ID="cspace-ui">Y3NwYWNlLXVpOg==</auth> <!-- cspace-ui: -->
+ <auth ID="bad">w3NwaWNlLXVpOg==</auth>
+ </auths>
+
+ <testGroup ID="tokenGranting">
+ <!-- GET, PUT, and DELETE requests should not be supported -->
+ <test ID="tokenGet" auth="cspace-ui">
+ <method>GET</method>
+ <uri>/cspace-services/oauth/token</uri>
+ <expectedCodes>405</expectedCodes>
+ </test>
+ <test ID="tokenPut" auth="cspace-ui">
+ <method>PUT</method>
+ <contentType>application/x-www-form-urlencoded</contentType>
+ <uri>/cspace-services/oauth/token</uri>
+ <filename>security-oauth/password-grant-admin.txt</filename>
+ <expectedCodes>405</expectedCodes>
+ </test>
+ <test ID="tokenDelete" auth="cspace-ui">
+ <method>DELETE</method>
+ <uri>/cspace-services/oauth/token</uri>
+ <expectedCodes>405</expectedCodes>
+ </test>
+ <!-- POST should fail when client credentials are incorrect -->
+ <test ID="tokenPostBadClientCreds" auth="bad">
+ <method>POST</method>
+ <contentType>application/x-www-form-urlencoded</contentType>
+ <uri>/cspace-services/oauth/token</uri>
+ <filename>security-oauth/password-grant-admin.txt</filename>
+ <expectedCodes>401</expectedCodes>
+ </test>
+ <!-- POST should when user credentials are incorrect -->
+ <test ID="tokenPostBadUserCreds" auth="cspace-ui">
+ <method>POST</method>
+ <contentType>application/x-www-form-urlencoded</contentType>
+ <uri>/cspace-services/oauth/token</uri>
+ <filename>security-oauth/password-grant-bad-password.txt</filename>
+ <expectedCodes>400</expectedCodes>
+ </test>
+ <!-- Token grant should succeed -->
+ <test ID="tokenPostSuccess" auth="cspace-ui">
+ <method>POST</method>
+ <contentType>application/x-www-form-urlencoded</contentType>
+ <uri>/cspace-services/oauth/token</uri>
+ <filename>security-oauth/password-grant-admin.txt</filename>
+ <expectedCodes>200</expectedCodes>
+ </test>
+ </testGroup>
+
+ <testGroup ID="tokenUsage">
+ <!-- Token grant with password should succeed-->
+ <test ID="tokenGrant" auth="cspace-ui">
+ <method>POST</method>
+ <contentType>application/x-www-form-urlencoded</contentType>
+ <uri>/cspace-services/oauth/token</uri>
+ <filename>security-oauth/password-grant-admin.txt</filename>
+ <expectedCodes>200</expectedCodes>
+ </test>
+ <!-- Getting a resource with the granted access token should succeed -->
+ <test ID="getWithToken" tokenauth='${tokenGrant.got("//access_token")}'>
+ <method>GET</method>
+ <uri>/cspace-services/collectionobjects</uri>
+ <expectedCodes>200</expectedCodes>
+ </test>
+ <!-- Posting a resource with the granted access token should succeed -->
+ <test ID="postWithToken" tokenauth='${tokenGrant.got("//access_token")}'>
+ <method>POST</method>
+ <uri>/cspace-services/collectionobjects</uri>
+ <filename>collectionobject/co1.xml</filename>
+ <expectedCodes>200,201</expectedCodes>
+ </test>
+ <!-- Getting a resource with a forged token should fail -->
+ <test ID="getWithForgedToken" tokenauth='${tokenGrant.got("//access_token")}xyz'>
+ <method>GET</method>
+ <uri>/cspace-services/collectionobjects</uri>
+ <expectedCodes>401</expectedCodes>
+ </test>
+ <!-- Getting a resource with a refresh token should fail -->
+ <test ID="getWithBadToken" tokenauth='${tokenGrant.got("//refresh_token")}'>
+ <method>GET</method>
+ <uri>/cspace-services/collectionobjects</uri>
+ <expectedCodes>401</expectedCodes>
+ </test>
+ <!-- Getting a new access token with the refresh token should succeed -->
+ <test ID="refreshTokenGrant" auth="cspace-ui">
+ <method>POST</method>
+ <contentType>application/x-www-form-urlencoded</contentType>
+ <uri>/cspace-services/oauth/token</uri>
+ <filename>security-oauth/refresh-token-grant.txt</filename>
+ <expectedCodes>200</expectedCodes>
+ </test>
+ <!-- Posting a resource with the new access token should succeed -->
+ <test ID="postWithNewToken" tokenauth='${refreshTokenGrant.got("//access_token")}'>
+ <method>POST</method>
+ <uri>/cspace-services/collectionobjects</uri>
+ <filename>collectionobject/co1.xml</filename>
+ <expectedCodes>200,201</expectedCodes>
+ </test>
+ </testGroup>
+</xmlReplay>
--- /dev/null
+grant_type=password&username=admin@core.collectionspace.org&password=Administrator
\ No newline at end of file
--- /dev/null
+grant_type=password&username=admin@core.collectionspace.org&password=NotThePassword
\ No newline at end of file
--- /dev/null
+grant_type=refresh_token&refresh_token=${tokenGrant.got("//refresh_token")}
\ No newline at end of file
+ <run controlFile="./security-oauth.xml" />
<run controlFile="./security.xml" testGroup="deleteBug" />
<run controlFile="objectexit/object-exit.xml" testGroup="makeone" />
<run controlFile="objectexit/object-exit.xml" testGroup="checkList" />