O port do sistema operativo Android está cada vez mais perto do HTC HD2. Depois de ultrapassados os problemas relacionados com o kernel (que aparentemente estavam relacionados com algumas instruções extra do processador) foi uma questão de dias – mais concretamente dois – até que conseguissem inicializar o Android. Nesta fase ainda há muitos drivers que não se encontram a funcionar e que fazem com que ainda seja inútil para qualquer utilizador, mas foi mais um passo na direcção certa.

Podem inclusive ver um video do processo de inicialização do sistema:

O próximo passo parece estar relacionado com os drivers do touchscreen, o famigerado ELAN B81 que mesmo após alguma insistência sobre o fabricante, este não libertou a informação necessária para ser criado o driver para linux.

Mais informações na thread oficial do port deste sistema operativo:

http://forum.xda-developers.com/showthread.php?t=651632

Depois do último algoritmo para validar o contribuinte, aqui fica uma versão para validar o NIB.

function isValidNib($nib){
$result = "";
if(strlen(intval($nib)) != 21)
return "NIB INVALIDO (Standard: 21 algarismos. Introduzido: " . strlen(intval($nib)) . ")";
 
$nnib = str_split(intval($nib));
 
for($i=0; $i< 19 ; $i++){
        $result = (($result + $nnib[$i]) * 10) % 97;
}
$result = 98 - (($result * 10) % 97);
 
if($result < 10)
        $result = "0" + $result;
 
if(substr($nib, 19, 2) != $result)
        return "NIB INVALIDO";
else
        return "NIB VALIDO";
}

Se preferirem podem trocar o texto enviado no retorno das funções e utilizar um boleano true/false.

EDIT: Agradecimentos ao Nuno Cancelo pela dica de optimização enviada! :)

Já tenho visto por aí vários algoritmos para validar o numero de contribuinte, mas não vi um feito em PHP.

Disponibilizo aqui um pedaço de código em PHP para que possam incluir nos vossos serviços.

function isValidNif($nif){
 
//Verificar se e' um numero e se e' composto exactamente por 9 digitos
if(!is_numeric($nif) || strlen($nif) != 9) return false;
 
$narray = str_split($nif);
 
//verificar se o primeiro digito e' valido. O primeiro digito indica o tipo de contribuinte.
if($narray[0] != 1 && $narray[0] != 2 &&  $narray[0] != 5 && $narray[0] != 6 && $narray[0] != 8 && $narray[0] != 9)
        return false;
 
$checkbit = $narray[0] * 9;
 
for($i=2; $i<=8; $i++){
        $checkbit += $nif[$i-1] * (10 - $i);
}
 
$checkbit = 11 - ($checkbit % 11);
 
if($checkbit >= 10) $checkbit=0;
 
if($nif[8] == $checkbit) return true;
echo "$nif - $checkbit";
return false;
}

Escreve o teu nome, ninja style:

Estava sem nada para fazer e resolvi fazer um pequeno script baseado na imagem de cima para criar o nome automaticamente.

http://www.davidgouveia.net/goodies/ninja.php?name=david – Substitui o nome david pelo teu.

O resultado será algo assim :

Utilidade: Nenhuma. Mas já estava enferrujado com a utlização da libgd :)

A partir de hoje o PokerStrategist será desactivado permanentemente. Recebi um aviso legal por parte da empresa que pediu para que removesse o programa por estar a violar alguns pontos dos termos e condições deles.

Sinceramente não sei qual a base legal para afirmarem que não posso publicar as respostas, mas também não estou para perder tempo com isto que surgiu como uma brincadeira para me ajudar a mim e a alguns amigos.

De: Ingo Mak [mailto:notice@pokerstrategy.com]
Enviada: sexta-feira, 28 de Maio de 2010 10:03
Para: xxxxxxxxxx
Assunto: Warning notice due to copyright infringement on your website

Dear Mr. Gouveia,

We have noticed that you offered your help on the website http://www.davidgouveia.net/tag/poker-strategy/ to solve the quiz on our website www.pokerstrategy.com by downloading a special software.

Transferring and/or publishing the answers of our quiz or providing them to other users is in contradiction with clause 2.6 of PokerStrategy’s Terms & Conditions. In such cases, we reserve the right to exclude the respective user from using the Services of PokerStrategy in accordance with section 4 of our Terms & Conditions.

Furthermore and in accordance with the Terms & Conditions of the Tell-a-Friend Program, in such cases we are entitled to reclaim Referrer Accruals already paid to you and/or to withhold future Referrer Accruals.
Therefore, we kindly ask you, to remove the respective article immediately. If you are going to publish or provide the answers of our quiz again, we will take the necessary legal steps to prevent you from doing that again.

Yours sincerely,

legal department

Hoje descobri um novo truque que poderá vir a ser útil para muitas pessoas que ainda não o conheçam.

Um cliente que possui o serviço de email do seu domínio associado ao Gmail perdeu o acesso via POP2/IMAP. O mais estranho é que o acesso via interface WEB continuava a ser feito sem problemas e que todas as outras pessoas ligadas no mesmo domínio continuavam a aceder sem qualquer problema. Mais estranho ainda é que essa mesma conta funcionava DESDE QUE o acesso fosse feito a partir de outro IP que não o IP externo da ligação à Internet por eles utilizada.
Resumindo, se eu me ligasse a uma VPN, ou através de uma vulgar placa 3G não tinha qualquer problema. Utilizando ligação directa as credenciais eram sempre negadas.

Após muita pesquisa, lá consegui descobrir um pequeno pormenor que pode fazer toda a diferença.
O Gmail tem tendência a bloquear acessos via POP/IMAP no caso de detectar muitas ligações vindas do mesmo IP em intervalos de tempo muito curtos (menos de 10 minutos).

Apesar de a informação transmitida não ser muito clara, a verdade é que para restaurar o acesso, devem aceder a uma página específica, colocar o endereço de email e o código do captcha para provarem que são humanos. Após isto o acesso fica restaurado e o serviço volta à normalidade.

Para restaurar o acesso a contas gmail utilizem o seguinte link :

https://www.google.com/accounts/DisplayUnlockCaptcha

Para o caso de essa conta de email estar associada a um domínio próprio alojado no gmail usem este link :

https://www.google.com/a/[DOMINIO]/UnlockCaptcha

Mais informações aqui.

I believe I have found a vulnerability in ClipBucket 2.0.6 (haven’t tested with prior versions).

ClipBucket is an open source and free script that will let you start your own Video Sharing (Youtube Clone) website in matter of minutes, ClipBucket is fastest growing script with most video sharing websites and social networking features.
current version: 2.0.6

Summary:
The script handling the search features is not sanitizing user input properly making it possible to produce XSS attacks.

Proof of Concept:

Use the search box of your ClipBucket 2.0.6 installation and Input:

 <script>alert(document.cookie);</script>

This will produce an alert with contents of your cookie.

Problem:
$search->key in search_result.php (line 18) is being directly assigned to the title of the search page without sanitizing its value first.

$search->key = $_GET['query'];

Workaround:
Open file search_result.php. Go to line 39:

Replace this:

Assign('search_type_title',sprintf(lang('searching_keyword_in_obj'),$search->key,$search->search_type[$type]['title']));

By this:

Assign('search_type_title',sprintf(lang('searching_keyword_in_obj'),htmlentities($search->key),$search->search_type[$type]['title']));

The ClipBucket team was already notified and the bug was corrected. Either apply this patch or upgrade your version to 2.0.7

Many of you have noticed that the default player (CB) does not autoplay movies. While some people suggested that there was a typo in the cbplayer.plug.php, changing autoload to autoload wasn’t enough.

I’ve disassembled the CB player to check which variables it was expecting and I found out that it wasn’t autoplay, but autoPlay.

So … in order to fix this issue, open player/cbplayer/cbplayer.plug.php. Locate :

$code	.= "settingsFile: \"".PLAYER_URL."/cbplayer/settings.php?hqid=".$vdata['videoid']."&amp;autplay=".$data['autoplay']."\"\n";
else
$code	.= "settingsFile: \"".PLAYER_URL."/cbplayer/settings.php?vid=".$vdata['videoid']."&amp;autplay=".$data['autoplay']."\"\n";

replace by :

$code	.= "settingsFile: \"".PLAYER_URL."/cbplayer/settings.php?hqid=".$vdata['videoid']."&amp;autoPlay=".$data['autoplay']."\"\n";
else
$code	.= "settingsFile: \"".PLAYER_URL."/cbplayer/settings.php?vid=".$vdata['videoid']."&amp;autoPlay=".$data['autoplay']."\"\n";

Part II

If you want to use autoplay under every pages except for index (eg. to disable autoplay of editor’s pick movies), add this little snippet :

Open the same file. Locate :

function cbplayer($data,$no_video=false)
	{

Add below :

	if(constant('THIS_PAGE')=='index')
		$data['autoplay'] = 'false';

You shoud now be able to autoplay every video using the CB default player except for the ones on main page.:D

Summary: with this mod you will be able to insert any script into your clipbucket. I’m using it to manage google analytics.

1st – Open styles/cbv2new/layout/global_header.html. Find:

<!-- Setting Template Variables -->
{php}
	if(!$_COOKIE['current_style'])
    	$_COOKIE['current_style'] = 'grid_view';
{/php}

Add below:

<!-- Google Analytics -->;
{show_analytics|html_entity_decode}

2nd – includes/common.php. Find:

$Smarty-&gt;register_function('cbtitle','cbtitle');

Add below:

$Smarty-&gt;register_function('show_analytics', 'show_analytics');

3rd – Open includes/functions.php. Find:

	/**
	 * Function used to load clipbucket title
	 */
	function cbtitle($params=false)
	{

Add above:

	/**
	* Function used to load Google Analytics - me( at )davidgouveia.net
	*/
	function show_analytics()
	{
		global $Cbucket;
		// code to convert html entities back useful code.
		echo base64_decode($Cbucket-&gt;configs['google_analytics']);
 
	}

4th – Open admin_area/main.php. Find:

	'gravatars',

Add above:

	'google_analytics',

Find:

	$value = mysql_clean($_POST[$field]);
	if(in_array($field,$num_array))

Add above:

	if($field == 'google_analytics')
		$value = base64_encode($_POST['google_analytics']);
	else

(the “else” MUST be in the line immediately above “$value = mysql_clean($_POST[$field]);”).

Finally, open /admin_area/styles/cbv2/layout/main.html. Find:

            <tr>
              <td valign="top">Meta Description</td>
              <td valign="top"><textarea name="description" id="description" cols="45" rows="5">{$row.description}</textarea></td>
            </tr>

Add below:

       	    <tr>
              <td valign="top">Google Analytics</td>
              <td valign="top"><textarea name="google_analytics" id="google_analytics" cols="45" rows="5">{$row.google_analytics|base64_decode|html_entity_decode}</textarea></td>
            </tr>

Done! You shoud see another option under Web Settings.

Tested under ClipBucket 2.0.6.

PS: I’m using base64_encode/decode because I want to save the script as its original values and I need to avoid using functions like mysql_clean() to sanitize the code. By saving it as a base64 string I avoid potential malicious SQL injection problems. I’m sure there are other ways of doing it but this works OK (I think :p).

This code was tested with ClupBucket 2.0.6. This will allow you to block specific emails domains. It is partivularly useful to block all email providers used to spam (like mailinator.com or temporaryinbox.com).

1st – Open your database and add a record to your config datatable (default is cb_config) with the value “disallowed_email_providers”.
2nd – Open clipbucket Control Panel and add a new phrase with code “usr_email_blacklisted_err” and value “Invalid email”.

3rd – open the main.html from your template.

Search for :

<tr>
<td valign="top">Disallowed usernames</td>
<td valign="top"><label>
<textarea name="disallowed_usernames" id="disallowed_usernames" cols="45" rows="5">{$row.disallowed_usernames}</textarea>
<br />
separate by commas
</label></td>
</tr>

and add below:

<tr>
<td valign="top">Disallowed email providers</td>
<td valign="top"><label>
<textarea name="disallowed_email_providers" id="disallowed_email_providers" cols="45" rows="5">{$row.disallowed_email_providers}</textarea>
<br />
separate by commas
</label></td>
</tr>

4th – Open admin_area/main.php and find (around line 56):

'disallowed_usernames',

and add below :

'disallowed_email_providers',

5th – Open includes/classes/user.class.php and add this function right above the signup_user function (around line 3160) :

/**
* Function to validate email provider
*/
function blacklisted($email){
global $Cbucket;
 
$providers = explode(",", $Cbucket->configs['disallowed_email_providers']);
 
foreach($providers as $provider){
if(eregi(trim($provider) . "$", $email))
return true;
}
return false;
}

6th – Finally enter function signup_user, locate this :

//checking terms and policy agreement
if($array['agree']!='yes' && !has_access('admin_access',true))
e(lang('usr_ament_err'));

add below :

//Check if email provider is blacklisted
if($this->blacklisted($array['email']))
e(lang('usr_email_blacklisted_err'));

You should now be able to block email providers 🙂