Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: WallTray
Forum PHP.pl > Inne > Oceny
Neotion
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 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 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ć 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
  1. <00WallTray><!WallTray>
  2. <?php
  3.  
  4. /**
  5.  * WallTrayServer server info send application
  6.  * 
  7.  * Server version:         0.6.2
  8.  * Protocole version:     v1b
  9.  *
  10.  * @author Artek Wiśniewski <aart3k@gmail.pl>
  11.  * @version $Id: connect.php,v 0.6 2006/01/15 20:35:38 aart3k Exp $
  12.  * @package WallTrayServer 
  13.  */
  14.  
  15. if(!isset($_GET['user'],$_GET['mode']))
  16.     die('<00error>00<!error>');
  17.  
  18. include('config.php');
  19.  
  20. $dbConnention = @mysql_connect($config['dbHost'],$config['dbUser'],$config['dbPass']);
  21. $dbBase = @mysql_select_db($config['dbBase']);
  22.  
  23. if(!$dbConnention OR !$dbBase)
  24.     die('<00error>01<!error>');
  25.  
  26. // Secure $_GET
  27. while ($data = each($_GET)) {
  28.  
  29.     if(!isset($size))
  30.         $size = strlen($data['value']);
  31.  
  32.     if (get_magic_quotes_gpc())
  33.         $_GET[$data['key']] = stripslashes($data['value']);
  34.     $_GET[$data['key']] = trim(strip_tags(str_replace("\"", "", $data['value'])));
  35.     $_GET[$data['key']] = substr(str_replace("'","", $data['value']),0,$size);
  36.     $_GET[$data['key']] = sprintf("%s",$data['value']);
  37.  
  38. }
  39.     
  40. if($_GET['mode'] == 'hash'){
  41.     
  42.     // Authorization level 1
  43.     
  44.     // Check for existement of ConnectionId
  45.     $resHash = mysql_query('SELECT '.$config['usrTblConnId'].' FROM '.$config['usrTbl'].' WHERE '.$config['usrTblUsrNam'].'=''.$_GET['user'].'' LIMIT 1');
  46.     
  47.     if(!mysql_num_rows($resHash))
  48.         die ('<00error>07<!error>');
  49.     
  50.     $dataHash = mysql_fetch_array($resHash);
  51.     $dataHash = explode('/',$dataHash[0]);
  52.     if(sizeof($dataHash) == 2 AND time() < $dataHash[1])
  53.         die('<00error>06<!error>');
  54.     
  55.     // Doing first level of Auth
  56.     $hashingId = mt_rand(1,256);
  57.     $expTime = time() + $config['timeout'];
  58.     
  59.     $result = mysql_query(
  60.         'UPDATE '.$config['usrTbl'].' SET '.$config['usrTblConnId'].'= ''.$hashingId.'/'.$expTime.'' WHERE '.$config['usrTblUsrNam'].'=''.$_GET['user'].'' LIMIT 1'
  61.     );
  62.     
  63.     if($result)
  64.         echo '<00hash>'.$hashingId.'<!hash>
  65. <00hashtype>'.$config['usrTblHashTp'].'<!hashtype>';
  66.     else
  67.         echo '<00error>02<!error>';
  68.     
  69.     
  70. } elseif($_GET['mode'] == 'data') {
  71.     
  72.     // Authorization level 2
  73.     
  74.     $result = mysql_query(
  75.         'SELECT '.$config['usrTblUsrNam'].','.$config['usrTblPasswd'].','.$config['usrTblConnId'].','.$config['usrTblPrivil'].' FROM '.$config['usrTbl'].' WHERE '.$config['usrTblUsrNam'].'=''.$_GET['user'].'' LIMIT 1'
  76.     )or die('<00error>03<!error>');
  77.     $userData = mysql_fetch_array($result);
  78.     
  79.     $userName = $userData[0];
  80.     $userPass = $userData[1];
  81.     $userPrivileiges = $userData[2];
  82.     list($userHash,$timeOut) = explode('/',$userData[2]);
  83.     
  84.     // Timeout
  85.     if(time() > $timeOut)
  86.         die('<00error>04<!error>');
  87.     
  88.     // Hashing by Boczek (my concept ^^)
  89.     for($i=0; $i<strlen($userPass);$i++){
  90.         $tmp=ord($userPass{$i});
  91.         $tmp=($tmp*$userHash)%256;
  92.         $tmp=$tmp>0xF?dechex($tmp):'0'.dechex($tmp);
  93.         $code.=$tmp;
  94.     }
  95.     
  96.     if($code != $_GET['pass'])
  97.         die('<00error>05<!error>');
  98.     else{
  99.         // TODO: Anormal tables
  100.         // Get data from DB
  101.         $getDataRes = mysql_query('SELECT * FROM '.$config['evntTbl'].' ORDER BY date');
  102.         
  103.         while($data = mysql_fetch_array($getDataRes)){
  104.             $id     = $data[0];
  105.             $date     = $data[1];
  106.             $title     = $data[2];
  107.             $text     = $data[3];
  108.             $link     = $data[4];
  109.             $prio     = $data[5];
  110.             $priv     = $data[6];
  111.             
  112.             // Skipping old events
  113.             $time = strtotime($date.' 23:59:59');
  114.             if(time() > $time AND $config['skipOldEvents'])
  115.                 continue;
  116.             
  117.             // TODO: sign parsing
  118.             eval('$avalabile = $userPrivileges '.$priv.'?true:false;'
  119.             
  120.             /*if($userPrivileges '.$priv.')
  121.                 $avalabile = true;
  122.             else
  123.                 $avalabile = false;'*/
  124.             );
  125.             
  126.             if($avalabile){
  127. echo '<00'.$id.':n>'.$title.'<!'.$id.':n>
  128. <00'.$id.'biggrin.gif>'.$date.'<!'.$id.'biggrin.gif>
  129. <00'.$id.':t>'.$text.'<!'.$id.':t>
  130. <00'.$id.':l>'.$link.'<!'.$id.':l>
  131. <00'.$id.'tongue.gif>'.$prio.'<!'.$id.'tongue.gif>';
  132.             }
  133.             
  134.         }
  135.     
  136.         $result = mysql_query(
  137.             'UPDATE '.$config['usrTbl'].' SET '.$config['usrTblConnId'].'= 'none' WHERE '.$config['usrTblUsrNam'].'=''.$_GET['user'].'' LIMIT 1'
  138.         );        
  139.         
  140.     }
  141.     
  142. }else{
  143.     
  144.     echo '<00error>00<!error>';
  145.     
  146. }
  147. /**
  148.  * Error codes ^^:
  149.  * 00: Required data not present
  150.  * 01: Database connection.
  151.  * 02: Database update failed.
  152.  * 03: User Authorization not found in DB
  153.  * 04: Operation timeout
  154.  * 05: Bad hash sent
  155.  * 06: ConnectionId exists and is valid!
  156.  * 07: No user like %user
  157.  * 
  158.  * Priors:
  159.  * 0: info
  160.  * 1: alert
  161.  * 2: stop
  162.  */
  163.  
  164. ?>


config.php
  1. <?php
  2.  
  3. /**
  4.  * WallTrayServer config file
  5.  *
  6.  * @author Artek Wiśniewski <aart3k@gmail.pl>
  7.  * @version $Id: config.php,v 1.00 2006/01/08 20:35:38 aart3k Exp $
  8.  * @package WallTrayServer 
  9.  */
  10.  
  11. $config = array(
  12.  
  13.     'dbHost'        => '',
  14.     'dbUser'        => '',
  15.     'dbPass'        => '',
  16.     'dbBase'        => '',
  17.     
  18.     'timeout'        => 120,                //Czas ważności połączenia (w sek)
  19.     'skipOldEvents'    => true,
  20.     
  21.     'usrTbl'        => '_members',    // Tabela z użytkownikami
  22.     'usrTblUsrNam'    => 'name',            //Pole z nazwa/loginem uzytkonika
  23.     'usrTblPasswd'    => 'wt_md5pass',    //Pole z zakodowanym hasłem
  24.     'usrTblConnId'    => 'wt_connectid',    //Pole w tabeli z identyfikatorem połącznia oraz czasem ważności
  25.     'usrTblPrivil'    => 'wt_privlevel',     //Pole w tabeli z poziomem uprawnień
  26.     'usrTblHashTp'    => 1,                //Sposob kodowania hasla w tabeli (na razie supportowane md5, dojdzie sha1 i inne) 1= md5 / 2= sha1
  27.     
  28.     'evntTbl'        => 'wt_events',        //Tabela z eventami dla WT
  29.     'evntTblType'    => 'normal',        //Typ tabeli: normalna (domyslna dla WT)|własna gdybys chciał wykorzystać dane z innej tabeli
  30.     //Pola tabeli niestandardowej
  31.     //NIE ZAIMPLEMENTOWANE!!
  32.     'custTblId'        => '',
  33.     'custTblTopic'    => '',
  34.     'custTblDate'    => '',
  35.     'custTblText'    => '',
  36.     'custTblLink'    => '',
  37.     'custTblPrio'    => '',
  38.     'custTblPriv'    => '',
  39.     
  40. );
  41. ?>


Programowałem proceduralnie (chyba?) gdyz nie widziałem zbytniej potrzeby zaśmiecania pamięci objektami.

klient: Stronka z Downloadem

Przykładowy kanał informacji jest od razu ustawiany po instalacji WT z tym że należy ustawić:

user: public
pass: public

Dodam iż klient jest w fazie alpha więc proszę nie oczekiwać za wiele cool.gif

_____
AHA:
Jeszcze tymczasowy klient w php jakby ktoś się chciał pobawić z protokołem biggrin.gif
  1. <?
  2. $userPass = '4c9184f37cff01bcdc32dc486ec36961';
  3. $userHash = 29;
  4.  
  5. for($i=0; $i<strlen($userPass);$i++){
  6. $tmp=ord($userPass{$i});
  7. $tmp=($tmp*$userHash)%256;
  8. $tmp=$tmp>0xF?dechex($tmp):'0'.dechex($tmp);
  9. $code.=$tmp;
  10. }
  11. echo $code;
  12.  
  13. ?>


$code jest juz zhashowanym hasłem.
Vengeance
Hmm... nie łatwiej było zrobić RSS + sprawdzanie hasła (np. podawane przez url do rssa) + zwykły browser RSSów? :]

No ale... każdy projekt kształci więc się nie czepiam już.
Neotion
Owszem łatwiej ale nie chceliśmy biggrin.gif

Taki nasz projekcik na konkurs, a btw to sie szkolimy i jak dla mnie jest to po prostu łatwiejsze w administrowaniu i obsłudze.

Niby możnaby zrobić RSS ale kumplowi od klienta po pierwsze nie chciałoby się bawić w parser a po drugie mi by się nie chciało administracji do tego robić.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.