diff --git a/splunk/src/main/java/com/splunk/HttpService.java b/splunk/src/main/java/com/splunk/HttpService.java index 693f3a36..aa6769b8 100644 --- a/splunk/src/main/java/com/splunk/HttpService.java +++ b/splunk/src/main/java/com/splunk/HttpService.java @@ -316,12 +316,12 @@ public void removeAllCookies() { } /** - * Returns true if the cookeStore has any cookies, false otherwise + * Returns true if the cookieStore has any Splunk Authorization cookies, false otherwise * * @return True if there are cookies, false otherwise */ - public Boolean hasCookies() { - return !cookieStore.isEmpty(); + public Boolean hasSplunkAuthCookies() { + return cookieStore.hasSplunkAuthCookie(); } /** diff --git a/splunk/src/main/java/com/splunk/Job.java b/splunk/src/main/java/com/splunk/Job.java index d101eeaf..354d413c 100644 --- a/splunk/src/main/java/com/splunk/Job.java +++ b/splunk/src/main/java/com/splunk/Job.java @@ -372,7 +372,7 @@ private InputStream getEventsMethod(String methodPath, Map args) { // v1(GET), v2(POST) String fullPath; ResponseMessage response; - if (service.versionIsEarlierThan("9.0")) { + if (!service.enableV2SearchApi()) { fullPath = path.replace(JobCollection.REST_PATH_V2, JobCollection.REST_PATH) + methodPath; response = service.get(fullPath, args); } @@ -380,7 +380,7 @@ private InputStream getEventsMethod(String methodPath, Map args) { fullPath = path.replace(JobCollection.REST_PATH, JobCollection.REST_PATH_V2) + methodPath; response = service.post(fullPath, args); } - + return response.getContent(); } diff --git a/splunk/src/main/java/com/splunk/JobCollection.java b/splunk/src/main/java/com/splunk/JobCollection.java index b47feadc..661e21ff 100644 --- a/splunk/src/main/java/com/splunk/JobCollection.java +++ b/splunk/src/main/java/com/splunk/JobCollection.java @@ -34,7 +34,7 @@ public class JobCollection extends EntityCollection { * @param service The connected {@code Service} instance. */ JobCollection(Service service) { - super(service, service.versionIsAtLeast("9.0") ? REST_PATH_V2 : REST_PATH, Job.class); + super(service, service.enableV2SearchApi() ? REST_PATH_V2 : REST_PATH, Job.class); this.refreshArgs.put("count", "0"); } @@ -46,7 +46,7 @@ public class JobCollection extends EntityCollection { * return and how to sort them (see {@link CollectionArgs}). */ JobCollection(Service service, Args args) { - super(service, service.versionIsAtLeast("9.0") ? REST_PATH_V2 : REST_PATH, Job.class, args); + super(service, service.enableV2SearchApi() ? REST_PATH_V2 : REST_PATH, Job.class); this.refreshArgs.put("count", "0"); } @@ -87,7 +87,7 @@ public Job create(String query, Map args) { .item(0) .getTextContent(); - String path = service.versionIsAtLeast("9.0") ? REST_PATH_V2 : REST_PATH; + String path = service.enableV2SearchApi() ? REST_PATH_V2 : REST_PATH; Job job = new Job(service, path + "/" + sid); job.refresh(); diff --git a/splunk/src/main/java/com/splunk/Receiver.java b/splunk/src/main/java/com/splunk/Receiver.java index b6057cc0..8ae4d826 100644 --- a/splunk/src/main/java/com/splunk/Receiver.java +++ b/splunk/src/main/java/com/splunk/Receiver.java @@ -98,9 +98,13 @@ public Socket attach(String indexName, Args args) throws IOException { headers.add("Accept-Encoding: identity"); headers.add("X-Splunk-Input-Mode: Streaming"); - if (service.hasCookies()) { + if (service.hasSplunkAuthCookies()) { headers.add(String.format("Cookie: %s", service.stringifyCookies())); } else { + // to persist the cookies other than Splunk such as from Load Balancer + if(!service.cookieStore.isEmpty()){ + headers.add(String.format("Cookie: %s", service.stringifyCookies())); + } headers.add(String.format("Authorization: %s", service.getToken())); } headers.add(""); diff --git a/splunk/src/main/java/com/splunk/Service.java b/splunk/src/main/java/com/splunk/Service.java index cbe63b4a..d6d15b8f 100644 --- a/splunk/src/main/java/com/splunk/Service.java +++ b/splunk/src/main/java/com/splunk/Service.java @@ -66,6 +66,9 @@ public class Service extends BaseService { /** The version of this Splunk instance, once logged in. */ public String version = null; + /** The type of this Splunk instance, once logged in. */ + public String instanceType = null; + /** The default host name, which is used when a host name is not provided.*/ public static String DEFAULT_HOST = "localhost"; @@ -225,7 +228,7 @@ public InputStream export(String search, Map args) { } ResponseMessage response; - if (versionIsAtLeast("9.0")) + if(enableV2SearchApi()) response = post(JobCollection.REST_PATH_V2 + "/export", args); else { response = post(JobCollection.REST_PATH + "/export", args); @@ -1112,7 +1115,7 @@ public UserCollection getUsers(Args args) { * @return The current {@code Service} instance. */ public Service login() { - if (!this.cookieStore.isEmpty() && (this.username == null || this.password == null)) { + if (this.cookieStore.hasSplunkAuthCookie() && (this.username == null || this.password == null)) { return this; } else if (this.username == null || this.password == null) { @@ -1147,6 +1150,7 @@ public Service login(String username, String password) { .getTextContent(); this.token = "Splunk " + sessionKey; this.version = this.getInfo().getVersion(); + this.instanceType = this.getInfo().getInstanceType(); if (versionCompare("4.3") >= 0) this.passwordEndPoint = "storage/passwords"; @@ -1258,7 +1262,7 @@ public ResponseMessage parse(String query) { public ResponseMessage parse(String query, Map args) { args = Args.create(args).add("q", query); - if (versionIsAtLeast("9.0")) + if(enableV2SearchApi()) return post("search/v2/parser", args); else return get("search/parser", args); @@ -1312,7 +1316,7 @@ public Job search(String query, Map args) { */ @Override public ResponseMessage send(String path, RequestMessage request) { // cookieStore is a protected member of HttpService - if (token != null && cookieStore.isEmpty()) { + if (token != null && !cookieStore.hasSplunkAuthCookie() ) { request.getHeader().put("Authorization", token); } return super.send(fullpath(path), request); @@ -1350,6 +1354,15 @@ public void setBearerToken(String value) { this.token = value.contains("Splunk") || value.contains("Bearer") ? value : "Bearer " + value; } + + public boolean enableV2SearchApi(){ + if(this.instanceType.equalsIgnoreCase("cloud")) { + return versionIsAtLeast("9.0.2209"); + }else{ + return versionIsAtLeast("9.0.2"); + } + } + /** * Returns true if this Splunk instance's version is no earlier than * the version specified in {@code version}. diff --git a/splunk/src/main/java/com/splunk/ServiceInfo.java b/splunk/src/main/java/com/splunk/ServiceInfo.java index 72f556bd..16ec8aaa 100644 --- a/splunk/src/main/java/com/splunk/ServiceInfo.java +++ b/splunk/src/main/java/com/splunk/ServiceInfo.java @@ -155,6 +155,8 @@ public String getVersion() { return getString("version"); } + public String getInstanceType() {return getString("instance_type", "");} + /** * Indicates whether this Splunk instance is running under a free license. * diff --git a/splunk/src/main/java/com/splunk/SimpleCookieStore.java b/splunk/src/main/java/com/splunk/SimpleCookieStore.java index afc1219c..4fd60664 100644 --- a/splunk/src/main/java/com/splunk/SimpleCookieStore.java +++ b/splunk/src/main/java/com/splunk/SimpleCookieStore.java @@ -28,6 +28,8 @@ */ class SimpleCookieStore { + public static final String SPLUNK_AUTH_COOKIE = "splunkd_"; + private Map cookieJar = new HashMap(); /** * Adds cookies from a "Set-Cookie" header to the cookie store. @@ -69,6 +71,18 @@ public Boolean isEmpty() { return cookieJar.isEmpty(); } + public boolean hasSplunkAuthCookie(){ + if(cookieJar.isEmpty()){ + return false; + } + for(String cookie : cookieJar.keySet()){ + if(cookie.startsWith(SPLUNK_AUTH_COOKIE)){ + return true; + } + } + return false; + } + /** * Removes all cookies from SimpleCookieStore */ diff --git a/splunk/src/test/java/com/splunk/CookieTest.java b/splunk/src/test/java/com/splunk/CookieTest.java index f49b18d2..d11cda76 100644 --- a/splunk/src/test/java/com/splunk/CookieTest.java +++ b/splunk/src/test/java/com/splunk/CookieTest.java @@ -16,13 +16,11 @@ package com.splunk; +import java.net.HttpCookie; import java.util.HashMap; import java.util.Map; -import org.junit.Assert; -import org.junit.Assume; -import org.junit.Before; -import org.junit.Test; +import org.junit.*; public class CookieTest extends SDKTestCase { @@ -124,6 +122,32 @@ public void testLoginWithMultipleCookies() { s.getSettings().refresh(); } + @Test + public void testLoginWithOtherCookies() { + String otherCookies = "load=balancer;"; + service.logout(); + service.cookieStore.removeAll(); + service.cookieStore.add(otherCookies); + service.login(); + service.getApplications(); + service.cookieStore.removeAll(); + } + + @Test + public void testUsingAuthTokenAndOtherCookie(){ + String validToken = service.getToken(); + Assert.assertTrue(validToken.startsWith("Splunk ")); + String otherCookies = "load=balancer;"; + Map args = new HashMap<>(); + args.put("cookie", otherCookies); + args.put("host",service.getHost()); + args.put("port", service.getPort()); + Service s = new Service(args); + s.setToken(validToken); + s.getApplications(); + Assert.assertEquals(otherCookies.trim(),s.cookieStore.getCookies().trim()); + } + @Test public void testLoginWithMultipleInvalidCookies() { String validCookie = service.stringifyCookies(); diff --git a/splunk/src/test/java/com/splunk/IndexTest.java b/splunk/src/test/java/com/splunk/IndexTest.java index a98dd56a..56d6670a 100644 --- a/splunk/src/test/java/com/splunk/IndexTest.java +++ b/splunk/src/test/java/com/splunk/IndexTest.java @@ -77,8 +77,8 @@ public void testAttachWithCookieHeader() throws IOException { // Cookies not implemented before version 6.2 return; } - // Check that their are cookies at all - Assert.assertTrue(service.hasCookies()); + // Check that their are Splunk Auth cookies at all + Assert.assertTrue(service.hasSplunkAuthCookies()); // Make a service that only has that cookie String validCookie = service.stringifyCookies(); diff --git a/splunk/src/test/java/com/splunk/ReceiverTest.java b/splunk/src/test/java/com/splunk/ReceiverTest.java index 99e4b0e4..e171b9d1 100644 --- a/splunk/src/test/java/com/splunk/ReceiverTest.java +++ b/splunk/src/test/java/com/splunk/ReceiverTest.java @@ -24,6 +24,8 @@ import java.io.IOException; import java.io.OutputStream; import java.net.Socket; +import java.util.HashMap; +import java.util.Map; public class ReceiverTest extends SDKTestCase { @@ -36,9 +38,28 @@ public void testReceiverWithoutCookie() { @Test public void testReceiverWithCookie() { Assume.assumeTrue(service.versionIsAtLeast("6.2")); - Assert.assertTrue(service.hasCookies()); + Assert.assertTrue(service.hasSplunkAuthCookies()); testReceiver(service); } + + @Test + public void testReceiverWithoutSplunkCookie() { + String validToken = service.getToken(); + Assert.assertTrue(validToken.startsWith("Splunk ")); + String otherCookies = "load=balancer;"; + Map args = new HashMap<>(); + args.put("cookie", otherCookies); + args.put("host",service.getHost()); + args.put("port", service.getPort()); + Service s = new Service(args); + s.setToken(validToken); + s.version = s.getInfo().getVersion(); + System.out.println(s.version); + Assume.assumeTrue(s.versionIsAtLeast("6.2")); + Assert.assertTrue(!s.cookieStore.isEmpty()); + testReceiver(s); + } + // Make a few simple requests and make sure the results look ok. public void testReceiver(Service passedService) { Receiver receiver = passedService.getReceiver(); diff --git a/splunk/src/test/java/com/splunk/ServiceTest.java b/splunk/src/test/java/com/splunk/ServiceTest.java index 1bd80833..ce9aafdf 100644 --- a/splunk/src/test/java/com/splunk/ServiceTest.java +++ b/splunk/src/test/java/com/splunk/ServiceTest.java @@ -715,4 +715,24 @@ public void testPost() { Assert.assertTrue(firstLineIsXmlDtd(response.getContent())); } + /* + Test whether the V2 and V1 Search APIs are switched properly based on the Type of Splunk Instance and Version. + */ + @Test + public void testEnableV2Api(){ + if(service.instanceType.equalsIgnoreCase("cloud")) { + if(service.versionIsEarlierThan("9.0.2209")){ + Assert.assertFalse(service.enableV2SearchApi()); + }else{ + Assert.assertTrue(service.enableV2SearchApi()); + } + }else{ + if(service.versionIsEarlierThan("9.0.2")){ + Assert.assertFalse(service.enableV2SearchApi()); + }else{ + Assert.assertTrue(service.enableV2SearchApi()); + } + } + } + }