Hi Tom, I can reproduce this issue using Cloudian, after investigation, I realized that this is a bug in Amazon SDK we have used, based on this thread: http://stackoverflow.com/questions/15473582/amazon-s3-presigned-urls-escape -the-slashes-in-the-key. When generatePresignedUrl is called it takes the entire key and escapes it, and then creates a signature using the escaped key. You cannot use the signature from the escaped key and combine it with the unescaped key in the URL. See the bug code here:
String resourcePath = "/" + ((bucketName != null) ? bucketName + "/" : "") + ((key != null) ? ServiceUtils.urlEncode(key) : "") + ((subResource != null) ? "?" + subResource : ""); We have two options to fix this: 1. Either upgrade Amazon SDK to use 1.4.3 version, someone in that thread claimed that it is fixed in that version, but I haven't checked that. Currently CloudStack is using 1.3.21. Not sure if this will break CloudStack cloud_bridge. 2. Workaround by creating customized AmazonS3Client to change the internal implementation on this. Thanks -min On 7/2/13 11:31 PM, "Thomas O'Dowd" <tpod...@cloudian.com> wrote: >Excellent. The link is there now. Thank you Min. I verified that bug and >closed it. > >However - now that I can finally click the download link... I ran into >the issue that the link doesn't work on AWS or Cloudian. Please see this >bug for details (latest 4.2 updates included in my test). > > https://issues.apache.org/jira/browse/CLOUDSTACK-3341 > >Tom. > >On Tue, 2013-07-02 at 22:54 +0000, Min Chen wrote: >> Hi Tom, >> I investigated this issue through the db dump you provided in the bug, >> this is an issue with our db view template_view creation script, and it >> has been fixed in resolving >> another bug (https://issues.apache.org/jira/browse/CLOUDSTACK-3314). I >> have verified the fix using your db dump on my local setup. Please check >> out latest 4.2 or master code to try again. >> >> Thanks >> -min >> >> On 7/2/13 2:18 PM, "Min Chen" <min.c...@citrix.com> wrote: >> >> >Tom, this seems like an issue with entry stored in our DB. I will take >>a >> >look at this bug and update you. Just to clarify, this symptom only >> >happens when you register these templates to Amazon S3, not for >>Cloudian >> >or RiakCS S3, right? >> > >> >Thanks >> >-min >> > >> >On 7/1/13 7:27 PM, "Thomas O'Dowd" <tpod...@cloudian.com> wrote: >> > >> >>Yes thanks Jessica. I re-opened the bug again. I know its not a gui >> >>problem per-say in that the template is not ready to show the download >> >>link. However, it never becomes ready is the actual problem. What sets >> >>the "isready" property to true? As far as I can see, the objects in >>the >> >>S3 stores (AWS or Cloudian) are complete and from my perspective >>"ready" >> >>to download/use. It sounds like a bug when registering the template. >> >> >> >>Tom. >> >> >> >>On Mon, 2013-07-01 at 18:54 +0000, Jessica Wang wrote: >> >>> Thomas, >> >>> >> >>> I checked the data you provided. >> >>> >> >>> The reason that the 2 templates("MyTiny", "AnotherTiny") have no >> >>>download button is because they are not ready >> >>> (i.e. their "isready" property is false). >> >>> >> >>> Download button is only available when "isready" property is true. >> >>> >> >>> Jessica >> >>> >> >>> -----Original Message----- >> >>> From: Thomas O'Dowd [mailto:tpod...@cloudian.com] >> >>> Sent: Thursday, June 27, 2013 8:04 PM >> >>> To: Min Chen >> >>> Cc: dev@cloudstack.apache.org; Jessica Wang >> >>> Subject: Re: Query String Request Authentication(QSRA) support by S3 >> >>>providers >> >>> >> >>> Hi Min/Jessica, >> >>> >> >>> I attached an image to that issue to show what what my browser is >> >>> showing. >> >>> >> >>> https://issues.apache.org/jira/browse/CLOUDSTACK-3220 >> >>> >> >>> Tom. >> >>> >> >>> On Fri, 2013-06-28 at 09:45 +0900, Thomas O'Dowd wrote: >> >>> > Hi Min, >> >>> > >> >>> > Yes. I'll try it again today to check again but when I added >>Amazon >> >>>S3 >> >>> > as the S3 secondary storage and uploaded a template, I was not >>shown >> >>>the >> >>> > "download template" link. However - for Cloudian S3, I am shown >>it so >> >>> > I'm wondering why. >> >>> > >> >>> > Tom. >> >>> > >> >>> > On Fri, 2013-06-28 at 00:26 +0000, Min Chen wrote: >> >>> > > Hi Tom, >> >>> > > >> >>> > > Are you saying that you cannot see a Download Template button >>from >> >>>UI >> >>> > > when Amazon S3 is added as secondary storage? I only tested with >> >>>RiakCS >> >>> > > and Cloudian, so didn't see this issue. But I am CC Jessica her >>to >> >>>confirm >> >>> > > what special handling is done in UI to enable/disable a button >>from >> >>>UI. >> >>> > > >> >>> > > Thanks >> >>> > > -min >> >>> > > >> >>> > > On 6/27/13 5:23 PM, "Thomas O'Dowd" <tpod...@cloudian.com> >>wrote: >> >>> > > >> >>> > > >Hi Min, >> >>> > > > >> >>> > > >Can you check this bug? I'm trying to test this feature for >>Amazon >> >>>but >> >>> > > >having no luck getting the Download template link/button to >> >>>appear. >> >>> > > > >> >>> > > >https://issues.apache.org/jira/browse/CLOUDSTACK-3220 >> >>> > > > >> >>> > > >Thanks, >> >>> > > > >> >>> > > >Tom. >> >>> > > > >> >>> > > >On Fri, 2013-06-21 at 17:21 +0000, Min Chen wrote: >> >>> > > >> John, >> >>> > > >> >> >>> > > >> For S3, the api call createEntityExtractUrl is done on >> >>>management >> >>> > > >>server >> >>> > > >> side; while for NFS secondary storage, if the implementation >>of >> >>> > > >> createEntityExtractUrl will involve some code be executed in >> >>>ssvm to >> >>> > > >>copy >> >>> > > >> template from the install location to a public accessible web >> >>>server >> >>> > > >> location. >> >>> > > >> I don't quite understand some of your comments below. This >>API >> >>>is not >> >>> > > >> used to write any information to S3 bucket/directory. This is >> >>>used for >> >>> > > >> object already existed on S3, and we just provide a URL for >>user >> >>>to >> >>> > > >> download a template from S3, just like how Amazon provided >>user >> >>>a way to >> >>> > > >> user to extract a S3 object through generatePresignedUrl. We >>can >> >>>discuss >> >>> > > >> more on this on collaboration conference. >> >>> > > >> >> >>> > > >> Thanks >> >>> > > >> -min >> >>> > > >> >> >>> > > >> >> >>> > > >> >> >>> > > >> On 6/21/13 7:25 AM, "John Burwell" <jburw...@basho.com> >>wrote: >> >>> > > >> >> >>> > > >> >Min, >> >>> > > >> > >> >>> > > >> >(I apologize for my belated reply -- I lost track of this >>draft >> >>>in the >> >>> > > >> >chaos of the last couple of days.) >> >>> > > >> > >> >>> > > >> >Upon further review, I think I feel into the confusion >>between >> >>> > > >>management >> >>> > > >> >server and ssvm. This code is executing on the management >> >>>server side, >> >>> > > >> >correct? Based on my "corrected" understanding is correct, >>I >> >>>would >> >>> > > >>like >> >>> > > >> >to amend my thoughts. Namely, I would like to see the >>driver >> >>> > > >>operations >> >>> > > >> >pushed out to the SSVM where we can use the stream. As I >>think >> >>>about >> >>> > > >>it, >> >>> > > >> >the management server should not need to interact with the >> >>>driver. >> >>> > > >> >Simply yard up the DataStore attributes + details map and >>other >> >>>extract >> >>> > > >> >parameters, and send them to the SSVM. Using this >>information, >> >>>the S3 >> >>> > > >> >driver could open a stream to write the template out to the >> >>> > > >> >bucket/directory. I recognize it changes the protocol >>between >> >>>the >> >>> > > >> >management server and SSVM, but it simply both sides of the >> >>>operation >> >>> > > >>by >> >>> > > >> >allowing the DataStore information to be treated opaquely >>until >> >>>it is >> >>> > > >> >consumed by the driver to execute the write operation. I >>also >> >>> > > >>recognize >> >>> > > >> >that we may a little late in the cycle to address it for >>4.2, >> >>>and it >> >>> > > >>may >> >>> > > >> >need to be part of the 4.3 enhancements. >> >>> > > >> > >> >>> > > >> >Thanks, >> >>> > > >> >-John >> >>> > > >> > >> >>> > > >> >On Jun 18, 2013, at 3:55 PM, Min Chen <min.c...@citrix.com> >> >>>wrote: >> >>> > > >> > >> >>> > > >> >> John, >> >>> > > >> >> In that case, how do we keep backward compatibility of >> >>> > > >>extractTemplate >> >>> > > >> >> api, which requires a URL in the response? >> >>> > > >> >> >> >>> > > >> >> Thanks >> >>> > > >> >> -min >> >>> > > >> >> >> >>> > > >> >> On 6/18/13 11:53 AM, "John Burwell" <jburw...@basho.com> >> >>>wrote: >> >>> > > >> >> >> >>> > > >> >>> Min, >> >>> > > >> >>> >> >>> > > >> >>> Looking through the code, I think we can simplify driver >> >>>operation >> >>> > > >>and >> >>> > > >> >>> increase robustness by changing >> >>> > > >> >>>ImageStoreDriver#createEntityExtractUrl() >> >>> > > >> >>> : String to ImageStoreDriver#readEntity(Š) : InputStream. >> >>>My first >> >>> > > >> >>> concern with the current implementation is that it >> >>>circumvents any >> >>> > > >> >>> connection pooling/resource management underlying client >> >>>libraries >> >>> > > >> >>> provide. I/O streams provide a higher-level abstraction >> >>>that allows >> >>> > > >> >>> drivers to provide the orchestration components with >>actual >> >>> > > >>resources >> >>> > > >> >>> rather String references. Second, the current interface >> >>>seems to >> >>> > > >> >>>appears >> >>> > > >> >>> to assume that an http/https URL will be returned. With >>I/O >> >>> > > >>streams, >> >>> > > >> >>>we >> >>> > > >> >>> can support any client library capable of using the >>standard >> >>>I/O >> >>> > > >> >>> framework -- enabling us to support other protocols for >> >>>downloading >> >>> > > >> >>> templates in the future (e.g. RBD, local filesystem, NBD, >> >>>etc). >> >>> > > >> >>> >> >>> > > >> >>> Thanks, >> >>> > > >> >>> -John >> >>> > > >> >>> >> >>> > > >> >>> On Jun 18, 2013, at 1:11 PM, Min Chen >><min.c...@citrix.com> >> >>>wrote: >> >>> > > >> >>> >> >>> > > >> >>>> A new version of using generatePresignedUrl in >> >>> > > >>S3ImageStoreDriverImpl >> >>> > > >> >>>>is >> >>> > > >> >>>> checked into object_store. >> >>> > > >> >>>> >> >>> > > >> >>>> THanks >> >>> > > >> >>>> -min >> >>> > > >> >>>> >> >>> > > >> >>>> On 6/18/13 8:29 AM, "Min Chen" <min.c...@citrix.com> >>wrote: >> >>> > > >> >>>> >> >>> > > >> >>>>> Yes, current code is in >> >>> > > >> >>>>>S3ImageStoreDriverImpl.createEntityExtractUrl, >> >>> > > >> >>>>> which has a security issue mentioned in >>CLOUDSTACK-3030. I >> >>>am >> >>> > > >>going >> >>> > > >> >>>>>to >> >>> > > >> >>>>> change it to use generatePresignedUrl api from AWS S3 >>api. >> >>> > > >> >>>>> >> >>> > > >> >>>>> Thanks >> >>> > > >> >>>>> -min >> >>> > > >> >>>>> >> >>> > > >> >>>>> From: John Burwell >> >>><jburw...@basho.com<mailto:jburw...@basho.com>> >> >>> > > >> >>>>> Date: Tuesday, June 18, 2013 8:07 AM >> >>> > > >> >>>>> To: Min Chen >> >>><min.c...@citrix.com<mailto:min.c...@citrix.com>> >> >>> > > >> >>>>> Cc: Thomas O'Dowd >> >>> > > >> >>>>><tpod...@cloudian.com<mailto:tpod...@cloudian.com>>, >> >>> > > >> >>>>> >> >>>"dev@cloudstack.apache.org<mailto:dev@cloudstack.apache.org>" >> >>> > > >> >>>>> >> >>><dev@cloudstack.apache.org<mailto:dev@cloudstack.apache.org>> >> >>> > > >> >>>>> Subject: Re: Query String Request Authentication(QSRA) >> >>>support by >> >>> > > >>S3 >> >>> > > >> >>>>> providers >> >>> > > >> >>>>> >> >>> > > >> >>>>> Min, >> >>> > > >> >>>>> >> >>> > > >> >>>>> Is the code checked into the object_store branch? If >>so, >> >>>which >> >>> > > >>lines >> >>> > > >> >>>>> in >> >>> > > >> >>>>> S3TemplateDownloader? >> >>> > > >> >>>>> >> >>> > > >> >>>>> Thanks, >> >>> > > >> >>>>> -John >> >>> > > >> >>>>> >> >>> > > >> >>>>> On Jun 18, 2013, at 12:39 AM, Min Chen >> >>> > > >> >>>>> <min.c...@citrix.com<mailto:min.c...@citrix.com>> >>wrote: >> >>> > > >> >>>>> >> >>> > > >> >>>>> Hi John, >> >>> > > >> >>>>> >> >>> > > >> >>>>> This is regarding extractTemplate api, where for >> >>>extractable >> >>> > > >> >>>>>template, >> >>> > > >> >>>>> users can click "Download Template" button from UI to >>get >> >>>a http >> >>> > > >>url >> >>> > > >> >>>>>to >> >>> > > >> >>>>> download the template already stored at S3 without >> >>>providing S3 >> >>> > > >> >>>>> credentials. In 4.1, we don't have this issue, since >>the >> >>>URL >> >>> > > >>returned >> >>> > > >> >>>>> is >> >>> > > >> >>>>> the public web server location hosted in ssvm, and in >>4.2, >> >>>we are >> >>> > > >> >>>>> returning URL pointing to s3 object. Without setting >>ACL >> >>>to the S3 >> >>> > > >> >>>>> object, user cannot directly click the URL returned >>from >> >>> > > >> >>>>> extractTemplate >> >>> > > >> >>>>> api to download the template without providing >> >>>credentials. By >> >>> > > >> >>>>>reading >> >>> > > >> >>>>> the AWS SDK doc today, I ran across the following API >>that >> >>>I may >> >>> > > >>be >> >>> > > >> >>>>> able >> >>> > > >> >>>>> to use for this purpose: >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >> >>> > > >> >>>>>>>>>>>>URL<http://java.sun.com/j2se/1.5.0/docs/api/java/net/URL.html?i >>>>>>>>>>>>s- >> >>>>>>>>>>e >> >>>>>>>>>>xt >> >>> > > >>>>>>>er >> >>> > > >> >>>>>na >> >>> > > >> >>>>> l= >> >>> > > >> >>>>> true> >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >> >>> > > >> >>>>>>>>>>>>generatePresignedUrl<http://docs.aws.amazon.com/AWSJavaSDK/late >>>>>>>>>>>>st >> >>>>>>>>>>/ >> >>>>>>>>>>ja >> >>> > > >>>>>>>va >> >>> > > >> >>>>>do >> >>> > > >> >>>>> c/ >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >> >>> > > >> >>>>>>>>>>>>com/amazonaws/services/s3/AmazonS3Client.html#generatePresigned >>>>>>>>>>>>Ur >> >>>>>>>>>>l >> >>>>>>>>>>%2 >> >>> > > >>>>>>>8j >> >>> > > >> >>>>>av >> >>> > > >> >>>>> a. >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >> >>> > > >> >>>>>>>>>>>>lang.String,%20java.lang.String,%20java.util.Date,%20com.amazon >>>>>>>>>>>>aw >> >>>>>>>>>>s >> >>>>>>>>>>.H >> >>> > > >>>>>>>tt >> >>> > > >> >>>>>pM >> >>> > > >> >>>>> et >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >> >>> > > >> >>>>>>>>>>>>hod%29>(String<http://java.sun.com/j2se/1.5.0/docs/api/java/lan >>>>>>>>>>>>g/ >> >>>>>>>>>>S >> >>>>>>>>>>tr >> >>> > > >>>>>>>in >> >>> > > >> >>>>>g. >> >>> > > >> >>>>> ht >> >>> > > >> >>>>> ml?is-external=true> bucketName, >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >> >>> > > >> >>>>>>>>>>>>String<http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String >>>>>>>>>>>>.h >> >>>>>>>>>>t >> >>>>>>>>>>ml >> >>> > > >>>>>>>?i >> >>> > > >> >>>>>s- >> >>> > > >> >>>>> ex >> >>> > > >> >>>>> ternal=true> key, >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >> >>> > > >> >>>>>>>>>>>>Date<http://java.sun.com/j2se/1.5.0/docs/api/java/util/Date.htm >>>>>>>>>>>>l? >> >>>>>>>>>>i >> >>>>>>>>>>s- >> >>> > > >>>>>>>ex >> >>> > > >> >>>>>te >> >>> > > >> >>>>> rn >> >>> > > >> >>>>> al=true> expiration, >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >> >>> > > >> >>>>>>>>>>>>HttpMethod<http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc >>>>>>>>>>>>/c >> >>>>>>>>>>o >> >>>>>>>>>>m/ >> >>> > > >>>>>>>am >> >>> > > >> >>>>>az >> >>> > > >> >>>>> on >> >>> > > >> >>>>> aws/HttpMethod.html> method) >> >>> > > >> >>>>> Returns a pre-signed URL for accessing an >>Amazon >> >>>S3 >> >>> > > >>resource. >> >>> > > >> >>>>> >> >>> > > >> >>>>> This is along the same line as QSRA mentioned by Tom, >>by >> >>>wrapped >> >>> > > >>in >> >>> > > >> >>>>> AmazonS3Client for easy consumption. By using this >>method, >> >>>I think >> >>> > > >> >>>>> that I >> >>> > > >> >>>>> don't need to change ACL of S3 object to open a >>security >> >>>hole. >> >>> > > >> >>>>> >> >>> > > >> >>>>> Thanks >> >>> > > >> >>>>> -min >> >>> > > >> >>>>> >> >>> > > >> >>>>> From: John Burwell >> >>><jburw...@basho.com<mailto:jburw...@basho.com>> >> >>> > > >> >>>>> Date: Monday, June 17, 2013 7:38 PM >> >>> > > >> >>>>> To: Min Chen >> >>><min.c...@citrix.com<mailto:min.c...@citrix.com>> >> >>> > > >> >>>>> Cc: Thomas O'Dowd >> >>> > > >> >>>>><tpod...@cloudian.com<mailto:tpod...@cloudian.com>>, >> >>> > > >> >>>>> >> >>>"dev@cloudstack.apache.org<mailto:dev@cloudstack.apache.org>" >> >>> > > >> >>>>> >> >>><dev@cloudstack.apache.org<mailto:dev@cloudstack.apache.org>> >> >>> > > >> >>>>> Subject: Re: Query String Request Authentication(QSRA) >> >>>support by >> >>> > > >>S3 >> >>> > > >> >>>>> providers >> >>> > > >> >>>>> >> >>> > > >> >>>>> Min, >> >>> > > >> >>>>> >> >>> > > >> >>>>> Why are we mucking with ACLs at all? The best security >> >>>practice >> >>> > > >> >>>>>would >> >>> > > >> >>>>> be >> >>> > > >> >>>>> to create a bucket for CloudStack's use and assign it a >> >>>dedicated >> >>> > > >> >>>>> access >> >>> > > >> >>>>> key and secret key pair with read/write access only to >> >>>that >> >>> > > >>bucket. >> >>> > > >> >>>>> Requiring an administrative account to an object store >> >>>opens an >> >>> > > >> >>>>> unnecessarily large attack surface. Therefore, as >> >>>implemented in >> >>> > > >> >>>>>4.1, >> >>> > > >> >>>>> we >> >>> > > >> >>>>> should defer bucket creation, ACL assignment, and >> >>>credential >> >>> > > >>creation >> >>> > > >> >>>>> to >> >>> > > >> >>>>> the administrator/operator. >> >>> > > >> >>>>> >> >>> > > >> >>>>> Thanks, >> >>> > > >> >>>>> -John >> >>> > > >> >>>>> >> >>> > > >> >>>>> On Jun 17, 2013, at 1:15 PM, Min Chen >> >>> > > >> >>>>> <min.c...@citrix.com<mailto:min.c...@citrix.com>> >>wrote: >> >>> > > >> >>>>> >> >>> > > >> >>>>> Tom filed a very good bug for ACL setting change on S3 >> >>>object when >> >>> > > >> >>>>> users >> >>> > > >> >>>>> issue extractTemplate API >> >>> > > >> >>>>> >>(https://issues.apache.org/jira/browse/CLOUDSTACK-3030), >> >>>and his >> >>> > > >> >>>>> recommendation of using Query String Request >> >>>Authentication (QSRA) >> >>> > > >> >>>>> alternative sounds like a right approach to fix this >>bug. >> >>>Before >> >>> > > >> >>>>> implementing it, I would like to confirm if QSRA >>should be >> >>> > > >>supported >> >>> > > >> >>>>>by >> >>> > > >> >>>>> all S3 providers if they claim that they are AWS s3 >> >>>compatible. If >> >>> > > >> >>>>>so, >> >>> > > >> >>>>> we >> >>> > > >> >>>>> will make this assumption in our code. Based on Tom, >> >>>Cloudian is >> >>> > > >> >>>>> supporting it. How about RiakCS, John? >> >>> > > >> >>>>> >> >>> > > >> >>>>> Thanks >> >>> > > >> >>>>> -min >> >>> > > >> >>>>> >> >>> > > >> >>>>> >> >>> > > >> >>>> >> >>> > > >> >>> >> >>> > > >> >> >> >>> > > >> > >> >>> > > >> >> >>> > > > >> >>> > > >-- >> >>> > > >Cloudian KK - http://www.cloudian.com/get-started.html >> >>> > > >Fancy 100TB of full featured S3 Storage? >> >>> > > >Checkout the Cloudian(R) Community Edition! >> >>> > > > >> >>> > > >> >>> > >> >>> >> >> >> >>-- >> >>Cloudian KK - http://www.cloudian.com/get-started.html >> >>Fancy 100TB of full featured S3 Storage? >> >>Checkout the Cloudian(R) Community Edition! >> >> >> > >> > >-- >Cloudian KK - http://www.cloudian.com/get-started.html >Fancy 100TB of full featured S3 Storage? >Checkout the Cloudian(R) Community Edition! >