Skip to content

Commit

Permalink
Payload json now in pojo and used in cause
Browse files Browse the repository at this point in the history
  • Loading branch information
sanderv32 committed May 9, 2018
1 parent 99bdb2c commit f93aff1
Show file tree
Hide file tree
Showing 7 changed files with 176 additions and 29 deletions.
16 changes: 2 additions & 14 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<java.level.test>8</java.level.test>

<!-- Jenkins -->
<jenkins.version>1.625.3</jenkins.version>
<jenkins.version>2.60.1</jenkins.version>
<jenkins-test-harness.version>2.36</jenkins-test-harness.version>

<!-- Security -->
Expand Down Expand Up @@ -94,7 +94,7 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>17.0</version>
<version>25.0-jre</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
Expand All @@ -120,18 +120,6 @@
<version>6.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.3</version>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
Expand Down
63 changes: 62 additions & 1 deletion src/main/java/org/jenkinsci/plugins/gogs/GogsCause.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,76 @@ associated documentation files (the "Software"), to deal in the Software without

package org.jenkinsci.plugins.gogs;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import hudson.model.Cause;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

class GogsCause extends Cause {
private final String deliveryID;
private String deliveryID;
private GogsPayloadData gogsPayloadData;
private Map<String, String> envVars = new HashMap<>();
private final static Logger LOGGER = Logger.getLogger(GogsCause.class.getName());


public GogsCause() {
}

public GogsCause(String deliveryID) {
this.deliveryID = deliveryID;
}

public String getDeliveryID() {
return deliveryID;
}

public Map<String, String> getEnvVars() {
return envVars;
}

public void setDeliveryID(String deliveryID) {
this.deliveryID = deliveryID;
}

public void setGogsPayloadData(String json) {
Map<String, Object> map = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

try {
gogsPayloadData = objectMapper.readValue(json, GogsPayloadData.class);
map = objectMapper.convertValue(gogsPayloadData, new TypeReference<Map<String, Object>>() {
});
} catch (Exception e) {
LOGGER.severe(e.getMessage());
}
if (gogsPayloadData != null) {
iterate(map, null);
}

}

private void iterate(Map<String, Object> map, String prefix) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
StringBuilder env_name = new StringBuilder();
if (prefix != null)
env_name.append(prefix.toUpperCase()).append("_");

if (entry.getValue() instanceof Map) {
iterate((Map<String, Object>) entry.getValue(), env_name + entry.getKey().toUpperCase());
} else if (entry.getValue() instanceof String || entry.getValue() instanceof Long || entry.getValue() instanceof Boolean) {
env_name.append(entry.getKey().toUpperCase());
envVars.put("GOGS_" + env_name.toString(), entry.getValue().toString());
}
}
}

@Override
public String getShortDescription() {
return this.deliveryID;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.jenkinsci.plugins.gogs;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.Run;
import hudson.model.TaskListener;
import jenkins.model.CoreEnvironmentContributor;

import javax.annotation.Nonnull;
import java.io.IOException;

@Extension
public class GogsEnvironmentContributor extends CoreEnvironmentContributor {
@Override
public void buildEnvironmentFor(@Nonnull Run r, @Nonnull EnvVars envs, @Nonnull TaskListener listener)
throws IOException, InterruptedException {
GogsCause gogsCause;

gogsCause = (GogsCause) r.getCause(GogsCause.class);
if (gogsCause != null) {
envs.putAll(gogsCause.getEnvVars());
}
}
}
12 changes: 9 additions & 3 deletions src/main/java/org/jenkinsci/plugins/gogs/GogsPayload.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,27 @@
import java.util.logging.Logger;

class GogsPayload extends InvisibleAction implements EnvironmentContributingAction {
private final Map<String, String> payload;
private Map<String, String> payload;
private GogsCause gogsCause;

public GogsPayload(Map<String, String> payload) {
this.payload = payload;
}

public GogsPayload(GogsCause gogsCause) {
this.gogsCause = gogsCause;
}

@Nonnull
private Map<String, String> getPayload() {
public Map<String, String> getPayload() {
return payload;
}

@Override
public void buildEnvVars(AbstractBuild<?, ?> abstractBuild, EnvVars envVars) {
LOGGER.log(Level.FINEST, "Injecting GOGS_PAYLOAD: {0}", getPayload());
payload.forEach((key, value) -> envVars.put("GOGS_" + key.toUpperCase(), value));
// payload.forEach((key, value) -> envVars.put("GOGS_" + key.toUpperCase(), value));
envVars.putAll(gogsCause.getEnvVars());
}

private static final Logger LOGGER = Logger.getLogger(GogsPayload.class.getName());
Expand Down
66 changes: 66 additions & 0 deletions src/main/java/org/jenkinsci/plugins/gogs/GogsPayloadData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package org.jenkinsci.plugins.gogs;

import java.util.List;

public class GogsPayloadData {
public static class UserDetails {
public String name;
public String email;
public String username;
}

public static class Owner {
public Long id;
public String login;
public String full_name;
public String email;
public String avatar_url;
public String username;
}

public static class Commits {
public String id;
public String message;
public String url;
public UserDetails author;
public UserDetails committer;
public List<String> added;
public List<String> removed;
public List<String> modified;
public String timestamp;
}

public static class Repository {
public Long id;
public Owner owner;
public String name;
public String full_name;
public String description;
public Boolean Private;
public Boolean fork;
public Boolean parent;
public Boolean empty;
public Boolean mirror;
public Long size;
public String html_url;
public String ssh_url;
public String clone_url;
public String website;
public Long stars_count;
public Long forks_count;
public Long watchers_count;
public Long open_issues_count;
public String default_branch;
public String created_at;
public String updated_at;
}

public String ref;
public String before;
public String after;
public String compare_url;
public List<Commits> commits;
public Repository repository;
public Owner pusher;
public Owner sender;
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ associated documentation files (the "Software"), to deal in the Software without
package org.jenkinsci.plugins.gogs;

import hudson.model.BuildableItem;
import hudson.model.Cause;
import hudson.security.ACL;
import jenkins.triggers.SCMTriggerItem;
import org.acegisecurity.context.SecurityContext;
Expand All @@ -43,30 +42,31 @@ associated documentation files (the "Software"), to deal in the Software without
class GogsPayloadProcessor {
private static final Logger LOGGER = Logger.getLogger(GogsPayloadProcessor.class.getName());
private final Map<String, String> payload = new HashMap<>();
private GogsCause gogsCause = new GogsCause();

GogsPayloadProcessor() {
}

public void setPayload(String k, String v) {
this.payload.put(k, v);
public void setCause(GogsCause gogsCause) {
this.gogsCause = gogsCause;
}

public GogsResults triggerJobs(String jobName, String deliveryID) {
public GogsResults triggerJobs(String jobName) {
AtomicBoolean jobdone = new AtomicBoolean(false);
SecurityContext saveCtx = ACL.impersonate(ACL.SYSTEM);
GogsResults result = new GogsResults();

try {
BuildableItem project = GogsUtils.find(jobName, BuildableItem.class);
if (project != null) {
Cause cause = new GogsCause(deliveryID);

if (project instanceof ParameterizedJob) {
ParameterizedJob pJob = (ParameterizedJob) project;
pJob.getTriggers().values().stream()
.filter(trigger1 -> trigger1 instanceof GogsTrigger).findFirst()
.ifPresent((g) -> {
GogsPayload gogsPayload = new GogsPayload(this.payload);
// GogsPayload gogsPayload = new GogsPayload(this.payload);
GogsPayload gogsPayload = new GogsPayload(this.gogsCause);
Optional.ofNullable(SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(project))
.ifPresent((item) -> {
item.scheduleBuild2(0, gogsPayload);
Expand All @@ -75,7 +75,7 @@ public GogsResults triggerJobs(String jobName, String deliveryID) {
});
}
if (!jobdone.get()) {
project.scheduleBuild(0, cause);
project.scheduleBuild(0, gogsCause);
jobdone.set(true);
}
}
Expand Down
10 changes: 6 additions & 4 deletions src/main/java/org/jenkinsci/plugins/gogs/GogsWebHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ private void setGogsSignature(String gogsSignature) {
*/
public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException {
GogsPayloadProcessor payloadProcessor = new GogsPayloadProcessor();
GogsCause gogsCause = new GogsCause();

if (!sanityChecks(req, rsp)) {
return;
Expand Down Expand Up @@ -140,8 +141,9 @@ public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException

AtomicReference<String> jSecret = new AtomicReference<>(null);
AtomicBoolean foundJob = new AtomicBoolean(false);
payloadProcessor.setPayload("ref", jsonObject.getString("ref"));
payloadProcessor.setPayload("before", jsonObject.getString("before"));
gogsCause.setGogsPayloadData(jsonObject.toString());
gogsCause.setDeliveryID(getGogsDelivery());
payloadProcessor.setCause(gogsCause);

SecurityContext saveCtx = ACL.impersonate(ACL.SYSTEM);

Expand Down Expand Up @@ -183,10 +185,10 @@ public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException
LOGGER.warning(msg);
} else if (isNullOrEmpty(jSecret.get()) && isNullOrEmpty(gSecret)) {
/* No password is set in Jenkins and Gogs, run without secrets */
result = payloadProcessor.triggerJobs(jobName, getGogsDelivery());
result = payloadProcessor.triggerJobs(jobName);
} else if (!isNullOrEmpty(jSecret.get()) && jSecret.get().equals(gSecret)) {
/* Password is set in Jenkins and Gogs, and is correct */
result = payloadProcessor.triggerJobs(jobName, getGogsDelivery());
result = payloadProcessor.triggerJobs(jobName);
} else {
/* Gogs and Jenkins secrets differs */
result.setStatus(403, "Incorrect secret");
Expand Down

0 comments on commit f93aff1

Please sign in to comment.