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