Skip to content

Commit

Permalink
Use UnprotectedRootAction instead of ProjectAction. Fix #48
Browse files Browse the repository at this point in the history
  • Loading branch information
janinko committed May 2, 2013
1 parent 5d05c73 commit 2ae22fe
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/main/java/org/jenkinsci/plugins/ghprb/Ghprb.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ void stop() {
/* INFO METHODS */

public String getHookUrl(){
return Jenkins.getInstance().getRootUrl() + project.getUrl() + GhprbProjectAction.URL + "/";
return Jenkins.getInstance().getRootUrl() + GhprbRootAction.URL + "/";
}

public boolean isRetestPhrase(String comment){
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@

package org.jenkinsci.plugins.ghprb;

import hudson.model.ProminentProjectAction;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand All @@ -13,6 +11,7 @@
/**
* @author janinko
*/
@Deprecated
public class GhprbProjectAction implements ProminentProjectAction{
static final String URL = "ghprbhook";
private GhprbGitHub gh;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ public String getRepoUrl(){
}


private static final EnumSet EVENTS = EnumSet.of(GHEvent.ISSUE_COMMENT, GHEvent.PULL_REQUEST);
private static final EnumSet<GHEvent> EVENTS = EnumSet.of(GHEvent.ISSUE_COMMENT, GHEvent.PULL_REQUEST);
private boolean hookExist() throws IOException{
for(GHHook h : repo.getHooks()){
if(!"web".equals(h.getName())) continue;
Expand Down
96 changes: 96 additions & 0 deletions src/main/java/org/jenkinsci/plugins/ghprb/GhprbRootAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package org.jenkinsci.plugins.ghprb;

import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.UnprotectedRootAction;
import hudson.security.ACL;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.model.Jenkins;
import org.acegisecurity.Authentication;
import org.acegisecurity.context.SecurityContextHolder;
import org.kohsuke.github.GHEventPayload;
import org.kohsuke.github.GHRepository;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

/**
* @author Honza Brázdil <jbrazdil@redhat.com>
*/
@Extension
public class GhprbRootAction implements UnprotectedRootAction {
static final String URL = "ghprbhook";

public String getIconFileName() {
return null;
}

public String getDisplayName() {
return null;
}

public String getUrlName() {
return URL;
}

public void doIndex(StaplerRequest req, StaplerResponse resp) {
String event = req.getHeader("X-Github-Event");
String payload = req.getParameter("payload");
if(payload == null){
Logger.getLogger(GhprbRootAction.class.getName()).log(Level.SEVERE, "Request doesn't contain payload.");
return;
}

GhprbGitHub gh = GhprbTrigger.getDscp().getGitHub();

Logger.getLogger(GhprbRootAction.class.getName()).log(Level.WARNING, "Got payload event: {0}", event);
try{
if("issue_comment".equals(event)){
GHEventPayload.IssueComment issueComment = gh.get().parseEventPayload(new StringReader(payload), GHEventPayload.IssueComment.class);
for(GhprbRepository repo : getRepos(issueComment.getRepository())){
repo.onIssueCommentHook(issueComment);
}
}else if("pull_request".equals(event)) {
GHEventPayload.PullRequest pr = gh.get().parseEventPayload(new StringReader(payload), GHEventPayload.PullRequest.class);
//for(GhprbRepository repo : getRepos(pr.getPullRequest().getRepository())){ // not working with github-api v1.40
for(GhprbRepository repo : getRepos(pr.getPullRequest().getBase().getRepository())){ // WA until ^^ fixed
repo.onPullRequestHook(pr);
}
}else{
Logger.getLogger(GhprbRootAction.class.getName()).log(Level.WARNING, "Request not known");
}
}catch(IOException ex){
Logger.getLogger(GhprbRootAction.class.getName()).log(Level.SEVERE, "Failed to parse github hook payload.", ex);
}
}

private Set<GhprbRepository> getRepos(GHRepository repo) throws IOException{
return getRepos(repo.getOwner().getLogin() + "/" + repo.getName());
}

private Set<GhprbRepository> getRepos(String repo){
HashSet<GhprbRepository> ret = new HashSet<GhprbRepository>();

// We need this to get acces to list of repositories
Authentication old = SecurityContextHolder.getContext().getAuthentication();
SecurityContextHolder.getContext().setAuthentication(ACL.SYSTEM);

try{
for(AbstractProject<?,?> job : Jenkins.getInstance().getAllItems(AbstractProject.class)){
GhprbTrigger trigger = job.getTrigger(GhprbTrigger.class);
if(trigger == null) continue;
GhprbRepository r = trigger.getGhprb().getRepository();
if(repo.equals(r.getName())){
ret.add(r);
}
}
}finally{
SecurityContextHolder.getContext().setAuthentication(old);
}
return ret;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
* @author janinko
*/
@Extension
@Deprecated
public class GhprbTransientProjectActionFactory extends TransientProjectActionFactory{

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
admin rights to specified repository.<br/>
If you want to create hook manualy set it for event types:
<code>issue_comment</code>, <code>pull_request</code>
and url <code>http://yourserver.com/jenkins/job/JOBNAME/ghprbhook</code>.<br/>
and url <code>http://yourserver.com/jenkins/ghprbhook</code>.<br/>
Also your Jenkins server must be accesible from internet.
</div>

0 comments on commit 2ae22fe

Please sign in to comment.