Aug 12

Secure download URLs with expiration time

Reading time: 4 – 6 minutes

Requirements

Imagine a HTTP server with those restrictions:

  • only specific files can be downloaded
  • with a limited time (expiration date)
  • an ID allows to trace who download files
  • with minimal maintenance and dependencies (no databases, or things like that)

the base of the solution that I designed is the URL format:

http://URL_HOST/<signature>/<customer_id>/<expire_date>/<path_n_file>
  • signature: is calculated with the next formula, given a “seed”
    • seed = “This is just a random text.”
    • str = customer_id + expire_date + path_n_file
    • signature = encode_base64( hmac_sha1( seed, str))
  • customer_id: just an arbitrary identifier when you want to distinguish who use the URL
  • expire_date: when the generated URL stops working
  • path_n_file: relative path in your private repository and the file to share

Understanding the ideas explained before I think it’s enough to understand what is the goal of the solution. I developed the solution using NGINX and LUA. But the NGINX version used is not the default version is a very patched version called Openresty. This version is specially famous because some important Chinese webs works with that, for instance, Taobao.com

Expiration URL solution Architecture schema

In the above schema there is a master who wants to share a file which is in the internal private repository, but the file has a time restriction and the URL is only for that customer. Then using the command line admin creates a unique URL with desired constrains (expiration date, customer to share and file to share). Next step is send the URL to the customer’s user. When the URL is requested NGINX server evaluates the URL and returns desired file only if the user has a valid URL. It means the URL is not expired, the file already exists, the customer identification is valid and the signature is not modified.

NGINX Configuration

server {
 server_name downloads.local;

 location ~ ^/(?<signature>[^/]+)/(?<customer_id>[^/]+)/(?<expire_date>[^/]+)/(?<path_n_file>.*)$ {
 content_by_lua_file "lua/get_file.lua";
 }

 location / {
 return 403;
 }
}

This is the server part of the NGINX configuration file, the rest of the file can as you want. Understanding this file is really simple, because the “server_name” works as always. Then only locations command are relevant. First “location” is just a regular expression which identifies the relevant variables of the URL and passes them to the LUA script. All other URLs that doesn’t match with the URI pattern fall in path “/” and the response is always “Forbiden” (HTTP 403 code). Then magics happen all in LUA code.

LUA scripts

There are some LUA files required:

  • create_secure_link.lua: creates secure URLs
  • get_file.lua: evaluates URLs and serves content of the required file
  • lib.lua: module developed to reuse code between other lua files
  • sha1.lua: SHA-1 secure hash computation, and HMAC-SHA1 signature computation in Lua (get from https://github.com/kikito/sha.lua)

It’s required to configure “lib.lua” file, at the beginning of the file are three variables to set up:

lib.secret = "This is just a long string to set a seed"
lib.base_url = "http://downloads.local/"
lib.base_dir = "/tmp/downloads/"

Create secure URLs is really simple, take look of the command parameters:

$ ./create_secure_link.lua 

 ./create_secure_link.lua <customer_id> <expiration_date> <relative_path/filename>

Create URLs with expiration date.

 customer_id: any string identifying the customer who wants the URL
 expiration_date: when URL has to expire, format: YYYY-MM-DDTHH:MM
 relative_path/filename: relative path to file to transfer, base path is: /tmp/downloads/

Run example:

$ mkdir -p /tmp/downloads/dir1
$ echo hello > /tmp/downloads/dir1/example1.txt
$ ./create_secure_link.lua acme 2015-08-15T20:30 dir1/example1.txt
http://downloads.local/YjZhNDAzZDY0/acme/2015-08-15T20:30/dir1/example1.txt
$ date
Wed Aug 12 20:27:14 CEST 2015
$ curl http://downloads.local:55080/YjZhNDAzZDY0/acme/2015-08-15T20:30/dir1/example1.txt
hello
$ date
Wed Aug 12 20:31:40 CEST 2015
$ curl http://downloads.local:55080/YjZhNDAzZDY0/acme/2015-08-15T20:30/dir1/example1.txt
Link expired

Small video demostration

Resources

Disclaimer and gratefulness

 

 

Jul 31

15 anys amb el blog online

Reading time: 1 – 2 minutes

Avui dia 31 de juliol fa 15 anys que vaig decidir-me a escriure el meu primer article al blog. Com passa el temps! cada cop que penso que el dia que vaig començar no sabia ni el que era un blog i que l’anomenava “digital diary”. Sovint escric tot dient que tinc l’agenda plena i que no sé d’on treure temps per escriure. Doncs bé, després d’un periode molt i molt llarg de temps on el meu vincle en diversos projectes m’impedia dedicar temps al blog puc dir que tot i tenir una llista de desitjos quasi infinita. Ja no tinc obligacions fortes en projectes fora dels horaris convencionals. Així doncs, en pocs mesos disposaré de temps per gestionar en els meus interessos personals cosa que fins ara no tenia.

15th-anniversary

De moment el meu proposit serà anar publicant alguns dels molts articles que tinc a mig fer i pendents de fer publics. Desitjo que aquest proper any la freqüència de publicacions al blog canviï dràsticament. Creuem els dits perquè pugui mantenir el desig.

Gràcies a tots els fidels seguidors que teniu la paciència d’anar-me seguint.

Jul 13

Conferència Summer Camp Garrotxa 2015: SmartHome usant Arduino, Raspberry PI i més

Reading time: 1 – 2 minutes

Aquest cap de setmana vaig tornar a donar la meva conferència sobre “SmartHome” en aquesta ocasió vaig introduïr la novetat del sistema de feedback basat en “Tasker + Auto-notification”, a més de l’execusió de tasques basades en “crontab”. També he inclòs un petit avanç sobre el nou projecte en el que estic treballant per tal d’integrar les dades del descalcificador dins del OpenHAB usant una webcam i OpenCV per processar les imatges optingudes.

Agraïr al Xavi, Gerardo i la Laura per haver-me donat aquesta oportunitat. Tant el SCG15 com el SAX2015 són events molt familiars a més l’entorn és espectacular. Tot un descobriment del que malgrat tenir referències no havia pogut disfrutar en primera persona.

scg2015

May 09

Reflexions d’aniversari: avui 38

Reading time: 4 – 6 minutes

google-congratulations

En dies com avui sempre aprofito per fer les meves reflexions. Aquests quasi 15 anys que porto escribint el blog alguns cops les he compartit amb vosaltres, doncs avui em ve de gust tornar-ho a fer. Si algo he après després de 38 primaveres és que les coses bones ho són encara més si les pots compartir. A tots ens agrada compartir els moments d’alegria però es fa més difícil obrir-se quan es tracta de mostrar el dolor; malgrat tot en més d’una ocasió he decidit també compartir els moments durs que m’ha tocat viure.

Culturalment els aniversaris sempre se m’han presentat com una alegria, malgrat algunes persones s’esforcen en amagar anys i en entristir-se de l’edat que van acumulant. En general tothom parla de celebracions i actes festius per compartir amb alegria l’efemèride. L’any passat com la majoria sabeu el dia va estar marcat per una sombra molt trista, la història del Pol, i obviament això marca molt. És a dir, que fa pocs dies va fer un any i aquest tipus de coses deixen una petjada molt fonda.

Amb tot plegat el que vull dir és el que recordava fa un parell de dies quan agraïa la nova oportunitat que m’havia donat la vida després de l’accident que vaig patir fa 12 anys (Fa 12 anys que vaig tornar a neixer). La vida és un regal fantàstic plena de lliçons constants, algunes són tan espectaculars que ens fan dividir la vida en un abans i un després dels fets. Estic convensut que cadascú de nosaltres en té unes quantes d’aquestes lliçons. Això ho dic perquè quan miro enrera i hem poso a repassar aquests punts d’inflexió veig que me n’ha tocat viure uns quants i alguns de ben grossos. És a dir, que han marcat canvis molt importants.

Quan jo tenia 9 anys el meu pare ens va deixar en un accident de feina, des d’aquell moment vaig tenir clara una cosa; la definició de “normal” ja no m’aplicava. Al sentir les típiques frases que et deien a l’escola “digueu als pares…” o, “que vinguin a veurem els pares…” cada cop que sentia això jo em sentia molt diferent. Amb la perspectiva que hem dona el temps ara veig que això em va marcar molt el caràcter.

Una de les coses que vaig aprendre és a acceptar el que hem tocava viure i a agafar consciència de quines eren les avantatges i inconvenients que tenia a l’abast en cada moment. Això em va convertir en algú molt perseverant i fins hi tot alguns dieren que un lluitador. Cosa que després d’acabar la carrera em va permetre tenir un perfil professional molt diferencial amb la majoria de persones que tenia al voltant.  Tan és així que trets negatius com la sopèrbia i el despotisme s’havia incorporat en la meva forma d’actuar.

Però la vida sempre té una nova lliçó apunt per fer-te tornar a tocar de peus a terra, en aquest cas va ser l’accident de cotxe al que feia referència abans. Obviament un cop tan fort et fa reflexionar i un nou procés de transformació es va iniciar dins meu. Gràcies a persones excepcionals a més de tècniques com la PNL i el coaching vaig iniciar un treball personal d’autoconeixment i de modelat de mi mateix que de ben segur no acabarà fins el dia que m’acomiadi d’aquest món.

Sort que gràcies a les dosis d’humilitat que he anat revent fa molts anys que he agafat consciència de que no sóc ningú i que la meva existència esta condicionada a unes energies tan poderoses que escapen del meu control, sense oblidar que sóc jo com decideixo viure aquests fets. Perquè de nou “La història del Pol” em va arribar en un moment de plenitut després d’haver iniciat un procés fantàstic amb l’Estefania i un projecte professional molt motivador. Així que ara mateix no tinc la perspectiva suficient com per entendre al 100% el missatge que em vol donar la vida amb aquesta lliçó però com repeteixo dia rera dia: gràcies per permetrem seguir endavant i poder compartir el millor de mi mateix.

A tots els que d’una forma o d’una altre heu compartit i/o compartiu el camí de la meva vida, només ús puc donar les gràcies. No oblideu que d’una forma o d’una altre sou mestres que m’heu ajudat a creixer i a evolucionar fins a convertir-me en el que sóc.

“” El que tinc m’ho han donat els meus èxits,
però el que sóc és fruit dels meus errors. “”

— Oriol Rius

May 08

Free dynamic DNS service

Reading time: < 1 minute A long time ago there were several free dynamic DNS services but nowadays it's difficult to find one of them. And when you find the service usually you have some important restrictions like: number of updates per day or only few subdomains per account. But in the end I found a good free service of that, it's part of the project guifi.net and is called: Qui; you only need a guifi.net account to use the service and it’s really simple and clear. From my part the compatibility with “ddclient” and the “mikrotik” script are really useful and I want tu highlight this functionality.

May 07

Fa 12 anys que vaig tornar a neixer

Reading time: < 1 minute De tant en tant em ve al cap aquella expressió que diu: "Hi ha coses a la vida que la divideixen en dos, es marca un abans i un després de...". Doncs bé, avui es compleixen 12 anys d'un dels fets que ha dividit la meva vida. Tal dia com avui hem dirigia a una reunió a València i vaig patir un accident de cotxe espectacular com podeu apreciar a la fotografia. Sort que no hem vaig fer ni una rascada. accident bmw

Dies com aquest serveixen per recordar-te la teva fragilitat i fins a quin punt hem d’estar agraïts de poder disfrutar d’aquesta aventura tan apassionant que és la vida. Així doncs acabo aquest article tradicional en el blog acabant com sempre amb un GRÀCIES.

Apr 19

Conference: SmartHome using Arduino, Raspberry PI and more

Reading time: 1 – 2 minutes

I did this conference twice but this time it’s in English as I said before in Catalan, this is how I’m getting real a childhood dream. Thanks to open hardware like Arduino and Raspberry PI and open source software like OpenHab I have a smarthome with several automations. Last Thursday I spoke in “IoT Barcelona meetup” sharing my personal experience automating my house.

If you lost it and you want to watch the presentation video is here:

and the presentations slides are here:

Mar 12

VMWare trick: add new hard drive without restarting the virtual machine

Reading time: < 1 minute As simple as that, if you add a new virtual hard drive using VMWare in your virtual machine with Linux and you want to force the re-scan SCSI bus to see the new hard drive when you run, for example: "fdisk -l". You can force the SCSI bus re-scan with:

# take into account that your new hard drive could be added in different point than “host0″
echo “- – -” > /sys/class/scsi_host/host0/scan
Feb 18

Conferència: SmartHome usant Arduino, Raspberry PI i més

Reading time: 1 – 2 minutes

El dia 12 de febrer al vespre vaig fer una conferència a la FIB (Facultat d’Informàtica de Barcelona) dins de la UPC (Universitat Politècnica de Catalunya). En aquesta xerra vaig estar explicant com vaig convertint en realitat un somni que vaig tenir quan era petit, estic parlant de domotitzar la casa. Gràcies a enginys com l’Arduino i la Raspberry PI a més d’aplicacions com l’OpenHab podem fer assequible allò que si anem a grans marques comercials es fa caríssim pel meu pressupost.

En aquest enllaç podeu trobar les transparències de:  SmartHome usant Arduino Raspberry i més i el video el teniu disponible al servidor de la FIB.

Ara també teniu disponible el video a youtube:

i podeu veure les transparències des d’aquest mateix post:

Espero els vostres feedbacks als comentaris, desitjo que ús sigui útil.