Commit c6080e4c authored by Greg Messner's avatar Greg Messner
Browse files

Mods to change HookManager into an interface.

parent 27aa5f5b
......@@ -4,37 +4,23 @@ package org.gitlab4j.api;
import javax.servlet.http.HttpServletRequest;
/**
* This class provides a base class handler for processing GitLab Web Hook and System Hook callouts.
* This interface provides a base class handler for processing GitLab Web Hook and System Hook callouts.
*/
public abstract class HookManager {
private String secretToken;
/**
* Create a HookManager to handle GitLab hook events.
*/
public HookManager() {
this.secretToken = null;
}
public interface HookManager {
/**
* Create a HookManager to handle GitLab hook events which will be verified
* against the specified secretToken.
*
* @param secretToken the secret token to verify against
* Get the secret token that received hook events should be validated against.
*
* @return the secret token that received hook events should be validated against
*/
public HookManager(String secretToken) {
this.secretToken = secretToken;
}
String getSecretToken();
/**
* Set the secret token that received hook events should be validated against.
*
* @param secretToken the secret token to verify against
*/
public void setSecretToken(String secretToken) {
this.secretToken = secretToken;
}
void setSecretToken(String secretToken);
/**
* Validate the provided secret token against the reference secret token. Returns true if
......@@ -44,8 +30,11 @@ public abstract class HookManager {
* @param secretToken the token to validate
* @return true if the secret token is valid or there is no reference secret token to validate against
*/
public boolean isValidSecretToken(String secretToken) {
return (this.secretToken == null || this.secretToken.equals(secretToken) ? true : false);
default public boolean isValidSecretToken(String secretToken) {
String ourSecretToken = getSecretToken();
return (ourSecretToken == null ||
ourSecretToken.trim().isEmpty() ||
ourSecretToken.equals(secretToken) ? true : false);
}
/**
......@@ -56,9 +45,9 @@ public abstract class HookManager {
* @param request the HTTP request to verify the secret token
* @return true if the secret token is valid or there is no reference secret token to validate against
*/
public boolean isValidSecretToken(HttpServletRequest request) {
default public boolean isValidSecretToken(HttpServletRequest request) {
if (this.secretToken != null) {
if (getSecretToken() != null) {
String secretToken = request.getHeader("X-Gitlab-Token");
return (isValidSecretToken(secretToken));
}
......@@ -73,5 +62,5 @@ public abstract class HookManager {
* @param request the HttpServletRequest to read the Event instance from
* @throws GitLabApiException if the parsed event is not supported
*/
public abstract void handleEvent(HttpServletRequest request) throws GitLabApiException;
public void handleEvent(HttpServletRequest request) throws GitLabApiException;
}
\ No newline at end of file
......@@ -21,7 +21,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* This class provides a handler for processing GitLab System Hook callouts.
*/
public class SystemHookManager extends HookManager {
public class SystemHookManager implements HookManager {
public static final String SYSTEM_HOOK_EVENT = "System Hook";
private final static Logger LOGGER = GitLabApi.getLogger();
......@@ -30,37 +30,69 @@ public class SystemHookManager extends HookManager {
// Collection of objects listening for System Hook events.
private final List<SystemHookListener> systemHookListeners = new CopyOnWriteArrayList<SystemHookListener>();
private String secretToken;
/**
* Create a HookManager to handle GitLab system hook events.
*/
public SystemHookManager() {
super();
}
/**
* Create a HookManager to handle GitLab system hook events which will be verified
* against the specified secretToken.
*
*
* @param secretToken the secret token to verify against
*/
public SystemHookManager(String secretToken) {
super(secretToken);
}
this.secretToken = secretToken;
}
/**
* Get the secret token that received hook events should be validated against.
*
* @return the secret token that received hook events should be validated against
*/
public String getSecretToken() {
return (secretToken);
}
/**
* Set the secret token that received hook events should be validated against.
*
* @param secretToken the secret token to verify against
*/
public void setSecretToken(String secretToken) {
this.secretToken = secretToken;
}
/**
* Parses and verifies an SystemHookEvent instance from the HTTP request and
* fires it off to the registered listeners.
*
*
* @param request the HttpServletRequest to read the Event instance from
* @throws GitLabApiException if the parsed event is not supported
*/
public void handleEvent(HttpServletRequest request) throws GitLabApiException {
handleRequest(request);
}
/**
* Parses and verifies an SystemHookEvent instance from the HTTP request and
* fires it off to the registered listeners.
*
* @param request the HttpServletRequest to read the Event instance from
* @return the processed SystemHookEvent instance read from the request,null if the request
* not contain a system hook event
* @throws GitLabApiException if the parsed event is not supported
*/
public SystemHookEvent handleRequest(HttpServletRequest request) throws GitLabApiException {
String eventName = request.getHeader("X-Gitlab-Event");
if (eventName == null || eventName.trim().isEmpty()) {
String message = "X-Gitlab-Event header is missing!";
LOGGER.warning(message);
return;
return (null);
}
if (!isValidSecretToken(request)) {
......@@ -126,6 +158,7 @@ public class SystemHookManager extends HookManager {
event.setRequestUrl(requestUrl != null ? requestUrl.toString() : null);
event.setRequestQueryString(request.getQueryString());
fireEvent(event);
return (event);
} catch (Exception e) {
LOGGER.warning("Error processing JSON data, exception=" +
......
......@@ -18,7 +18,7 @@ import org.gitlab4j.api.utils.JacksonJson;
/**
* This class provides a handler for processing GitLab WebHook callouts.
*/
public class WebHookManager extends HookManager {
public class WebHookManager implements HookManager {
private final static Logger LOGGER = GitLabApi.getLogger();
private final JacksonJson jacksonJson = new JacksonJson();
......@@ -26,11 +26,12 @@ public class WebHookManager extends HookManager {
// Collection of objects listening for WebHook events.
private final List<WebHookListener> webhookListeners = new CopyOnWriteArrayList<WebHookListener>();
private String secretToken;
/**
* Create a HookManager to handle GitLab webhook events.
*/
public WebHookManager() {
super();
}
/**
......@@ -40,7 +41,25 @@ public class WebHookManager extends HookManager {
* @param secretToken the secret token to verify against
*/
public WebHookManager(String secretToken) {
super(secretToken);
this.secretToken = secretToken;
}
/**
* Get the secret token that received hook events should be validated against.
*
* @return the secret token that received hook events should be validated against
*/
public String getSecretToken() {
return (secretToken);
}
/**
* Set the secret token that received hook events should be validated against.
*
* @param secretToken the secret token to verify against
*/
public void setSecretToken(String secretToken) {
this.secretToken = secretToken;
}
/**
......@@ -51,11 +70,24 @@ public class WebHookManager extends HookManager {
* @throws GitLabApiException if the parsed event is not supported
*/
public void handleEvent(HttpServletRequest request) throws GitLabApiException {
handleRequest(request);
}
/**
* Parses and verifies an Event instance from the HTTP request and
* fires it off to the registered listeners.
*
* @param request the HttpServletRequest to read the Event instance from
* @return the Event instance that was read from the request body, null if the request
* not contain a webhook event
* @throws GitLabApiException if the parsed event is not supported
*/
public Event handleRequest(HttpServletRequest request) throws GitLabApiException {
String eventName = request.getHeader("X-Gitlab-Event");
if (eventName == null || eventName.trim().isEmpty()) {
LOGGER.warning("X-Gitlab-Event header is missing!");
return;
return (null);
}
if (!isValidSecretToken(request)) {
......@@ -101,6 +133,7 @@ public class WebHookManager extends HookManager {
event.setRequestUrl(request.getRequestURL().toString());
event.setRequestQueryString(request.getQueryString());
fireEvent(event);
return (event);
} catch (Exception e) {
LOGGER.warning("Error parsing JSON data, exception=" + e.getClass().getSimpleName() + ", error=" + e.getMessage());
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment