package org.xmlsh.aws; import java.io.IOException; import java.io.OutputStream; import java.net.URL; import java.util.Date; import java.util.List; import javax.xml.stream.XMLStreamException; import org.xmlsh.aws.util.AWSS3Command; import org.xmlsh.aws.util.S3Path; import org.xmlsh.core.InvalidArgumentException; import org.xmlsh.core.Options; import org.xmlsh.core.UnexpectedException; import org.xmlsh.core.XValue; import org.xmlsh.core.io.OutputPort; import org.xmlsh.util.StringPair; import org.xmlsh.util.Util; import com.amazonaws.HttpMethod; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; import com.amazonaws.services.s3.model.ResponseHeaderOverrides; import com.amazonaws.services.s3.model.SSEAlgorithm; import com.amazonaws.services.s3.model.SSECustomerKey; import net.sf.saxon.s9api.SaxonApiException; import net.sf.saxon.trans.XPathException; public class s3GeneratePresignedUrl extends AWSS3Command { private OutputStream mOutput; /** * @param args * @throws IOException */ @Override public int run(List<XValue> args) throws Exception { Options opts = getOptions( "expiration:,key:,sse-algorithm:,sse-customer-key:,sse-customer-key-algorithm:,conent-type:,content-md5:,kms=kms-cmk-id:,http-method:,response-header:+,zero-byte"); parseOptions(opts, args); args = opts.getRemainingArgs(); setSerializeOpts(this.getSerializeOpts(opts)); try { getS3Client(opts); } catch (UnexpectedException e) { usage(e.getLocalizedMessage()); return 1; } int ret = 0; if(args.size() != 1) { usage(); return 1; } OutputPort outp = this.getStdout(); mOutput = outp.asOutputStream(getSerializeOpts()); S3Path path = new S3Path(args.get(0).toString()); ret = generate(path, opts); return ret; } private int generate(S3Path path, Options opts) throws IOException, XMLStreamException, InvalidArgumentException, SaxonApiException, XPathException { GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest( path.getBucket(), path.getKey()); if(opts.hasOpt("expiration")) request.setExpiration(parseDate(opts.getOptValue("expiration"))); if(opts.hasOpt("http-method")) request.setMethod(parseMethod(opts.getOptStringRequired("http-method"))); if(opts.hasOpt("key")) request.setKey(opts.getOptStringRequired("key")); if(opts.hasOpt("sse-algorithm")) request.setSSEAlgorithm( SSEAlgorithm.fromString(opts.getOptStringRequired("sse-algorithm"))); if(opts.hasOpt("sse-customer-key")) request.setSSECustomerKey( new SSECustomerKey(opts.getOptStringRequired("sse-customer-key"))); if(opts.hasOpt("sse-customer-key-algorithm")) request.setSSECustomerKeyAlgorithm(SSEAlgorithm .fromString(opts.getOptStringRequired("sse-customer-key-algorithm"))); if(opts.hasOpt("content-type")) request.setContentType(opts.getOptStringRequired("content-type")); if(opts.hasOpt("content-md5")) request.setContentType(opts.getOptStringRequired("content-md5")); if(opts.hasOpt("kms")) request.setKmsCmkId(opts.getOptStringRequired("kms")); if(opts.hasOpt("zero-byte")) request.setZeroByteContent(true); request.setResponseHeaders( parseResponseHeaders(opts.getOptValues("response-header"))); traceCall("generatePresignedUrl"); URL url = getAWSClient().generatePresignedUrl(request); mOutput.write( url.toString().getBytes(getSerializeOpts().getOutputTextEncoding())); mOutput.write(Util.getNewlineBytes(getSerializeOpts())); return 0; } private ResponseHeaderOverrides parseResponseHeaders(List<XValue> optValues) { if(optValues == null || optValues.isEmpty()) return null; ResponseHeaderOverrides headers = new ResponseHeaderOverrides(); for(XValue xv : optValues) { StringPair p = new StringPair(xv, '='); assert (p.hasLeft()); if(p.hasLeft()) { switch(p.getLeft()){ case ResponseHeaderOverrides.RESPONSE_HEADER_CONTENT_TYPE: headers.setContentType(p.getRight()); break; case ResponseHeaderOverrides.RESPONSE_HEADER_CONTENT_LANGUAGE: headers.setContentLanguage(p.getRight()); break; case ResponseHeaderOverrides.RESPONSE_HEADER_EXPIRES: headers.setExpires(p.getRight()); break; case ResponseHeaderOverrides.RESPONSE_HEADER_CACHE_CONTROL: headers.setCacheControl(p.getRight()); break; case ResponseHeaderOverrides.RESPONSE_HEADER_CONTENT_DISPOSITION: headers.setContentDisposition(p.getRight()); break; case ResponseHeaderOverrides.RESPONSE_HEADER_CONTENT_ENCODING: headers.setContentEncoding(p.getRight()); } } } return headers; } private HttpMethod parseMethod(String method) { return HttpMethod.valueOf(method); } private Date parseDate(XValue value) throws InvalidArgumentException { return (Date) value.convert(Date.class); } }