backes Posted January 31, 2015 Share Posted January 31, 2015 DownloadGuard for ProcessWire About DownloadGuard This simple module was developed to give clients or users a unique download link to access file downloads you offer them. Installation & Usage 1. Place the module files in /site/modules/DownloadGuard/ 2. In your admin, click Modules > Check for new modules 3. Click "install" for __DownloadGuard__ 4. In the module Settings you can edit the default count for max downloads and the time, the download should be active. 5. During the installation a Page „Downloads“ is created in your PageTree. You can create children under this Page to make Downloads. In the children page you get your unique hash and the ability to upload your file. Todo - Let the system create the download links, for easy copy and paste. BitBucket Repository: https://bitbucket.org/m_knorr/downloadguard/overview Direct Download: https://bitbucket.org/m_knorr/downloadguard/get/master.zip 9 Link to comment Share on other sites More sharing options...
backes Posted January 31, 2015 Author Share Posted January 31, 2015 Hey Guys, this is my first module and I hope, someone else has a use for it. It generates a .htaccess file at the assets/files/$id folder when a file is uploaded and generates a unique hash for each download. This is the content of the created htaccess with the changed filename. <Files "$yourfilename"> Order Allow,Deny Deny from all </Files> Some styling and changed etc. can be done in the installed dg_ template files. I changed the mechanics a bit, so i think that the dg_download.php could be deleted for the next release. You can access all Downloads you created through your unique file id. For example: http://example.com/downloads/hash/6ffbb022729a7e0f41cf74c28092731454c953655a884/ change the part behind the /hash/ to your unique file hash. If someone has some additions or somethings isn't working please reply. I'm looking forward to your feedback. I need it, because it's my first module! Best regard, Martin 1 Link to comment Share on other sites More sharing options...
adrian Posted January 31, 2015 Share Posted January 31, 2015 Hi Martin, Thanks very much for this - looks very useful! Just having a look through it now. The first thing I noticed is the htaccess rules. You will need to add support for apache 2.4+ which means that: order allow,deny deny from all no longer works. Instead you need: Require all denied but of course you need to support older versions, so you will need to detect the apache version: http://php.net/manual/en/function.apache-get-version.php As for testing it, I am currently getting a 404 for this: http://pwtest.dev/downloads/hash/aa3033f10280fc120dbec5f3877dbcfa54ccd4d1ba5e7 I checked this link: http://pwtest.dev/downloads/test/aa3033f10280fc120dbec5f3877dbcfa54ccd4d1ba5e7 where "test" is the name of the child page under Downloads that I created. This wants to work, but first I needed to change this line: $max->save(); to: $max->save("dg_downloads"); because I was getting a "Call $page->setOutputFormatting(false) before getting/setting values that will be modified and saved" error, although not actually sure since you were already doing this. Anyway, saving just the field works fine! 2 Link to comment Share on other sites More sharing options...
adrian Posted January 31, 2015 Share Posted January 31, 2015 More comments for you! When uninstalling, I am not sure about deleting the Downloads page tree and the required templates - this could result in a LOT of data loss with a simple click of a button. kongondo has struggled with this and his Blog module and went with a separate, optional, cleanup script before uninstall. I think you need to do something along these lines, or at least, don't remove these things. Maybe you should limit the uninstall to deleting all the .htaccess files and the module files, but nothing else? Also, looks like there is an error with the install routine and making use of the new PW "Which URL segments do you want to allow?" option. Looks like you are trying to set it with this line: $t->urlSegments = array('regex:^hash/[0-9a-zA-Z]+$'); but you have that on the dg_downloads template, rather than the dg_download one, which is where it is needed. Hope that helps! EDIT: Now I see what is going on with that non-working "hash" url - that would have worked, but you didn't have urlsegments enabled for the dg_downloads template, even though you had tried to set the regex rule there. Anyway, not sure which way you want to go, but at the moment, it is half and half and therefore not working Link to comment Share on other sites More sharing options...
backes Posted January 31, 2015 Author Share Posted January 31, 2015 Hey Adrian, thanks for you responses... The hash / 404 problem occurred because I forgot to update the php templates in the modules folder. I just made my changes in the templates folder... also the regex for templates is now in the right place in dg_downloads. I don't want the access of the dg_download. Everything has to run against dg_downloads with the hash segment and the unique hash. The Apache check is built in now, I hope it works, because I have only a Apache 2.2 currently running on my machine. Thanks for this hint! And the $max->save should work now too. Again, thanks for this one! Now theres a new master version in the repository. The problem with uninstalling is definitely something to care about! I think in the first step, I will go with the approach of deleting just the htaccess files and the module files without something else. Thanks for your helping eyes! Martin Link to comment Share on other sites More sharing options...
adrian Posted January 31, 2015 Share Posted January 31, 2015 OK, the apache check is working - I am getting the correct line in the htaccess file, but there is still a problem with the download URL. You have the URL segments settings correct, but the dg_download.php file is still the one with: $hash = $input->urlSegment1; echo $modules->get('DownloadGuard')->validateDownload($hash); That now needs to be in the dg_downloads.php file and changed to grab the second URL segment, since the first one would now be "hash". Also, doing that will result in all the downloaded files being named "downloads.ext" rather than the name of their child page. Link to comment Share on other sites More sharing options...
backes Posted January 31, 2015 Author Share Posted January 31, 2015 I did the template change. But I forgot to deinstall the php templates in the site/templates folder. So currently you have to update them manually or just delete them before you install the module. Because it checks if there are already these files. And if so, it wont copy them over. And you are right, I have to look into the naming of the downloaded files to make it a better UX for the enduser. Best regards. 1 Link to comment Share on other sites More sharing options...
adrian Posted January 31, 2015 Share Posted January 31, 2015 I did the template change. But I forgot to deinstall the php templates in the site/templates folder. So currently you have to update them manually or just delete them before you install the module. Because it checks if there are already these files. And if so, it wont copy them over. Best regards. Ok, I see - I manually deleted those and reinstalled and it works now. I still don't really like the downloads.ext filename, but maybe that's a personal thing. Also, the dg_download template still has URL Segments enabled, but they aren't needed. Doesn't really matter since that template throws a 404 anyway, but would be cleaner to not enable it. Thanks again for putting this together! PS Not everyone has their templates folder writeable by PHP, so you might want to add a note and also handle any permission errors if those template files can't be added/removed. 1 Link to comment Share on other sites More sharing options...
backes Posted February 1, 2015 Author Share Posted February 1, 2015 Hello Adrian, thanks for your hints. I hope I fixed the possible errors with writeaccess. The filename is now the name of the dg_download page. It was something, that bothered me too! The uninstall method is currently removed, so no dataloss will happen on uninstall. 1 Link to comment Share on other sites More sharing options...
Pete Posted February 2, 2015 Share Posted February 2, 2015 Hi there If you could add your module to the Modules Directory I can add the relevant badge to your profile in the Developer Directory 1 Link to comment Share on other sites More sharing options...
backes Posted February 3, 2015 Author Share Posted February 3, 2015 Hey Pete, thanks for your hint! I added the module to the repository! Best regards, Martin 1 Link to comment Share on other sites More sharing options...
peterpp Posted February 4, 2015 Share Posted February 4, 2015 Hi, I am getting error while uploading a pdf. I tried with several pdfs. Session: Could not create .htaccess for quick_start_guide_for_woocommerce_with_wootax.pdf at the needed location. Downloads page is created . When creating child page i am getting error Session: Could not create .htaccess for at the needed location.. Settings of module are defaults, nothing is changed. Plz help me. Regards, Peterpp Link to comment Share on other sites More sharing options...
backes Posted February 4, 2015 Author Share Posted February 4, 2015 Hey Peterpp, is your assets folder writable? Do other uploads works without any concerns? I'll look into this to find a solution! Regards, Martin Link to comment Share on other sites More sharing options...
peterpp Posted February 4, 2015 Share Posted February 4, 2015 Hi Martin, Other uploads are working fine. assets folder is writable. Regards, Peterpp Link to comment Share on other sites More sharing options...
backes Posted February 9, 2015 Author Share Posted February 9, 2015 Hey Peterpp, can you tell me you current system environment? And the folder rights you set up? Currently I can't reproduce the error you mentioned before. Thanks, Martin Link to comment Share on other sites More sharing options...
peterpp Posted February 10, 2015 Share Posted February 10, 2015 Hi Martin, Below are my system details: Apache/2.4.7 (Ubuntu) PHP Version 5.5.9-1ubuntu4 processwire 2.5.3 folder rights i set to 777. I dont think folder issue is their. Because all other pages/attachments are doing well. When i try to save a page under Downloads page, i am getting "session: Could not create .htaccess for at the needed location." error. when i am trying to upload a pdf to this page, i am getting "Session: Could not create .htaccess for filename.pdf at the needed location." error. Regards, Peterpp Link to comment Share on other sites More sharing options...
peterpp Posted February 10, 2015 Share Posted February 10, 2015 Hey Peterpp, can you tell me you current system environment? And the folder rights you set up? Currently I can't reproduce the error you mentioned before. Thanks, Martin Hi Martin, Below are my system details: Apache/2.4.7 (Ubuntu) PHP Version 5.5.9-1ubuntu4 processwire 2.5.3 folder rights i set to 777. I dont think folder issue is their. Because all other pages/attachments are doing well. When i try to save a page under Downloads page, i am getting "session: Could not create .htaccess for at the needed location." error. when i am trying to upload a pdf to this page, i am getting "Session: Could not create .htaccess for filename.pdf at the needed location." error. Regards, Peterpp Link to comment Share on other sites More sharing options...
backes Posted February 10, 2015 Author Share Posted February 10, 2015 Hello Peterpp, maybe it's a problem with the Apache Version you use. Because I have set up a blank PW2.5.3 with DG on my Apache 2.2 with PHP 5.6, and everything is running fine. I'll try to find a spot, where I can test with a 2.4 Apache. Or maybe, someone's here to help. I'm trying to fix this behaviour as soon as I get my hands on a new Apache! Kind regards, Martin 1 Link to comment Share on other sites More sharing options...
peterpp Posted February 11, 2015 Share Posted February 11, 2015 Hi Martin, Ok...With my config its not working. I will try on your configuration.. Regards, Peterpp Link to comment Share on other sites More sharing options...
Manaus Posted April 19, 2016 Share Posted April 19, 2016 Hello, mine neither works locally, I get a Could not create .htaccess for myfile_xlsx.zip at the needed location. I gave 777 to /assets/ but don't know where the .htaccess file needs to be placed. Config: Pw 2.7.2 Php 5.4.10 Apache 2.2.3 Thanks! Link to comment Share on other sites More sharing options...
BFD Calendar Posted April 20, 2016 Share Posted April 20, 2016 It didn't work on a local server but it works on a live server. The only thing I haven't figured out how or where to find the download links. The 'Downloads' page is hidden because I don't want a list of all the downloads, just links to files I can add into text on a page. Link to comment Share on other sites More sharing options...
Manaus Posted April 20, 2016 Share Posted April 20, 2016 Getting closer.. At line 198 of DownloadGuard.module I added this line: $this->message("{$path}.htaccess"); So I get in the messages this awkward line: /Users/utente/Sites/mysupermegawebsite//mysupermegawebsite/site/assets/files/1079/.htaccess Path is $path = $this->config->paths->root . $this->config->urls->files . $page->id . '/'; But I don't know the proper way to edit it... Thanks! Link to comment Share on other sites More sharing options...
Manaus Posted April 20, 2016 Share Posted April 20, 2016 Solved using $path = $this->config->paths->files . $page->id . '/'; instead of $path = $this->config->paths->root . $this->config->urls->files . $page->id . '/'; Ok. Now how do I code the links to files? ... Using /downloads/{$thepage->dg_downloadhash}/ returns me a 404... Thanks! Link to comment Share on other sites More sharing options...
BFD Calendar Posted April 26, 2016 Share Posted April 26, 2016 Can someone please shed a light on how to get the links for downloading a file? Documentation doesn't mention much and after all that's supposed to be the core business of this module if I'm right. Link to comment Share on other sites More sharing options...
Manaus Posted June 30, 2016 Share Posted June 30, 2016 Basically you have to create download pages under /downloads/, which is created by the plugin, for each file serving. You create them via the admin, or via API. Each /downloads/download/ page allows a file field and creates a unique hash, that you put, when invoking the file download, after the /downloads/hash/ url segment. Like for example /downloads/hash/18297192837oiu etc. Each download page allows for 5 file download, but you can customize the number. You can also customize the expiring time in the plugin settings. Be sure to tweak the plugin code as I mentioned in the post above, at least for me it solved a recurring bug. 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now