Skip to content
6 changes: 3 additions & 3 deletions splunk/src/main/java/com/splunk/HttpService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

/**
Expand Down
4 changes: 2 additions & 2 deletions splunk/src/main/java/com/splunk/Job.java
Original file line number Diff line number Diff line change
Expand Up @@ -372,15 +372,15 @@ 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);
}
else {
fullPath = path.replace(JobCollection.REST_PATH, JobCollection.REST_PATH_V2) + methodPath;
response = service.post(fullPath, args);
}

return response.getContent();
}

Expand Down
6 changes: 3 additions & 3 deletions splunk/src/main/java/com/splunk/JobCollection.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class JobCollection extends EntityCollection<Job> {
* @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");
}

Expand All @@ -46,7 +46,7 @@ public class JobCollection extends EntityCollection<Job> {
* 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");
}

Expand Down Expand Up @@ -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();

Expand Down
6 changes: 5 additions & 1 deletion splunk/src/main/java/com/splunk/Receiver.java
Original file line number Diff line number Diff line change
Expand Up @@ -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("");
Expand Down
21 changes: 17 additions & 4 deletions splunk/src/main/java/com/splunk/Service.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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";

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -1312,7 +1316,7 @@ public Job search(String query, Map<String, Object> 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);
Expand Down Expand Up @@ -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}.
Expand Down
2 changes: 2 additions & 0 deletions splunk/src/main/java/com/splunk/ServiceInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
14 changes: 14 additions & 0 deletions splunk/src/main/java/com/splunk/SimpleCookieStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
*/
class SimpleCookieStore {

public static final String SPLUNK_AUTH_COOKIE = "splunkd_";

private Map<String, String> cookieJar = new HashMap<String, String>();
/**
* Adds cookies from a "Set-Cookie" header to the cookie store.
Expand Down Expand Up @@ -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
*/
Expand Down
32 changes: 28 additions & 4 deletions splunk/src/test/java/com/splunk/CookieTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -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<String, Object> 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();
Expand Down
4 changes: 2 additions & 2 deletions splunk/src/test/java/com/splunk/IndexTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
23 changes: 22 additions & 1 deletion splunk/src/test/java/com/splunk/ReceiverTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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<String, Object> 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();
Expand Down
20 changes: 20 additions & 0 deletions splunk/src/test/java/com/splunk/ServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
}
}

}