private Map<String, JSONObject> convertToTokenMap(Object tokenStoreData) { if (tokenStoreData == null) { // in case there are no token return Collections.emptyMap(); } else if (tokenStoreData instanceof JSONObject) { // in case there is only one token JSONObject singleTokenData = (JSONObject) tokenStoreData; Map<String, JSONObject> result = new HashMap<>(); addJSONTokenIntoMap(result, singleTokenData); return result; } else if (tokenStoreData instanceof JSONArray) { // in case there are multiple tokens JSONArray tokenArray = ((JSONArray) tokenStoreData); Map<String, JSONObject> result = new HashMap<>(); for (int i = 0; i < tokenArray.size(); i++) { JSONObject tokenData = tokenArray.getJSONObject(i); addJSONTokenIntoMap(result, tokenData); } return result; } throw HttpResponses.error(400, "Unexpected class received for the token store information"); }
@Override public HttpResponse onSuccess(String authorizationCode) { try { IdTokenResponse response = IdTokenResponse.execute( flow.newTokenRequest(authorizationCode).setRedirectUri(buildOAuthRedirectUrl()) ); IdToken idToken = IdToken.parse( JSON_FACTORY, response.getIdToken()); Object username = idToken.getPayload().get(userNameField); if(username==null) { return HttpResponses.error(500,"no field '"+userNameField+"' was suppied in the token payload to be used as the username"); } if(failedCheckOfTokenField(idToken)) { return HttpResponses.errorWithoutStack(401, "Unauthorized"); } flow.createAndStoreCredential(response, null); loginAndSetUserData(username.toString(), new GrantedAuthority[] { SecurityRealm.AUTHENTICATED_AUTHORITY }, idToken); return new HttpRedirect(redirectOnFinish); } catch (IOException e) { return HttpResponses.error(500,e); } } }.doCommenceLogin();
private String getRequestBody(StaplerRequest request) { String requestBody; try { Charset charset = request.getCharacterEncoding() == null ? UTF_8 : Charset.forName(request.getCharacterEncoding()); requestBody = IOUtils.toString(request.getInputStream(), charset); } catch (IOException e) { throw HttpResponses.error(500, "Failed to read request body"); } return requestBody; }
public void execute(StaplerResponse response) { SCMTriggerItem item = SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(project); if (!hasGitSCM(item)) { throw HttpResponses.error(409, "The project has no GitSCM configured"); } writeStatusBody(response, build, getStatus(build)); }
@Override protected void writeStatusBody(StaplerResponse response, Run<?, ?> build, BuildStatus status) { try { response.setHeader("Expires", "Fri, 01 Jan 1984 00:00:00 GMT"); response.setHeader("Cache-Control", "no-cache, private"); response.setHeader("Content-Type", "image/png"); IOUtils.copy(getStatusImage(status), response.getOutputStream()); response.flushBuffer(); } catch (Exception e) { throw HttpResponses.error(500, "Could not generate response."); } }
@RequirePOST public synchronized HttpResponse doRenewSessionSeed(@AncestorInPath @Nonnull User u) throws IOException { u.checkPermission(Jenkins.ADMINISTER); if (DISABLE_USER_SEED) { return HttpResponses.error(404, "User seed feature is disabled"); } try (BulkChange bc = new BulkChange(u)) { UserSeedProperty p = u.getProperty(UserSeedProperty.class); p.renewSeed(); LastGrantedAuthoritiesProperty lastGranted = u.getProperty(LastGrantedAuthoritiesProperty.class); if (lastGranted != null) { lastGranted.invalidate(); } bc.commit(); } return HttpResponses.ok(); }
@RequirePOST public HttpResponse doScan(StaplerRequest req) throws IOException, GeneralSecurityException { if(req.hasParameter("background")) { start(false); } else if(req.hasParameter("schedule")) { scanOnBoot.on(); } else if(req.hasParameter("dismiss")) { disable(true); } else throw HttpResponses.error(400,"Invalid request submission: " + req.getParameterMap()); return HttpResponses.redirectViaContextPath("/manage"); }
@Override protected void writeStatusBody(StaplerResponse response, Run<?, ?> build, BuildStatus status) { try { JSONObject object = new JSONObject(); object.put("sha", sha1); if (build != null) { object.put("id", build.getNumber()); } object.put("status", status.getValue()); writeBody(response, object); } catch (IOException e) { throw HttpResponses.error(500, "Failed to generate response"); } }
public void execute(StaplerResponse response) { if (build != null) { try { response.sendRedirect2(Jenkins.getInstance().getRootUrl() + build.getUrl()); } catch (IOException e) { try { response.sendRedirect2(Jenkins.getInstance().getRootUrl() + build.getBuildStatusUrl()); } catch (IOException e1) { throw HttpResponses.error(500, "Failed to redirect to build page"); } } } } }
public HttpResponse doProvision(@QueryParameter String template) throws ServletException, IOException { checkPermission(PROVISION); if (template == null) { throw HttpResponses.error(SC_BAD_REQUEST, "The 'template' query parameter is missing"); } SlaveTemplate t = getTemplate(template); if (t == null) { throw HttpResponses.error(SC_BAD_REQUEST, "No such template: " + template); } try { List<EC2AbstractSlave> nodes = getNewOrExistingAvailableSlave(t, 1, true); if (nodes == null || nodes.isEmpty()) throw HttpResponses.error(SC_BAD_REQUEST, "Cloud or AMI instance cap would be exceeded for: " + template); //Reconnect a stopped instance, the ADD is invoking the connect only for the node creation Computer c = nodes.get(0).toComputer(); if (nodes.get(0).getStopOnTerminate() && c != null) { c.connect(false); } Jenkins.getInstance().addNode(nodes.get(0)); return HttpResponses.redirectViaContextPath("/computer/" + nodes.get(0).getNodeName()); } catch (AmazonClientException e) { throw HttpResponses.error(SC_INTERNAL_SERVER_ERROR, e); } }
/** * When the identity provider is done with its thing, the user comes back here. */ public HttpResponse doFinishLogin(StaplerRequest request) throws IOException { StringBuffer buf = request.getRequestURL(); if (request.getQueryString() != null) { buf.append('?').append(request.getQueryString()); } AuthorizationCodeResponseUrl responseUrl = new AuthorizationCodeResponseUrl(buf.toString()); if (! uuid.equals(responseUrl.getState())) { return HttpResponses.error(401, "State is invalid"); } String code = responseUrl.getCode(); if (responseUrl.getError() != null) { return HttpResponses.error(401, "Error from provider: " + code); } else if (code == null) { return HttpResponses.error(404, "Missing authorization code"); } else { return onSuccess(code); } }
public HttpResponse doProvision(@QueryParameter String template) throws ServletException, IOException { checkPermission(PROVISION); if(template==null) { throw HttpResponses.error(SC_BAD_REQUEST,"The 'template' query parameter is missing"); } SlaveTemplate t = getTemplate(template); if(t==null) { throw HttpResponses.error(SC_BAD_REQUEST,"No such template: "+template); } StringWriter sw = new StringWriter(); StreamTaskListener listener = new StreamTaskListener(sw); try { EC2AbstractSlave node = t.provision(listener); Hudson.getInstance().addNode(node); return HttpResponses.redirectViaContextPath("/computer/"+node.getNodeName()); } catch (AmazonClientException e) { throw HttpResponses.error(SC_INTERNAL_SERVER_ERROR,e); } }
@Restricted(DoNotUse.class) @RequirePOST public void doRun(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException { if (!isEnabled() || !(isReplayableSandboxTest())) { throw new AccessDeniedException("not allowed to replay"); // AccessDeniedException2 requires us to look up the specific Permission } JSONObject form = req.getSubmittedForm(); // Copy originalLoadedScripts, replacing values with those from the form wherever defined. Map<String,String> replacementLoadedScripts = new HashMap<String,String>(); for (Map.Entry<String,String> entry : getOriginalLoadedScripts().entrySet()) { // optString since you might be replaying a running build, which might have loaded a script after the page load but before submission. replacementLoadedScripts.put(entry.getKey(), form.optString(entry.getKey().replace('.', '_'), entry.getValue())); } if (run(form.getString("mainScript"), replacementLoadedScripts) == null) { throw HttpResponses.error(SC_CONFLICT, new IOException(run.getParent().getFullName() + " is not buildable")); } rsp.sendRedirect("../.."); // back to WorkflowJob; new build might not start instantly so cannot redirect to it }
/** * Serves a single jacoco.exec file that merges all that have been recorded. * @return HTTP response serving a single jacoco.exec file, or error 404 if nothing has been recorded. * @throws IOException if any I/O error occurs */ @WebMethod(name="jacoco.exec") public HttpResponse doJacocoExec() throws IOException { final List<File> files = action.getJacocoReport().getExecFiles(); switch (files.size()) { case 0: return HttpResponses.error(404, "No jacoco.exec file recorded"); case 1: return HttpResponses.staticResource(files.get(0)); default: // TODO: perhaps we want to cache the merged result? return new HttpResponse() { public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException { ExecFileLoader loader = new ExecFileLoader(); for (File exec : files) { loader.load(exec); } rsp.setContentType("application/octet-stream"); final ExecutionDataWriter dataWriter = new ExecutionDataWriter(rsp.getOutputStream()); loader.getSessionInfoStore().accept(dataWriter); loader.getExecutionDataStore().accept(dataWriter); } }; } }
new Object[]{request.getMethod(), origin}); return HttpResponses .error(HttpServletResponse.SC_BAD_REQUEST, "Only POST requests are supported, this was a " + request.getMethod() + " request"); new Object[]{request.getContentType(), origin}); return HttpResponses .error(HttpServletResponse.SC_BAD_REQUEST, "Only application/json content is supported, this was " + request.getContentType()); LOGGER.log(Level.FINE, "Received request without X-Gitea-Event header from {1}", new Object[]{request.getContentType(), origin}); return HttpResponses.error(HttpServletResponse.SC_BAD_REQUEST, "Expecting a Gitea event, missing expected X-Gitea-Event header");
@Override @RequirePOST public HttpResponse doBuild(StaplerRequest req, @AncestorInPath BuildPipelineView owner) throws IOException { final AbstractProject<?, ?> p = getFirstJob(owner); if (p == null) { return HttpResponses.error(StaplerResponse.SC_BAD_REQUEST, "No such project: " + getFirstJob()); } return new HttpResponse() { @Override public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException { rsp.sendRedirect(".."); rsp.setStatus(200); try { p.doBuild(req, rsp, new TimeDuration(0)); } catch (IllegalStateException e) { ; // Ignore because sendRedirect(String) gets called twice. We do not want to hit the top // level of the project but instead we want to be redirected back 1 directory. } } }; }
@Restricted(DoNotUse.class) @RequirePOST public void doRebuild(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException { if (!isRebuildEnabled()) { throw new AccessDeniedException("not allowed to replay"); // AccessDeniedException2 requires us to look up the specific Permission } if (run(getOriginalScript(), getOriginalLoadedScripts()) == null) { throw HttpResponses.error(SC_CONFLICT, new IOException(run.getParent().getFullName() + " is not buildable")); } rsp.sendRedirect("../.."); // back to WorkflowJob; new build might not start instantly so cannot redirect to it }
@RequirePOST public HttpResponse doScan(StaplerRequest req) throws IOException, GeneralSecurityException { if(req.hasParameter("background")) { start(false); } else if(req.hasParameter("schedule")) { scanOnBoot.on(); } else if(req.hasParameter("dismiss")) { disable(true); } else throw HttpResponses.error(400,"Invalid request submission: " + req.getParameterMap()); return HttpResponses.redirectViaContextPath("/manage"); }