Archive

Archive for the ‘PHP’ Category

.htpasswd protecting your phpMyAdmin installation (Debian)

March 16th, 2010

So you got yourself a LAMP webserver and started hosting some sites on it. Now, for easy access to your databases, you opt to chose phpMyAdmin.

When installing phpMyAdmin on a Debian system via the synaptic manager (apt-get install phpmyadmin), the installation will be done in this folder

/usr/share/phpmyadmin

You will be able to access your phpMyAdmin via

http://www.mydomain.com/phpmyadmin

You will notice that you are asked for a username and password. This is great! It means that your database is protected…. but what if i want to protect it even more?
What if i would like to add some extra folder protection by using the good old .htpasswd technique?

Well, I looked around for a while but did not find any satisfying solutions. This meant I had to mess around a bit myself and after not too long, success! I had a phpMyAdmin installation where it would first use the .htpasswd protection before bringing me to the phpMyAdmin login page.

How did we do this?

1) create a .htpasswd file in the installation directory (cfr. supra). You can use handy .htpasswd generators like this one: http://www.htaccesstools.com/htpasswd-generator/

2) find and edit the phpMyAdmin apache2 config file:

/etc/apache2/conf.d/phpmyadmin.conf

3) add the necessary lines in the conf file to tell Apache2 it should use the .htpasswd file. Below you will find the before and after of the code.

Before:

# phpMyAdmin default Apache configuration
 
Alias /phpmyadmin /usr/share/phpmyadmin
 
 
		AllowOverride All
		Options Indexes FollowSymLinks
		DirectoryIndex index.php
 
		# Authorize for setup

After:

# phpMyAdmin default Apache configuration
 
Alias /phpmyadmin /usr/share/phpmyadmin
 
 
        AllowOverride All
        Options Indexes FollowSymLinks
        DirectoryIndex index.php
 
        AuthType Basic
        AuthName "HaLe MySQL"
        AuthUserFile /usr/share/phpmyadmin/.htpasswd
        Require valid-user
 
        # Authorize for setup

4) reload your Apache2

sudo /etc/init.d/apache2 reload

5) your phpMyAdmin is now .htpasswd protected!

Cheers
Lajfi

Author: lhe Categories: Databases, General, Linux (Ubuntu), MySQL, PHP Tags:

VAT number validation with VIES

March 15th, 2010

For a couple of our clients we implemented a webshop with Drupal and Ubercart. One feature which was missing from the default Ubercart setup, was a VAT number field, and the accompanying validation.

After some googling I found out about the VAT number module . This module adds a VAT field to the checkout billing fieldset, depending on which country you have selected. Because only european corporate visitors should be able to fill in a VAT number, it’s useless for other countries and can be hidden.

Now there are 2 ways of validating a VAT number:

1. Through a fixed preg-match scheme, which validates the format of the VAT number depending on the country. This method ensures you have a valid formatted VAT number but it does not validate if this VAT number belongs to an actual company. Hence method 2.

2. You can also validate a VAT number through the European VAT validation service, in short “VIES”. They allow for a developer to do a Soap call to their service, providing the country code and VAT number. The Drupal module already provides this Soap call, but there has been an update to the VIES services, and the endpoint url of the Soap service has moved.

So to get your VAT checker up and running again, here’s The Fix:

Just replace the existing endpoint by the new one:

$client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/api/checkVatPort?wsdl");

By

$client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/services/checkVatService.wsdl");

For a full implementation on how to do a VAT validation through SOAP:

function hale_validate_vat($args = array()) {
	if ( '' != $args['vatnumber'] ) {
		$vat_number 	= str_replace(array(' ', '.', '-', ',', ', '), '', $args['vatnumber']);
		$countryCode 	= substr($vat_number, 0, 2);
		$vatNumber 		= substr($vat_number, 2);
 
		if ( strlen($countryCode) != 2 || is_numeric(substr($countryCode, 0, 1)) || is_numeric(substr($countryCode, 1, 2)) ) {
			$error = array('result' => false, 'message' => 'Your VAT Number syntax is not correct. You should have something like this: BE805670816B01');
			return $error;
		}
 
		if ( $args['country'] != $countryCode ) {
			$error = array('result' => false, 'message' => 'Your VAT Number is not valid for the selected country.');
			return $error;
		}
 
		$client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/services/checkVatService.wsdl");
		$params = array('countryCode' => $countryCode, 'vatNumber' => $vatNumber);
 
		$result = $client->checkVat($params);
 
		if ( !$result->valid ) {
			$error = array('result' =&gt; false, 'message' =&gt; sprintf('Invalid VAT Number. Check the validity on the customer VAT Number via <a href="%s">Europa VAT Number validation webservice</a>', 'http://ec.europa.eu/taxation_customs/vies/lang.do?fromWhichPage=vieshome'));
			return $error;
		} else {
			return true;
		}
	}
	return false;
}

Use it like this:

$result = hale_validate_vat(array(‘vatnumber’ => ‘BE0123456789′, ‘country’ => ‘BE’));

Where the result is either TRUE or contains the error message in $result['message']

Update: Like promised in the comments below I have created a txt file with the code of this post and some comments. Download it here.

Greets,
Kim

Author: Kim Categories: Coding, Drupal, PHP Tags:

CakePHP created and modified fields

February 8th, 2010

For a project of a client of ours, we had to create a custom web-application. After some online investigation Googling, CakePHP came out as the best-value-for-money PHP framework, and it comes with a super-duper handbook.

After implementing the outlines of the application, we had a first evaluation round which attended us at a small bug (?) in the system…

The “created” and “modified” (or “updated” as alternative) columns in the database scheme should, according to the CakePHP book, be updated automagically when using the built-in model->save() method.

After a few test-rounds we noticed that these values were initialised when first adding the data to the database, but were not updated afterwards when editing the model data.

The traceback lead me to the /cakeframework/cake/libs/model/model.php line 1204:

1204
if ($this->hasField($updateCol) && !in_array($updateCol, $fields)) {

This if checks if a model has access to a database column “created”, “modified” or “updated” with the hasField() model-method and also does a simple in_array() check and here’s the caveat: The second check requires the datetime-field NOT to be in a preset array with the following values “created”, “modified” or “updated”.

Rather tricky to result in both requirements returning “true” and update the datetimefields if available ^^.

So to fix it and have your modified / updated datetime-fields kept up-to-date change the line to the following:

1204
if ($this->hasField($updateCol) && in_array($updateCol, $fields)) {

Hoping to be of any assistance!

Author: Kim Categories: Coding, PHP Tags: