WallTray jest małym systemikiem udostępniania newsów czy jakichkolwiek informacji które mają zdarzyć się w przyszłości (zostało to napisane dla naszej klasy żeby informaować o sprawdzianach (IMG:
http://forum.php.pl/style_emoticons/default/tongue.gif) ).
Cały system jest oparty nie o plik XML lecz o serwer w php i bazę w mySQL'u.
Serwer składa się z 2-óch plików i zajmuje 5,4 KB (IMG:
http://forum.php.pl/style_emoticons/default/winksmiley.jpg) a klient jest programem napisanym w C++ przez mojego kumpla z którym stworzyłem ten projekt.
Dodatkową zaletą jest system autoryzacji pozwalający na wyświetlanie newsów tylko dla danej grupy (na razie jest to tylko tymczasowe i dosyć trywailne rozwiązanie), np tylko grupa trzymająca browar dostanie newsa: w piątek idziemy się integrować (IMG:
http://forum.php.pl/style_emoticons/default/winksmiley.jpg) .
Wszystko komunikuje się w protokole będącym "nakładką" na HTTP oraz małym autorkskim systemikiem podawania danych jakim jest DFML.
Posiadamy małe zabezpieczenie połączenia (tzn. porównywanie hasha hasła na obu komputerach) które jest związane z autoryzacją użytkownika.
connect.php
<00WallTray><!WallTray>
<?php
/**
* WallTrayServer server info send application
*
* Server version: 0.6.2
* Protocole version: v1b
*
* @author Artek Wiśniewski <aart3k@gmail.pl>
* @version $Id: connect.php,v 0.6 2006/01/15 20:35:38 aart3k Exp $
* @package WallTrayServer
*/
if(!isset($_GET['user'],$_GET['mode'])) die('<00error>00<!error>');
include('config.php');
$dbConnention = @mysql_connect($config['dbHost'],$config['dbUser'],$config['dbPass']);
if(!$dbConnention OR !$dbBase)
die('<00error>01<!error>');
// Secure $_GET
while ($data = each($_GET)) {
$size = strlen($data['value']);
$_GET[$data['key']] = sprintf("%s",$data['value']);
}
if($_GET['mode'] == 'hash'){
// Authorization level 1
// Check for existement of ConnectionId
$resHash = mysql_query('SELECT '.$config['usrTblConnId'].' FROM '.$config['usrTbl'].' WHERE '.$config['usrTblUsrNam'].'=''.$_GET['user'].'' LIMIT 1');
die ('<00error>07<!error>');
$dataHash = explode('/',$dataHash[0
]); if(sizeof($dataHash) == 2 AND
time() < $dataHash[1
]) die('<00error>06<!error>');
// Doing first level of Auth
$expTime = time() + $config['timeout'];
'UPDATE '.$config['usrTbl'].' SET '.$config['usrTblConnId'].'= ''.$hashingId.'/'.$expTime.'' WHERE '.$config['usrTblUsrNam'].'=''.$_GET['user'].'' LIMIT 1'
);
if($result)
echo '<00hash>'.$hashingId.'<!hash> <00hashtype>'.$config['usrTblHashTp'].'<!hashtype>';
else
echo '<00error>02<!error>';
} elseif($_GET['mode'] == 'data') {
// Authorization level 2
'SELECT '.$config['usrTblUsrNam'].','.$config['usrTblPasswd'].','.$config['usrTblConnId'].','.$config['usrTblPrivil'].' FROM '.$config['usrTbl'].' WHERE '.$config['usrTblUsrNam'].'=''.$_GET['user'].'' LIMIT 1'
)or
die('<00error>03<!error>');
$userName = $userData[0];
$userPass = $userData[1];
$userPrivileiges = $userData[2];
list
($userHash,$timeOut) = explode('/',$userData[2
]);
// Timeout
die('<00error>04<!error>');
// Hashing by Boczek (my concept ^^)
for($i=0; $i<strlen($userPass);$i++){
$tmp=ord($userPass{$i});
$tmp=($tmp*$userHash)%256;
$code.=$tmp;
}
if($code != $_GET['pass'])
die('<00error>05<!error>'); else{
// TODO: Anormal tables
// Get data from DB
$getDataRes = mysql_query('SELECT * FROM '.$config['evntTbl'].' ORDER BY date');
$id = $data[0];
$date = $data[1];
$title = $data[2];
$text = $data[3];
$link = $data[4];
$prio = $data[5];
$priv = $data[6];
// Skipping old events
if(time() > $time AND
$config['skipOldEvents']) continue;
// TODO: sign parsing
eval('$avalabile = $userPrivileges '.$priv.'?true:false;'
/*if($userPrivileges '.$priv.')
$avalabile = true;
else
$avalabile = false;'*/
);
if($avalabile){
echo '<00'.$id.':n>'.$title.'<!'.$id.':n> <00'.$id.':t>'.$text.'<!'.$id.':t>
<00'.$id.':l>'.$link.'<!'.$id.':l>
}
}
'UPDATE '.$config['usrTbl'].' SET '.$config['usrTblConnId'].'= 'none' WHERE '.$config['usrTblUsrNam'].'=''.$_GET['user'].'' LIMIT 1'
);
}
}else{
echo '<00error>00<!error>';
}
/**
* Error codes ^^:
* 00: Required data not present
* 01: Database connection.
* 02: Database update failed.
* 03: User Authorization not found in DB
* 04: Operation timeout
* 05: Bad hash sent
* 06: ConnectionId exists and is valid!
* 07: No user like %user
*
* Priors:
* 0: info
* 1: alert
* 2: stop
*/
?>
config.php
<?php
/**
* WallTrayServer config file
*
* @author Artek Wiśniewski <aart3k@gmail.pl>
* @version $Id: config.php,v 1.00 2006/01/08 20:35:38 aart3k Exp $
* @package WallTrayServer
*/
'dbHost' => '',
'dbUser' => '',
'dbPass' => '',
'dbBase' => '',
'timeout' => 120, //Czas ważności połączenia (w sek)
'skipOldEvents' => true,
'usrTbl' => '_members', // Tabela z użytkownikami
'usrTblUsrNam' => 'name', //Pole z nazwa/loginem uzytkonika
'usrTblPasswd' => 'wt_md5pass', //Pole z zakodowanym hasłem
'usrTblConnId' => 'wt_connectid', //Pole w tabeli z identyfikatorem połącznia oraz czasem ważności
'usrTblPrivil' => 'wt_privlevel', //Pole w tabeli z poziomem uprawnień
'usrTblHashTp' => 1, //Sposob kodowania hasla w tabeli (na razie supportowane md5, dojdzie sha1 i inne) 1= md5 / 2= sha1
'evntTbl' => 'wt_events', //Tabela z eventami dla WT
'evntTblType' => 'normal', //Typ tabeli: normalna (domyslna dla WT)|własna gdybys chciał wykorzystać dane z innej tabeli
//Pola tabeli niestandardowej
//NIE ZAIMPLEMENTOWANE!!
'custTblId' => '',
'custTblTopic' => '',
'custTblDate' => '',
'custTblText' => '',
'custTblLink' => '',
'custTblPrio' => '',
'custTblPriv' => '',
);
?>
Programowałem proceduralnie (chyba?) gdyz nie widziałem zbytniej potrzeby zaśmiecania pamięci objektami.
klient:
Stronka z DownloademPrzykładowy kanał informacji jest od razu ustawiany po instalacji WT z tym że należy ustawić:
user:
publicpass:
publicDodam iż klient jest w fazie alpha więc proszę nie oczekiwać za wiele (IMG:
http://forum.php.pl/style_emoticons/default/cool.gif)
_____
AHA:
Jeszcze tymczasowy klient w php jakby ktoś się chciał pobawić z protokołem (IMG:
http://forum.php.pl/style_emoticons/default/biggrin.gif)
<?
$userPass = '4c9184f37cff01bcdc32dc486ec36961';
$userHash = 29;
for($i=0; $i<strlen($userPass);$i++){
$tmp=ord($userPass{$i});
$tmp=($tmp*$userHash)%256;
$code.=$tmp;
}
?>
$code jest juz zhashowanym hasłem.
Ten post edytował Neotion 17.02.2006, 22:51:48