Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated version checks to enable v2 search APIs #193

Merged
merged 11 commits into from
Sep 12, 2022
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());
}
}
}

}