dimecres, de desembre 22, 2010

Permetre crides AJAX des d'un domini diferent (Peticions "Cross-site")

El servidor específica en la resposta HTTP a quins dominis permet efectuar consultes (si és que n'hi ha algun més que el propi d'on es troba allotjat) mitjançant la capçalera "Access-Control-Allow-Origin"

Així doncs si la crida AJAX va cap a un recurs PHP que es trobi en un domini diferent es pot fer si modifiquem l'script PHP perquè retorni una capçalera "Access-Control-Allow-Origin" adequada:

header('Access-Control-Allow-Origin: http://domini_desdonhiha_el_javascript_amb_ajax.com');

o fins i tot per permetre qualsevol origen:

header('Access-Control-Allow-Origin: "*"');


D'altre banda si no es tracta d'un PHP o no ho podem modificar les capçaleres HTTP
per la raó que sigui, l'Apache es pot configurar mitjançant directiva o mitjançant un arxius .httacces per afegir-la, en aquest darrer cas la directiva podria ser:

header add Access-Control-Allow-Origin *

Cal tenir el mòdul "mod_headers" d'apache carregat perquè funcionin aquestes directives. En Debian/Ubuntu seria assegurant-nos que a "/etc/apache2/mods-enabled" existeix el headers.load ( i si no és així enllaçant-li des dels mods-available amb un "ln -s /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load")

Un exemple d'afegir la capçaera mitjançant la directiva a l'arxiu de configuració seria afegir
Header set Access-Control-Allow-Origin "*" a l'arxiu de configuració del lloc web, per exemple dins de la secció que ens interessi. En aquest cas, per què Apache agafi els canvis de configuració caldria reiniciar-lo
sudo /etc/init.d/apache2 reload



dissabte, de desembre 04, 2010

Ús del Subversion, pas a pas

Malgrat està una mica "passat de moda" i els projectes mínimament grans sembla s'han passat tots a git o mercurial, Subversion encara és útil en molts casos... A continuació un pas a pas realitzat en un Ubunu 10.04 (LTS) Server, esquemàtic, de com posar en marxa un repositori i la seva utilització bàsica com a "client" del repositori des de la línia de comandes.
De tota manera per als clients, des de la meva experiència, és recomanable usar alguna eina gràfica, i les més recomanables són el TortoisSVN pels clients Windows i el Rabbitvcs per GNU/Linux, apart, és clar, del plug-in Subclipse si es desenvolupa des d'Eclipse.


INSTAL·LACIÓ:


Instal·lar els paquets

# sudo apt-get install subversion libapache2-svn


Configurar un repositori: crear-lo

# mkdir /home/usuari/repositori

# svnadmin create /home/usuari/repositori/projecteX


Configurar un repositori: servir-lo via apache

# sudo chown -R www-data:www-data /home/usuari/repositori/

# sudo nano /etc/apache2/sites-available/default

I afegir-hi :

DAV svn
SVNParentPath /home/usuari/repositori
SVNListParentPath On
AuthType Basic
AuthName "Repositori de Control de Versions"
AuthUserFile /etc/subversion/passwd
Require valid-user

# sudo htpasswd -c /etc/subversion/passwd usuari_http

# sudo apache2ctl restart



Configurar una acció automàtica al servidor després de cada “commit”

# vi /home/usuari/repositori/projecteX/hooks/post-commit

I afegir-hi les accions que volguem, per exemple, actualitzar una carpeta amb els contiguts:

/usr/bin/svn update /var/www/test >> /var/log/svn/deploy.log 2>&1

En aquest exemple, caldrà que “/var/log/svn” existeixi i tingui permisos per l'usuari “www- data”



ÚS:


Importar els continguts el primer cop al repositori

# svn import /home/usuari/prjX_backup file:///home/usuari/repositori/projecteX


Descarregar els continguts del repositori a una carpeta "publica_projecte", el primer cop

# svn co file:///home/usuari/repositori/projecteX /var/www/publica_projecte


Actualitzar la carpeta amb els canvis que hi hagi al repositori

# svn update /var/www/publica_projecte/


Afegir nous continguts a la carpeta i “pujar-los” al repositori

# mkdir /var/www/publica_projecte/nova_carpeta

hi copiem o hi creem els continguts que calgui amb “cp” o com ens sembli...

cd /var/www/publica_projecte

# svn add nova_carpeta

# svn commit


Enviar els canvis fets al repositori

En general qualsevol canvi o modificaió als continguts que es vulguin “pujar” al servidor.

# cd /var/www/publica_projecte

# svn commit



Fonts:
https://help.ubuntu.com/10.04/serverguide/C/subversion.html http://elliotth.blogspot.com/2005/02/better-subversion-post-commit-hook.html

dimarts, de novembre 23, 2010

SSH invers.


Ho he fet 30 vegades però cada cop he hagut de buscar els passos exactes.. per futura referència i per si pot ajudar a algú.

Escenari: Volem connectar-nos a un equip a
mb connexió a internet però que no té cap port “accessible” i que només port sortir pels ports 53, 80 i 443 Disposem d'un servidor a Internet amb IP pública i que controlem (anomenem-la IP_PÚB_NOSTRE_SERVER)

1. Al servidor que controlem hi creem un usuari per fer la connexió SSH inversa. Per exemple amb l'script “adduser” dels Debian/Ubuntu.

# sudo adduser tmp

2. Per seguretat, i si ens interessa que aquest compte "tmp" que hem creat, i que serà usat al client no pugui obtenir una un cónsola de comandes al servidor, editem l'arxiu /etc/passwd
al servidor ihi canviem el "/bin/bash" del final de la linea de l'usuari "tmp" per /usr/sbin/nologin (o la localització d'aquest nologin... si tenim dubtes, ens assegurem que existeix amb un “locate nologin“)

tmp:x:1001:1001:Temporal,,,:/home/tmp:/usr/sbin/nologin


3. Al servidor editem l'arxiu de configuració del servei ssh a “/etc/ssh/sshd_config” i hi afegim que escolti per algun dels ports que el client pot usar per sortir.. per exemple el 53 (nota: ha de ser un port que estigui “lliure”, és a dir que si tenim per exemple l'apache escoltant pel port 80, no el podrem usar). Cal afegir a sota del Port 22 que hi ha per defecte:

Port 53

4. Reiniciem el servei sshd i anem al client. (p.e. /etc/init.d/ssh restart)


5. Al client fem la comanda del ssh invers pròpiament dit:

# sudo ssh -R 4430:localhost:22 tmp@IP_PÚB_NOSTRE_SERVER -p 53 -N

El primer cop ens demanarà...
The authenticity of host ' IP_PÚB_NOSTRE_SERVER (IP_PÚB_NOSTRE_SERVER)' can't be established. RSA key fingerprint is xx:xx:xx:a1:5f:1a:89:78:90:7b:2e:22:9a:xx:xx:xx. Are you sure you want to continue connecting (yes/no)?

escrivim que sí, i ens demanarà el password de l'usuari “tmp” que hem creat més amunt al server amb l'”adduser” i s'hauria de quedar a l'espera...

6. Només falta que, ara ja des del server, ens connectem al port 4430 del localhost host que realment està redirigit cap al ssh del client:

# ssh USUARI_CLIENT@localhost -p 4430

En aquest exemple, USUARI_CLIENT és un usuari vàlid per fer una connexió ssh al client, i IP_PÚB_NOSTRE_SERVER és la IP pública del nostre servidor, i el port és el 4430 però podria ser qualsevol no tallat.


dijous, de juny 03, 2010

A Google ho tenen clar, la culpa és de Microsoft.

Per aquells sorpresos que Google hagi decidit deixar d'usar Windows internament tot dient que les falles de seguretat són culpa d'aquest, ho haurien pogut pre-veure llegint el missatge d'error que Google Chrome mostra quan falla inesperadament en un sistema Windows: "Google Chrome no és responsable d'aquests actes", tot referint-se al pet que ha fet l'aplicació fa uns instants

dimarts, de març 02, 2010

Checking for corrupt, not cleanly closed and upgrade needing tables..

Després d'actualitzar el mysql 5.0 al 5.1 en un Debian Lenny, al reiniciar el servei em donava el següent missatge (un error o warning, pensava jo):

debian:~# /etc/init.d/mysql restart
Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..

En un primer moment em vaig pensar que potser calia executar a mà l'actualitzador de les dades entre versions de mysql. Però no, la seva execució deia que les dades ja estaven actualitzades:

debian:~# mysql_upgrade -p
Enter password:
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
This installation of MySQL is already upgraded to 5.1.44, use --force if you still need to run mysql_upgrade

Total, que després d'una cerca a internet vaig trobar el resultat... El missatge està mal triat amb ganes. A continuació us mostro entre [ ] la part del missatge que es dóna per sobre-entesa...

"[I am now] Checking for corrupt [tables]"
"[I am now checking for ], not cleanly closed [tables] and "
"[I am now checking for ] upgrade needing tables"

És a dir, que mysql simplement va dient què és el que està fent: 1. Comprovar si hi ha taules corruptes, 2. [Comprovar si] hi ha taules tancades inesperadament i, finalment, [Comprovar si alguna taula] necessita ser actualitzada...