Proiectarea Si Realizarea Unei Retele Intranet

=== 4 ===

Anexa A

Specifiicatii Tehnice Detaliate

Pentru Software preturile folosite in acest studiu sunt, prezentate per statie:

95€ Microsoft Windows 98 OEM;

160€ Microsoft Windows XP Pro OEM;

250€ Micrsoft Office XP OEM pentru Windows;

Acestea sunt cele mai mici preturi la revanzare oferite de partenerii nostri de afaceri care comercializeaza software Microsoft (sunt sub preturile pentru end-useri practicate direct de catre Mircosoft – a caror lista o puteti gasi la:

http://www.microsoft.com/romania/licentiere/lista.mspx sau http://download.microsoft.com/download/f/b/4/fb4605bc-f2ab-4f50-8c9d-0870c9a80d66/Lista_preturi_2006_05.xls).

Nu am folosit in calculul noul sistem de licentiere Open Subscription promovat de Microsoft deoarece acesta implica un TCO cu mult mai mare. Alternativ puteti considera ca preturile reprezinta echivalentul a 2 ani de OSL.

35€ Kaspersky Antivirus

Am considerat un pret mediu pentru softwareul antivirus, ar fi imposibil un calcul exact deoarece reteua se poate extinde cu un numar variabil de statii, folositi http://www.kaspersky.com/buykavbo.html

pentru o cotatie exacta.

0€ Debian GNU/Linux;

0€ OpenOffice 1.0.2 pentru Linux;

0€ Linux Terminal Server Project – LTSP;

0€ Orice alt Software Open Source sub licenta GPL.

Costurile sunt 0 atat timp cat software-ul este downloadat (gratuit) de pe Internet.

Ca hardware am folosit:

Statii de lucru terminale:

260€ – Model Powder si 140€ – Model Snow

Statii de lucru independente/server:

350€ – Model Pixie si 900€ Server Hydra

Elemente de networking:

140€ Switch 16 porturi 10/100 Unmanaged AT-FS716-50

750€ Switch 24 porturi 10/100/1000 AT-8224XL-50

50€ costuri aditionale pentru fiecare statie reprezentand alte elemente de infrastructura (cablu, canal cablu, prize mufe, mansoane, manopera instalare retea etc.)

Serviciile de consultanta, instalare si configurare pentru platforma Windows au preturile sugerate de Microsoft (le puteti gasi la:

http://www.microsoft.com/romania/)

820€ per zi de consultanta;

60€ per client/statie pentru instalare;

380€ Workshop (instruire practica);

Pentru serviciile de consultanta, instalare si configurare pentru GNU/Linux, Open Source Software (OSS) am folosit preturile medii practicate pe piata romaneasca.

490€ per zi de consultanta;

20€ per client/statie pentru instalare;

100€ Workshop (instruire practica avasata);

Modalitatea de calcul:

Costuri hardware:

Pentru 6-12 statii am luat in calcul un switch de 16 porturi unmanaged, pentru 18-24 un switch de 24 de porturi managed. Pe langa acesta costurile totale au inclus costurile fiecarei statii, inclusiv conectarea sa in retea.

Costuri software:

Aceste sunt numai costurile licentelor, acolo unde se aplica.

Alte costuri:

In ambele situatii am inclus in pretul total o zi de consultanta, instalarea fiecarui client, iar pentru mai mult de 12 statii am adaugat un workshop pentru instruirea personalului.

IMPORTANT

Preturile sunt exprimate in euro. Preturile pentru hardware si software sunt cele din perioada in care s-a elaborat acest studiu, respectiv primul semestru al anului 2006. Acolo unde preturile folosite de vanzatori au fost exprimate in alte valute acestea au fost transformate in euro folosindu-se un curs aproximativ, valabil in aceasta perioada. Datorita evolutiei rapide a pietei de hardware preturile se vor modifica intr-o perioada relativ scurta de timp.

=== l ===

Introducere

Intranet, un asistent pentru manageri

Creșterea volumului de informații și resurse ale companiilor sau altor organizații a făcut să sporească necesitatea și importanța unor aplicații electronice de organizare internă.

Economia de timp și eficiența în administrare, iată doar două dintre marile beneficii pe care Intranetul le aduce dezvoltării și organizării unei companii.

În epoca exploziei informatice, a devenit o certitudine faptul că un sistem Intra- net bine structurat și la îndemâna utilizatorilor poate eficientiza considerabil activitatea unei companii moderne. Dat fiind că aplicațiile Intranet au fost în general dezvoltate la cererea specifică a companiilor, este normal ca ele să difere foarte mult (ca structură și funcționalități), în funcție de nevoile organizației care le folosește.

O soluție Intranet poate fi unidirecțională (spre exemplu, o aplicație care să permită partajarea documentelor firmei între angajați) sau dezvoltată în mai multe direcții (o aplicație care să cuprindă mai multe module interconectate). Aceasta din urmă ar putea cuprinde un modul dedicat gestionării resurselor umane ale companiei, un altul dedicat administrării financiare, administrării unei biblioteci de documente.

Activitatea salariaților companiei poate fi supravegheată prin intermediul unui modul al unei plicații Intranet (care să urmărească atât timpul petrecut la firmă, cât și activitatea desfășurată). Activitatea angajaților poate fi privită, de asemenea, în relație cu proiectele desfășurate – adăugând Intranetului o componentă de project management.

Aceste instrumente electronice pot ajuta în bună măsură managementul unei companii: un manager poate avea întotdeauna controlul asupra proiectelor în curs, poate vedea gradul de implicare a angajaților în diverse proiecte, cu însărcinările aferente.

De asemenea, având acces la baza de date a resurselor umane, poate aloca noi competențe acolo unde este nevoie (sau poate ușor sesiza nevoia de a angaja persoane noi atunci când volumul de muncă necesar se dovedește foarte mare).

O soluție modernă o reprezintă construirea unei aplicații Intranet proprii, pliate pe nevoile companiei. Organizațiile cu o orientare modernă care înțeleg avantajele aduse de implementarea unui astfel de sistem dedicat optează pentru dezvoltarea unei soluții care să fie în deplină concordanță cu propriile necesități de organizare internă.

Această soluție este preferată din motive ușor de înțeles: posibilitatea de a crea un soft perfect adaptat nevoilor companiei, ușor de înțeles și folosit și posibil de îmbunătățit pe parcurs. În plus, angajarea unei chipe specializate în software pentru a realiza o astfel de aplicație Intranet prezintă anumite beneficii: costul mai mic de dezvoltare (față de achiziționarea unor aplicații Intranet deja consacrate pe piața mondială), posibilitatea de a îmbunătăți aplicația Intranet pe măsură ce nevoile companiei o cer (spre deosebire de produsele consacrate care sunt deja într-o versiune finalå și multe dintre ele – nu pot fi modificate conform cerințelor ulterioare).

Principalele beneficii pe care le aduce Intranetul:

Sporirea competitivității: 90%

Managementul conținutului: 87%

Îmbunătățirea comunicării: 87%

Reducerea costurilor de aprovizionare: 86%

Îmbunătățirea serviciului clienți: 85%

Eficientizarea resurselor umane: 77%

Îmbunătățirea procesului de vânzări: 81%

Reducerea inventarului: 55%

Control sporit asupra procesului de cumpărare: 63%

Scopul Intranetului este:

să partajeze informatiile din interiorul organizației pentru a putea fi utilizate de angajații ei;

să faciliteze lucrul în grup;

să faciliteze lucrul pentru teleconferințe.

Un Intranet folosește, în general, protocoale TCP/IP si HTTP.

În mod normal, organizațiile permit utilizatorilor din Intranet să aibă acces la Internet prin intermediul serverelor (firewall, proxy etc.) care oferã un schimb de informații securizat. Dacă o parte dintr-un Intranet este accesibil clienților, partenerilor, furnizorilor etc. din afara companiei atunci putem spune cã acea parte se numeste Extranet.

Pornind de la aceste idei, in prezentul studiu mi-am propus să identific și să analizez care sunt pașii pentru realizarea si menținerea unei rețele Intranet precum si o aplicație care să ajute la identificarea si gestionarea stațiilor din intranet cu funcții de aflare a anumitor informații referitoare la utilizatorii aplicației sau pur si simplu sa servească ca un mijloc de comunicație in cadrul firmei din care face parte.

Anumite module din aplicație sunt deja folosite in cadrul firmei și ajută la dezvoltarea durabilă a comunicațiilor si societații per ansamblu.

Studiul este structurat in două parți, prima parte are o pondere mai mică fata de a doua. Cuprinzând primele două capitole, prima parte are rolul de a explica procedeele prin care se poate realiza o rețea intranet parcurgând pas cu pas fiecare cerință hardware sau software care poate ajuta la dezvoltarea rețelei precum si modul in care fiecare operează iar uneori propunând și unele recomandări.

In primul capitol este prezentată firma S.C. C.N.D.P.I. ROMSOFT S.A. care se ocupa cu distribuția si vânzarea de echipamente hardware la nivel național.

In capitolul doi sunt prezentate cerințele pe care firma trebuie sa le îndeplinească pentru realizarea unei rețele intranet precum și prezentarea protocoalelor necesare și utilizate în cadrul rețelei cu toate funcțiile pe care poate să le îndeplinească.

Cea de-a doua parte cuprinde trei capitole si reprezintă mult mai exact modul in care este realizată o rețea intranet si aplicațiile care pot ajuta la menținerea, securitatea si utilizarea Intranetului.

De reținut ca pe o rețea intranet pot rula exact aceleași aplicații ca si pe internet numai că utilizatorii sunt numai din cadrul firmei sau persoane autorizate să aibă acces la intranetul firmei.

In capitolul trei este prezentat modul în care este realizat intranetul

Pe lângă abordarea teoretică, pe măsura posibilităților în cadrul studiului am prezentat câteva modele de imbunatățire a rețelei pentru o utilizare mai eficientă.

Capitolul 1

Prezentarea firmei C.N.D.P.I. ROMSOFT S.A.

1.1 Istoric

Înainte de 1989, Romsoft era o secție a Institutului de Cercetări în Informatică (ICI) și se numea Laborator "Biblioteca Națională de Programe".
În 1990, Biblioteca Națională de Programe s-a desprins de ICI și a devenit o unitate economică cu personalitate juridică, numită Centrul Național de Difuzare Produse Informatice (C.N.D.P.I.), înregistrată în 1991 sub marca Romsoft.

În 1992 Romsoft devine societate pe acțiuni, statul român deținând pachetul majoritar. Din 1999 capitalul social al firmei este integral privat. Firma s-a axat pe parcurs pe distribuția de hardware, software-ul deținând o pondere din ce în ce mai mare în cifra de afaceri. Pentru a reflecta această realitate, în 2001 Romsoft și-a adaugat în denumire sintagma "The hardware company".
În prezent Romsoft este unul dintre cei mai importanți distribuitori de tehnică de calcul din România, cu acoperire națională prin rețeaua de parteneri locali. Continua extindere a firmei și nevoia comunicațiilor au forțat înființarea unui departament IT care să asigure o bună comunicare cu toate sucursalele companiei care momentan se extind în toată țara în nu mai puțin de 44 de orașe cu mai multe sucursale în București și orașele mari.

Rețeaua dezvoltată în cadrul firmei a permis o coordonare mult mai rapidă a centrelor comerciale și supravegherea mai atentă a angajaților.

Din 2002 a avut loc un upgrade al rețelei și o securizare prin introducerea de VPN(Virtual Private Network), care a permis monitorizarea live a camerelor de supraveghere din magazinele de distribuție cât și a bazelor de date.

Odată cu VPN s-a dezvoltat foarte repede o aplicație internă ce permitea verificarea în timp real a vânzărilor din magazine cât și a efectuării de BACKUP a datelor de mai multe ori pe zi.

În prezent se lucrează la dezvoltarea comunicațiilor prin intermediul Intranetului deja existent ceea ce presupune instalarea a noi servere mai performante.

1.2 Informații generale

Societate cu capital 100% românesc, este unul dintre cei mai importanți distribuitori de tehnică de calcul din România. Gama de produse oferite de Romsoft acopera întregul spectru de componente și periferice, Romsoft fiind un furnizor de soluții complete (one-stop shop). Zona de piață acoperită de vânzările Romsoft o reprezintă întreg teritoriul țării, activitatea companiei fiind prin excelență una de distribuitor.
Compania este certificată conform standardului de management al calității ISO 9001: 2000, de către Germanischer Lloyd România, membru al Germanischer Lloyd Germania.
Romsoft are în prezent 850 de angajați, birouri centrale în suprafața de aproximativ 633 mp, depozite centrale în suprafața de aproximativ 3100 mp, precum și spații comerciale în magazine de peste 5000 mp.

Datorită creșterii constante în ultimii ani a pieței de retail, Romsoft a decis, în toamna anului 2001, să abordeze și acest segment prin deschiderea unui lanț propriu de magazine:

Depozitul De Calculatoare – este deja o prezență bine-cunoscută pe piață, datorită prețurilor atractive ("de depozit"), gamei variate de produse, precum și datorită posibilității de cumpărare în rate fără avans.

Au fost deja deschise 11 magazine în București, la următoarele adrese:

str.Stirbei Voda, nr. 172

str. I.C. Bratianu, nr. 6, sect. 3

b-dul Decebal, nr. 18

b-dul Ion Mihalache, nr. 109

sos.Stefan cel Mare, nr. 22

Calea Mosilor, nr. 294, bl. 42, parter, sect. 2

bd. Iuliu Maniu, nr. 59, bl. 10A, parter, sect. 6

sos. Oltenitei, nr. 162, bl. 3, parter, sect. 3

Bd. 1 mai nr. 15, parter.

UNIREA SHOPPING CENTER, et. 3, corp central

B-dul Camil Ressu, nr 16 Bl.4bis

ROMSOFT are în plan extinderea lanțului de magazine la nivel național, prin deschiderea unui număr tot mai mare de magazine în principalele orașe ale țării.

Craiova – str. Popa Sapca, bl. 7-14

Pitesti – Blvd. Republicii, nr. 162-164

Ploiesti – b-dul. Republicii, nr. 197, bl. 5C1

Iasi – str. Costache Negri, nr. 60, bl. CL21

Constanta – b-dul Tomis, nr. 142, bl. TD2A

Galati – b-dul Siderurgistilor, bl. SD2C, ap. 5, parter

Bacau – b-dul. Unirii, bl. 15 SCD, parter

Brasov – b-dul 15 Noiembrie, nr. 50

Arad – str. Stefan Augustin Doinas, nr. 2-4, bl. M7, parter

Sibiu – Parcul Tineretului, bl. 5, parter, tronson B

Ramnicu Valcea – b-dul Tudor Vladimirescu, bl. 5, parter

Alba Iulia – Str. Nicolae Goldis Nr.31

Deva – b-dul 22 Decembrie, bl. 4, parter

Timisoara – Calea Aradului, nr. 30, SCB

Baia Mare – BD. Republicii , nr. 15

Targu Mures – b-dul 1 Decembrie 1918, nr. 23

Resita – str. I.L. Caragiale, nr. 5

Oradea – b-dul General Magheru, nr. 6

Cluj-Napoca – str. Fabricii, nr. 1, bl. M5

Suceava – str. Universitatii, nr. 27, bl. D1, parter

Drobeta Turnu Severin – b-dul. Tudor Vladimirescu

Sfantu Gheorghe – B-dul. Gen. Grigore Balan, nr. 30

Satu Mare – Str. Careiului, bl. C2-4

Slatina – Bd. Nicolae Titulescu, bl. 41

Alexandria – str. Bucuresti, bl. M4, parter

Focsani – Str. Cuza Voda, bl.30, parter

Targu-Jiu – Str. Victoriei, nr. 138

Tulcea – Str. Babadag, nr. 7, bl. B3, parter

Slobozia – Str. Matei Basarab, bl. U, parter

Vaslui – Str. Republicii, nr. 363, sc. A, parter

Piatra Neamt – B-dul. Decebal, nr. 71, bl. E2, parter

Braila – Str. 1 Decembrie 1918, Nr. 5, parter

Targoviste – Str. Libertatii, bl. A3

Zalau – Str. Gheorghe Doja, Nr. 69

Odorheiul Secuiesc – Str Rakoczi Ferenc, nr. 14

Timisoara2 – Str. Gheorghe Lazar, nr.30-32

Iasi2 – Str. Pacurari 124 bl.583 sc.b parter

Bistrita – PIATA CENTRALA nr.1

Giurgiu – Sos. Bucuresti, bl. 47/3D ap.81, parter

Pitesti2 – Bd. Nicolae Balcescu, nr 131

Buzau – str. Unirii , bloc 16 H , parter

Borsa – str. Decebal , nr. 1

Viseu – str. 22 Decembrie , bloc S23

Această extindere urmată de afilierea cu mai mulți distribuitori sau chiar producători a dus la o extindere rapidă fiind momentan cea mai mare firmă IT de pe teritoriul României distribuind produse hardware și software de la producători renumiți.

1.3 Distribuție

Zona de piață acoperită de vânzările Romsoft o reprezintă practic întreg teritoriul țării, activitatea companiei este prin excelență una de distribuitor, având o foarte largă rețea de distribuție.
Pentru o acoperire optimă a teritoriului, Romsoft și-a format depozite la parteneri în toate zonele importante ale țării.
    Traseul Constanța – livrare zilnic de marți până vineri

Slobozia, Constanța

Traseul Brăila – livrare miercuri

Buzău, Brăila, Galați

Traseul Moldova – livrare marți, miercuri

Buzău, Focșani, Onești, Bacău, Roman, Piatra Neamț, Suceava, Rădăuți, Iași, Vaslui

Traseul Ardeal – livrare joi, vineri

Sibiu, Alba Iulia, Târgu Mureș, Cluj, Oradea, Arad, Timișoara

Traseul Brașov – livrare zilnic de marți până vineri

Brașov, Pitești, Câmpulung – Muscel, Ploiești

Traseul Craiova – livrare vineri

Craiova, Râmnicu Vâlcea, Drobeta – Turnu Severin, Slatina

1.4 Organigrama C.N.D.P.I. ROMSOFT S.A.

Capitolul 2

Instrumente folosite pentru dezvoltarea Intranetului

2.1 Cerințe hardware și software pentru realizarea unui Intranet

Intranetul este o rețea locală privată, care se bazează pe tehnologiile și aplicațiile Internet. Un Intranet aparține unei anumite firme și se construiește pe suportul fizic și logic al rețelei locale. Adică, peste software-ul necesar implementării rețelei locale, se adaugă software-ul pentru crearea, implementarea și administrarea serviciilor de tip Internet: site Web intern, mesagerie electronică, lucru colaborativ prin discuții și subscrieri pe grupuri de dialog, etc.(Fig.2.1)

Fig. 2.1 – Reprezentare schematică a unei rețele Intranet

Instrumentele necesare pentru dezvoltarea Intranetului sunt bazate pe instrumente existente pentru Internet, incluzând protocoale, alte resurse si servicii informaționale (information services)

2.1.1 Instalarea TCP / IP

Stiva de protocoale TCP / IP ce stă la baza Internetului trebuie instalate pe rețeaua proprie pentru a putea activa serviciile unui Intranet. Problema se soluționează ușor, deoarece TCP / IP este parte integrantă a multor sisteme de operare, incluzând Windows 95, Windows NT și UNIX.

2.1.2 Crearea serviciilor Web cu HTTP.

Un Intranet trebuie să conțină neapărat servicii Web. Cheia pentru Web este protocolul http (Hypertext Transfer Protocol). Acest protocol asigură mijloacele de a naviga de la un document la altul și de a indexa documente.

Accesarea documentelor publicate pe Intranet implică comunicații între browsere (clienți – Web) și server. Browserul se ocupă de interpretarea comenzilor de transfer hipertext și de comunicarea cererilor. Programul HTTPD (Hypertext Transfer Protocol Daeman) procesează cererile transmise de browsere. Acest program (HTTPD) se află instalat pe serverul Web.

Înainte de instalarea software-ului de server trebuie să se decidă platforma (sistemul de operare) pe care va rula serverul de Web, întrucât software-ul de Web server și aplicațiile de management ale serverului sunt disponibile pe aproape orice platformă.

2.2 Modul de organizare și exploatare a Intranetului

2.2.1 Ce reprezintă Intranetul ?

Prin „ Intranet” se înțelege utilizarea tehnologiilor Internet, în scopul legării într-un tot unitar a resurselor informaționale ale unei organizații.

Ceea ce Intranetul aduce nou în domeniul IT este la nivel conceptual și anume nu presupune noi tehnologii, ci realizează integrarea celor existente, intr-o forma ușor accesibilă pentru utilizatorii unei organizații.

2.2.1.1 Ușor de învățat.

Precizarea caracterului facil (ușor de învățat) motivează răspândirea și acceptarea – cu predilecție în lumea corporațiilor mari – cu o viteză impresionantă a acestui nou concept. Practic, utilizatorul Intranetului nu trebuie să parcurgă decât o singură dată curba de învățare a specificațiilor unei interfețe meniuri, truse de butoane, unelte, dialoguri etc., ca fiind aceeași indiferent de informațiile accesate / prelucrate.

2.2.1.2 Independența

Fața de localizarea efectivă a utilizatorului. Din orice punct al globului, dispunând de hardware-ul si software-ul necesar, precum și eventualele informații, referitoare la securitate (parole, limite de acces) orice utilizator poate efectua operațiile disponibile într-un sistem Intranet.

2.2.1.3 Costul scăzut

De menținere si întreținere a unui sistem Intranet. Datorită faptului că există o mare varietate de produse software dezvoltate pentru tehnologia Internet, disponibile la prețuri relativ mici, Intranetul devine încă de la început o soluție eficientă, din acest punct de vedere.

Utilizatorii Intranetului beneficiază de experiența acumulată la folosirea Internetului.

2.2.1.4 Facilitarea comunicării

Întreg personalului organizației. Intranetul este instrumentul cvasi-acoperitor pentru nevoile legate de gestiunea informațiilor si lucrul în grup ale unei organizații .

În Fig.2.2 sunt reprezentate cele două componente integrate în Intranet, cu ajutorul cărora se realizează o structură optimă de sistem informațional.

Fig.2.2 Integrarea tehnologiilor în Internet

Modelul de interconectare între Intranet și Internet este ilustrat în Fig. 2.3

Acesta arată cum utilizatorii din cadrul Intranetului au acces spre Internet și structura rețelei interne a organizației, care poate fi construită pe departamente cu multiple legături între acestea și cu resurse integrate local sau referințe exact din Internet.

Fig. 2.3 – Sistemul de informații al organizației

La acest ultim nivel se poate configura o platformă unică informațională, în care să se lege între ele rețelele locale din diferite departamente ale unei organizații, după cum este reprezentat în Fig.2.4.

Fig. 2.4. Interconectarea rețelelor locale

Pentru Intranet este nevoie de unul sau mai multe servere, care să asigure serviciile esențiale, printre care serviciul de poștă electronică și Web. Software-ul necesar serviciului Web este folosit pentru a afișa documentele hipertext (HTML) publicate pe Intranet (în pagini Web). Publicarea pe un Intranet este diferită de publicarea pe Internet, în sensul că pentru cea din urmă documentele sunt publice tuturor celor cu acces la Internet. Documentele de pe Intranet sunt disponibile numai pentru cei care au acces la Intranet, adică angajații companiei. Mai presus de toate, un Intranet are nevoie de aplicații și aici intervine Java. Cu Java se pot crea aplicații puternice si sigure, independente de platformă. În plus, Java oferă o interfață grafică complexă. Spre deosebire de programele scrise în alte limbaje, programele Java nu sunt mari consumatoare de resurse.

La întrebarea, dacă o organizație are nevoie de un Intranet, răspunsul este „ da”, chiar și pentru organizațiile mici, și iată următoarele argumente :

Intranetul este o soluție ieftină – în general serviciile Intranet nu cer cantități mari de resurse, deci nu va fi nevoie sa folosim calculatoare foarte performante pentru a asigura serviciile. Se pot folosi unele calculatoare care sunt pe post de servere. Serverele Intranet sunt ușor de administrat, nefiind nevoie de o specializare suplimentară pentru aceasta.

Intranetul aduce economii. Dezvoltând aplicații specifice companiei, aceasta nu mai are nevoie să cumpere software scump.

Intranetul este o soluție eficientă – pentru a informa angajații despre politica de marketing a organizației. De exemplu : un document de 200 de pagini trebuie să fie transmis salariaților unei organizații. Soluția devine elegantă, dacă acest document este publicat și indexat în Intranet. În acest fel devine foarte ușor accesibil celor din interiorul organizației, dar inaccesibil din exterior. Soluția este mai elegantă și mai eficientă, decât transmiterea documentului prin e-mail sau prin înzestrarea angajaților cu câte o xerocopie a documentului.

2.3 Moduri de organizare

La baza organizării Intranetului exista trei modele :

Centralizat

Descentralizat

Combinat

Decizia asupra unuia dintre aceste modele trebuie să se bazeze pe responsabilitatea și controlul asupra resurselor Intranetului, pe mărimea organizației și numărul resurselor.

În general se apreciază ca modelul combinat este cel mai potrivit.

Modelul centralizat

În cadrul acestui model toate resursele de calcul sunt centralizate într-o singură locație, în genul centrelor de calcul fizice.

Modelul descentralizat

Modelul acesta a fost introdus în momentul apariției conceptului client- server. Resursele de calcul sunt răspândite în organizație și se află sub coordonarea departamentelor în care se găsesc calculatoarele . De exemplu – rețelele alcătuite din servere și stații de lucru de mare putere.

Modelul combinat

Modelul acesta a apărut atunci când administratorii de rețele au realizat ce pericol poate reprezenta organizarea descentralizată. În modelul combinat, există un centru unde sunt stabilite politici generale, iar departamentele individuale sunt libere să lucreze conform cu aceste politici (fig. 2.5)

Fig. 2.5 – Modelul combinat

În cadrul modelului combinat, Intranetul are un server de Web centralizat care leagă toate serverele departamentale. Administratorul acestui server de Web este responsabil pentru întreținerea sa și actualizarea legăturilor la resurse în întreaga organizație (adică stabilește ce departament are acces și la ce fel de tipuri de date).

Departamentele individuale sunt responsabile pentru întreținerea serverelor proprii. Câte o persoană din fiecare departament poate fi responsabilă pentru resursele Intranet ale acelui departament.

În felul acesta este eliminat controlul centralizat asupra tuturor departamentelor, dar nici nu este lăsată libertatea totală a persoanelor din diferite departamente asupra Intranetului. Astfel angajații unui anumit departament nu pot accesa paginile de Web adresate altui departament.

2.4 Securitatea Intranetului

Într-un Intranet, problemele de securitate sunt următoarele :

Securitatea Web serverului

Securitatea serviciilor TCP / IP

Securitatea Web browserelor clienților pentru a limita ceea ce pot face ele.

O problemă importantă în cadrul discuțiilor pe marginea securității Intranetului este cea referitoare la modalitățile de accesare : “ dacă există sau nu posibilitatea de acces din exteriorul companiei, via Internet”

Acest lucru este de dorit în anumite cazuri, mai ales pentru persoanele din companie care călătoresc mult (departamentul marketing) și au nevoie de informații stocate în cadrul Intranetului companiei lor.

Pentru acele companii care se decid să permită accesul din exterior (Internet) problemele se complică puțin.

2.5 Securitatea Web serverului

a) Autentificarea la nivel de utilizator / parolă

b) Limitarea accesului prin intermediul adresei de rețea

c) Criptarea tranzacțiilor

Aceste trei tehnici se pot combina în moduri variate, creând mecanisme de securitate extrem de puternice și totodată flexibile.

2.5.1 Autentificarea prin nume utilizator / parolă

Este nivelul de bază, asigurat de majoritatea serverelor de Web. Adică atunci când un utilizator dorește să acceseze o anumită pagină Web, pe ecran apare o casetă de dialog care îi cere utilizatorului să-și introducă numele și parola. Măsurile de securitate se pot aplica la nivel de directoare, subdirectoare și /sau fișiere, folosind fișiere LACF (Local Acces Configuration File).

2.5.2 Autentificarea pe baza adresei de rețea

Majoritatea serverelor de Web au și un alt mod de autentificare, folosind adresa IP (numerică) sau simbolică a stațiilor client, ca criteriu de acces. Fiecare cerere de document a unui browser de Web conține adresa IP numerică a calculatorului care emite cererea. Serverul caută numele de host al calculatorului care a făcut cererea folosind această adresa de IP și serviciul DNS (Domain Name Service). Se pot seta reguli de acces în fișierele de GACF (Global Access Configuration File) și apoi în fișierul LACF, bazându-se pe aceste adrese, astfel încât anumite calculatoare (cu anumite adrese) sa nu aibă acces la Web server.

2.5.3 Criptarea tranzacțiilor

Securitatea Intranetului poate fi îmbunătățită folosind tranzacții Web criptate. Există mai multe soluții de criptare pentru Web.

Dintre multele propuneri, doar două au ajuns la forma de standard :

Secure HTTP (S – HTTP)

Secure Socket Lazer (SSL)

Din păcate, cele două protocoale nu sunt compatibile între ele.

În acest caz se poate folosi doar un protocol, doar dacă serverul de Web și browserele clienților implementează acel protocol.

Valoarea Intranetului este de cele mai multe ori prea mare pentru a fi permis oricui din afară să pătrundă fără nici o restricție. În acest caz, pe lângă măsurile de securitate prevăzute mai sus, se impune folosirea unui firewall.

Firewall este un dispozitiv care stă între Intranetul propriu și Internet și are scopul de a limita accesul spre sau dinspre Intranet în exterior, bazându-se pe diferite politici de acces (Fig.2.6)

Fig. 2.6 – Firewall hardware

2.6 Intranetul virtual

În prezent mai multe organizații folosesc Internetul ca mijloc de comunicație între stațiile din cadrul diferitelor departamente pe care le conduce, în locul rețelelor private.

Acest mod de lucru, implică apariția numeroaselor conexiuni către Internet, din cadrul organizației. Internetul devine astfel coloana vertebrala (backbone) a rețelei organizației. Deși aceasta abordare prezintă un grad ridicat de risc, multe organizații o folosesc pentru a schimba date neconfidențiale între departamente.

Mai multe firme producătoare de firewall-uri au pus la punct un protocol numit Virtual Private Network (VPN) reprezintă o extensie a mecanismelor standard pentru firewall-uri de autentificare și criptare a informațiilor ce circula între stații din Internet.

Mai precis folosind Private Network (VPN), o stație poate accesa informații confidențiale situate pe o altă stație oriunde în Internet, într-un mod sigur.

Datele care pleacă în Internet sunt criptate și vor fi decriptate la celalalt capăt al conexiunii. În concluzie, rețelele VPN permit comunicarea sigura si ieftina intre stații aflate oriunde in Internet.

2.7 Intranetul și bazele de date

În orice organizație, companie, firmă, fie ea mică, medie sau mare, este necesar să se păstreze, actualizeze și să se regăsească rapid informații. Posibilitatea de acces rapid la informații implică următoarele activități :

Crearea unei baze de date

Întreținerea bazei de date

Securitatea bazei de date.

2.7.1 Metode de acces la bazele de date

Exista extrem de multe metode de a stoca si regăsi date, printre care cele mai răspândite sunt :

Modul nativ

ODBC (Open DataBaze Connectivity)

SQL (Structured Query Language).

Metodele native sunt folosite în special de creatorii de drivere.

2.7.1.1 ODBC

Este un standard elaborat de firma Microsoft și reprezintă o interfață pentru accesul bazelor de date într-un mod standard, dintr-o mulțime de tipuri de surse. Dacă sursa care dorește accesul la o baza de date suportă ODBC, programul comunică cu acea bază de date.

2.7.1.2 SQL

Are o metodă standard de integrare a bazelor de date din diferite tipuri de surse. SQL este un standard adoptat în 1986, iar în 1992 a fost complet rescris și noul limbaj a fost numit SQL2.

Bazele de date pot fi ușor accesate și din Java. Există mai multe moduri de a face aceasta:

Acces printr-un server de Web

Server proprietar

Acces prin rețea

Acces direct

2.8 Diferențe între Internet și Intranet

Între Internet și Intranet sunt următoarele diferențe :

Internetul este zona informațiilor publice, în timp ce Intranetul se întâlnește cu predilecție în zona informațiilor cu caracter privat.

În Intranet apare o preocupare deosebită pentru securitate și acces restrictiv, bazat pe parole, modalități de autentificare sau sisteme firewall.

Intranetul trebuie să asigure și modalități de difuzare și de partajare a cunoștințelor, precum și lucru în colaborare, în echipe mai mult sau mai puțin numeroase.

Se remarcă o apropiere mai mare între domeniul bazelor de date și cel al Intranetului, față de relația baze de date – Internet. Bazele de date răspund dezideratului de regăsire rapidă a informațiilor.

Informația disponibilă în Intranet va avea întotdeauna un stăpân (o persoană responsabilă cu publicarea și actualizarea ei) si va fi limitată la dimensiunile organizației. În cazul Internetului, nici o persoana și nici o organizație nu-și asumă responsabilitatea asigurării globale a informațiilor vehiculate. Nivelul global și caracterul public al accesului la Internet face imposibil controlul total.

Utilizatorul de Internet caută divertisment, știri curente, referințe bibliografice, contactul uman cu un prieten sau necunoscut, iar mai recent facilitați de comerț-afaceri.

Utilizatorul de Intranet este bine poziționat în cadrul organizației, el are sarcini precise, obligații si atribuții, având în acest sens la dispoziție o sumă de proceduri manuale și automate, bine definite.

Capitolul 3

Rețeaua Intranet în cadrul firmei

O rețea de calculatoare reprezintă un grup de echipamente de calcul ce pot partaja în comun resurse hardware (echipamente) și software (fișiere, foldere, servicii).

3.1 Caracteristicile Intranetului existent în firma Romsoft

In cadrul firmei exista un server central care își oferă resursele spre a fi utilizate de stațiile de lucru care își oferă resursele în rețea. Exemplu de resurse: imprimante, foldere, fișiere, discuri. Exemplu de servicii: gestionarea accesului la foldere și fișiere partajate(file server – server de fișiere), gestionarea imprimantelor de rețea (print server – server pentru imprimante), gestionarea mesageriei electronice ( comunication server – server de comunicații).

Stațiile de lucru, sau stații client beneficiază de serviciile oferite de unul sau mai multe server.

In timp, o dată cu dezvoltarea firmei s-a ajuns la concluzia că un server nu este suficient așa ca s-a demarat o extindere a intranetului deja existent ajungându-se la forma actuala.

Așa că în urma acestei dezvoltări s-au introdus în intranet mai multe servere utilizate numai pentru anumite ramuri.

File Server – server de fișiere

Acest tip de server constă dintr-un calculator care pune la dispoziția celorlalți participanți în rețea informațiile ( fișiere, foldere ) memorate pe mediile sale de stocare (hard disc, CD-ROM etc.). În același timp, gestionează accesul partajat la acestea.

Acest tip de servere au fost puse in fiecare sediu legate toate intre ele printr-un VPN (Virtual Private Network) care la rândul său are un server central.

Accesul la toate serverele de fișiere se poate face de oriunde din rețea precum si din afara ei prin autentificare.

Print Server – server pentru imprimare

Un calculator sau un echipament special, care pune la dispoziția celorlalți participanți în rețea imprimanta sau imprimantele la care este conectat si gestionează accesul partajat la acestea.

In cadrul firmei exista foarte multe servere de acest gen fiind accesate numai din cadrul departamentului respectiv.

Comunication server – server de comunicații

Un calculator care pune la dispoziția celorlalți participanți ai rețelei dispozitivele de comunicații la care este conectat (un modem de exemplu) și gestionează toate aspectele legate de mesageria electronică.

Acest gen de server este folosit ca mail server unde toți angajații pot fi informați de anumite protocoale sau informații pe care altfel le-ar afla mai greu. Serverul de mail poate fi accesat la adresa http://mail.romsoft.ro/default/login.php chiar si din cadrul rețelei intranet.

Server DHCP

Server existent în cadrul unei rețele bazate pe protocolul TCP/IP care asigură alocarea și configurarea acestui protocol pentru stațiile client conectate la rețea.

Exista un singur astfel de server care asigura alocarea corectă a adreselor IP in cadrul Intranetului.

Server DNS

Server existent în cadrul unei rețele bazate pe protocolul TCP/IP, care asigură o corespondență între adresa de IP numerică a unui nod de rețea și un nume alfa numeric prin care poate fi identificat acel nod.

Folosit pentru Intranet si care aloca nume tuturor serverelor din cadrul rețelei, astfel daca se dorește accesarea unui server se poate numai după nume ca un exemplu ar fi http://www.tehnic.local

De asemenea, acest server DNS a ajutat si la realizarea unui alt mailserver intern intre anumite departamente pentru transferul mai rapid si mai sigur de informații.

Stație de lucru, sau stație client

Echipamente de calcul care beneficiază de serviciile folosite de unul sau mai multe servere, având acces la resursele hardware si software partajate.

Exista foarte multe astfel de sisteme care folosesc resursele partajate.

Peer(egal)

Echipamente de calcul ce pot îndeplini ambele roluri funcționale, de server și client.

Un echipament de calcul poate să ofere spre partajare una sau mai multe din resursele sale(exemplu: ceilalți utilizatori ai rețelei să poată lista la imprimanta conectată la respectivul calculator) și în același timp poate accesa celelalte resurse partajate din rețea, de exemplu sa-și stocheze fișierele pe hard-discul altui echipament din rețea. Deci, același echipament poate fi și server și client.

Se practica de obicei in departamente unde au loc transferuri foarte mari de date iar folosirea serverului ca intermediar ar lua mai mult timp.

Peer-to-peer, sau egal – la – egal

Echipamentele de calcul pot juca rol de server și de client. De exemplu un echipament poate accesa un folder stocat pe un calculator de rețea (deci este client) și în același timp poate oferi spre partajare imprimanta sa (are rol de server).

Acest tip de rețele sunt, în general, de dimensiuni reduse (10-30 echipamente).

În Fig.3.1 , calculatorul PC 1 oferă spre partajare un folder și modemul la care este conectat. În aceasta calitate el îndeplinește rol de server. Calculatorul PC 2 oferă spre partajare un folder și imprimanta la care este conectat și astfel deține rolul de server.

Prin intermediul rețelei, un utilizator de pe calculatorul PC 1 poate lista la imprimanta conectată fizic la calculatorul PC 2 și astfel, calculatorul PC 1 îndeplinește în acest moment rol de client al rețelei.

Un utilizator de pe calculatorul PC 2 poate modifica un fișier stocat în folderul oferit spre partajare de calculatorul PC 1. Astfel, calculatorul PC 2 joaca rolul de client.

Client-server

Echipamentele de calcul au roluri bine definite, de server sau de client, nu pot să dețină ambele roluri în același timp.

În Fig. 3.1, calculatorul server oferă spre partajare un modem si o imprimantă. Acestea pot fi accesate prin intermediul rețelei de către cele două calculatoare client.

În acest caz, resursele partajate sunt conectate fizic numai la server, iar calculatoarele de tip client pot doar accesa aceste resurse(Fig. 3.2).

Fig. 3.1 – Rolurile Serverelor

Sunt cazuri în care echipamentele partajate sunt conectate direct la rețea, exemplu: imprimantele de rețea(Fig. 3.3).

Fig. 3.2 – Imprimante de rețea

3.2 Mediul de transmisie ( cabluri, unde radio, microunde)

O data cu apariția a noi sedii ale firmei a fost necesară folosirea mai multor medii de transmisie în funcție de distanța dintre sediul central si centrele de vânzări ale firmei.

Mediul de transmisie reprezintă calea fizică de transmitere a informației în cadrul rețelei ( cabluri, unde radio, microunde, etc.). Mediul de transmisie este cel care asigură conexiunea fizică între echipamentele rețelei.

Mediul de transmisie reprezintă legătura fizică prin intermediul căreia calculatoarele din rețea pot comunica.

Modul în care este realizată conectarea la mediul de transmisie definește topologia fizică a rețelei.

3.2.1 Caracteristicile mediului de transmisie

distanța maximă pe care o acoperă

distanța minimă între două echipamente de rețea

capacitatea de transmisie a datelor

costul

Cablu de tip TP(Twisted Pair)

Se bazează pe mai multe perechi de fire din cupru izolate. Cel mai des întâlnit tip de cablu TP este cablul UTP(Unshielded Twisted Pair Cable), utilizat în telefonie. Perechile de fire de cupru izolate sunt introduse într-un înveliș de plastic. Cablul UTP este clasificat în categorii, categoria 5 fiind cel mai des întâlnită în rețelele de calculatoare. Cablul de tip STP(Shielded Twisted Pair) deține un strat suplimentar de izolare prin inserarea perechilor într-un tub izolator care la rândul lui este introdus într-un înveliș de plastic.

Acest tip de cablu este utilizat în interiorul sediilor fiind mai accesibil.

Cablu coaxial

Cablul coaxial este format din două fire conductoare ce dețin o axă comună. Două tipuri de cabluri coaxiale sunt foarte des întâlnite în cablarea rețelelor locale: cablu coaxial gros și cablu coaxial subțire, acesta din urmă fiind preferat datorita ușurinței la instalare și costului scăzut. În imagine este arătat cablul coaxial subțire.

Mai este utilizat doar in departamentele mai puțin importante unde majoritatea aplicațiilor nu implica necesitatea comunicării rapide.

Fibra Optică

Deși are un preț ridicat iar instalarea sa este dificilă și necesită unelte specializate și experiență, fibra optică este utilizată datorită distanțelor mari pe care le poate acoperi și datorită caracteristicilor sale pentru transmisia datelor având atenuare a semnalului mică și imunitate la interferențe electromagnetice.

Se folosește la interconectarea serverelor din sedii mai apropiate, de preferință din același oraș.

3.3 Protocolul ( TCP/IP)

Protocoalele asigură comunicația între echipamentele rețelei. Pentru ca echipamentele sa poată comunica, trebuie sa aibă instalat același protocol. Exemple de protocoale: TCP/IP( specific Internet-ului și rețelelor UNIX ), IPX/SPX ( specific rețelelor Novell Netware), NetBEUI ( specific rețelelor Microsoft de dimensiune redusă)etc.( Fig.3.3)

Fig. 3.3- Comunicarea prin protocolul TCP/IP

3.4 Tipuri de rețele existente în firmă

LAN ( Local Area Network) – rețea locală

Conectează un număr de echipamente în cadrul unei clădiri sau instituții. Distanța maximă dintre echipamente este de până la un kilometru.

MAN (Metropolitan Area Network) – rețea la nivel de metropolă

Conectează un număr de echipamente individuale și/sau rețele locale a căror arie de răspândire este la nivelul unei localități.

Distanța maximă dintre elementele rețelei poate fi de la zeci de km până la sute de km.

WAN (Wide Area Network) – rețea de larga răspândire

Rețea realizată prin intermediul firmei RDS care a pus la dispoziția companiei Romsoft serviciile sale de internet și telefonie.

Prin intermediul rețelei RDS firma a conectat toate sediile la Internet in acest mod fiecare sediu putând fi la rândul lui conectat la o rețea VPN prin autentificarea in cadrul rețelei la serverul de la adresa vpn.romsoft.ro

Astfel formând o rețea națională de genul WAN care este conectată la serviciile oferite de Intranet, adică de la orice sediu poate fi accesat orice server.

3.5 Conectarea la mediul de transmisie

Placă de rețea, sau adaptor de rețea

Este un dispozitiv hardware care intermediază legătura între două sau mai multe calculatoare prin mediul de transmisie(cabluri) al rețelei la care este conectat. Un adaptor se mai numește placă de rețea sau LAN card, sau LAN adaptor. Placa de rețea transformă informațiile transmise de calculatorul la care este conectat în semnale electrice ce pot fi trimise printr-un cablu de rețea și invers. În funcție de viteza cu care pot fi transmise informațiile, există două tipuri de adaptoare de rețea:

Adaptor rețea de tip “Ethernet” care permite conectarea prin cablu de rețea coaxial și/sau cablu de rețea de tip UTP și permite o viteză maximă de transmitere a datelor de 10Mbps.

Adaptor rețea de tip “Fast Ethernet” care permite conectarea numai prin cablu de rețea de tip UTP și permite o viteză maximă de 100 Mbps.

In Interiorul firmei cea mai răspândita gama de adaptoare sunt Fast Ethernet.

3.6 Dispozitive utilizate pentru a extinde limita impusă de mediul de transmisie

Repeater (repetor)

Utilizat pentru depășirea limitei maxime impuse de tipul cablului sau pentru a interconecta segmente de rețea bazate pe cabluri diferite. Când se dorește depășirea limitei maxime impuse de tipul cablului, se utilizează dispozitive speciale care au rolul de a prelua și de a amplifica semnalul de pe un segment de cablu și a-l transmite pe următorul segment. Astfel de dispozitiv se numește repetor și se utilizează în general în cazul rețelelor bazate pe cablu coaxial. Repetoarele pot fi de două feluri: repetoare care transmit mai departe semnalul primit și repetoare care sunt capabile să regenereze semnalul, eliminând interferențele nedorite. Figura 3.4 reprezintă două segmente de rețea bazată pe cablu coaxial subțire, cu un repetor.

Fig.3.4 – Repetor pentru extinderea limitei de distanta impusă de tipul cablului

Pe lângă extinderea distanței maxime impuse pentru un segment de cablu, repetoarele mai pot fi utilizate și în vederea conectării mai multor segmente de rețea cablate cu ajutorul unor cabluri diferite.

Hub(concentrator)

Utilizat în cadrul rețelelor cu tipologie de tip stea, care presupune ca există un element central la care se conectează toate celelalte echipamente ale rețelei. Hub-ul este elementul central. Un hub se poate utiliza pentru depășirea limitei maxime impuse de tipul cablului, sau pentru a interconecta segmente de rețea bazate pe cabluri diferite. Hubul se mai numește concentrator și este utilizat în cadrul rețelelor bazate pe UTP.

Topologia fizică a acestor rețele necesită un element central la care vor fi conectați toți ceilalți participanți ai rețelei. Hubul joacă un rol de repetor deoarece el transmite mai departe semnalele primite. El mai poartă și denumirea de repetor multi-port sau hub repetor. Figura de mai jos reprezintă două segmente de rețea bazată pe cablu UTP, cu două huburi(Fig. 3.5).

Fig. 3.5 – Hub pentru extinderea limitei de distanta impusă de tipul cablului

Pe lângă extinderea distanței maxime impuse pentru un segment de cablu, huburile mai pot fi utilizate și în vederea conectării mai multor segmente de rețea cablate utilizând cabluri diferite. De exemplu, în figura 3.6, un segment de cablu coaxial subțire este conectat prin intermediul unui hub cu un segment de rețea bazată pe UTP.

Fig.3.6 – Hub pentru interconectarea a două rețele bazate pe cabluri diferite

Bridge(punte)

Dispozitiv utilizat pentru extinderea distanței maxime impuse de mediul de transmisie, dar care îndeplinește și funcția de optimizare a traficului din rețea, prin filtrarea selectivă a datelor transmise. Aceste dispozitive sunt capabile de a transmite selectiv mesajele numai pe segmentele ce conțin destinatarii mesajelor, reducând astfel traficul din rețea, pentru o rețea formată din mai multe segmente. Spre deosebire de un bridge, un repetor transmite semnalele mai departe, indiferent dacă destinatarul lor se află conectat la acel segment de rețea sau nu. Un bridge poate fi utilizat și pentru a interconecta două rețele locale distincte, care, ulterior , pot fi privite ca o singură rețea.

Router(ruter)

Dispozitiv utilizat pentru conectarea mai multor rețele, eventual bazate pe protocoale diferite, care poate îndeplini și funcții avansate pentru optimizarea traficului și a transmisiei de date . Pe lângă dispozitivele hardware există metode software pentru a transforma un echipament de calcul într-un router. Routerele sunt similare cu bridge-urile, în sensul ca îndeplinesc funcția de filtrare a traficului și permit interconectarea mai multor rețele distincte. În plus, routerele oferă și mai multe facilități, unele dintre ele fiind specificate mai jos:

selecția căii optime pentru transmiterea datelor

posibilitatea transmiterii mesajelor provenite de la protocoalele de rețea diferite. Un router poate interconecta rețele cu protocoale diferite (Fig.3.7).

Fig. 3.7 – Router pentru interconectarea mai multor rețele bazate pe protocoale diferite

În vederea interconectării a două rețele distincte, sunt disponibile următoarele metode:

Hardware: prin utilizarea unor dispozitive speciale, cum ar fi bridge-uri sau routere.

Software: prin instalarea a două plăci de rețea în cadrul unui echipament de calcul care îndeplinește rolul de server și prin utilizarea unui software specializat. Fiecare placă de rețea va fi conectată la o rețea. Funcțiile îndeplinite de router vor fi simulate pe cale software.

Gateway(poartă)

Dispozitiv utilizat pentru interconectarea mai multor rețele distincte, bazate pe protocoale diferite. Un astfel de dispozitiv este diferit de un bridge sau router. Funcția sa este de a traduce mesajele provenite de la o rețea ce utilizează un anumit protocol într-un format adecvat pentru a putea fi interpretat de rețeaua destinație care utilizează un protocol diferit.

3.7 Identificarea echipamentelor in cadrul rețelelor

Un echipament din rețea se identifică prin: adresă și nume (Fig.3.8).

Fig. 3.8 – Identificarea echipamentelor

În cazul un care mai multe rețele sunt interconectate, atunci la adresa ce corespunde unui echipament se adaugă și adresa rețelei.

Acest lucru este necesar deoarece este posibil ca un dispozitiv din cadrul unei rețele să dețină aceiași adresă ca un dispozitiv din cadrul altei rețele.

Numele unui calculator îl identifică în cadrul rețelei în mod unic și este mai ușor de utilizat de către utilizatorul uman decât o adresă numerică.

Există servicii de rețea care administrează automat corespondența între numele echipamentelor de calcul și adresa lor(WINS, DNS).

3.8 Aplicații de rețea

Pe lângă sistemele de operare de rețea sau software-ul client de pe stațiile de lucru, într-o rețea mai pot exista și diverse aplicații specifice rețelei. Acestea sunt programe care permit accesul simultan pentru mai mulți utilizatori la același set de informații stocat pe o resursă partajată. De exemplu, dacă baza de date pentru personal este memorată pe discul C: al serverului , care este partajat , atunci, în timp ce un utilizator introduce informații pentru angajații noi, alți utilizatori pot să listeze statul de plată, sau să culeagă informații despre activitatea angajaților. Tot mai des în ultimul timp aplicațiile de rețea au dobândit o arhitectură de tip client/server.

Acest lucru înseamnă că aplicația respectivă are două componente principale: componenta care se instalează pe server și cea care se instalează pe stația client. Când utilizatorul cere informații de la server, datele sunt procesate pe server și numai rezultatele sunt transmise clientului, rezultând o reducere substanțială a traficului de rețea.

In S.C. C.N.D.P.I. ROMSOFT S.A. s-a mers pe aplicații pentru server accesibile de orice persoana autorizată să aibă acces la resursele Intranetului prin browser.

3.9 Protocoale de rețea

Modul în care comunică echipamentele din rețea este definit prin seturi de reguli de comunicație, numite protocoale. Un protocol definește modul cum sunt transmise informațiile între entitățile unei rețele, cum ne putem asigura că datele ajung la destinație, dimensiunea maximă a informației care poate circula în cadrul rețelei, viteza de transmisie, modalitatea de tratare a erorilor. Protocolul poate fi comparat cu limbajul comun pe care toate calculatoarele dintr-o rețea trebuie să-l cunoască pentru a putea comunica.

Există metode care permit transmisia de date între echipamente cu protocoale diferite, însă în general, pentru buna funcționare a rețelei se utilizează același tip de protocol pentru toate echipamentele.

Capitolul 4

Internet – prezentare generală

Internet-ul reprezintă o rețea globală constituită prin interconectarea mai multor rețele și calculatoare din întreaga lume

În momentul în care un utilizator accesează rețeaua Internet, de la calculatorul său personal, echipamentul de calcul devine client al rețelei globale și are la dispoziția sa resursele pe care le poate oferi aceasta.

4.1 Metode uzuale de conectare la internet

4.1.1 Modem

În acest caz pe echipament trebuie instalat un dispozitiv numit modem și este nevoie de o conexiune telefonică

4.1.2 Rețea locală

În acest caz calculatorul face parte dintr-o rețea locală și în cadrul rețelei există posibilitatea de conectare la Internet (Fig. 4.1).

Fig.4.1 – Conectarea prin rețea locala

4.2 Rețeaua Internet

Rețeaua Internet este o rețea de dimensiuni globale formată din mii de clienți și subrețele. Facilitățile Internet sunt disponibile prin intermediul “furnizorilor de servicii Internet”- Internet Service Provider (ISP), care oferă spre închiriere acces la Internet utilizatorilor obișnuiți.

Internetul este format din rețele și calculatoare și are drept arie de răspândire globul terestru.

O parte din subrețelele Internetului au rol de întreținere și partajare a resurselor, fiind denumite ”Puncte de acces la rețea “- Network Access Point(NAP) și se referă la o rețea comercială având caracter regional. Ea oferă servicii de următoarea natură: echipamente de calcul , de comunicație și spațiu pentru stocarea datelor. Fiecare NAP regional este conectat la cel puțin alte două NAP-uri prin intermediul unor linii de viteză mare, pentru ca în cazul unei defecțiuni temporare să nu fie afectată transmisia de date în cadrul Internet-ului.

Accesul la Internet nu este posibil în mod direct, ci prin intermediul unor “furnizori de servicii Internet”- Internet Service Provider(ISP), care reprezintă de fapt o firmă sau o asociație conectate la un punct de acces NAP și care oferă spre închiriere acces la Internet utilizatorilor obișnuiți.

4.3 Principalele servicii oferite de Internet

4.3.1 World Wide Web (WWW sau Web)

Accesul la Web sau accesul la informații organizate ierarhic, bazate pe protocolul HTTP și care pot fi parcurse prin intermediul unor legături denumite hyperlinks. Informațiile accesate pot fi: text, imagini, secvențe audio/video, animații.

4.3.2 Poștă electronică(e-mail)

Trimiterea și primirea de mesaje de poștă electronică, care se efectuează prin intermediul protocoalelor dedicate SMTP și POP3. Mesajele pot fi de tip text, dar la ele pot fi atașate fișiere cu alt format (imagine, executabil, document, bază de date,etc.)

4.3.3 Transfer de fișiere (file transfer )

Se efectuează prin intermediul unui protocol dedicat FTP se referă la preluarea de pe un server din cadrul Internetului a unuia sau mai multor fișiere (operație denumită download), sau copierea de pe un calculator din Internet a unuia sau mai multor fișiere (operație denumită upload).

4.4 Protocoale utilizate în rețeaua Internet

4.4.1 Protocolul de bază: TCP/IP, “Transmission Control Protocol-TCP”/ “Internet Protocol-IP”

Controlează modul de transmisie a datelor și gestionează identificarea echipamentelor între care se efectuează comunicarea, prin intermediul adreselor IP. Este format din două protocoale: TCP și IP. Reprezintă protocolul de bază al Internetului și este de asemenea un protocol frecvent utilizat în cazul rețelelor de dimensiuni mari. Fiecare calculator din cadrul rețelei trebuie să aibă instalat și configurat protocolul TCP/IP pentru a putea comunica cu celelalte calculatoare din rețea.

4.4.2 Protocolul pentru autentificare cont utilizator ( de exemplu, PPP – “Point -to-Point Protocol ”)

Definește tipul de legătură pe care o asigură furnizorul de servicii Internet. De exemplu, pentru conexiuni dial-up (modem și telefon) dispunem de protocolul PPP. O altă opțiune pentru protocolul de autentificare al utilizatorului este SLIP (Serial Line Internet Protocol). Ambele protocoale sunt destinate utilizării conexiunilor la Internet bazate pe linii telefonice. Informații despre tipul protocolului ce trebuie utilizat se obțin de la furnizorul de servicii Internet.

4.5 Protocolul TCP/IP

TCP/IP este protocolul oficial al Internet-ului. Comunicarea între echipamente pe baza acestui protocol se bazează pe posibilitatea identificării unice a fiecărui echipament printr-o adresă IP. Echipamentele din cadrul unei rețele TCP/IP se numesc host-uri (host = gazdă) indiferent de rolul pe care îl joacă (client sau server).

TCP este un protocol orientat spre transmiterea secvențială a datelor în pachete ce conțin informații atât despre destinatar, cât și despre expeditor. TCP garantează expedierea corectă a pachetelor de date în ordinea corectă, în plus, asigurând și o facilitate de verificare prin care validează acuratețea datelor transmise. Dacă apar pierderi în timpul transmisiei, TCP este capabil să monitorizeze aceste pierderi și să retransmită pachetele de date ce conțin erori.

Pentru a garanta transmisia datelor, TCP solicită întotdeauna destinatarului confirmarea recepției în bune condiții a fiecărui pachet de date.

Aceste caracteristici conferă protocolului o stabilitate și o acuratețe remarcabile, fiind protocolul ideal pentru transmisii de date, aplicații de tip client-server sau servicii critice cum este cel de poștă electronică.

Protocolul IP este responsabil doar de expedierea pachetelor de date între expeditor și destinatar.

Acest protocol nu garantează recepția pachetelor de date și nici nu oferă garanția ca acestea sunt recepționate în ordinea corectă. Protocolul verifică doar integritatea adresei din fiecare pachet; responsabilitatea verificării integrității datelor revenind componentei TCP.

În cadrul unei rețele TCP/IP, echipamentele de calcul participante se numesc host, indiferent de rolul pe care îl dețin (client sau server). Un host este identificat în cadrul rețelei în mod unic prin intermediul unui cod numeric, numit adresă IP.

Din punct de vedere administrativ, protocolul TCP/IP necesită configurare. În acest scop trebuie cunoscute următoarele noțiuni:

Adresă IP: formată din două componente, una pentru identificarea rețelei și cealaltă pentru identificarea calculatorului

Subnet mask, sau mască pentru subnet-uri: se asociază cu adresa IP pentru a identifica dacă calculatorul face parte din rețeaua locală, sau dintr-o altă rețea. O rețea poate fi divizată din motive administrative în mai multe rețele, acestea numindu-se subrețele (subnet). Toate calculatoarele ce fac parte dintr-o subrețea au alocate adresele IP într-un mod anume. O adresă IP trebuie să fie unică în cadrul rețelei sau subrețelei din care face parte echipamentul de calcul. Asociind masca subnet cu adresa IP, calculatoare din subrețele diferite pot comunica între ele.

Modul de alocare a adreselor IP: adresele pot fi alocate manual, de către administratorul de rețea. În acest caz , administratorul trebuie să configureze fiecare calculator în parte, lucru deloc practic pentru rețele de dimensiuni mari formate din sute de calculatoare care se pot afla în zone geografice diferite. De aceea există posibilitatea ca alocarea adreselor să se efectueze automat, de către un server specializat, astfel administratorul de rețea configurează doar serverul de rețea.

4.6 Adresa IP

O adresă IP identifică in mod unic un echipament de calcul din cadrul rețelei și este formată dintr-o succesiune de 4 bytes în format zecimal, separați prin puncte.

Adresa IP conține nu numai adresa host-ului respectiv, ci și adresa rețelei:

ADRESA IP= adresa_rețea.adresa_host

Toate echipamentele de calcul din cadrul aceleiași rețele vor avea aceeași adresă de rețea, dar adresele lor individuale trebuie să fie unice (Fig.4.2).

Fig. 4.2 – Adresele IP

4.7 Formatele adreselor IP

4.7.1 Format binar

O succesiune de patru octeți(sau bytes) (un octet este format din 8 biți. Fiecare bit poate lua valoarea 0 sau 1. Pentru lizibilitate se preferă formatul zecimal cu puncte. Cele două adrese date in exemplu sunt identice, doar că sunt reprezentate in formate respective). Exemplu: 11000000.01101010.00001111.00001001

4.7.2 Format zecimal cu puncte

Acest format este preferat deoarece se citește mai ușor, succesiune de 4 octeți în format zecimal , separați prin puncte. Exemplu: 192.106.15.9

4.8 Clase de adrese IP

Pentru a departaja care porțiune a adresei IP reprezintă adresa de rețea și care reprezintă adresa hostului se utilizează clasele A, B și C.

4.8.1 Clasa A

Primul byte (sau octet) al adresei poate lua valori între 1 și 126 și desemnează adresa rețelei. Următorii 3 bytes sunt utilizați pentru adresa host-ului.

Rețelele care utilizează adrese IP din clasa A sunt rețele de mari dimensiuni, deoarece fiecare din cele 126 de rețele posibile poate dispune de maxim 16 777 214 de hosturi.

Un exemplu de adresă din clasa A este14.25.123.45. Adresa rețelei este 14, iar adresa hostului este 25.123.45.

4.8.2 Clasa B

Primul byte al adresei poate lua valori între 128 și 191. Primii 2 bytes sunt utilizați pentru adresa rețelei, iar ultimii doi bytes pentru adresa hostului. Fiecare din cele 16384 rețele de clasă B posibile pot dispune de maxim 65534 hosturi. Un exemplu de adresă din clasa B este 168.15.33.21. Adresa rețelei este 168.15, iar adresa hostului este 33.21.

4.8.3 Clasa C

Primul byte poate lua valori între 192 și 223. Primii trei bytes sunt utilizați pentru adresa rețelei, iar ultimul byte pentru adresa hostului. Fiecare din cele 2 097 151 de rețele de clasă C pot avea maxim 254 de hosturi. Un exemplu de adresă din clasa C este: 192.220. 200.8. Adresa rețelei este 192.220. 200, iar adresa hostului este 8.

Adresa 127 este rezervată pentru tastarea adreselor IP pe echipamentul de calcul local, iar adresele de la 224 în sus sunt rezervate pentru a fi utilizate împreună cu anumite protocoale speciale.

Tabelul următor centralizează informațiile ce pot fi deduse din împărțirea adreselor IP în clase:

Clasa de adrese poate fi identificată prin valoarea primului byte.

Adresa 127 este rezervată pentru testarea adreselor IP pe echipamentul de calcul local, iar adresele de la 224 în sus sunt rezervate pentru a fi utilizate împreună cu anumite protocoale speciale.

Observație: există 5 clase de adrese de la A la E, dar sistemele Microsoft oferă suport pentru clasele A,B și C.

În momentul asigurării unei adrese IP administratorul trebuie să se asigure că în cadrul unei rețele, fiecare host primește o adresă unică, de asemenea, adresele de rețea trebuie să fie unice. Adresa de rețea identifică toate echipamentele care fac parte din rețeaua respectivă. Toate hosturile dintr-o rețea trebuie să dețină aceeași adresă de rețea pentru a putea comunica între ele.

Exemple de adrese IP: 192.150.0.11(Clasa C)

152.8.43.5(Clasa B)

11.200.12.28(Clasa A)

4.9 Subnet

O rețea poate fi divizată în subnet-uri (subrețele), fiecare subnet dispunând de o adresă unică. Divizarea in subnet-uri este realizată de administratorul rețelei.

O adresă IP este întotdeauna asociată cu o mască subnet, chiar și in cazul rețelelor care nu sunt divizate în subrețele.

4.10 Tipuri de subnet mask

implicite: pentru rețele care nu sunt divizate în subneturi

personalizate: pentru rețele care sunt divizate în mai multe subneturi

Tabelul următor indică valorile implicite de subnet mask pentru fiecare clasă de adrese.

În pozițiile corespunzătoare adresei rețelei există valoarea 1, iar în pozițiile corespunzătoare adresei host-ului există valoarea 0.

Subnet mask reprezintă o “mască” care se suprapune peste adresa IP pentru a identifica ce porțiune din adresa IP reprezintă adresa de rețea și care porțiune reprezintă adresa host-ului.

Astfel, la transferul de date, se poate ști din ce subnet face parte hostul respectiv.

4.11 Alocarea adreselor IP

Mod de alocare în funcție de natura rețelei:

rețea privată: în cazul unei rețele din cadrul unei firme sau instituții, adresarea host-urilor este realizată de către administrator, ținând seama de complexitatea rețelei respective.

conectare la Internet: pentru a conecta insă o rețea la Internet trebuie obținut un interval de adrese IP care vor fi alocate numai host-urilor din cadrul acelei rețele, ele fiind unice în toată lumea.

4.12 Mod de alocare adrese în rețele TCP/IP

Manual

Administratorul de rețea configurează manual adresa IP pentru fiecare calculator în parte. Dacă rețeaua este de dimensiuni mari, această soluție nu este practică. Adresele alocate manual se numesc adrese statice, în sensul că nu se modifică de la o sesiune la alta (decât dacă administratorul o modifică din nou) (Fig. 4.3).

Fig. 4.3 – Alocarea manuală a adreselor IP

Automat

Adresa IP este generată în mod automat de către un server de rețea cu funcție specializată, denumit server DHCP(Dynamic Host Configuration Protocol). În momentul în care o stație se conectează la o rețea, serverul DHCP ce deservește rețeaua respectivă îi alocă în mod automat o adresă IP. Server DHCP: server din cadrul unei rețele TCP/IP a cărei funcție este alocarea automată de adrese IP pentru stațiile din rețea. Administratorul de rețea efectuează configurarea acestui server astfel: stabilește un interval de adrese ce pot fi alocate și eventual alți parametrii.

În momentul în care o stație se conectează la rețea, serverul DHCP care deservește rețeaua respectivă alocă automat o adresă IP. Acest mod de alocare a adreselor se numește alocare dinamică. Astfel, configurarea are loc într-o singură locație și anume pe serverul DHCP. Serverul DHCP fiind un host în cadrul rețelei, trebuie de asemenea să dispună de o adresă IP care va fi stabilită manual de către administratorul rețelei (primește o adresă statică). Fig.4.4

Fig. 4.4 – Alocarea automată a adreselor IP

Alocarea automată de adrese private IP

Numai Sub MS Windows 98/Millenium Clienții DHCP își pot aloca automat adrese IP dacă server-ul DHCP nu este disponibil. Formatul unei astfel de adrese trebuie să fie 169.254.x.y.( Fig. 4.5)

Fig. 4.5 – Alocarea automată fără server DHCP

4.13 Extranet-ul

Reprezintă un intranet pentru care accesul a fost extins să includă și persoane fizice sau juridice din afara companiei care deține intranet-ul.

Motive pentru crearea unui extranet:

poate fi furnizat acces limitat pentru clienți, furnizori sau colaboratori.

pot fi oferite servicii de tip magazin electronic

pot fi oferite cursuri on-line

4.14 Conectarea la Internet prin rețea locală

4.14.1 Cerințe hardware

placă de rețea conectată la mediul de transmisie prin elementele de conectică. Un echipament din rețea este conectat la Internet și această conexiune va putea fi accesată de către celelalte calculatoare (Fig. 4.6).

4.14.2 Cerințe software

driverele corespunzătoare pentru instalarea plăcilor de rețea

protocolul TCP/IP instalat și configurat

software-ul client instalat și configurat

aplicațiile pentru Internet trebuie configurate corespunzător, astfel încât să recunoască accesul la Internet prin rețeaua locală

pentru server-ul care dispune de conexiunea directă la Internet, aceasta trebuie configurată.

Fig. 4.6 – Conectarea la internet prin rețeaua locală

Capitolul 5

Proiectarea și realizarea rețelei la firma

C.N.D.P.I. Romsoft S.A.

Studiu de caz

O analiză comparativă a costurilor inițiale pentru legalizarea, modernizarea și extinderea departamentului IT al C.N.D.P.I. ROMSOFT S.A. folosind platforme software Windows/Microsoft respectiv GNU-Linux/Open Source.

5.1 Prezentare succintă

Modernizarea structurii rețelei prin introducerea a noi stații de lucru și conectarea lor la mediul Intranet pentru ușurarea muncii în echipă.

Adaugarea a minim 24 noi stații de lucru

O previziune asupra costurilor extinderii rețelei pentru a se putea hotărî câte alte stații noi se pot achiziționa în limita bugetului disponibil (Fig. 5.1).

Fig. 5.1 – Costurile rețelei

După cum se poate observa costul soluțiilor bazate pe GNU-Linux și Software Open Source (OSS) este între 40% și 60% din cel al unei soluții pe platforma Windows. Aceste raporturi procentuale se regăsesc și în costurile totale de utilizare. (TCO).

Hw Nou – Componente Hardware noi.

Hw P.O. – Componente Hardware folosite anterior (monitoare noi).

5.2 Analiza prețurilor folosite

În studiul nostru vom include diverse achiziții software și

hardware, pe lângă cheltuieli pentru consultanță, suport și

documentare.

Prețul citat al echipamentelor hardware este acela la care firma

C.N.D.P.I. ROMSOFT S.A. le distribuie. Nu am citat prețurile producătorilor de sisteme brand-name pentru că am dorit să oferim o soluție pentru un buget restrâns, de asemenea nu am utilizat prețurile altor vânzători de sisteme pentru a evita recomandarea hardware-ului netestat și pentru a nu intra într-un conflict de interese cu terți.

Prețul software-ului pentru platforma Microsoft este dat de prețul minim pe care l-am putut obține pentru revânzare de la partenerii noștri de afaceri, aceasta deoarece C.N.D.P.I. ROMSOFT S.A. nu comercializează acest tip de software.

Pentru consultanță, instalare și instruire în vederea utilizării

platformei Windows am folosit prețurile recomandate oficial de

către Microsoft România, din nou, C.N.D.P.I. ROMSOFT S.A. nu oferă astfel de servicii pentru care, însa, există o paletă largă de ofertanți pe piață.

Pentru consultanță, instalare și instruire în vederea utilizării platformei GNU-Linux/Open Source am folosit prețurile practicate de către C.N.D.P.I. ROMSOFT S.A. la aceste servicii.

Deși este promovată o soluție bazată pe Open Source am considerat necesară păstrarea unei imparțialități în ceea ce privește costurile. Pentru a vă convinge de corectitudine sunteți invitați să studiați prețurile altor companii ce oferă produse, respectiv servicii, similare.

Toate prețurile, sursele de la care provin acestea, precum și specificații tehnice detaliate sunt afișate (Anexa A).

5.3 Prezentare Hardware

Am luat ca referință următoarele echipamente:

Stații de lucru independente: 350€ (Model Pixie); sistem mediu ca performanță ce poate rula Linux sau Windows.

Stații de lucru terminale: 260€ (Model Powder); 140€ (Model Snow); Sisteme noi/deținute anterior (Previously Owned -P.O.) ce vor rula ca terminale Linux.

Server terminale: 900€ (Model Hydra); sistem ce va rula pe post de Linux terminal server concomitent îndeplinind funcția de stație de lucru.

Elemente de rețea: 140€ Switch 16 porturi 10/100 Unmanaged;

750€ Switch 24 porturi 10/100/1000 Managed; 50€ costuri adiționale pentru fiecare stație – reprezentând alte elemente de infrastructură (cablu, canal cablu, prize, mufe, manșoane, manopera instalare retea etc.)

Pentru interconectarea în rețea am preferat secționarea costurilor, astfel switchul de 16 porturi se va folosi pentru extinderea la maxim 12 stații, pentru mai multe considerăm necesară utilizarea unui switch de 24 de porturi cu uplink gigabit. Costurile adiționale se aplică în ambele cazuri și reprezintă o medie a prețurilor practicate pentru instalarea unei rețele.

De asemenea vom întrebuința și toate echipamentele hardware vechi pe care le deținea anterior firma.

5.4 Prezentare Software

Încercam să reducem nevoile de software la minim și vom lua în calcul numai pachetele de strictă importanță – sistemul de operare, suita de birou/Office, antivirus pentru protejarea integrității datelor.

Sisteme de operare: 95€ Microsoft Windows 98 OEM; 160€ Microsoft Windows XP Pro OEM; 0€ Debian GNU/Linux;

Suite Office: 250€ Micrsoft Office XP OEM pentru Windows; 0€ OpenOffice 1.0.2 pentru Linux;

Programe Antivirus: 35€ Kaspersky Antivirus pentru Windows; 0€ Nu este nevoie de un antivirus sub Linux.

În funcție de profilul firmei vor exista și alte aplicații software folosite, nu le-am luat în calcul pentru că nu era posibilă o acoperire obiectivă a costurilor lor. Este demn de menționat faptul că pe platforma GNU/Linux există aplicații opensource gratuite (Opensource Software – OSS – sub licența GPL) pentru orice domeniu de activitate, echivalente celor comerciale ce rulează sub Microsoft Windows.

Restul software-ului la care se va face referire pe parcursul documentului nu are costuri de licențiere fiind distribuit gratuit.

Toate prețurile, sursele de la care provin acestea, precum si specifiicații tehnice detaliate sunt alăturate acestui document (Anexa A).

5.5 Consultanță și instruire

Serviciile de acest gen nu se bucură de popularitatea meritată în rândul managerilor autohtoni datorită fie unor mentalități învechite conform cărora totul se poate face in-house, fie datorită calității îndoielnice la care au fost prestate aceste servicii de unele firme de profil. Scopul nostru este sa demonstrăm prin eficacitatea soluțiilor aduse beneficiile apelării la sfatul unor profesioniști.

Costuri pentru platforma Windows/Microsoft: 820€ per zi de consultanta; 60€ per client/statie pentru instalare; 380€ Workshop (instruire practica).

Documentația vine cu produsele achiziționate.

Platforma GNU-Linux/Open Source: 490€ per zi de consultanta; 20€ per client/statie pentru instalare; 100€ Workshop (instruire practica avasata).

Idealul urmărit pe platforma GNU-Linux este ca utilizatorul să intervină cât mai puțin în funcționarea calculatorului. Astfel acesta, ca și colegii săi de lucru, are la dispoziție o stație de lucru (ce nu este supusă defecțiunilor de ordin software în mod curent) și nu este nevoie decât de o singură persoană ce se poate ocupa de buna funcționare a tuturor calculatoarelor din rețea, la fața locului sau de la distanță, prin Internet. În acest mod se reduc la minim perioadele de inactivitate și se ușurează sarcinile operatorilor.

5.6 Situația actuală la departamentul transporturi

Sa trecem în revista situația actuală a firmei: trei stații de lucru cu software nelicențiat; o stație de lucru ce rulează software licentiat; o imprimantă atașată uneia dintre stații.

Toate stațiile rulează pe o platformă software Windows/Microsoft.

O diagramă a configurației actuale ar arăta astfel:

Fig. 5.2 – Configurația actuală

Se dorește:

intrarea în legalitate cu software-ul folosit precum și modernizarea acestuia;

interconectarea stațiilor de lucru în rețea pentru a se putea ușura munca în echipă;

adăugarea a minim 2 noi stații de lucru.

O previziune asupra costurilor extinderii rețelei pentru a se putea hotărî câte alte stații noi se pot achiziționa în limita bugetului disponibil.

Pentru indeplinirea cerințelor avem la dispoziție două scenarii:

Scenariul 1 – Folosim o soluție bazată pe Microsoft Windows pentru toate stațiile de lucru.

Scenariul 2 – Implementăm o soluție bazată pe GNU-Linux.

În continuare avem dezvoltate și comparate ambele scenarii astfel încât să se poată observa avantajele și dezavantajele, informatii necesara in larea unei decizii.

5.7 Scenariul 1

5.7.1 Hardware

Se păstrează stațiile existente, se adaugă două stații noi, se conectează în rețea.

5.7.2 Software

Se achiziționează licențe de Windows 98 pentru stațiile vechi, Windows XP pentru cele noi, suita Office XP și Antivirus pentru toate.

5.7.3 Achiziții

2 stații de lucru noi – model Pixie;

1 switch 16 porturi 10/100 Unmanaged;

interconectarea în rețea pentru 6 stații;

3 licențe Windows 98;

2 licențe Windows XP Pro;

5 licente Microsoft Office XP;

5 licențe Kaspersky Antivirus;

1 zi consultanta oferita de un Microsoft Certified Partner;

instalare și configurare 5 stații;

La o scurtă trecere în revistă scenariul nostru ar arăta astfel:

4 stații de lucru vechi;

2 stații noi;

o rețea functională cu un total de 6 stații noi, rulând software licențiat.

5.7.4 Avantajele acestei soluții

se poate lucra in retea;

se folosește software licențiat;

a crescut numărul stațiilor de lucru din firmă;

O diagramă a rețelei din scenariul 1 arată astfel(Fig. 5.3):

Fig.5.3 – Diagrama retelei

5.7.5 Dezavantajele acestei soluții

Nu există o centralizare a datelor;

Nu s-au upgradat stațiile vechi care lucrează încet cu software-ul actual;

Datorită costului licențelor nu se poate opera cu toate pachetele software dorite, fiind necesară o selecție a acestora.

Calculând punem în evidență costul per nod, adică suma de bani necesară achiziționării unei noi mașini, identice cu cele două deja utilizate.

Costul mașinii (hardware, software): 795€

Alte costuri (instalare, configurare, rețea): 110€

Cost total per nod: 905€

Cu siguranță merită să luăm în calcul și o altă opțiune

5.8 Scenariul 2

Vom adopta o soluție client/server astfel ca necesitățile noastre hardware vor fi putin diferite:

5.8.1 Hardware

Se pastreaza nealterata statia ce ruleaza software licentiat, se achiztioneaza un server (un calculator mai puternic), două stații terminal noi, celelalte 3 stații vechi sunt transformate în terminale, se atașează imprimanta serverului pentru a fi partajată de către toți utilizatorii, se leagă toate computerele într-o rețea.

5.8.2 Software

Se folosește ca sistem de operare GNU-Linux/Open Source Software, se instalează LTSP pentru lucrul cu terminalele, se instalează OpenOffice precum și alte programe necesare (ex: baze de date, medii de dezvoltare/programare, server web/ftp). Stația ce rulează software Microsoft licențiat este păstrată, este utilă în cazul folosirii unei aplicații ce nu rulează decât pe platforma Windows.

5.8.3 Achiziții

1 server central – model Hydra;

2 stații de lucru noi – model Powder;

Sau

2 stații de lucru noi – Snow;

1 switch 16 porturi 10/100 Unmanaged;

interconectarea in retea pentru 6 stații;

Debian GNU/Linux /LTSP/alte OSS (CD);

1 zi consultanta System & Network Solutions;

instalare si configurare server si 4 stații;

Folosind stații terminal noi (model Snow) costurile vor fi următoarele:

Pentru stații terminale P.O. (model Powder) costurile sunt cuprinse în tabelul de mai jos:

O diagramă a scenariului bazat pe această soluție va arăta astfel:

5.4 – Diagrama rețelei

5.8.4 Avantajele unei astfel de soluții

prezența unui server Linux/LTSP și a stațiilor de lucru cu sistem de operare GNU-Linux și folosirii Software-ului Open Source.

Hardware:

se reutilizează hardware-ul vechi;

nu este necesar upgrade-ul, sau achiziționarea de stații noi scumpe;

se pot împărți transparent resursele între utilizatori (pot avea acces la fișierele comune; pot folosi simultan imprimanta legată la server; pot citi/scrie CD-uri);se poate contoriza accesul utilizatorilor la diferite resurse (timpul de folosire, accesul la imprimanta, CDRW etc);

se elimina piesele in miscare (hard disk, ventilatoare), se reduce zgomotul produs și se pot folosi în medii ostile (cu expunere mare la praf, zgomot, vibrații)

Software:

se fac configurații doar într-un singur loc (totul este configurat o singură dată pe server);

upgradarea/schimbarea softului folosit se face într-un singur loc;

terminalele nu au nevoie de nici o configurare/administrare ulterioară;

se poate extinde/restrânge rețeaua fără alte costuri;

se poate lucra simultan pe diferite sisteme de operare;

se asigură securitatea datelor fiecărui utilizator în parte precum și a întregii rețele;

nu există pericolul infectării cu viruși;

utilizatorii nu sunt “legați” de o stație de lucru, își pot accesa contul de pe oricare (roaming);

toți utilizatorii au acces la stația ce rulează Microsoft Windows direct de pe sistemele lor, folosind VNC;

se poate modifica software-ul folosit după nevoile interne (având acces la sursa acestuia).

5.8.5 Dezavantaje

Soluția bazată pe terminale nu se pretează unor activități cum ar fi editarea și prelucrarea video datorită lățimii mari de bandă necesare, costurile asigurării acesteia fiind mai mari decât costurile unei stații dedicate. Desigur sistemul de operare Linux poate fi folosit și pe aceste stații.

În funcție de modelul de stație terminal ales putem face calculul

costului per nod.

Hardware nou:

Costul sistemului (hardware, software): 240€

Alte costuri (instalare, configurare, retea): 70€

Cost total per nod: 310€

Hardware P.O.:

Costul mașinii (hardware, software): 160€

Alte costuri (instalare, configurare, rețea): 70€

Cost total per nod: 230€

5.9 De ce am nevoie de un server?

Datorită abordării unei arhitecturi client/server, o arhitectură ce aduce cu sine numeroase avantaje dar ce presupune o investiție inițiala într-un server care poate susține o rețea scalabilă.

Serverul reprezintă un calculator mai puternic, acesta rulează sistemul de operare, la el se leagă alte calculatoare (mai slabe în general). Un astfel de server suportă multiple terminale, până la 20 în cazul dat de noi, ceea ce înseamnă că oricând se pot cumpăra/refolosi calculatoare noi sau vechi slabe ca performanță care să devină terminale. Paralel pot funcționa și stații de lucru de sine stătătoare (dedicate).

Terminalele sunt stații (computere vechi sau noi) cu configurații mai slabe ce au funcție doar de afișare, resursele lor interne sunt folosite pentru comunicarea în rețea și afișarea imaginilor.

Viteza la care lucrează terminalele este dată de viteza serverului.

Datorită managementului resurselor foarte eficient al Linux-ului mai multe terminale pot lucra simultan la aceeași viteză, comparabilă, daca nu superioară, cu viteza unei stații de lucru dedicate.

Capitolul 6

Prezentarea aplicației pentru monitorizarea, întreținerea și utilizarea Intranetului la firma S.C. CNDPI Romsoft S.A.

6.1 Fundamente teoretice

Acestă lucrare poate reprezenta una din solutiile de utilizare a retelei Intranet a firmei Romsoft SA. Totodată, prezenta lucrare cuprinde într-un instantaneu destul de detaliat aspecte teoretice și practice ale modalităților de concepere și implementare a aplicației.

Fundamente teoretice care stau la baza aplicației Web

Spațiul WWW (World Wide Web)

Programare Web pe partea client folosind limbajul JavaScript

Dezvoltarea de aplicații Web dinamice folosind PHP

Principii aplicate în proiectarea și organizarea siturilor Web

6.1.1 Spațiul WWW (World Wide Web)

Din punct de vedere tehnic, spațiul Web pune la dispoziție un sistem global și standardizat de comunicare multimedia, informațiile fiind organizate asociativ și fiind distribuite în funcție de cererile utilizatorilor, funcționând conform modelului client-server.

Web-ul, cu toată dezvoltarea lui spectaculoasă, nu trebuie confundat cu Internetul, ci poate fi văzut drept cea mai dinamică componentă software a acestuia, neputând exista fară infrastructura hardware a rețelelor mondiale interconectate.

Ca orice serviciu Internet bazat pe modelul client/server, Web-ul trebuie să includă o mulțime de servere Web. Cele mai cunoscute servere Web sunt Apache, Netscape Enterprise Server, Sun Web Server și Microsoft Internet Server.

Calculatorul pe care rulează un server Web și care găzduiește o serie de documente (pagini) WWW înrudite se mai numește și sit (site). Un sit Web are asociată în general o adresă vizibilă oricărui utilizator Internet.

Alături de situl Web, un alt concept important al Web-ului este cel de multimedia. În esență, multimedia reprezintă o sumă de medii de comunicare continue (audio, video) și discrete (text). Dacă la acest conținut se adaugă și capabilități de a realiza diverse legături (relații) între părțile componente ale documentelor multimedia, ceea ce rezultă se numește hipermedia sau hipertext. Conceptele centrale pe care se bazează hipertextul sunt nodurile și legăturile.

Un nod reprezintă un concept unic (o idee), având în componență informații de tip text, grafică, animație, audio, video sau programe. Nodurile sunt conectate la alte noduri prin intermediul legăturilor.

Modalitatea de memorare a informațiilor în cadrul nodurilor variază de la sistem la sistem, dar cele mai folosite tehnici sunt cele bazate pe SGML (Standard Generalized Markup Language) sau XML (Extensible Markup Language), pentru Web pretându-se limbajul HTML (HyperText Markup Language)

6.1.2 Programare Web pe partea client folosind limbajul JavaScript

JavaScript reprezintă nu numai un limbaj, ci un mediu complet, orientat obiect, disponibil în cadrul navigatorului Web. Limbajul este dezvoltat la origine de Netscape, permițând scrierea de scvențe de program care se execută la apariția unui eveniment utilizator și care sunt interpretate de către client (navigatorul Web). Evenimentele de obicei sunt rezultate ale acțiunilor utilizatorilor (de exemplu mișcarea mouse-ului).

Astfel, prin intermediul scripturilor pot fi definite metode care pot trata automat evenimentele sesizate de către navigatorul Web.

Ca și celelalte limbaje de programare JavaScript permite definirea de variabile, de diverse tipuri scalare sau compuse, folosirea de instrucțiuni (de atribuire, de test, de ciclare, de control), utilizarea obiectelor, conținând metode (funcții) predefinite sau descrise de programator. De asemenea JavaScript pune la dispoziție un set cuprinzător de clase predefinite care pot fi folosite atât pentru specificarea dinamicii conținutului paginilor Web, cât și pentru prelucrarea diverselor conținuturi (HTML, CSS, XML etc).

Introducerea de cod sursă JavaScript în cadrul documentelor HTML se realizează prin intermediului tag-ului <SCRIPT>, putându-se specifica prin atributul language versiunea JavaScript în care se scriu programele. Astfel, este oferită posibilitatea de a scrie părți alternative de funcții JavaScript în funcție de navigator sau de versiunea de JavaScript.

În aplicația descrisa este folosit limbajul JavaScript pentru validarea datelor preluate de la utilizator prin intermediu formularelor interactive. În felul acesta, dacă utilizatorul introduce unele date nevalide, este atenționat printr-un mesaj corespunzător iar aplicația nu își poate continua execuția decât după introducerea unor date valide.

În cazul aplicației Calendar Evenimente, fiind foarte multe constrângeri privind datele sau informațiile preluate de la utilizator, folosirea validării și la nivel de client duce la o securitate sporită și economisire de timp, față de cazul în care validarea datelor s-ar fi făcut numai pe partea de server.

6.1.3 Dezvoltarea de aplicații Web dinamice folosind PHP

PHP-ul (PHP: Hypertext Processor) este un limbaj de scriptare open-source care rulează pe partea de server, fiind folosit pentru crearea paginilor Web dinamice care necesită prezența unor aplicații Web dinamice. Acestea sunt predominante în siturile de tip ecommerce, e-business sau e-school, unde conținutul este generat de datele accesate dintr-o bază de date sau de o altă sursă externă.

Preprocesorul PHP va determina construcțiile PHP delimitate între tag-urile <?php ?> și le va interpreta, ignorând restul conținutului documentului pe care îl va trimite, la ieșirea standard, nealterat.

Astfel, putem privi analizorul PHP ca un script CGI care efectuează o preprocesare specială înainte ca datele să fie expediate clientului Web. PHP-ul oferă soluții simple și universale care ușurează munca programatorului de a crea pagini Web dinamice. Interfața intuitivă permite programatorilor să introducă comenzi PHP în paginile HTML.

Sintaxa PHP este compusă din concepte de Perl, Java și C. Structura sintaxei împrumută

foarte mult din limbajul C, ceea ce îl face mult mai ușor de studiat, chiar și pentru programatorii începători. Designul elegant ușurează în mod semnificativ capacitatea de menținere și actualizare a aplicațiilor, decât scripturile scrise în alte limbaje.

PHP permite folosirea unor elemente specifice limbajelor de programare. Ieșirea standard a script-ului PHP devine intrarea standard pentru programul de navigare care vizualizează pagina. Așadar, la ieșirea standard poate fi scris (de exemplu, prin intermediul comenzii echo) orice tip de cod HTML, acesta fiind interpretat de catre borwser.

Pe lângă manipularea conținutului paginilor de Web, PHP poate trimite headere HTTP pentru autentificare, poate seta cookie-uri sau redirecționa utilizatorii. Mai mult, cu ajutorul bibliotecilor externe de funcții poate parsa fișiere XML, crea și manipula imagini, animații Shokwave Flash, PDF-uri sau se poate conecta la un server de mail, iar acestea sunt doar cateva din funcțiile pe care le poate îndeplini.

Interpretorul PHP parcurge documentul accesat până în momentul în care întâlnește un marcaj de deschidere care indică faptul că textul care urmează trebuie interpretat ca fiind cod PHP. In continuare, textul este interpretat ca fiind cod PHP până în momentul în care este întâlnit marcajul de închidere. Întreg textul care nu este interpretat ca fiind cod PHP este furnizat la ieșire în forma în care a fost primit ca intrare de catre interpretor. Există mai multe marcaje care indică începerea unei secvențe de cod PHP, doar două dintre ele fiind folosite de obicei. Dacă dorim ca documentul să respecte specificațiile XML, atunci singura posibilitate de inserare a codului PHP este folosirea unei secvențe de tipul:

<?php

//cod PHP

?>

Cea de-a doua posibilitate este utilizarea marcajului <SCRIPT> într-o manieră asemănătoare celei folosite pentru includerea de script-uri JavaScript. Sintaxa este următoarea:

<SCRIPT language = "php">

//cod PHP

</SCRIPT>

Intreg codul sursa al aplicatiei impreuna cu explicarea succinta a functiilor se poate gasi in Anexa B.

6.2 Descriere generală a aplicației

Pentru monitorizarea și întreținerea rețelei la firma Romsoft s-a proiectat și s-a realizat o aplicație informatică pentru explorarea rețelei și audit de securitate capabilă să scaneze repede rețele mari, cu toate că funcționează bine și la scanarea unui singur host.

Folosită în mod curent în procesul de audit al securității, aplicația este folosită și de administratorii de rețea pentru rutinele de inventariere a rețelei, managementul upgrade-urilor și monitorizarea calculatoarelor sau a perioadelor de uptime pentru servicii.

Bazată pe o tehnologie inovatoare open source, aplicația folosește pachete IP în formă brută într-un mod inovator pentru a determina ce calculatoare sunt disponibile în rețea, ce servicii (numele aplicației și versiunea) oferă acestea, ce sistem de operare (și versiune) rulează, ce tipuri de filtre de pachete/firewall sunt utilizate și o mulțime de alte caracteristici.

Rezultatul generat de aplicație este o listă de ținte scanate, cu informații secvențiale despre fiecare în funcție de opțiunile utilizate. O parte cheie a informațiilor furnizate este tabela de porturi interesante.

Aceasta tabelă conține numărul portului și protocolul, numele serviciului și starea. Starea poate fi:

open (deschis)

filtered (filtrat)

closed (inchis)

unfiltered (nefiltrat)

Deschis (open) înseamnă că aplicația de pe sistemul țintă ascultă la portul respectiv, așteptând conexiuni.

Filtered (filtrat) înseamnă că un firewall, filtru sau alt obstacol în rețea blochează respectivul port astfel încât Nmap nu poate spune daca este deschis  sau închis.

Porturile închise nu au nici o aplicație care să aștepte conexiuni, cu toate că ele se pot deschide în orice moment. Porturile sunt clasificate ca

nefiltrate când ele răspund la probele aplicației, dar aplicația nu poate determina dacă sunt închise sau deschise.

Aplicația raportează combinația de stări open|filtered (deschis|filtrat) și closed|filtered (închis|filtrat) când nu poate determina care din cele două stări este cea corectă. Tabela de porturi mai poate include versiuni ale software-ului când detecția versiunii a fost solicitată. Când un protocol de scanare IP este solicitat, aplicația furnizează informații despre protocoalele IP suportate în locul listei de porturi.

În plus față de lista de porturi interesante, aplicația poate furniza și alte informații despre ținte, incluzând aici nume obținute prin reverse DNS, poate ghici sistemul de operare, tipul hardwareului și adresele MAC.

O scanare tipică este exemplificată mai jos.

Singurele argumente folosite în acest exemplu sunt:

pentru afișarea hosturilor active în rețea(Fig 6.1)

pentru determinarea porturilor deschise ale unui host(Fig 6.2)

Fig. 6.1 – Afișarea hosturilor active în rețea

Fig 6.2 – Determinarea porturilor deschise ale unui host

6.3 Funcționalitățile aplicației

Preluarea unei liste mari de calculatoare este un lucru greu de făcut din linia de comandă, deși acest lucru este de preferat. De exemplu, serverul DHCP poate exporta o listă de 10.000 de IP pe care le-a atribuit și pe care noi dorim sa le scanăm. Sau poate dorim sa scanăm toate adresele

  cu excepția celor generate de DHCP pentru a monitoriza adresele statice neautorizate. Generați lista de IP-uri si plasați numele fișierului ca argument al opțiunii

Intrările din fișier pot fi în orice format acceptat de aplicație în linia de comandă (adrese IP, nume, CIDR, IPv6 sau domenii pe octeți). Fiecare intrare trebuie separată prin unul sau mai multe spații libere sau prin linie nouă. Este specificat caracterul – ca nume de fișier dacă se vrea ca aplicația să citească de la intrarea standard în locul unui fișier.

  Pentru sondaje asupra Internetului sau alte cercetări, se pot alege alege ținte în mod aleator.

Vom împrumuta din limba engleză termenul de host. Acesta se referă la orice element din rețea care comunică sau poate comunica. Aceste elemente pot fi stații de lucru, servere, routere, imprimante de rețea, etc. Unul din primii pași ai descoperirii elementelor din rețea este reducerea numărului (adesea uriaș) de IP într-o listă de hosturi active sau interesante. Scanarea fiecărui port de pe fiecare IP este un proces lent și de obicei inutil. Desigur, ce transformă un host într-unul interesant depinde în mare parte de scopul scanării. Administratorii de rețea ar putea fi interesați doar de calculatoarele ce rulează anumite servicii, în timp ce auditorii de securitate pot fi interesați de toate elementele ce posedă o adresa IP. Unui administrator îi poate fi suficient un simplu pachet ping ICMP pentru localizarea calculatoarelor din rețeaua internă, în timp ce un auditor extern poate folosi o multitudine de probe în încercarea de a scăpa de restricțiile firewall-ului.

Deoarece necesitățile în vederea descoperirii hosturilor sunt atât de diverse , aplicația prezentată oferă o varietate mare de opțiuni de personalizare a tehnicilor folosite. Descoperirea hosturilor este adesea numită scanare ping, dar trece cu mult de simplul stadiu al pachetelor ICMP care solicită un răspuns asociate omniprezentului instrument ping

Utilizatorii pot sări de pasul care implică pingul cu o scanare de tip listă sau dezactivând pingul, sau angrenând alte combinații arbitrare de probe multiport TCP SYN/ACK, UDP și ICMP. Scopul acestor probe este să solicite răspunsuri care să demonstreze dacă o adresa IP este cu adevărat activă (este folosită de un dispozitiv din rețea).

În multe rețele, doar un mic procentaj de adrese IP sunt active la un moment dat. Acest lucru este în mod special adevărat într-un spațiu de adrese rezervat conform binecuvântatului RFC1918 cum ar fi 10.0.0.0/8. Aceasta rețea are 16 milioane de IP-uri, dar am văzut că sunt folosite de companii cu mai puțin de o mie de calculatoare. Descoperirea hosturilor poate găsi acele calculatoare risipite în marea de adrese IP. Dacă nu sunt furnizate opțiuni de descoperire a hosturilor, aplicația trimite un pachet TCP ACK destinat portului 80 și un pachet de interogare ICMP cu solicitare de răspuns la fiecare sistem-calculator ținta.

O excepție la acestea este că scanarea ARP este folosită pentru orice ținta dintr-o rețea locală. Pentru utilizatori neprivilegiați cu conturi shell pe sisteme UNIX, sunt trimise pachete SYN în locul celor ack folosind apelul de sistem connect().

Descoperirea hosturilor este de obicei suficientă pentru scanarea rețelelor locale, dar un set mult mai cuprinzător de probe pentru descoperire este recomandat în auditul de securitate.

Opțiunea (care selectează tipul pingului) poate fi combinată. Se pot mări șansele de penetrare a unor firewalluri stricte trimițând mai multe probe folosind diferite porturi/flaguri (indicatori din pachetele) TCP și coduri ICMP. Descoperirea ARP este executată implicit împotriva țintelor dintr-o rețea locală chiar dacă se specifică altă opțiune , deoarece este aproape întotdeauna mai rapidă și mai eficientă.

Opțiunea scanare(ping) spune aplicației să realizeze o scanare ping (descoperirea hosturilor) și apoi să afișeze hosturile disponibile care răspund la scanare.

Nici un alt fel de test (cum ar fi scanarea de porturi sau detecția sistemului de operare) nu va fi realizat. Acest pas este mai intruziv decât scanarea de tip listă și poate fi folosită adesea în același scop. Permite o descoperire a țintelor din rețea fără a atrage prea mult atenția. Cunoscând cate hosturi sunt active este o informație mult mai valoroasă unui atacator decât simpla listă furnizată de scanarea de tip listă a fiecărei adrese IP și a numelor hosturilor.

6.4 Modulele aplicației

6.4.1 Scanarea și descoperirea rețelei Intranet

Administratorii de sistem găsesc adesea această opțiune prețioasă ca atare poate fi ușor utilizată pentru numărarea calculatoarelor disponibile într-o rețea sau pentru monitorizarea disponibilității serverelor. Adesea este denumită măturare ping și este mai de încredere decât pingul asupra adresei de broadcast deoarece multe hosturi nu răspund la solicitările de broadcast.

Opțiunea fără ping sare complet peste faza de descoperire. În mod normal, aplicația folosește această fază pentru a determina sistemele active pentru scanarea avansată. Implicit, realizează scanarea avansată cum ar fi scanarea de porturi, detecția versiunii și a sistemului de operare doar pentru hosturile găsite active. Dezactivarea descoperirii hosturilor face ca aplicația să încerce tehnicile avansate de scanare pentru fiecare adresa IP specificată ca țintă. Toate cele 65 536 de adrese IP vor fi scanate cu tehnicile avansate.

Unul dintre cele mai comune scenarii de utilizare ale aplicației o reprezintă scanarea unei întregi rețele locale (LAN).

În multe LAN-uri, în special în cele care folosesc spațiul privat de adrese specificat în RFC1918, majoritatea adreselor IP nu sunt utilizate la un moment dat.

Când aplicația încearcă să trimită un pachet ICMP solicitând un răspuns, sistemul de operare trebuie să determine adresa de destinație hardware (ARP) corespunzătoare adresei țintă IP astfel încât să poată adresa în mod corect frame-ul ethernet.

Este adesea un proces lent, din moment ce sistemele de operare nu au fost proiectate să realizeze milioane de solicitari ARP către hosturi indisponibile într-o perioadă foarte scurtă de timp.

  Scanarea ARP pune algoritmii în funcțiune pentru a realiza solicitările ARP. Și dacă primește un răspuns nici nu mai ia în considerare pingurile bazate pe IP din moment ce știe deja ca hostul este activ. Acest lucru face scanarea ARP mult mai rapidă și mai corectă decât scanările bazate pe IP. Așadar este realizată implicit când aplicația detectează faptul că adresele scanate fac parte dintr-un LAN. Chiar dacă tipuri diferite de ping sunt specificate.

6.4.2 Scanarea porturilor pentru siguranța rețelei

Cele șase stări ale porturilor recunoscute de aplicație:

open (deschis)

O aplicație acceptă în mod activ conexiuni TCP sau pachete UDP la respectivul port. Găsirea acestora este adesea scopul principal al scanării de porturi. Oamenii preocupați de securitate știu că fiecare port deschis reprezintă o cale de acces pentru un atac. Atacatorii și pen-testerii doresc exploatarea porturilor deschise, în timp ce administratorii încearcă să le închidă sau să le protejeze prin firewalluri fără a încurca planurile utilizatorilor legitimi. Porturile deschise sunt interesante și pentru scanările ce nu urmăresc stabilirea securității deoarece ele arată serviciile disponibile pentru rețea de la respectivul host.

closed (închis)

Un port închis este accesibil (primește și răspunde la un pachet de probă trimis dar nu există nici o aplicație care să asculte la el). Pot fi folositoare în dezvăluirea stării hostului sau ca parte a detecției sistemului de operare. Deoarece cu porturile închise se poate comunica, ele merită scanate și mai târziu în caz că vreunul dintre ele se deschide. Administratorii pot lua în considerare blocarea unor astfel de porturi cu ajutorul unui firewall. Astfel ele vor apărea având starea filtrat, discutată mai departe.

filtered (filtrat)

Aplicația nu poate determina dacă portul este deschis datorită unui filtru de pachete care împiedică pachetele să ajungă la portul destinație. Filtrarea poate proveni de la un firewall dedicat, din regulile unui router sau dintr-un firewall software al țintei. Aceste porturi frustrează atacatorii deoarece furnizează foarte puține informații. Uneori răspund cu un mesaj de eroare ICMP cum ar fi tipul 3 codul 13 (destinație care nu a putut fi atinsă: comunicația interzisă administrativ), dar filtrele care execută operația drop (ignoră pachetul) fără să răspundă sunt mult mai comune. Acest lucru forțează aplicația să retrimită de câteva ori probele pentru cazul în care pachetul s-a pierdut din cauza congestionării rețelei și nu din cauza filtrării. Acest lucru încetinește viteza de scanare dramatic.

unfiltered (nefiltrat)

Starea nefiltrată înseamnă că portul este accesibil, dar nu se poate determina dacă portul este închis sau deschis. Numai scanarea ACK, folosită pentru maparea regulilor din firewall, clasifică portul în această stare. Scanarea porturilor nefiltrate cu alte tipuri de opțiuni cum ar fi scanarea Window(fereastra), scanarea SYN sau scanarea FIN poate stabili dacă portul este deschis.

open|filtered (deschis|filtrat)

Plasează porturi în această categorie când nu poate determina dacă portul este deschis sau filtrat. Acestea apar pentru tipurile de scanări în care porturile deschise nu oferă nici un răspuns. Lipsa răspunsului poate sa mai însemne și că un filtru de pachete a ignorat pachetul de probă sau orice răspuns aferent. Așadar aplicația nu poate ști sigur dacă portul este deschis sau filtrat. Scanările UDP, IP, FIN, Null sau Xmas clasifică porturile în această stare.

closed|filtered (închis|filtrat)

Această stare este folosită când aplicația este în imposibilitatea de a determina dacă portul este închis sau filtrat. Este folosit doar de scanarea IPID Idle.

6.4.3 Tehnici de scanare de porturi

Experții înțeleg multitudinea de tehnici de scanare și o aleg pe cea potrivită (sau combinația potrivită) pentru o anumită misiune. Pe de altă parte, utilizatorii neexperimentați și script kiddies încearcă să rezolve problema prin scanarea SYN implicită. Din moment ce open source este gratuit, singura barieră în arta scanării de porturi o reprezintă cunoștințele.

Multe dintre tipurile de scanare sunt disponibile doar utilizatorilor privilegiați. Aceasta datorită faptului că trimit și primesc pachete brute, care necesită acces root pe sistemele UNIX. Folosirea unui cont de administrator sub Windows este recomandată, cu toate că aplicația funcționează câteodată și pentru utilizatorii neprivilegiați.

Necesitatea privilegiilor root au reprezentat o problemă serioasă la lansarea aplicației , deoarece mulți utilizatori beneficiau doar de conturi limitate. Acum lumea e diferită. Calculatoarele sunt ieftine, mulți oameni au acces direct și permanent la Internet iar sistemele UNIX (incluzând Linux și MAC OS X) sunt răspândite.

Chiar dacă aplicația încearcă să producă cele mai precise rezultate, întotdeauna el se bazează pe pachetele returnate de sistem țintă (sau firewallul din fața lui). Asemenea hosturi pot să nu fie de încredere iar răspunsurile trimise pot fi menite să încurce sau să ducă pe o pistă greșită aplicația.

Comune sunt hosturile neconcordante cu standardele RFC care nu răspund cum ar trebui probelor aplicației. Scanările sunt în mod particular susceptibile de așa ceva.

Astfel de probleme sunt specifice anumitor tipuri de scanări și sunt discutate individual la fiecare tip de scanare în parte.

Această secțiune documentează multitudinea de tehnici de scanare de porturi suportate. O singură metodă poate fi folosită la o scanare (nu pot fi combinate mai multe tipuri), cu excepția scanării UDP care poate fi combinată cu unul din tipurile de scanare TCP.

Scanare TCP SYN

Scanarea SYN este implicită și cea mai populară metodă pentru motive bine întemeiate. Poate fi executată rapid, scanând mii de porturi pe secundă într-o rețea rapidă neobstrucționată de un firewall deranjant. Scanările SYN sunt relativ invizibile, din moment ce nu stabilesc niciodată o conexiune TCP. Funcționează împotriva oricărei implementari conform cu standardul de stivă TCP în loc să depindă de platformă așa cum o fac scanările. Oferă de asemenea o diferență clară și precisă între stările open (deschisă), closed (închisă), filtered (filtrată).

Această tehnică este adesea denumită ca o scanare jumătate deschisă, deoarece nu se deschide o conexiune completă TCP. Se trimite un pachet SYN, ca și cum s-ar deschide o conexiune și se așteaptă un răspuns. Un pachet SYN/ACK indică faptul ca portul este deschis, în timp ce un RST (reset) este indicatorul unui port închis. Dacă nici un răspuns nu este primit după mai multe retransmiteri, portul este marcat ca fiind filtrat. Portul este de asemenea marcat filtrat dacă un mesaj de eroare ICMP negăsit (tipul 3, codurile 1,2,3,9,10 sau 13) este recepționat.

Scanare TCP connect()

Scanarea TCP Connect() este implicită când SYN nu reprezintă o opțiune viabilă. Acesta este cazul în care utilizatorul nu beneficiază de posibilitatea de trimitere a pachetelor brute sau scanează rețele IPv6. În locul scrierii pachetelor brute așa cum o fac majoritatea tipurilor de scanare, Nmap cere nivelelor inferioare ale sistemului de operare să stabilească o conexiune cu sistemul țintă și portul dorit realizând un apel de sistem connect()

Acesta este același apel de sistem prin care aplicațiile de nivel înalt cum ar fi browserele, clienții P2P și în general aplicațiile cu funcții de rețea le folosesc pentru stabilirea conexiunii. Este o parte a interfeței de programare cunoscută ca Berkley Sockets API. În loc să citească pachete brute ca răspuns se folosește API pentru a obține informații despre starea fiecărei conexiuni încercate.

Când scanarea SYN este disponibilă, ea reprezintă în general alegerea mai bună.

Apelul de sistem completează conexiunea pentru a deschide conexiunea în loc să efectueze o jumătate de conexiune așa cum scanarea SYN o face. Nu numai că acest lucru durează mai mult și necesită mai multe pachete pentru a obține aceeași informație, dar există șanse mai mari ca sistemele țintă să înregistreze conexiunea. Un IDS decent va prinde și el conexiunea, dar multe servere nu au astfel de sisteme de alarmă. Multe servicii ale unui sistem uzual UNIX vor adăuga o notă la syslog și câteodată și un mesaj criptic de eroare când aplicația se conectează și apoi închide conexiunea fără a trimite date. Servicii patetice se pot bloca în acest caz, dar nu este un lucru comun. Un administrator care vede o mulțime de tentative de conexiune în log-uri venind de la o singură sursă trebuie să știe că a fost scanat prin metoda connect.

Detecția sistemului de operare

Una dintre cele mai cunoscute facilități o reprezintă detectarea de la distanță a sistemului de operare folosind amprentele stivei TCP/IP. Aplicația trimite o serie de pachete TCP si UDP la calculatorul țintă și examinează practic bit cu bit răspunsul. După ce rulează o mulțime de teste ce includ crearea de modele TCP ISN, suportul și ordonarea opțiunilor TCP, crearea de modele IPID și verificarea dimensiunii inițiale a cadrului, compararea rezultatului cu baza de date ce conține mai mult de 1500 de amprente de sisteme de operare, și afișează detaliile acestuia dacă este găsită o similitudine. Fiecare amprentă include o descriere textuală a sistemului de operare și o clasificare ce furnizează numele producătorului (ex: Sun), sistemul de operare (ex: Solaris), versiunea (ex: 10) și tipul serverului (scop general, router, switch, consola de jocuri, etc.).

Dacă aplicația este în imposibilitatea de a ghici sistemul de operare al unui calculator iar condițiile sunt favorabile (ex: cel puțin un port deschis și unul închis au fost găsite), se va furniza un URL care poate fi folosit pentru a trimite, dacă se știe cu siguranță, ce sistem de operare rulează. Prin acest lucru contribuiți la baza de sisteme cunoscute , făcând identificarea sistemului de operare mai precisă și pentru ceilalți.

Detecția sistemului de operare activează alte câteva teste care folosesc oricum informația obținută în acest proces. Unul dintre acestea este masurarea timpului de activitate (uptime), care folosește opțiunea de amprenta de timp din pachetele TCP (RFC 1323) și ghicește când a fost ultima oară rebutat sistemul. Acest lucru este raportat doar pentru sistemele care furnizează această informație.

Alt test este cel de clasificare al predictibilității secvenței TCP. Acesta măsoară cu aproximație cât de greu este să stabilești o conexiune falsificată TCP cu țintă. Este folositoare pentru exploatarea relațiilor de încredere bazate pe IP (login, filtre firewall, etc.) sau pentru ascunderea sursei unui atac. Acest tip de ascundere a identității este rar întâlnită în zilele noastre, dar multe sisteme sunt încă vulnerabile.

Numărul ce reprezintă dificultatea este bazat pe modelarea statistică și poate fluctua. În general este mai bine dacă se folosește clasificarea textuală, cum ar fi worthy challenge (merită încercat) sau trivial joke (glumă banală) . Acestea sunt raportate doar în modul afișare detaliată.

Aplicația are capacitatea de a scana porturi sau versiuni pe mai multe hosturi în paralel. Acest lucru se realizează prin divizarea spațiului de adrese IP țintă în grupuri și scanând fiecare grup pe rând. În general, grupurile mari sunt mult mai eficiente.

Aspectul negativ este că rezultatul scanării pentru fiecare host nu poate fi furnizat până ce nu e terminată scanarea pentru întregul grup. Dacă aplicația pornește scanarea unui grup de 50 de hosturi, utilizatorul nu va primi nici un raport (cu excepția update-urilor oferite de modul vizualizare detaliată) până când nu s-a terminat scanarea pentru aceste hosturi.

Implicit, se adoptă o abordare de compromis în acest conflict.

Pornește cu un grup mic de cinci pentru a afișa rapid primele rezultate și apoi crește dimensiunea grupului până la 1024. Numărul exact depinde de opțiunea dată. Din motive de eficiență, aplicația utilizează grupuri mai mari pentru scanările UDP și pentru câteva din porturile TCP.

Daca hosturile fac parte din rețeaua internă, o valoare de 100 milisecunde este una suficient de agresivă.

Dacă routarea intră în joc, executați un ping la un host din respectiva rețea folosind utilitarul PING din sistemul de operare, sau cu un utilitar de construit pachete cum ar fi hping2 ce are mai multe șanse de a trece prin firewall. Analizați timpul maxim dintr-un grup de zece pachete.

Păcălirea Firewall/IDSurilor și ascunderea identității

Mulți pionieri ai Internetului au prevăzut o rețea globală deschisă cu un spațiu universal de adrese IP permițând conexiuni virtuale între oricare doua noduri. Acest lucru permite hosturilor să acționeze ca parteneri în comunicație, să servească și să obțină informații unul de la celalalt. Oamenii pot accesa sistemele de acasă, să schimbe temperatura în casă sau să deschidă ușa pentru oaspeții grăbiți. Viziunea conectivității universale a fost înăbușită de micșorarea spațiului de adrese și de problemele de securitate. La începutul anilor 90, organizațiile au început implementarea firewall-urilor cu scopul precis de reducere a conectivității. Rețele uriașe au fost separate de Internetul nefiltrat prin aplicații proxy, traduceri de adrese de rețea (NAT) și filtre de pachete. Fluxul nerestricționat de informații a făcut loc canalelor de comunicație aprobate și supuse unor anumite reguli, precum și controlului datelor ce trece prin ele.

Obstacolele din rețea cum ar fi firewall-urile pot face din maparea rețelei o operație extrem de dificilă. Nu va deveni mai ușor din moment ce constrângerile aplicate rețelei reprezintă adesea un scop al implementării noilor echipamente în rețea. Nu e mai puțin adevărat că aplicația oferă multe opțiuni pentru înțelegerea acestor rețele complexe și să verifice dacă filtrele funcționează așa cum trebuie. Chiar suportă mecanisme de depășire a sistemelor de apărare prost implementate. Puneți-vă în pielea unui atacator și aplicați tehnici din această secțiune în rețeaua dumneavoastră. Lansați un atac sărit FTP, o scanare Idle, o fragmentare a atacului sau încercați realizarea unui tunel printr-un proxy de-al dumneavoastră.

In plus față de restricțiile rețelelor, companiile au început să monitorizeze traficul cu sisteme de detecție a intruziunilor (IDS). Toate IDS-urile cunoscute sunt livrate cu reguli care să detecteze scanările deoarece acestea preced de obicei un atac. Multe dintre acestea s-au transformat în sisteme de prevenire a intruziunilor (IPS) care blochează în mod activ traficul presupus malițios.

Din păcate pentru administratorii de rețea și vânzătorii IDS-urilor, detectarea în mod corect a relelor intenții prin analizarea pachetelor este o problemă dificilă. Atacatorii cu răbdare, îndemânare și ajutor din partea anumitor opțiuni pot în mod normal să treacă de IDS nedetectați. Între timp, administratorii au de a face cu o mulțime de alerte false când trafic inocent este greșit diagnosticat și se emite o atenționare sau este chiar blocat.

Câteodată oamenii sugerează aplicația nu ar trebui să ofere funcții de păcălire a regulilor firewall-urilor sau de trecerea nedetectata de IDS. Argumentează prin faptul ca pot fi folosite de atacatori. Problema în acest raționament este că atacatorii tot vor găsi instrumente sau patchuri pentru a realiza acest lucru. Între timp, administratorii pot descoperi că munca lor este mult mai dificilă. Instalarea numai a serverelor FTP moderne, cu patchurile aplicate la zi este o metoda mult mai bună de protecție decât prevenirea distribuirii instrumentelor ce implementează atacurile sărite FTP.

Nu există nici o opțiune magică pentru detectarea și păcălirea firewall-urilor și a sistemelor IDS. Acest lucru ia îndemânare și experiență. O prezentare detaliată este dincolo de scopul acestui ghid de referință, care listează doar opțiunile relevante și descrie ce fac ele.

O greșeală surprinzător de des întâlnită o reprezintă configurarea relațiilor de încredere în funcție de numărul portului sursa. Este ușor de înțeles cum stau lucrurile. Un administrator instalează un nou firewall și este apoi îngropat în plângeri din partea utilizatorilor nemulțumiți ale căror aplicații nu mai funcționează. În particular, DNS-ul poate fi blocat deoarece răspunsurile UDP DNS de la serverele externe nu mai pot intra în rețea. FTP este un alt exemplu. În transferurile FTP active, serverul încearcă să stabilească o conexiune înapoi la client pentru transferarea fișierului solicitat.

Soluții securizate la aceste probleme există, de obicei sub formă de proxi-uri la nivelul aplicație sau module firewall care analizează protocoalele. Din păcate există și soluții mai simple și mai nesigure. Notând faptul că răspunsurile DNS vin de la portul 53 și cele de la conexiunile FTP de la portul 20, mulți administratori au căzut în capcana permiterii necondiționate a traficului de la aceste porturi. Adesea ei presupun că nici un atacator nu va observa și exploata astfel de găuri în firewall. În alte cazuri, administratorii consideră această rezolvare ca una pe termen scurt până când vor implementa o soluție mai sigură. Apoi ei uită să mai facă upgrade-ul de securitate.

Administratorii rețelelor supraîncărcate nu sunt singurii care cad în această capcană. Numeroase produse au fost livrate cu aceste reguli nesigure. Chiar și Microsoft are partea ei de vină. Filtrele IP-sec livrate cu Windows 2000 și Windows XP conțin o regulă implicită care permite traficul oricărui pachet UDP cu portul sursa 53 (DNS) sau 67 (DHCP).

În mod normal aplicația trimite pachete minimaliste conținând doar headerul. Astfel, pachetele TCP au în general 40 bytes și cererile de răspuns ICMP doar 28. Această opțiune adaugă numărul dat ca argument de bytes, generați aleator, la majoritatea pachetelor trimise. Pachetele pentru detecția sistemului de operare nu sunt afectate, dar majoritatea pingurilor și scanărilor de porturi sunt. Acest lucru încetinește viteza de scanare, dar pachetele pot fi mai puțin suspicioase.

6.4.4 Afișarea rezultatelor

Orice instrument de securitate este bun în măsura rezultatelor generate. Teste complexe și algoritmi nu au nici o valoare dacă nu sunt prezentate într-un mod organizat și inteligibil. Dat fiind numărul de moduri în care aplicația este folosită de oameni sau programe, nu există un format unic care să îi mulțumească pe toți.

Dig crește cantitatea de informații afișate, făcând ca aplicația să afișeze mai multe date despre scanarea în curs. Porturile deschise sunt afișate pe măsură ce sunt descoperite și un timp estimat al terminării este furnizat atunci când se constată că scanarea va dura mai mult decât câteva minute. Se folosește de două ori opțiunea pentru un efect și mai puternic. Folosirea mai mult de două ori nu are nici un efect.

 Deși IPv6 nu a revoluționat lumea, are parte de o folosire semnificativă în unele țări (în special în Asia) și majoritatea sistemelor moderne de operare oferă suport. Pentru folosirea Nmap cu IPv6, atât sursa cât și ținta scanării trebuie să fie configurate în IPv6. Dacă ISP-ul nu alocă o adresă IPv6 (mulți nu o fac), tunele de trecere sunt disponibile gratuit și funcționează bine.

6.4.5 Alte funcții și utilitare ale aplicației

Descrierea succintă a funcțiilor folosite în aplicație

6.4.6 Rezolvă Host / Reverse Lookup

Reverse Lookup este un termen referitor la utilizarea lookups-urilor DNS pentru a determina ce adresa IP este asociată cu un hostname dat.

 Cu Reverse IP/Lookup se află host-ul original pentru un anumit IP. E folositor dacă se dorește localizarea unui spammer.

6.4.7 Află țara

Opțiunea află țara va încerca să determine în ce țară este localizat un host specific, și ar trebui să meargă cu aproape orice host dacă nu este un host local.

La prima utilizare poate să ia mai mult timp deoarece trebuie salvată lista cu țările de la website-ul ISO Standards. După prima utilizare va merge mult mai repede.

6.4.8 Whois (IP)

Whois este un protocol de Internet care este foarte folosit pentru interogarea unei baze de date pentru aflarea proprietarului unui domeniu sau o adresă IP pe Internet.
Se poate folosi și un anumit port.
Ex:  whois.arin.net:43

6.4.9 Whois (Domain)

Whois este un protocol de internet care este larg folosit pentru interogarea unei baze de date pentru aflarea proprietarului unui domeniu sau o adresa IP pe Internet.

6.4.10 NS Lookup

Comanda nslookup folosește DNS lookup să găsească adresa IP a unui computer particular. Funcționalitatea s-a învechit și este recomandată folosirea opțiunii DIG.

6.4.11 DIG

DIG (Domain Information Groper) este o unealtă flexibilă pentru interogarea serverelor DNS.

6.4.12 Ping

Ping este folosită la testarea dacă un anumit host operează corespunzător și este găsit pe rețea. Ping oferă estimări ale timpului și ale pierderilor de informații dintre sisteme.

6.4.13 Traceroute  

Traceroute (tracert pe sistemul Windows) permite utilizatorului să determine rutarea pachetelor până la un host. Trimite datagrame UDP și folosește pachetele returnate ICMP să producă o listă de sisteme traversate de pachet în drumul spre destinație.

6.4.14 Tracepath  

Tracepath este o comandă similară cu Traceroute cu excepția că de obicei nu necesită privilegii specifice ale utilizatorului pe server.

6.4.15 Portscan  

Port scanner este un software proiectat să caute porturile deschise ale unui sistem. Folosit pentru verificarea securității rețelei.

Folosiți virgule (,) pentru a separa porturile și o liniuță pentru a indica delimitarea (1-50).Se pot combina virgule și liniuțe.

Ex:  '21-23,80' va scana porturile 21,22,23 si 80.

6.4.16 Nmap  
Nmap este o utilitate de scanare avansată a porturilor cu multe opțiuni. Unele opțiuni necesită privilegii de root pe server și nu vor funcționa în acest script. Dacă se încearcă folosirea acestei opțiuni va fi returnată o eroare.
De asemenea nu toate serverele au instalate nmap sau permit folosirea acestei comenzi.

6.5 Modulul calendar evenimente

Modul pentru implementarea unui spațiu de lucru unde personalul poate vedea programarea anumitor evenimente din cadrul firmei (evenimente la care pot participa sau pot răspunde direct în modulul aplicației).

Aplicația este compusă din modulul vizualizare (Fig.6.3) în care se pot observa toate zilele lunii cu o descriere scurtă a evenimentelor programate și orarul acestora, cu posibilitatea de a afla detalii despre evenimente ( atunci când se face click pe linkul corespunzător evenimentului vizat ).

Fig. 6.3 Interfata Calendar evenimente

Aplicația mai are următoarele facilități: păstrarea unei arhive cu evenimentele petrecute în lunile anterioare, precum și posibilitatea aflării evenimentelor viitoare.

Pentru personalul autorizat de către administratorul aplicației există partea de autentificare, care permit unui utilizator sau administratorului să introducă noi evenimente prin simplul click pe ziua corespunzătoare evenimentului.

Adăugarea unui nou eveniment (Fig.6.4) se face prin completarea câmpurilor din fereastra de adăugare.

Fig. 6.4 Adaugarea evenimentelor

În modulul de administrare a calendarului, administratorul este singurul care are drepturile de adăugare, modificare sau ștergere a utilizatorilor sau a evenimentelor.(Fig. 6.5) Utilizatorii au posibilitatea numai de a adăuga evenimente.

Fig.6.5 – Editare evenimente in modul administrare

Administrarea utiliyatorilor se face in modul adinistrare(Fig. 6.6)

Funcția de editare (Fig.6.7) a unui utilizator de către administrator oferă următoarele posibilități: schimbarea numelui, prenumelui sau a emailului utilizatorului, în caz de nevoie, precum și a parolei. În anumite cazuri, contul unui utilizator se poate transforma în cont de administrator .(Fig.6.8)

Fig. 6.6 – Administrarea utilizatorilor

Fig.6.7 – Editarea utilizatorilor

Funcția de ștergere afișează pe ecran un pop-up (deschiderea unei ferestre) cu opțiunile de ștergere sa revocare.

Acest modul ( calendar de evenimente) ajută foarte mult personalul firmei , contribuind la o informare rapidă a acestuia despre evenimentele din firmă.

6.6 Modulul forum

Dezvoltat datorită nevoii de comunicare între angajații firmei pentru rezolvarea unor probleme comune, forumul firmei a fost adaptat la transferul rapid de informații și fișiere în cadrul unității, precum și la menținerea unei arhive cu problemele apărute și soluționate sau aflate in curs de soluționare.

Această arhivă poate fi accesată de către oricare angajat și poate fi consultată în eventualitatea unor situații similare cu scopul de a găsi cea mai potrivită soluție pentru situația respectivă.

Forumul are următoarele funcții:

Adaugarea de noi subiecte

Posibilitatea de a raspunde anumitor anunturi sau subiecte

Interfata administrare de unde se pot sterge sau modifica anunturile sau mesajele(fig. 6.8)

Fig. 6.8 Interfata Forum

In modul de administrare al forumului, administratorul are dreptul de a sterge anumite anunturi, sau de a le modifica (Fig.6.9)

Fig.6.9 – Modulul administrare al forumului

CONCLUZII

Indubitabil, tehnologiile Web reprezintă cel mai fascinant și dinamic domeniu al informaticii actuale și de viitor. Această dezvoltare tehnologică poate reprezenta soluția ideală pentru ca multe dintre activitățile pe care omul le întreprinde să devină mai ușoare și chiar mult mai eficiente.

În lucrarea de față s-a prezentat o soluție pentru îmbunătățirea și eficientizarea comunicarii dintr-o firmă în gestiunea activității angajatilor folosind tehnologiile Web. Mai mult, prin această soluție reprezentată de aplicația descrisa, angajatii au oricând și de oriunde acces la informații cum ar fi: evenimentele ce se petrec, s-au petrecut sau se vor petrece în cadrul firmei, anumite informatii despre hosturi, porturile serverelor, situatia Intranetului etc.

Mai întâi s-au prezentat tehnologiile necesare dezvoltării aplicației și avantajele folosirii acestor tehnologii. Apoi, în partea a doua a lucrării s-a prezentat aspectul practic pe care lucrarea de față îl tratează, făcând o analiză a modului de implementare a aplicației.

Accentul s-a pus pe construirea unuei aplicații care să fie ușor de întreținut și care să necesite costuri minime în eventualitatea extinderii ei.

Planurile de viitor includ: mărirea flexibilității de stabilire a modului de evaluare a Intranetului, dezvoltarea de noi module, integrarea în aplicație unui program Neoman pentru gestionarea mărfii din magazine, precum și funcționalitățile care vor fi cerute pe parcursul folosirii efective a aplicației în procesul informațional al firmei.

Bibliografie

U. Black, Internet Security Protocols, Prentice Hall PTR, 2003.

2. C. Brenton, C. Hunt, Mastering Network Security, SYBEX Inc., 2002.

3. J.R. Burke, Network Management: Concepts and Practice, A Hands-On

Approach, Prentice Hall PTR, 2004

4. D. Corner, Complete TCP/IP Training Course, Student Edition, Prentice Hall PTR, 2001.

5. T. Maufer, IP Fundamentals: What Everyone Needs to Know About

Addressing and Routing, Prentice Hall PTR, 1999.

6. T.W. Ogletree, Firewalls . Protecția rețelelor conectate la Internet, Ed.

Teora, București, 2001.

7. A.S. Tanenbaum, Rețele de calculatoare (ediția a treia), Ed. Computer Press AGORA, Tg. Mureș, 1998

8. A.S. Tanenbaum, Computer Networks (Fourth Edition), Prentice Hall PTR, 2003.

9. R.D. Zota, Rețele de calculatoare în era Internet, Ed. Economică, București, 2002

. James Chellis, Matthew Strebe, Elemente fundamentale ale retelelor de calculatoare (Ghid de studiu), Ed. ALL, 2000

11. Adrian Munteanu, Valerica Greavu-Serban, Gabriel Cristescu, Retele windows. servere si clienti. exemple practice, Ed. Polirom,2004

12. F. Halsall – Multimedia communications – applications, networks,

protocols and standards – Pearson Education Limited, 2001

13. Levine Young M. – Internet complete reference, Millennium

Edition, Osborne/Mcgraw-Hill,1999;

14. I. Roșca, ș.a. – Internet și Intranet – Concepte și aplicații, Editura

Economică, București 2000;

15. Tr. Surcel, R. Marsanu, A. Reveiu, P. Pocatilu, Bazele informaticii economice, http://www.ase.ro/biblioteca/carte2.asp?id=380&idb=

16. LaQuey, Tracy, Users' Directory of Computer Networks, Digital Press, Bedford, MA, 1990

17. Coman, Daniel, trad. , Administrarea retelelor Microsoft Windows NT : manual pentru administrarea retelelor Windows NT 4.0 , Teora, 1999 

18. Nastase, Floarea , Arhitectura retelelor de calculatoare , Editura Economica, 1998

19. Microsoft Corporation ; Petrescu, Anca, trad. ; Petrescu, Silviu, trad. , Bazele retelelor de calculatoare : manual pentru administrarea retelelor LAN si WAN , Teora, 1999 

=== Sursa ===

Anexa B

Listingul Sursei

Config.php

<?php

//Setari

$dbserver = "localhost";

$dbname = "roparty_network";

$dbprefix = "a";

$dbusername = "roparty_network";

$dbpassword = "network";

$OS = "2";

?>

Admin.php

<?php

require "requires.php";

$self = $_SERVER['PHP_SELF'];

function login_form($param,$power) {

echo "<style type='text/css'>

<!–

body {

background-color: #FFE1C4;

}

–>

</style><title>Romsoft Administrare IP</title><form method='POST' action='$self'><p align='center'>";

if ($param == "w") {

echo "<b><font face='Verdana, Arial, Helvetica, sans-serif' color='red' size='2'>Utilizator sau Parola gresita va rugam incercati din nou</font></b><br>";

}

echo "Utilizator: <input type='text' name='username' size='20'><br>

Parola:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type='password' name='password' size='20'><br>

<input type='submit' name='login' value='Intra'><br><br>$power</p>

</form>";

}

function unset_login() {

unset($_SESSION['username']);

unset($_SESSION['password']);

}

function check_login($dbprefix) {

$query = sprintf("SELECT * FROM " . $dbprefix . "users WHERE username=%s AND password=%s",

quote_smart($_POST['username']),

quote_smart(md5($_POST['password'])));

$result = mysql_query($query);

if (!$result) {

$message = 'Invalid query: ' . mysql_error() . "\n";

$message .= 'Whole query: ' . $query;

die($message);

}

if (mysql_num_rows($result) == 0) {

$status = "w";

}

while ($row = mysql_fetch_assoc($result)) {

$_SESSION['username'] = $row['username'];

$_SESSION['password'] = $row['password'];

}

if($_SESSION['password'] == md5($_POST['password'])) {

$logged_in = 1;

} else {

$logged_in = 0;

$status = "w";

unset_login();

}

}

session_start();

if (isset($_POST['login'])) {

check_login($dbprefix);

}

if (!isset($_SESSION['username']) || !isset($_SESSION['password'])) {

$logged_in = 0;

} else {

$logged_in = 1;

}

if ($logged_in == 0) {

login_form($status,$power);

}

if ($logged_in == 1) {

if (empty($_REQUEST['framename'])) {

echo "<style type='text/css'>

<!–

body {

background-color: #FFE1C4;

}

–>

</style><frameset cols='175,*' border='0' framespacing='2' frameborder='0'>

<frame name='nav' src='admin.php?framename=nav' noresize='0' frameborder='0' />

<frame name='main' src='admin.php?framename=main' noresize='0' frameborder='0' />

<noframes><body>Your browser does not support frames.<br />

Please download a browser like Internet Explorer or Firefox that supports frames.<br />

</body></noframes>

</frameset>";

}

}

if ($_REQUEST['framename'] == "nav") {

include ('head1.php');

echo "<div align='center'>CNDPI ROMSOFT

<table border='0' width='100%' >

<tr><td><p align='center'><b>ADMINISTRARE IP</b></td></tr>

<tr><td><a href='admin.php?framename=main' target='main'>Acasa</a></td></tr>

<tr><td><a href='index.php' target='main'>Vizualizare IP-uri</a></td></tr>

</table><br>

<table border='0' width='100%'>

<tr><td><p align='center'><b>Administrare</b></td></tr>

<tr><td><a href='admin.php?framename=main&do=addman' target='main'>Management</a></td></tr>

</table><br>";

echo "<table border='0' width='100%'>

<tr><td><p align='center'><b>Optiuni</b></td></tr>

<tr><td><a href='index.php' target='_parent'>Iesire</a></td></tr>

</table><br></div>";

}

if ($_REQUEST['do'] == "logout") {

if ($logged_in == 0) {

die('Eroare');

}

unset($_SESSION['username']);

unset($_SESSION['password']);

$_SESSION = array();

session_destroy();

header('Location: admin.php');

}

if ($_REQUEST['framename'] == "main") {

if (empty($_REQUEST['do'])) {

include ('head1.php');

echo "<b>Panou central pentru administrarea retelei prin vizualizarea ip-urilor care raspund la ping</b><br><br><br>$power</p>";

}

if ($_REQUEST['do'] == "addman") {

echo "<b>Management Adrese IP</b><br><br>";

if (empty($_REQUEST['func'])) {

include ('head11.php');

echo "Din acest panou se poate adauga, sterge sau modifica Adresele stocate in baza de date";

echo "<br><br><a href='admin.php?framename=main&do=addman&func=add'>Adaugare</a><br><table border='0' width='100%'>

<tr><td width='40%'><b>Numele sistemului</b></td><td width='40%'><b>IP sau adresa URL</b></td><td width='20%'><b>Optiuni</b></td></tr> ";

$query = sprintf("SELECT * FROM " . $dbprefix . "ips");

$result = mysql_query($query);

if (!$result) {

$message = 'Invalid query: ' . mysql_error() . "\n";

$message .= 'Whole query: ' . $query;

die($message);

}

if (mysql_num_rows($result) == 0) {

$status = "w";

}

while ($row = mysql_fetch_assoc($result)) {

echo "<tr><td>".$row['name']."</td><td>".$row['address']."</td><td><a href='admin.php?framename=main&do=addman&func=edit&id=".$row['id']."'><img src='images/edit.gif' border='0' alt='Editare'></a></td></tr>";

}

}

if ($_REQUEST['func'] == "edit") {

if (!isset($_POST['edit'])) {

include ('head11.php');

echo "Din acest panou se poate edita o adresa din baza de date";

$query = sprintf("SELECT * FROM " . $dbprefix . "ips WHERE id=%s", quote_smart($_REQUEST['id']));

$result = mysql_query($query);

if (!$result) {

$message = 'Invalid query: ' . mysql_error() . "\n";

$message .= 'Whole query: ' . $query;

die($message);

}

if (mysql_num_rows($result) == 0) {

$status = "w";

}

while ($row = mysql_fetch_assoc($result)) {

include ('head11.php');

echo "<form method='POST' action='admin.php?framename=main&do=addman&func=edit'>

<p align='center'>Numele sistemului:<input type='text' name='name' size='20' value='".$row['name']."'><br>

IP sau adresa URL: <input type='text' name='address' size='20' value='".$row['address']."'><br>

<input type='hidden' name='id' value='".$row['id']."'>

<input type='submit' value='Actualizeaza' name='edit'><input type='reset' value='Reseteaza'></p>

</form>";

}

} else {

$query = sprintf("UPDATE " . $dbprefix . "ips SET name = %s, address = %s WHERE id = %s LIMIT 1", quote_smart($_POST['name']), quote_smart($_POST['address']), quote_smart($_POST['id']));

$result = mysql_query($query);

if (!$result) {

$message = 'Invalid query: ' . mysql_error() . "\n";

$message .= 'Whole query: ' . $query;

die($message);

} else {

include ('head11.php');

echo "<br><br><center>Inregistrarea a fost modificata cu succes<br><br>Click <a href='admin.php?framename=main&do=addman'>aici</a> pentru a va intoarce la management</center>";

}

}

}

if ($_REQUEST['func'] == "add") {

if (!isset($_POST['add'])) {

include ('head11.php');

echo "<form method='POST' action='admin.php?framename=main&do=addman&func=add'>

<p align='center'>Numele sistemului:<input type='text' name='name' size='20'><br>

IP sau adresa URL: <input type='text' name='address' size='20'><br>

<input type='submit' value='Adauga' name='add'><input type='reset' value='Reseteaza'></p>

</form>";

} else {

$query = sprintf("INSERT INTO " . $dbprefix . "ips (name, address) VALUES (%s, %s)", quote_smart($_POST['name']), quote_smart($_POST['address']));

$result = mysql_query($query);

if (!$result) {

$message = 'Invalid query: ' . mysql_error() . "\n";

$message .= 'Whole query: ' . $query;

die($message);

} else {

include ('head11.php');

echo "<br><br><center>Sistemul ".$_POST['name']." a fost adaugat in baza de date<br><br>Click <a href='admin.php?framename=main&do=addman'>aici</a> pentru a va intoarce la management</center>";

}

}

}

}

}

?>

Index.php

<style type="text/css">

<!–

body {

background-image: url(images/bg.jpg);

}

–>

</style><?php

include ('head.php');

require "requires.php";

$address_array = array();

$query = sprintf("SELECT * FROM " . $dbprefix . "ips");

$result = mysql_query($query);

if (!$result) {

$message = 'Invalid query: ' . mysql_error() . "\n";

$message .= 'Whole query: ' . $query;

die($message);

}

while ($row = mysql_fetch_assoc($result)) {

$string = $row['name'] . ":" . $row['address'];

array_push($address_array, $string);

}

function ping($pc,$ip,$OS){

if ($OS == "1") {

$cmd = shell_exec("ping -n 1 $ip");

} elseif ($OS == "2") {

$cmd = shell_exec("ping -c 1 $ip");

}

$data_mount = explode(",",$cmd);

if (eregi("0", $data_mount[1])) {

$connection = "<img src=\"images/off.gif\">";

}

if (eregi("1", $data_mount[1])) {

$connection = "<img src=\"images/on.gif\">";

}

$result = "<tr><td align='center'>$connection</td><td align='center'><i>$pc</i></td><td align='center'>$ip</td></tr>";

return $result;

}

echo "<title>Administrare Ip-uri interne</title>

<table cellspacing='0' width='100%'>

<tr>

<td width='15%' align='center'><b>Status</b></td>

<td width='45%' align='center'><b>Nume sistem</b></td>

<td width='30%' align='center'><b>Ip sau adresa URL</b></td>

</tr>";

while(list($k,$v) = each($address_array)){

$ip = explode(":",$v);

$result = ping($ip[0],$ip[1],$OS);

echo $result;

}

echo "</table><br><br>";

echo $power;

?>

Util.php

<?

$version = 'Lucrare de Licenta';

// retine informatii despre cine viziteaza pagina

$enable_log_user = FALSE;

//globale

global $ip, $host_name, $host_ip;

//variabile

$host = $_POST['host'];

$resolve = $_POST['resolve'];

$ip_to_country = $_POST['ip_to_country'];

$whois_ip = $_POST['whois_ip'];

$whois_ip_server = $_POST['whois_ip_server'];

$whois_domain = $_POST['whois_domain'];

$whois_domain_server = $_POST['whois_domain_server'];

$ns = $_POST['ns'];

$dig = $_POST['dig'];

$dig_class = $_POST['dig_class'];

$dig_server = $_POST['dig_server'];

$ping = $_POST['ping'];

$ping_count = $_POST['ping_count'];

$trace = $_POST['trace'];

$tracepath = $_POST['tracepath'];

$portscan = $_POST['portscan'];

$ports = $_POST['ports'];

$scan_timeout = $_POST['scan_timeout'];

$nmap = $_POST['nmap'];

$nmap_options = $_POST['nmap_options'];

// Functie pentru aflarea ip-ului utilizatorului

function get_ip()

{

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {

$ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }

elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {

$ip = $_SERVER['HTTP_CLIENT_IP']; }

else {

$ip = $_SERVER['REMOTE_ADDR']; }

return $ip;

}

// Functie pentru inregistrarea informatiilor despre persoana care navigheaza pe site (data, timp, IP, host, ce au scanat).

// Salvat intr-un fisier text care se poate vedea mai tarziu

function log_user($host)

{

global $ip;

// Data si ora actuala

$log_date = date('Y.m.d');

$log_time = date('H:i:s');

// variabila care tine informatiile spre a fi salvate

$log_info = "$log_date,$log_time,$ip," . gethostbyaddr($ip) . ",$host\r\n";

//daca exista log.csv

if (file_exists('log.csv'))

{

// deschide fisierul si adauga la sfarsit

$handle = fopen('log.csv', 'a');

}

// …altfel, …

else

{

// … creaza unu nou si scrie in el

$handle = fopen('log.csv', 'w');

@fwrite($handle, "DATE,TIME,USER IP,USER HOST,QUERY\r\n\r\n");

}

// Adauga informatiile si inchide fisierul

@fwrite($handle, $log_info);

fclose($handle);

}

// Functia pentru afisarea de Rezolvare Host/Reverse Lookup

function resolve($host)

{

global $host_name, $host_ip;

echo "<a href=\"javascript:enter_ip('$host');\">$host</a> rezolvat la ";

if ($host == $host_name) {

echo "<a href=\"javascript:enter_ip('$host_ip');\">$host_ip</a><br><br>"; }

else {

echo "<a href=\"javascript:enter_ip('$host_name');\">$host_name</a><br><br>"; }

}

// Functie pentru gasirea tarii IP-ului

function ip_to_country()

{

// Utilizarea "whois.arin.net" si pastrarea rezultatelor

$buffer = nl2br(whois_ip('whois.arin.net', '-1', 'FALSE'));

// Daca rezultatele contin referral server, se face o noua cautare utilizand serverul si se tin rezultatele in $buffer

if (eregi("ReferralServer:[[:space:]]*[a-z]*(whois://)*([a-z0-9-][\.a-z0-9-]{2,})[:]*([0-9]+)*", $buffer, $regs))

{

$referral_host = $regs[2];

$buffer = nl2br(whois_ip($referral_host, $regs[3], 'FALSE'));

}

// Daca exista o linie numita "country", ia rezultatele si le afiseaza

if (eregi("country:[[:space:]]*([a-z]{2,})", $buffer, $regs))

{

// Retine rezultatele "country" din buffer

$country = $regs[1];

// Lista tarilor: Daca "list_file.txt" exista pe server lista cu tarile exista deja si se citeste variabila $list_file

if (file_exists('list_file.txt'))

{

$list_file = @file_get_contents('list_file.txt');

}

// altfel se downloadeaza lista tarilor si se salveaza ca "list_file.txt"

else

{

// dawnloadez si salvez variabila $list_file

$list_file = @file_get_contents('http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1-semic.txt');

$handle = fopen('list_file.txt', 'w');

@fwrite($handle, $list_file);

fclose($handle);

}

$list_file_br = nl2br($list_file);

$list_rows = explode("<br />", $list_file_br);

// array pentru tara

$country_list = array();

// Loop prin fiecare linie si salveaza 2 caractere ale tarii si numele intreg in $country_list array

for ($i = 1; $i < count($list_rows); $i++)

{

$row = explode(";", $list_rows[$i]);

$row_abbr = $row[1];

$row_name = ucwords(strtolower($row[0]));

$country_list[$row_abbr] = $row_name;

}

// daca tara din buffer exista in country_list array, afisez numele intreg

if (array_key_exists($country, $country_list)) {

echo "Locatia: &nbsp;<b>$country_list[$country]</b> ($country)<br><br>"; }

// daca nu afisez doar caracterele tarii gasite in whois buffer

else {

echo "Locatia: &nbsp;<b>$country</b><br><br>"; }

}

// sau daca nu exista "country" afisez locatie necunoscuta

else {

echo 'Locatia: &nbsp;Necunoscuta<br><br>'; }

}

// Functie pentru whois lookup pe adresa de IP

function whois_ip($whois_ip_server, $whois_ip_port, $do_echo)

{

if (eregi("^[a-z0-9\:\.\-]+$", $whois_ip_server))

{

global $host_ip;

//Serverul whois "whois.arin.net" cere un "+" ca sa ia toate detaliile

if ($whois_ip_server == 'whois.arin.net') {

$whois_ip_server .= ' +'; }

// Setez o variabila care contine comanda sa fie trimisa sistemului

$command = "whois -h $whois_ip_server $host_ip";

// Daca exista un port specific adauga la comanda

if ($whois_ip_port > 0) {

$command .= " -p $whois_ip_port"; }

$fp = shell_exec("$command 2>&1");

// Daca variabila $do_echo este setata "TRUE", trimit rezultatele la functia parse_output()

if ($do_echo == 'TRUE')

{

$output = '<b>Rezultate Whois (IP):</b><blockquote>';

$output .= nl2br(htmlentities(trim($fp)));

$output .= '</blockquote>';

parse_output($output);

}

// daca nu returneaza rezultatele intr-o variabila (ex. pentru functia ip_to_country())

else {

return $fp; }

}

else

{

echo '<b>Rezultate Whois (IP):</b><blockquote>';

echo 'Caractere invalide in campul Whois (IP).';

echo '</blockquote>';

}

}

// Functie pentru whois lookup pe domeniu

function whois_domain($host, $whois_domain_server)

{

if (eregi("^[a-z0-9\.\-]+$", $whois_domain_server))

{

global $host_name, $host_ip;

// Setez valoarea implicita pentr o variabila

$who_host = $host;

$split_host = explode('.', $host_name);

// daca exista www se scoate

if ($split_host[0] == 'www')

{

array_shift($split_host);

$who_host = implode(".", $split_host);

}

// pentru caractere japoneze

if (substr($whois_domain_server, -3) == '.jp') {

$who_host .= '/e'; }

$command = "whois -h $whois_domain_server $who_host";

$fp = shell_exec("$command 2>&1");

// Se salveaza rezultatele ca o variabila si se trimit la functia parse_output()

$output = "<b>Rezultate Whois (Domain):</b><blockquote>";

$output .= nl2br(htmlentities(trim($fp)));

$output .= "</blockquote>";

parse_output($output);

}

else

{

echo '<b>Rezultate Whois (Domain) :</b><blockquote>';

echo 'Caractere invalide la campul Whois (Domain) Server.';

echo '</blockquote>';

}

}

// Functie pt NS Lookup la un host/ip

function nslookup($host)

{

// comanda

$command = "nslookup $host -sil";

//"2>&1" pipe STDERR in STDOUT si daca e o eroare o afiseaza.

$fp = shell_exec("$command 2>&1");

// salveaza rezultatele si le trimite la functia parse_output()

$output = '<b>Rezultatele NS Lookup:</b><blockquote>';

$output .= nl2br(htmlentities(trim($fp)));

$output .= '</blockquote>';

parse_output($output);

}

function dig($host, $dig_class, $dig_server)

{

if (eregi("^[a-z0-9\.\-]*$", $dig_server))

{

$command = "dig -t $dig_class $host";

if ($dig_server) {

$command .= ' @' . $dig_server; }

$fp = shell_exec("$command 2>&1");

$output = "<b>Rezultate mai amanuntite ($dig_class):</b><blockquote>";

$output .= nl2br(htmlentities(trim($fp)));

$output .= '</blockquote>';

parse_output($output);

}

else

{

echo "<b>Rezultate mai amanuntite ($dig_class):</b><blockquote>";

echo 'Caractere invalide in campul Rezultate amanuntite.';

echo '</blockquote>';

}

}

// Ping host/ip

function ping($host, $ping_count)

{

// comanda initiala

$command = "ping -c $ping_count $host";

$fp = shell_exec("$command 2>&1");

$output = '<b>Rezultatele Ping:</b><blockquote>';

$output .= nl2br(htmlentities(trim($fp)));

$output .= '</blockquote>';

parse_output($output);

}

// Traceroute host/ip

function traceroute($host)

{

$command = "traceroute $host";

$fp = shell_exec("$command 2>&1");

$output = '<b>Rezultatele Traceroute :</b><blockquote>';

$output .= nl2br(htmlentities(trim($fp)));

$output .= '</blockquote>';

parse_output($output);

}

// Tracepath host/ip

function tracepath($host)

{

$command = "tracepath $host";

$fp = shell_exec("$command 2>&1");

$output = '<b>Rezultatele Tracepath :</b><blockquote>';

$output .= nl2br(htmlentities(trim($fp)));

$output .= '</blockquote>';

parse_output($output);

}

// Port scan host/ip

function portscan($host, $ports, $scan_timeout)

{

if (eregi("^[0-9\,\-]+$", $ports))

{

echo '<b>Rezultatele scanarii porturilor :</b><blockquote>';

echo "<table border='0' cellspacing='0' cellpadding='0'>";

$port_array = explode(",", $ports);

$start_time = time();

for ($i = 0; $i < count($port_array); $i++)

{

if (eregi("([0-9]+)[-]{1}([0-9]+)", $port_array[$i], $regs))

{

for ($x = $regs[1]; $x <= $regs[2]; $x++)

{

$sock = @fsockopen($host, $x, $num, $error, $scan_timeout);

// IDaca se conecteaza la port status este 'Open',

// altfel "closed"

if ($sock) {

$port_status = "<font class='open_port'>open</font>";

fclose($sock); }

else {

$port_status = 'closed'; }

// Ia o descriere a portului

$port_name = getservbyport($x, 'tcp');

// Asiseaza statusul portului

echo "<tr><td width='50%'>Port <b>$x</b> este $port_status.</td>";

//Daca are descriere se afiseaza

if ($port_name != NULL) {

echo "<td>[$port_name]</td>"; }

echo '</tr>';

}

}

// altfel scaneaza numai numarul

elseif (eregi("[0-9]+", $port_array[$i]))

{

// creaza o conexiune la port

$sock = @fsockopen($host, $port_array[$i], $num, $error, $scan_timeout);

if ($sock) {

$port_status = "<font class='open_port'>open</font>";

fclose($sock); }

else {

$port_status = 'closed'; }

$port_name = getservbyport($port_array[$i], 'tcp');

echo "<tr><td width='50%'>Port <b>$port_array[$i]</b> is $port_status.</td>";

if ($port_name != NULL) {

echo "<td>[$port_name]</td>"; }

echo '</tr>';

}

}

// Salvez timpul din nou pentru a calcula cat a durat scanul

$end_time = time();

// Calculul

$time_diff = $end_time – $start_time;

$mins = date('i', $time_diff);

$secs = date('s', $time_diff);

// daca scanarea a durat sub o secunda afisam 1 secunda

if (($mins == '00') && ($secs == '00')) {

$secs = '01'; }

//Afisarea timpului

echo "<tr><td colspan='2'><br>Scanare completa in <b>$mins</b> minute si <b>$secs</b> secunde.</td></tr>";

echo '</table></blockquote>';

}

else

{

echo '<b>Rezultatele scanarii:</b><blockquote>';

echo 'Caractere invalide in campul Scanare Porturi.';

echo '</blockquote>';

}

}

//nmap la host/ip

function nmap($host, $nmap_options)

{

if (eregi("^[a-z0-9 @_:,-\.\*\/]+$", $nmap_options))

{

$command = "nmap $nmap_options $host";

$fp = shell_exec("$command 2>&1");

echo '<b>Rezultatele Nmap :</b><blockquote>';

echo nl2br(htmlentities(trim($fp)));

echo '</blockquote>';

}

else

{

echo '<b>Rezultatele Nmap :</b><blockquote>';

echo 'Invalid characters in the Nmap field.';

echo '</blockquote>';

}

}

function parse_output($input)

{

$user = '[-a-z0-9!#$%&\'*+/=?^_`{|}~]';

$domain = '([a-z]([-a-z0-9]*[a-z0-9]+)?)';

$regex = $user . '+(\.' . $user . '+)*@(' . $domain . '{1,63}\.)+' . $domain . '{2,63}';

// Convert adrese IP in lincuri

$parsed_ip = eregi_replace("([0-9]{1,3}(\.[0-9]{1,3}){3})", "<a href=\"javascript:enter_ip('\\0');\">\\0</a>", $input);

// Convert adrese email in linkuri

$parsed_email = eregi_replace($regex, "<a href=\"mailto:\\0\">\\0</a>", $parsed_ip);

//Afisarea

$output = $parsed_email;

echo $output;

}

// cateva variabile

if ($host == "") {

$host = 'Introduceti Host sau IP'; }

if ($whois_ip_server == "") {

$whois_ip_server = 'whois.arin.net'; }

if ($whois_domain_server == "") {

$whois_domain_server = 'whois-servers.net'; }

if ($ping_count == "") {

$ping_count = '4'; }

if ($scan_timeout == "") {

$scan_timeout = '1'; }

// Cauta functia get_ip() si pastreaza rezultatele in $ip

$ip = get_ip();

?>

<html>

<head>

<title>Utilitare intranet si internet</title>

<script language="javascript">

function check_focus(val)

{

if (val.value == "Introduceti host sau adresa IP") {

val.value = ""; }

}

function enter_ip(ip)

{

document.forms[0].host.value = ip;

}

function help(box_width, box_height, box_title, box_msg, box_wiki, box_manpage)

{

var box_left = (screen.width – box_width) / 2;

var box_top = (screen.height – box_height) / 2;

box_header = "<html><head><title>" + box_title + "</title>";

box_header += "<style type='text/css'>body { font-family: Veranda, Arial, Helvetica; font-size: 14; background-color: #87E8EB; } ";

box_header += "A:link, A:visited, A:active { color: #0000FF; text-decoration: none; } A:hover { font-weight: bold; }</style>";

box_header += "</head><body>";

box_footer = "</body></html>";

if (box_wiki != "")

{

box_msg += "<br><br><br>";

box_msg += "<a href='" + box_wiki + "' target='_wiki'>Articol din enciclopedia Wikipedia </a>";

}

if (box_manpage != "")

{

if (box_wiki == "")

{

box_msg += "<br><br>";

}

box_msg += "<br><a href='" + box_manpage + "' target='_manpage'>Descrierea comenzii</a>";

}

box_text = box_header + box_msg + box_footer;

var help_box = window.open('','help_box','width=' + box_width + ',height=' + box_height + ',left=' + box_left + ',top=' + box_top + ',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,copyhistory=no,resizable=yes');

help_box.document.write(box_text);

help_box.focus();

}

</script>

</head>

<body>

<? include ('head.php');?>

<form name="tools" action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">

<a href="index.php"></a>

<table align="center" border="0" cellspacing="0" cellpadding="2">

<tr>

<td width="350" height="20" align="center" bgcolor="#00FFFF">Informatii Host</td>

<td width="300" height="20" align="center" bgcolor="#00FFFF">Conexiune Host</td>

</tr>

<tr>

<td height="100" bgcolor="#CCCC66">

<input type="checkbox" name="resolve" <? if (isset($resolve)) { echo "checked"; } ?>>

Rezolva Host / Reverse Lookup &nbsp;

[ <a href="javascript:help('400', '150', 'Reverse Lookup', '<i>Reverse Lookup</i> este un termen referitor la utilizarea lookups-urilor DNS pentru a determina ce adresa ip este asociata cu un hostname dat', 'http://en.wikipedia.org/wiki/Reverse_DNS_lookup' ,'')">?</a> ]<br>

<input type="checkbox" name="ip_to_country" <? if (isset($ip_to_country)) { echo "checked"; } ?>>

Afla tara &nbsp;

[ <a href="javascript:help('500', '160', 'Aflarea tarii', 'Optiunea <i>Afla tara</i> va incerca sa determine in ce tara este localizat un host specific, si ar trebui sa mearga cu aproape orice host daca nu este un host local.<br><br>La prima utilizare poate sa ia mai mult timp deoarece trebuie downloadat <a href=\'http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1-semic.txt\' target=\'_iso\'>lista cu tarile</a> de la website-ul ISO Standards. Dupa prima utilizare va merge mult mai repede.', '', '')">?</a> ]<br>

<input type="checkbox" name="whois_ip" <? if (isset($whois_ip)) { echo "checked"; } ?>>

Whois (IP) &nbsp;

<input type="text" name="whois_ip_server" size="20" value="<? echo $whois_ip_server; ?>"> &nbsp;

[ <a href="javascript:help('500', '210', 'Cine este (IP)', '<i>Whois</i> este un protocol de internet care este foarte folosit pentru interogarea unei baze de date pentru aflarea proprietarului unui domeniu sau o adresa IP pe Internet.<br><br>Se poate folosi si un anumit port.<br><br><b>Ex:</b>&nbsp; whois.arin.net:43', 'http://en.wikipedia.org/wiki/Whois' ,'http://man.linuxquestions.org/?query=whois&section=0&type=2')">?</a> ]<br>

<input type="checkbox" name="whois_domain" <? if (isset($whois_domain)) { echo "checked"; } ?>>Whois (Domain) &nbsp;

<input type="text" name="whois_domain_server" size="20" value="<? echo $whois_domain_server; ?>"> &nbsp;

[ <a href="javascript:help('400', '160', 'Whois (Domain)', '<i>Whois</i>este un protocol de internet care este larg folosit pentru interogarea unei baze de date pentru aflarea proprietarului unui domeniu sau o adresa IP pe Internet.', 'http://en.wikipedia.org/wiki/Whois', 'http://man.linuxquestions.org/?query=whois&section=0&type=2')">?</a> ]<br>

<input type="checkbox" name="ns" <? if (isset($ns)) { echo "checked"; } ?>>NS Lookup &nbsp;

[ <a href="javascript:help('400', '160', 'NS Lookup', 'Comanda <i>nslookup</i> foloseste DNS lookupsa gaseasca adresa IP a unui computer particular Functionalitatea s-a invechit si este recomandata <i>dig</i> sa fie folosita in schimb (<a href=\'http://homepages.tesco.net./~J.deBoynePollard/FGA/nslookup-flaws.html\' target=\'_nslokup_flaws\'>mai multe informatii</a>).', 'http://en.wikipedia.org/wiki/Nslookup', 'http://man.linuxquestions.org/index.php?query=nslookup&section=0&type=2')">?</a> ]<br>

<input type="checkbox" name="dig" <? if (isset($dig)) { echo "checked"; } ?>>Dig &nbsp;

<select name="dig_class">

<?

$dig_class_array = Array('ANY', 'A', 'IN', 'MX', 'NS', 'SOA', 'HINFO', 'AXFR', 'IXFR');

for ($i = 0; $i < count($dig_class_array); $i++)

{

echo "<option value=\"$dig_class_array[$i]\"";

if (!isset($_POST['dig_class'])) {

$dig_class = 'ANY'; }

if ($dig_class_array[$i] == $dig_class) {

echo ' selected'; }

echo ">$dig_class_array[$i]</option>";

}

?>

</select> &nbsp;

<input type="text" name="dig_server" size="20" value="<? echo $dig_server; ?>"> &nbsp;

[ <a href="javascript:help('500', '200', 'Dig', '<i>Dig</i> (Domain Information Groper) este o unelta flexibila pentru interogarea serverelor DNS <br><br>Folositi meniul pentru a selecta interogarea dorita si casuta text pentru a specifica serverul DNS pe care doriti sa il interogati(optional).', '', 'http://man.linuxquestions.org/index.php?query=dig&section=0&type=2')">?</a> ] </td>

<td height="100" bgcolor="#CCCC66">

<input type="checkbox" name="ping" <? if (isset($ping)) { echo "checked"; } ?>>

Ping &nbsp;-&nbsp; de<input type="text" name="ping_count" size="1" value="<? echo $ping_count; ?>"> &nbsp; ori

[ <a href="javascript:help('400', '150', 'Ping', '<i>Ping</i> este folosita la testarea daca un anumit host opereaza corespunzator si este gasit pe retea. Ping ofera estimari ale timpului si ale pierderilor de informatii dintre sisteme.', 'http://en.wikipedia.org/wiki/Ping', 'http://man.linuxquestions.org/index.php?query=ping&section=0&type=2')">?</a> ]<br>

<input type="checkbox" name="trace" <? if (isset($trace)) { echo "checked"; } ?>>Traceroute &nbsp;

[ <a href="javascript:help('400', '160', 'Traceroute', '<i>Traceroute</i> (<i>tracert</i> pe sistemul Windows) permite utilizatorului sa determine rutarea pachetelor pana la un host. Trimite datagrame UDP si foloseste pachetele returnate ICMP sa produca o lista de sisteme traversate de pachet in drumul spre destinatie.', 'http://en.wikipedia.org/wiki/Traceroute', 'http://man.linuxquestions.org/index.php?query=traceroute&section=0&type=2')">?</a> ]<br>

<input type="checkbox" name="tracepath" <? if (isset($tracepath)) { echo "checked"; } ?>>Tracepath &nbsp;

[ <a href="javascript:help('430', '180', 'Tracepath', '<i>Tracepath</i> este o comanda similara cu <i>Traceroute</i> cu exceptia ca de obicei nu necesita privilegii specifice ale utilizatorului pe server.<br><br>', 'http://en.wikipedia.org/wiki/Tracepath', 'http://man.linuxquestions.org/index.php?query=tracepath&section=0&type=2')">?</a> ]<br>

<input type="checkbox" name="portscan" <? if (isset($portscan)) { echo "checked"; } ?>>Portscan &nbsp;

<input type="text" name="ports" size="20" value="<? echo $ports; ?>"> &nbsp;

[ <a href="javascript:help('500', '200', 'Portscan', ' <i>Port scanner</i> este un software proiectat sa caute porturile deschise ale unui sistem.Folosit pentru verificarea securitatii retelei.<br><br>Folositi virgule (,) pentru a separa porturile si o liniuta pentru a indica delimitarea (1-50).Se pot combina virgule si liniute.<br><br><b>Ex:</b>&nbsp; \'21-23,80\' va scana porturile 21,22,23 si 80.', 'http://en.wikipedia.org/wiki/Port_scanner', '')">?</a> ]<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Timeout: &nbsp;<input type="text" name="scan_timeout" size="1" value="<? echo $scan_timeout; ?>">

secunde <br>

<input type="checkbox" name="nmap" <? if (isset($nmap)) { echo "checked"; } ?>>Nmap &nbsp;

<input type="text" name="nmap_options" size="30" value="<? echo $nmap_options; ?>"> &nbsp;

[ <a href="javascript:help('500', '180', 'Nmap', '<i>Nmap</i> este o utilitate de scanare avansata a porturilor cu multe optiuni. Unele optiuni necesita privilegii de root pe server si nu vor functiona in acest script. Daca se incearca folosirea acestei optiuni va fi returnata o eroare.<br><br> De asemenea nu toate serverele au instalate nmap sau permit folosirea acestei comenzi.', 'http://en.wikipedia.org/wiki/Nmap', 'http://www.insecure.org/nmap/data/nmap_manpage.html')">?</a> ] </td>

</tr>

<tr>

<td colspan="2" align="center" bgcolor="#99CC66">Host: &nbsp;&nbsp;

<input type="combo" name="host" size="30" value="<? echo $host; ?>" onFocus="check_focus(this)"> &nbsp;

<input type="submit" name="submit" value="Interogare"> </td>

</tr>

<tr>

<td colspan="2" align="center"><? echo "IP-ul tau este: &nbsp;&nbsp;<a href=\"javascript:enter_ip('$ip');\">$ip</a>"; ?> </tr>

</table>

</form>

<br><br><br><br>

<?

// Daca este apasat butonul Interogare

if ($_POST['submit'])

{

// Daca nu a fost aleasa nici o optiune afiseaza o eroare

if (!isset($resolve) && !isset($ip_to_country) && !isset($whois_ip) && !isset($whois_domain) && !isset($ns) && !isset($dig) && !isset($ping) && !isset($trace) && !isset($tracepath) && !isset($portscan) && !isset($nmap)) {

echo '<br><br>Trebuie aleasa cel putin o optiune.';

exit; }

// Daca nu e host afiseaza eroare

if (($host == 'Introduceti Host sau IP') || ($host == "")) {

echo '<br><br>Trebuie introdus un host sau o adresa IP valida.';

exit; }

// Daca $host incepe cu un caracter alpha, este host, afla IP

if(eregi("^[a-z]", $host))

{

$host_name = $host;

$host_ip = gethostbyname($host);

}

// daca nu ,este IP

else

{

$host_name = gethostbyaddr($host);

$host_ip = $host;

}

if ($enable_log_user == TRUE) {

log_user($host); }

}

if (isset($resolve)) {

resolve($host); }

if (isset($ip_to_country)) {

ip_to_country(); }

if (isset($whois_ip)) {

whois_ip($whois_ip_server, '-1', 'TRUE'); }

if (isset($whois_domain)) {

whois_domain($host, $whois_domain_server); }

if (isset($ns)) {

nslookup($host); }

if (isset($dig)) {

dig($host, $dig_class, $dig_server); }

if (isset($ping)) {

ping($host, $ping_count); }

if (isset($trace)) {

traceroute($host); }

if (isset($tracepath)) {

tracepath($host); }

if (isset($portscan)) {

portscan($host, $ports, $scan_timeout); }

if (isset($nmap)) {

nmap($host, $nmap_options); }

?>

</body>

</html>

Calendar evenimente

Index.php

<?

session_start();

require("config.php");

require("./lang/lang." . LANGUAGE_CODE . ".php");

require("functions.php");

include ('head.php');

$month = (int) $HTTP_GET_VARS['month'];

$year = (int) $HTTP_GET_VARS['year'];

$m = (!$month) ? date("n") : $month;

$y = (!$year) ? date("Y") : $year;

$scrollarrows = scrollArrows($m, $y);

$auth = auth();

require("./templates/" . TEMPLATE_NAME . ".php");

?>

Functions.php

<?

function auth($login = '', $passwd = '')

{

session_start();

global $HTTP_SESSION_VARS;

$authdata = $HTTP_SESSION_VARS['authdata'];

if (!empty($login)) {

$username = $login;

$pw = $passwd;

$register = true;

} elseif (!empty($authdata['login'])) {

$username = $authdata['login'];

$pw = $authdata['password'];

$register = false;

} else {

$auth = 0;

}

if (!empty($username)) {

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT * FROM " . DB_TABLE_PREFIX . "users WHERE username = '" . $username . "'";

$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_assoc($result);

if ( $row["password"] == $pw ) {

if ($register) {

$HTTP_SESSION_VARS['authdata'] = array('login'=>$row['username'], 'password'=>$row['password'], 'userlevel'=>$row['user_level'], 'uid'=>$row['uid']);

}

$auth = $row['userlevel'];

} else {

unset($HTTP_SESSION_VARS['authdata']);

$auth = 0;

}

}

return $auth;

}

function monthPullDown($month, $montharray)

{

echo "\n<select name=\"month\">\n";

for($i=0;$i < 12; $i++) {

if ($i != ($month – 1))

echo " <option value=\"" . ($i + 1) . "\">$montharray[$i]</option>\n";

else

echo " <option value=\"" . ($i + 1) . "\" selected>$montharray[$i]</option>\n";

}

echo "</select>\n\n";

}

function yearPullDown($year)

{

echo "<select name=\"year\">\n";

$z = 3;

for($i=1;$i < 8; $i++) {

if ($z == 0)

echo " <option value=\"" . ($year – $z) . "\" selected>" . ($year – $z) . "</option>\n";

else

echo " <option value=\"" . ($year – $z) . "\">" . ($year – $z) . "</option>\n";

$z–;

}

echo "</select>\n\n";

}

function dayPullDown($day)

{

echo "<select name=\"day\">\n";

for($i=1;$i <= 31; $i++) {

if ($i == $day)

echo " <option value=\"$i\" selected>$i</option>\n";

else

echo " <option value=\"$i\">$i</option>\n";

}

echo "</select>\n\n";

}

function hourPullDown($hour, $namepre)

{

echo "\n<select name=\"" . $namepre . "_hour\">\n";

for($i=0;$i <= 12; $i++) {

if ($i == $hour)

echo " <option value=\"$i\" selected>$i</option>\n";

else

echo " <option value=\"$i\">$i</option>\n";

}

echo "</select>\n\n";

}

function minPullDown($min, $namepre)

{

echo "\n<select name=\"" . $namepre . "_min\">\n";

for($i=0;$i <= 55; $i+=5) {

if ($i < 10)

$disp = "0" . $i;

else

$disp = $i;

if ($i == $min)

echo " <option value=\"$i\" selected>$disp</option>\n";

else

echo " <option value=\"$i\">$disp</option>\n";

}

echo "</select>\n\n";

}

function amPmPullDown($pm, $namepre)

{

if ($pm) { $pm = " selected"; } else { $am = " selected"; }

echo "\n<select name=\"" . $namepre . "_am_pm\">\n";

echo " <option value=\"0\"$am>am</option>\n";

echo " <option value=\"1\"$pm>pm</option>\n";

echo "</select>\n\n";

}

function javaScript()

{

?>

<script language="JavaScript">

function submitMonthYear() {

document.monthYear.method = "post";

document.monthYear.action = "index.php?month=" + document.monthYear.month.value + "&year=" + document.monthYear.year.value;

document.monthYear.submit();

}

function postMessage(day, month, year) {

eval("page" + day + " = window.open('eventform.php?d=" + day + "&m=" + month + "&y=" + year + "', 'postScreen', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=340,height=400');");

}

function openPosting(pId) {

eval("page" + pId + " = window.open('eventdisplay.php?id=" + pId + "', 'mssgDisplay', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=340,height=400');");

}

function loginPop(month, year) {

eval("logpage = window.open('login.php?month=" + month + "&year=" + year + "', 'mssgDisplay', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=340,height=400');");

}

</script>

<?

}

function footprint($auth, $m, $y)

{

global $lang;

echo "<br><br><span class=\"footprint\">[\n";

if ( $auth == 2 ) {

echo "<a href=\"useradmin.php\">" . $lang['adminlnk'] . "</a> | ";

echo " <a href=\"login.php?action=logout&month=$m&year=$y\">" . $lang['logout'] . "</a>";

} elseif ( $auth == 1 ) {

echo "<a href=\"useradmin.php?flag=changepw\">" . $lang['changepw'] . "</a> | ";

echo "<a href=\"login.php?action=logout&month=$m&year=$y\">" . $lang['logout'] . " </a>";

} else {

echo "<a href=\"javascript:loginPop($m, $y)\">" . $lang['login'] . "</a>";

}

echo " ]</span>";

}

function scrollArrows($m, $y)

{

// set variables for month scrolling

$nextyear = ($m != 12) ? $y : $y + 1;

$prevyear = ($m != 1) ? $y : $y – 1;

$prevmonth = ($m == 1) ? 12 : $m – 1;

$nextmonth = ($m == 12) ? 1 : $m + 1;

$s = "<a href=\"index.php?month=" . $prevmonth . "&year=" . $prevyear . "\">\n";

$s .= "<img src=\"images/leftArrow.gif\" border=\"0\"></a> ";

$s .= "<a href=\"index.php?month=" . $nextmonth . "&year=" . $nextyear . "\">";

$s .= "<img src=\"images/rightArrow.gif\" border=\"0\"></a>";

return $s;

}

function writeCalendar($month, $year)

{

$str = getDayNameHeader();

$eventdata = getEventDataArray($month, $year);

$weekpos = getFirstDayOfMonthPosition($month, $year);

$auth = auth();

$days = 31-((($month-(($month<8)?1:0))%2)+(($month==2)?((!($year%((!($year%100))?400:4)))?1:2):0));

if ($weekpos == 0) $day = 1; else $day = 0;

$timestamp = mktime() + CURR_TIME_OFFSET * 3600;

$d = date(j, $timestamp); $m = date(n, $timestamp); $y = date(Y, $timestamp);

while($day <= $days) {

$str .="<tr>\n";

for($i=0;$i < 7; $i++) {

if($day > 0 && $day <= $days) {

$str .= " <td class=\"";

if (($day == $d) && ($month == $m) && ($year == $y))

$str .= "today";

else

$str .= "day";

$str .= "_cell\" valign=\"top\"><span class=\"day_number\">";

if ($auth)

$str .= "<a href=\"javascript: postMessage($day, $month, $year)\">$day</a>";

else

$str .= "$day";

$str .= "</span><br>";

$eventcount = count($eventdata[$day]["title"]);

if (MAX_TITLES_DISPLAYED < $eventcount) $eventcount = MAX_TITLES_DISPLAYED;

for($j=0;$j < $eventcount;$j++) {

$str .= "<span class=\"title_txt\">-";

$str .= "<a href=\"javascript:openPosting(" . $eventdata[$day]["id"][$j] . ")\">";

$str .= $eventdata[$day]["title"][$j] . "</a></span>" . $eventdata[$day]["timestr"][$j];

}

$str .= "</td>\n";

$day++;

} elseif($day == 0) {

$str .= " <td class=\"empty_day_cell\" valign=\"top\">&nbsp;</td>\n";

$weekpos–;

if ($weekpos == 0) $day++;

} else {

$str .= " <td class=\"empty_day_cell\" valign=\"top\">&nbsp;</td>\n";

}

}

$str .= "</tr>\n\n";

}

$str .= "</table>\n\n";

return $str;

}

function getDayNameHeader()

{

global $lang;

if (WEEK_START != 0) {

for($i=0; $i < WEEK_START; $i++) {

$tempday = array_shift($lang['abrvdays']);

array_push($lang['abrvdays'], $tempday);

}

}

$s = "<table cellpadding=\"1\" cellspacing=\"1\" border=\"0\">\n<tr>\n";

foreach($lang['abrvdays'] as $day) {

$s .= "\t<td class=\"column_header\">&nbsp;$day</td>\n";

}

$s .= "</tr>\n\n";

return $s;

}

function getEventDataArray($month, $year)

{

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT id, d, title, start_time, end_time, ";

if (TIME_DISPLAY_FORMAT == "12hr") {

$sql .= "TIME_FORMAT(start_time, '%l:%i%p') AS stime, ";

$sql .= "TIME_FORMAT(end_time, '%l:%i%p') AS etime ";

} elseif (TIME_DISPLAY_FORMAT == "24hr") {

$sql .= "TIME_FORMAT(start_time, '%H:%i') AS stime, ";

$sql .= "TIME_FORMAT(end_time, '%H:%i') AS etime ";

} else {

echo "Bad time display format, check your configuration file.";

}

$sql .= "FROM " . DB_TABLE_PREFIX . "mssgs WHERE m = $month AND y = $year ";

$sql .= "ORDER BY start_time";

$result = mysql_query($sql) or die(mysql_error());

while($row = mysql_fetch_assoc($result)) {

$eventdata[$row["d"]]["id"][] = $row["id"];

if (strlen($row["title"]) > TITLE_CHAR_LIMIT)

$eventdata[$row["d"]]["title"][] = substr(stripslashes($row["title"]), 0, TITLE_CHAR_LIMIT) . "…";

else

$eventdata[$row["d"]]["title"][] = stripslashes($row["title"]);

if (!($row["start_time"] == "55:55:55" && $row["end_time"] == "55:55:55")) {

if ($row["start_time"] == "55:55:55")

$starttime = "- -";

else

$starttime = $row["stime"];

if ($row["end_time"] == "55:55:55")

$endtime = "- -";

else

$endtime = $row["etime"];

$timestr = "<div align=\"right\" class=\"time_str\">($starttime – $endtime)&nbsp;</div>";

} else {

$timestr = "<br>";

}

$eventdata[$row["d"]]["timestr"][] = $timestr;

}

return $eventdata;

}

function getFirstDayOfMonthPosition($month, $year)

{

$weekpos = date("w",mktime(0,0,0,$month,1,$year));

if (WEEK_START != 0)

if ($weekpos < WEEK_START)

$weekpos = $weekpos + 7 – WEEK_START;

else

$weekpos = $weekpos – WEEK_START;

return $weekpos;

}

?>

Createtables.php

<?

require("config.php");

require("./lang/lang.admin." . LANGUAGE_CODE . ".php");

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

mysql_query("CREATE TABLE " . DB_TABLE_PREFIX . "mssgs (

id mediumint(5) unsigned NOT NULL auto_increment,

uid tinyint(3) unsigned NOT NULL default '0',

m tinyint(2) NOT NULL default '0',

d tinyint(2) NOT NULL default '0',

y smallint(4) NOT NULL default '0',

start_time time NOT NULL default '00:00:00',

end_time time NOT NULL default '00:00:00',

title varchar(50) NOT NULL default '',

text text NOT NULL,

PRIMARY KEY (id)

) TYPE=MyISAM") or die(mysql_error());

mysql_query("create index id on " . DB_TABLE_PREFIX . "mssgs (id)");

mysql_query("create index m on " . DB_TABLE_PREFIX . "mssgs (m)");

mysql_query("create index y on " . DB_TABLE_PREFIX . "mssgs (y)");

mysql_query("CREATE TABLE " . DB_TABLE_PREFIX . "users (

uid smallint(6) NOT NULL auto_increment,

username char(15) NOT NULL default '',

password char(32) NOT NULL default '',

fname char(20) NOT NULL default '',

lname char(30) NOT NULL default '0',

userlevel tinyint(2) NOT NULL default '0',

email char(40) default NULL,

PRIMARY KEY (uid)

) TYPE=MyISAM") or die(mysql_error());

mysql_query("create index uid on " . DB_TABLE_PREFIX . "mssgs (uid)");

mysql_query("INSERT INTO " . DB_TABLE_PREFIX . "users

VALUES (

'', 'admin', 'password', 'default', 'user', 2, ''

)") or die (mysql_error());

echo $lang['successfulinstall'];

?>

Useradmin.php

<?

session_start();

require("config.php");

require("./lang/lang.admin." . LANGUAGE_CODE . ".php");

require("functions.php");

$flag = $HTTP_GET_VARS['flag'];

$auth = auth();

if ( $auth == 2 ) {

switch ( $flag ) {

case "add":

editUserForm("Add");

break;

case "edit":

$id = (int) $HTTP_GET_VARS['id'];

if (!empty($id))

editUserForm("Edit", $id);

else

$lang['accesswarning'];

break;

case "insert":

insertNewUser();

break;

case "update":

updateExistingUser();

break;

case "delete":

$id = (int) $HTTP_GET_VARS['id'];

if (!empty($id))

deleteUser($id);

else

$lang['accesswarning'];

break;

default:

userList();

}

} elseif ( $auth == 1 ) {

switch ( $flag ) {

case "changepw":

changePW($flag);

break;

case "updatepw":

updatePassword();

changePW($flag);

break;

default:

header("location:index.php");

}

} else {

echo $lang['accessdenied'];

}

/***************************************

******** Functiile administratorului **********

***************************************/

function editUserForm($mode, $id="", $error="")

{

global $lang, $HTTP_SESSION_VARS, $HTTP_POST_VARS;

$editorstr = "<option value=\"1\">" . $lang['editoroption'] . "</option>\n";

if ($mode=="Edit") {

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT username, password, fname, lname, userlevel, email ";

$sql .= "FROM " . DB_TABLE_PREFIX . "users WHERE uid=" . $id;

$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_row($result);

$username = $row[0];

$password = $row[1];

$fname = $row[2];

$lname = $row[3];

$userlevel = $row[4];

$email = $row[5];

if ($userlevel == 2)

$admin = "selected";

else

$admin = "";

$header = $lang['edituser'];

$formaction = "update";

$unameinput = "<span class=\"edit_user_label\">" . $username . "</span><input type=\"hidden\" name=\"username\" value=\"" . $username . "\">\n";

if ($username == $HTTP_SESSION_VARS['authdata']['login']) { $editorstr = ""; }

} else {

if (is_array($HTTP_POST_VARS)) {

$username = "";

$password = $HTTP_POST_VARS['pw'];

$fname = $HTTP_POST_VARS['fname'];

$lname = $HTTP_POST_VARS['lname'];

$userlevel = $HTTP_POST_VARS['userlevel'];

$email = $HTTP_POST_VARS['email'];

} else {

$username=$password=$fname=$lname=$userlevel=$email="";

}

$header = $lang['adduser'];

$formaction = "insert";

$unameinput = "<input type=\"text\" name=\"username\" size=\"29\" maxlength=\"20\" value=\"" . $username . "\">";

}

?>

<html><head>

<title>phpEventCalendar: <?=$mode?> Calendar User</title>

<link rel="stylesheet" type="text/css" href="css/adminpgs.css">

<script language="JavaScript">

function validate(f) {

var regex = /\W+/;

var un = f.username.value;

var pw = f.pw.value;

var str = "";

if (f.fname.value == "") { str += "\n<?=$lang['fnameblank']?>"; }

if (f.lname.value == "") { str += "\n<?=$lang['lnameblank']?>"; }

if (f.email.value == "") { str += "\n<?=$lang['emailblank']?>"; }

if (un == "") { str += "\n<?=$lang['unameblank']?>"; }

if (un.length < 4) { str += "\n<?=$lang['unamelength']?>"; }

if (regex.test(un)) { str += "\n<?=$lang['unameillegal']?>"; }

if (pw == "") { str += "\n<?=$lang['passblank']?>"; }

if (pw != f.pwconfirm.value) { str += "\n<?=$lang['passmatch']?>"; }

if (pw.length < 4) { str += "\n<?=$lang['passlength']?>"; }

if (regex.test(pw)) { str += "\n<?=$lang['passillegal']?>"; }

if (str == "") {

f.method = "post";

f.action = "useradmin.php?flag=<?= $formaction ?>";

f.submit();

} else {

alert(str);

return false;

}

}

</script>

</head><body>

<?

if ( !empty($error) ) {

echo "<p><span class=\"bad_user_name\">" . $lang['unameinuse'] . "</span></p>";

}

include ('head.php');

?>

<form onSubmit="return validate(this);">

<table cellpadding="2" cellspacing="2" border="0" align="center">

<tr>

<td colspan="2"><span class="edit_user_header"><?=$header?>:</span></td>

</tr>

<tr><td><img src="images/clear.gif" width="1" height="3"></td></tr>

<tr>

<td align="right"><span class="edit_user_label"><?=$lang['username']?>:</span></td>

<td><?=$unameinput?></td>

</tr>

<tr>

<td align="right"><span class="edit_user_label"><?=$lang['password']?>:</span></td>

<td><input type="password" name="pw" size="29" maxlength="20" value="<?=$password?>"></td>

</tr>

<tr>

<td align="right"><span class="edit_user_label"><?=$lang['pwconfirm']?>:</span></td>

<td><input type="password" name="pwconfirm" size="29" maxlength="20" value="<?=$password?>"></td>

</tr>

<tr>

<td align="right"><span class="edit_user_label"><?=$lang['userlevel']?>:</span></td>

<td><select name="userlevel">

<?=$editorstr?>

<option value="2" <?=$admin?>><?=$lang['adminoption']?></option>

</select>

</td>

</tr>

<tr>

<td align="right"><span class="edit_user_label"><?=$lang['fname']?>:</span></td>

<td><input type="text" name="fname" size="29" maxlength="20" value="<?=$fname?>"></td>

</tr>

<tr>

<td align="right"><span class="edit_user_label"><?=$lang['lname']?>:</span></td>

<td><input disable type="text" name="lname" size="29" maxlength="30" value="<?=$lname?>"></td>

</tr>

<tr>

<td align="right"><span class="edit_user_label"><?=$lang['email']?>:</span></td>

<td><input type="text" name="email" size="29" maxlength="40" value="<?=$email?>"></td>

</tr>

<tr><td><img src="images/clear.gif" width="1" height="7"></td></tr>

<tr>

<td colspan="2" align="right"><input type="submit" value="<?=$mode?> User">

&nbsp; <input type="button" value="Revocare" onClick="location.replace('useradmin.php');">

</td>

</tr>

</table>

</form>

</body></html>

<?

}

function insertNewUser()

{

global $HTTP_POST_VARS;

$uname = $HTTP_POST_VARS['username'];

$pw = $HTTP_POST_VARS['pw'];

$ulevel = $HTTP_POST_VARS['userlevel'];

$fname = $HTTP_POST_VARS['fname'];

$lname = $HTTP_POST_VARS['lname'];

$email = $HTTP_POST_VARS['email'];

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT * FROM " . DB_TABLE_PREFIX . "users WHERE username='$uname'";

$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_row($result);

if ( is_array($row) ) {

editUserForm("Add", "", $uname);

} else {

$sql = "INSERT INTO " . DB_TABLE_PREFIX . "users SET ";

$sql .= "username='$uname', password='$pw', fname='$fname', lname='$lname', ";

$sql .= "userlevel='$ulevel', email='$email'";

mysql_query($sql) or die(mysql_error());

header("location:useradmin.php");

}

}

function updateExistingUser()

{

global $HTTP_SESSION_VARS, $HTTP_POST_VARS;

$uname = $HTTP_POST_VARS['username'];

$pw = $HTTP_POST_VARS['pw'];

$ulevel = $HTTP_POST_VARS['userlevel'];

$fname = $HTTP_POST_VARS['fname'];

$lname = $HTTP_POST_VARS['lname'];

$email = $HTTP_POST_VARS['email'];

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "UPDATE " . DB_TABLE_PREFIX . "users SET password='$pw', fname='$fname', ";

$sql .= "lname='$lname', userlevel='$ulevel', email='$email' WHERE username='$uname'";

mysql_query($sql) or die(mysql_error());

if ( $uname==$HTTP_SESSION_VARS['authdata']['login'] )

$HTTP_SESSION_VARS['authdata']['password'] = $pw;

header("location:useradmin.php");

}

function deleteUser($id)

{

global $authdata;

if ($authdata['uid'] != $id) {

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "DELETE FROM " . DB_TABLE_PREFIX . "users WHERE uid='$id'";

mysql_query($sql) or die(mysql_error());

}

header("location:useradmin.php");

}

function userList()

{

global $lang, $HTTP_SESSION_VARS;

include ('head.php');

?>

<html><head><title>phpEventCalendar User List</title>

<link rel="stylesheet" type="text/css" href="css/adminpgs.css">

<script language="JavaScript">

function deleteConfirm(user, uid) {

var msg = "<?=$lang['deleteconf']?>: \"" + user + "\"?";

if (user == "<?= $HTTP_SESSION_VARS['authdata']['login'] ?>") {

alert("<?=$lang['deleteown']?>");

return;

} else if (confirm(msg)) {

location.replace("useradmin.php?flag=delete&id=" + uid);

} else {

return;

}

}

</script>

</head>

<body>

<table cellpadding="0" cellspacing="0" border="0" width="600" align="center">

<tr>

<td><span class="user_list_header"><?=$lang['ulistheader']?></span></td>

<td align="right" valign="bottom"><span class="user_list_options">[ <a href="useradmin.php?flag=add"><?=$lang['adduser']?></a> | <a href="index.php"><?=$lang['return']?></a> ]</span></td>

</tr>

<tr><td><img src="images/clear.gif" width="1" height="5"></td></tr>

</table>

<table cellpadding="0" cellspacing="0" border="0" width="600" bgcolor="#000000" align="center">

<tr><td>

<table cellspacing="1" cellpadding="3" border="0" width="100%" align="center">

<tr bgcolor="#666666">

<td><span class="user_table_col_label"><?=$lang['username']?></span></td>

<td><span class="user_table_col_label"><?=$lang['name']?></span></td>

<td><span class="user_table_col_label"><?=$lang['email']?></span></td>

<td><span class="user_table_col_label"><?=$lang['userlevel']?></span></td>

<td><span class="user_table_col_label"><?=$lang['edit']?></span></td>

<td><span class="user_table_col_label"><?=$lang['delete']?></span></td>

</tr>

<?

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT * FROM " . DB_TABLE_PREFIX . "users";

$result = mysql_query($sql) or die(mysql_error());

$bgcolor = "#ffffff";

while( $row = mysql_fetch_array($result) ) {

$userlevel = ($row[5] == 2) ? $lang['admin'] : $lang['editor'];

echo "<tr bgcolor=\"$bgcolor\">\n";

echo " <td><span class=\"user_table_txt\">" . $row[1] . "</span></td>\n";

echo " <td><span class=\"user_table_txt\">" . $row[3] . " " . $row[4] . "</span></td>\n";

echo " <td><span class=\"user_table_txt\">" . $row[6] . "</span></td>\n";

echo " <td><span class=\"user_table_txt\">" . $userlevel . "</span></td>\n";

echo " <td><span class=\"user_table_txt\"><a href=\"useradmin.php?flag=edit&id=" . $row[0] . "\">" . $lang['edit'] . "</a></span></td>\n";

echo " <td><span class=\"user_table_txt\"><a href=\"#\" onClick=\"deleteConfirm('" . $row[1] . "', '" . $row[0] . "');\">" . $lang['delete'] . "</a></span></td>\n";

echo "</tr>\n";

if ( $bgcolor == "#ffffff" )

$bgcolor = "#dddddd";

else

$bgcolor = "#ffffff";

}

echo "</table></td></tr></table>";

}

function changePW($flag)

{

global $lang, $HTTP_SESSION_VARS;

$username = $HTTP_SESSION_VARS['authdata']['login'];

$id = $HTTP_SESSION_VARS['authdata']['uid'];

?>

<html><head>

<title><?=$lang['changepw']?></title>

<link rel="stylesheet" type="text/css" href="css/adminpgs.css">

<script language="JavaScript">

function validate(f) {

var regex = /\W+/;

var pw = f.pw.value;

var str = "";

if (pw == "") { str += "\n<?=$lang['pwblank']?>"; }

if (pw != f.pwconfirm.value) { str += "\n<?=$lang['pwmatch']?>"; }

if (pw.length < 4) { str += "\n<?=$lang['pwlength']?>"; }

if (regex.test(pw)) { str += "\n<?=$lang['pwchars']?>"; }

if (str == "") {

f.method = "post";

f.action = "useradmin.php?flag=updatepw";

f.submit();

} else {

alert(str);

return false;

}

}

</script>

</head></body>

<? if ( $flag=="changepw" ) { ?>

<form onSubmit="return validate(this);">

<input type="hidden" name="id" value="<?= $id ?>">

<input type="hidden" name="un" value="<?= $username ?>">

<table cellpadding="2" cellspacing="2" border="0">

<tr><td colspan="2"><span class="edit_user_header"><?=$lang['chpassheader']?></span></td>

</tr><tr><td><img src="images/clear.gif" width="1" height="3"></td></tr>

<tr><td align="right"><span class="edit_user_label"><?=$lang['username']?>:</span></td>

<td><span class="edit_user_label"><?=$username?></span></td>

</tr><tr><td align="right"><span class="edit_user_label"><?=$lang['password']?>:</span></td>

<td><input type="password" name="pw" size="29" maxlength="25" value=""></td>

</tr><tr>

<td align="right"><span class="edit_user_label"><?=$lang['pwconfirm']?>:</span></td>

<td><input type="password" name="pwconfirm" size="29" maxlength="25" value=""></td>

</tr><tr><td><img src="images/clear.gif" width="1" height="7"></td></tr>

<tr><td colspan="2" align="right"><input type="submit" value="<?=$lang['changepw']?>">

&nbsp; <input type="button" value="<?=$lang['cancel']?>" onClick="location.replace('index.php');">

</td></tr></table>

</form>

<? } elseif ( $flag=="updatepw" ) { ?>

<span class="edit_user_label"><?=$lang['pwchanged']?> &nbsp;"<?=$username?>"</span>

<p>

<span class="user_list_options">[ <a href="index.php"><?=$lang['return']?></a> ]</span>

<? } else {

echo $lang['accessdenied'] . "<p>";

echo "<span class=\"user_list_options\">[ <a href=\"index.php\">" . $lang['return'] . "</a> ]</span>";

} ?>

</body> </html>

<? }

function updatePassword() {

global $HTTP_POST_VARS, $HTTP_SESSION_VARS;

$pw = $HTTP_POST_VARS['pw'];

$id = $HTTP_POST_VARS['id'];

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "UPDATE " . DB_TABLE_PREFIX . "users SET password='$pw' WHERE uid='$id'";

$result = mysql_query($sql) or die(mysql_error());

$HTTP_SESSION_VARS['authdata']['password'] = $pw;

}

?>

Eventsubmit.php

<?

require("config.php");

require("./lang/lang.admin." . LANGUAGE_CODE . ".php");

require("functions.php");

if (auth()) {

switch ($HTTP_GET_VARS['flag']) {

case "add" :

submitEventData();

break;

case "edit":

$id = (int) $HTTP_GET_VARS['id'];

if (!empty($id))

submitEventData($id);

else

$lang['accesswarning'];

break;

case "delete":

$month = (int) $HTTP_GET_VARS['month'];

$year = (int) $HTTP_GET_VARS['year'];

$id = (int) $HTTP_GET_VARS['id'];

if (!(empty($id) && empty($month) && empty($year)))

deleteEvent($id, $month, $year);

else

$lang['accesswarning'];

break;

default:

$lang['accesswarning'];

}

} else {

echo $lang['accessdenied'];

}

function submitEventData ($id="")

{

global $lang, $HTTP_POST_VARS;

$uid = $HTTP_POST_VARS['uid'];

$title = addslashes($HTTP_POST_VARS['title']);

$title = strip_tags($title);

$text = addslashes($HTTP_POST_VARS['text']);

$text = strip_tags($text);

$month = $HTTP_POST_VARS['month'];

$day = $HTTP_POST_VARS['day'];

$year = $HTTP_POST_VARS['year'];

$shour = $HTTP_POST_VARS['start_hour'];

$sminute = $HTTP_POST_VARS['start_min'];

$s_ampm = $HTTP_POST_VARS['start_am_pm'];

$ehour = $HTTP_POST_VARS['end_hour'];

$eminute = $HTTP_POST_VARS['end_min'];

$e_ampm = $HTTP_POST_VARS['end_am_pm'];

if ($shour == 0 && $sminute == 0 && $s_ampm == 0) {

$starttime = "55:55:55";

} else {

if ($s_ampm == 1 && $shour != 12) $shour = $shour + 12;

if ($s_ampm == 0 && $shour == 12) $shour = 0;

$starttime = "$shour:$sminute:00";

}

if ($ehour == 0 && $eminute == 0 && $e_ampm == 0) {

$endtime = "55:55:55";

} else {

if ($e_ampm == 1 && $ehour != 12) $ehour = $ehour + 12;

if ($e_ampm == 0 && $ehour == 12) $ehour = 0;

$endtime = "$ehour:$eminute:00";

}

if ($id) {

$sql = "UPDATE " . DB_TABLE_PREFIX . "mssgs SET uid='$uid', m='$month', d='$day', y='$year', ";

$sql .= "start_time='$starttime', end_time='$endtime', title='$title', text='$text' ";

$sql .= "WHERE id=$id";

$result = $lang['updated'];

} else {

$sql = "INSERT INTO " . DB_TABLE_PREFIX . "mssgs SET uid=$uid, m=$month, d=$day, y=$year, ";

$sql .= "start_time='$starttime', end_time='$endtime', title='$title', text='$text'";

$result = $lang['added'];

}

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

mysql_query($sql) or die(mysql_error());

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<link rel="stylesheet" type="text/css" href="css/popwin.css">

<script language="JavaScript">

opener.location = "index.php?month=<?= $month ?>&year=<?= $year ?>";

window.setTimeout('window.close()', 1000);

</script>

</head>

<body>

<div align=\"center\" class=\"display_txt\"><?= stripslashes($title) ?> <?= $result ?></div>

</body>

</html>

<?

}

function deleteEvent($id, $m, $y)

{

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "DELETE FROM " . DB_TABLE_PREFIX . "mssgs WHERE id = $id";

$result = mysql_query($sql) or die(mysql_error());

header("Location: index.php?month=$m&year=$y");

}

?>

Eventform.php

<?

require("config.php");

require("./lang/lang.admin." . LANGUAGE_CODE . ".php");

require("functions.php");

$auth = auth();

$id = $HTTP_GET_VARS['id'];

$uid = $HTTP_SESSION_VARS['authdata']['uid'];

if ($auth) {

if (empty($id)) {

displayEditForm('Add', $uid);

} else {

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT uid FROM " . DB_TABLE_PREFIX . "mssgs WHERE id = $id";

$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_assoc($result);

if ( $auth == 2 || $uid == $row['uid'] ) {

displayEditForm('Edit', $uid, $id);

} else {

echo $lang['accessdenied'];

}

}

} else {

echo $lang['accessdenied'];

}

function displayEditForm($mode, $uid, $id="")

{

global $lang;

if ($mode == "Add") {

global $HTTP_GET_VARS;

$d = $HTTP_GET_VARS['d'];

$m = $HTTP_GET_VARS['m'];

$y = $HTTP_GET_VARS['y'];

$text = $title = "";

$shour = $sminute = 0;

$ehour = $eminute = 0;

$headerstr = $lang['addheader'];

$buttonstr = $lang['addbutton'];

$pgtitle = $lang['addeventtitle'];

$qstr = "?flag=add";

} elseif ($mode == "Edit") {

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT uid, y, m, d, start_time, end_time, title, text ";

$sql .= "FROM " . DB_TABLE_PREFIX . "mssgs WHERE id = $id";

$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_assoc($result);

if (!empty($row)) {

$qstr = "?flag=edit&id=$id";

$headerstr = $lang['editheader'];

$buttonstr = $lang['editbutton'];

$pgtitle = $lang['editeventtitle'];

$title = stripslashes($row["title"]);

$text = stripslashes($row["text"]);

$m = $row["m"];

$d = $row["d"];

$y = $row["y"];

}

getPullDownTimeValues($row["start_time"], $shour, $sminute, $spm);

getPullDownTimeValues($row["end_time"], $ehour, $eminute, $epm);

} else {

$lang['accesswarning'];

}

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html> <head> <title><?= $pgtitle ?></title>

<link rel="stylesheet" type="text/css" href="css/popwin.css">

<script language="JavaScript">

function formSubmit() {

if (document.eventForm.title.value != "") {

document.eventForm.method = "post";

document.eventForm.action = "eventsubmit.php<?= $qstr ?>";

document.eventForm.submit();

} else {

alert("<?= $lang['titlemissing'] ?>");

}

}

</script>

</head> <body> <span class="add_new_header"><?= $headerstr ?></span>

<br><img src="images/clear.gif" width="1" height="5"><br>

<table border=0 cellspacing=7 cellpadding=0>

<form name="eventForm">

<input type="hidden" name="uid" value="<?=$uid?>">

<tr>

<td nowrap valign="top" align="right" nowrap><span class="form_labels"><?=$lang['date']?></span></td>

<td><? monthPullDown($m, $lang['months']); dayPullDown($d); yearPullDown($y); ?></td> </tr> <tr> <td nowrap valign="top" align="right" nowrap>

<span class="form_labels"><?=$lang['title']?></span></td>

<td><input type="text" name="title" size="29" value="<?= $title ?>" maxlength="50"></td>

</tr> <tr> <td nowrap valign="top" align="right" nowrap>

<span class="form_labels"><?=$lang['text']?></span></td>

<td><textarea cols=22 rows=6 name="text"><?= $text ?></textarea></td>

</tr> <tr> <td nowrap valign="top" align="right" nowrap><span class="form_labels"><?=$lang['start']?></span></td>

<td><? hourPullDown($shour, "start"); ?><b>:</b><? minPullDown($sminute, "start"); amPmPullDown($spm, "start"); ?></td> </tr> <tr> <td nowrap valign="top" align="right" nowrap><span class="form_labels"><?=$lang['end']?></span></td>

<td><? hourPullDown($ehour, "end"); ?><b>:</b><? minPullDown($eminute, "end"); amPmPullDown($epm, "end"); ?></td> </tr> <tr><td></td><td><br><input type="button" value="<?= $buttonstr ?>" onClick="formSubmit()">&nbsp;<input type="button" value="<?= $lang['cancel'] ?>" onClick="window.close();"></td></tr>

</form> </table></body></html>

<? }

function getPullDownTimeValues($time, &$hour, &$minute, &$pm)

{

$hour = (int) substr($time, 0, 2);

$minute = (int) substr($time, 3, 2);

if ($hour == 55) {

$hour = 0;

$minute = 0;

$pm = false;

} elseif ($hour > 12) {

$hour = $hour – 12;

$pm = true;

} elseif ($hour == 12) {

$pm = true;

} elseif ($hour == 0) {

$hour = 12;

$pm = false;

} else {

$pm = false;

}

}

?>

Eventdisplay.php

<?

session_start();

require("config.php");

require("./lang/lang." . LANGUAGE_CODE . ".php");

require("functions.php");

$id = (int) $HTTP_GET_VARS['id'];

$auth = auth();

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT d, m, y FROM " . DB_TABLE_PREFIX . "mssgs WHERE id=" . $id;

$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_array($result);

$d = $row["d"];

$m = $row["m"];

$y = $row["y"];

$dateline = $lang['months'][$m-1] . " $d, $y";

$wday = date("w", mktime(0,0,0,$m,$d,$y));

writeHeader($m, $y, $dateline, $wday, $auth);

writePosting($id, $auth);

echo '<img src="images/clear.gif" width="1" height="25" border="0"><br clear="all">';

$sql = "SELECT id, start_time FROM " . DB_TABLE_PREFIX . "mssgs ";

$sql .= "WHERE y = " . $y . " AND m = " . $m . " AND d = " . $d . " AND id != $id ";

$sql .= "ORDER BY start_time ASC";

$result = mysql_query($sql) or die(mysql_error());

if (mysql_num_rows($result)) {

echo '<span class="display_header">' . $lang['otheritems'] . '</span>';

echo '<br clear="all"><img src="/images/clear.gif" width="1" height="3" border="0"><br clear="all">';

while ($row = mysql_fetch_array($result)) {

writePosting($row[0], $auth);

echo '<img src="images/clear.gif" width="1" height="12" border="0"><br clear="all">';

}

}

echo "</body></html>";

function writeHeader($m, $y, $dateline, $wday, $auth)

{

global $lang;

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Calendar Evenimente</title>

<link rel="stylesheet" type="text/css" href="css/popwin.css">

<? if ($auth) { ?>

<script language="JavaScript">

function deleteConfirm(eid) {

var msg = "<?= $lang['deleteconfirm'] ?>";

if (confirm(msg)) {

opener.location = "eventsubmit.php?flag=delete&id=" + eid + "&month=<?=$m?>&year=<?=$y?>";

window.setTimeout('window.close()', 1000);

} else {

return;

}

}

</script>

<? } ?>

</head>

<body>

<!– selected date –>

<table cellspadding="0" cellspacing="0" border="0" width="300">

<tr>

<td><span class="display_header"><? echo $dateline ?></span></td>

<td align="right"><span class="display_header"><? echo $lang['days'][$wday] ?></span></td>

</tr>

</table>

<img src="images/clear.gif" width="1" height="3" border="0"><br clear="all">

<?

}

function writePosting($id, $auth)

{

global $lang, $HTTP_SESSION_VARS;

mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME) or die(mysql_error());

$sql = "SELECT y, m, d, title, text, start_time, end_time, ";

$sql .= DB_TABLE_PREFIX . "users.uid, fname, lname, ";

if (TIME_DISPLAY_FORMAT == "12hr") {

$sql .= "TIME_FORMAT(start_time, '%l:%i%p') AS stime, ";

$sql .= "TIME_FORMAT(end_time, '%l:%i%p') AS etime ";

} elseif (TIME_DISPLAY_FORMAT == "24hr") {

$sql .= "TIME_FORMAT(start_time, '%H:%i') AS stime, ";

$sql .= "TIME_FORMAT(end_time, '%H:%i') AS etime ";

} else {

echo "Eroare!";

}

$sql .= "FROM " . DB_TABLE_PREFIX . "mssgs ";

$sql .= "LEFT JOIN " . DB_TABLE_PREFIX . "users ";

$sql .= "ON (" . DB_TABLE_PREFIX . "mssgs.uid = " . DB_TABLE_PREFIX . "users.uid) ";

$sql .= "WHERE id = " . $id;

$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_assoc($result);

$title = stripslashes($row["title"]);

$body = stripslashes(str_replace("\n", "<br />", $row["text"]));

$postedby = $lang['postedby'] . ": " . $row['fname'] . " " . $row['lname'];

if (!($row["start_time"] == "55:55:55" && $row["end_time"] == "55:55:55")) {

if ($row["start_time"] == "55:55:55")

$starttime = "- -";

else

$starttime = $row["stime"];

if ($row["end_time"] == "55:55:55")

$endtime = "- -";

else

$endtime = $row["etime"];

$timestr = "$starttime – $endtime";

} else {

$timestr = "";

}

if ($auth == 2 || ($auth != 0 && $HTTP_SESSION_VARS['authdata']['uid'] == $row['uid'])) {

$editstr = "<span class=\"display_edit\">";

$editstr .= "[<a href=\"eventform.php?id=" . $id . "\">edit</a>]&nbsp;";

$editstr .= "[<a href=\"#\" onClick=\"deleteConfirm(" . $id . ");\">delete</a>]&nbsp;</span>";

} else {

$editstr = "";

}

?>

<table cellspacing="0" cellpadding="0" border="0" width="300">

<tr><td bgcolor="#000000">

<table cellspacing="1" cellpadding="1" border="0" width="100%">

<tr>

<td class="display_title_bg"><table cellspacing="0" cellpadding="0" border="0" width="100%"><tr>

<td width="100%"><span class="display_title">&nbsp;<?= $title ?></span></td>

<td><img src="images/clear.gif" width="20" height="1" border="0"></td>

<td align="right" nowrap="yes"><span class="display_title"><?= $timestr ?>&nbsp;</span></td>

</tr></table></td>

</tr>

<tr><td class="display_txt_bg">

<table cellspacing="1" cellpadding="1" border="0" width="100%">

<tr>

<td><span class="display_txt"><?= $body ?></span></td>

</tr>

<tr>

<td align="right"><span class="display_user"><?= $postedby ?></td>

</tr>

<tr>

<td align="right"><?= $editstr ?></td>

</tr>

</table>

</td></tr>

</table>

</td></tr></table>

<?

}

?>

Forum

Admin.php

<?php

include("config.php");

include("lib.php");

// Navigare

function browtopic() {

global $itemperpage, $start, $tablewidth, $admheadercolor, $admrowcolor1, $admrowcolor2;

$index_url = "admin.php?action=browtopic";

if (!isset($start) OR ($start == "")) $start = 0 ;

$query_jumlah = mysql_query("SELECT count(*) FROM forum_topic");

$data_jumlah = mysql_fetch_row($query_jumlah);

$all_record = $data_jumlah[0];

$query = mysql_query("SELECT * FROM forum_topic ORDER BY topic_time DESC LIMIT $start, $itemperpage");

$this_page= @mysql_num_rows($query) or die("No records found!");

echo"<table width=\"$tablewidth\" border=\"0\" cellspacing=\"1\" cellpadding=\"2\">

<tr><td class=\"normal\" align=\"center\">";

echo "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\"><b>Navighare prin inregistrari";

$paging = generate_pagination($index_url, $all_record, $itemperpage, $start);

echo $paging . "</td></tr></table>";

echo "</b></font>

<form method=\"get\" action=\"admin.php\">

<input type=\"hidden\" name=\"action\" value=\"deltopic\">

<input type=\"hidden\" name=\"start\" value=\"$start\">";

echo "

<table width=\"$tablewidth\" border=\"0\" cellspacing=\"1\" cellpadding=\"5\" bgcolor=\"#d0d0d0\">

<tr bgcolor=\"$admheadercolor\">

<td align=\"center\" width=\"5%\">&nbsp;</td>

<td width=\"20%\" class=\"normal\"><font color=\"#FFFFFF\"><b>Autor</b></font></td>

<td width=\"55%\" class=\"normal\"><font color=\"#FFFFFF\"><b>Titlul</b></font></td>

<td align=\"center\" width=\"5%\" class=\"normal\"><font color=\"#FFFFFF\"><b>Vizite</b></font></td>

<td align=\"center\" width=\"5%\" class=\"normal\"><font color=\"#FFFFFF\"><b>Raspunsuri</b></font></td>

<td width=\"10%\">&nbsp;</td></tr>\n";

if ($this_page < $itemperpage) $looping = $this_page; else $looping = $itemperpage;

for ($i=1; $i<=$looping; $i++) {

$counter = $end – $i;

$data = mysql_fetch_row($query) or die("Nimic Gasit!");

$nomor = $counter + 1;

if ((($i+1) % 2) == 0) $kolor = $admrowcolor1; else $kolor = $admrowcolor2;

$tgl = substr($data[3],8,2) . "-" . substr($data[3],5,2) . "-" . substr($data[3],0,4);

echo "<tr bgcolor=\"$kolor\">";

echo "<td align=\"center\"><input type=\"checkbox\" name=\"check[]\" value=\"$data[0]\"></td>";

echo "<td valign=\"top\" class=\"normal\">$tgl<br>";

$hasil_user = mysql_query("SELECT * FROM forum_post WHERE topic_id=$data[0] ORDER BY post_time ASC");

$data_user = mysql_fetch_row($hasil_user) or die("Nici un anunt gasit!");

$user = $data_user[2];

$user_mail = $data_user[4];

$user_web = $data_user[5];

echo "by <b>$user</b><br>";

if (!$user_mail == "") echo "<a href=\"mailto:$user_mail\"><img src=\"images/sym_email.gif\" border=\"0\"></a> ";

if ($user_web <> "" AND $user_web <> "http://") echo "<a href=\"$user_web\" target=\"_blank\"><img src=\"images/sym_www.gif\" border=\"0\"></a>";

echo "</td>";

echo "<td class=\"normal\"><a href=\"admin.php?action=browpost&id=$data[0]\"><b>$data[1]</b></a><br>";

$hasil_post = mysql_query("SELECT * FROM forum_post WHERE topic_id=$data[0] ORDER BY post_time ASC");

$data_post = mysql_fetch_row($hasil_post) or die("Nici un anunt gasit!");

$hasil_text = mysql_query("SELECT post_id, SUBSTRING_INDEX(post_text,' ',20) FROM forum_postext WHERE post_id=$data_post[0]");

$data_text = mysql_fetch_row($hasil_text) or die("Nici un anunt gasit!");

$kontet = smile($data_text[1]);

$kontet = auto_url($kontet);

echo "$kontet …</td>";

echo "<td align=\"center\" class=\"normal\"><b>$data[4]</b></td>

<td align=\"center\" class=\"normal\"><b>$data[5]</b></td>

<td align=\"center\" class=\"normal\"><a href=\"admin.php?action=edittopic&id=$data[0]&start=$start\">editare</a></td></tr>";

}

echo "

</table>

<br>

<table width=\"$tablewidth\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">

<tr>

<td>

<input type=\"submit\" value=\"Stergere anunturi selectate\">

</td>

<td align=\"right\" valign=\"top\">

<font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">total anunturi : <font color=\"#ff0000\">$all_record</font></font>

</td>

</tr>

</table>

</form>

";

}

// Navigare prin anunturi

function browpost() {

global $itemperpage, $start, $tablewidth, $admheadercolor, $admrowcolor1, $admrowcolor2, $id;

if (!isset($start) OR ($start == "")) $start = 0 ;

$hasil_topic = mysql_query("SELECT * FROM forum_topic WHERE topic_id=$id");

$data_topic = mysql_fetch_row($hasil_topic) or die("Nici un anunt gasit!");

$index_url = "admin.php?action=browpost&id=$id";

$query_jumlah = mysql_query("SELECT count(*) FROM forum_post WHERE topic_id=$id");

$data_jumlah = mysql_fetch_row($query_jumlah);

$all_record = $data_jumlah[0];

$query = mysql_query("SELECT * FROM forum_post WHERE topic_id=$id ORDER BY post_time LIMIT $start, $itemperpage");

$this_page = mysql_num_rows($query) or die("Nici un anunt gasit!");

echo "

<form method=\"get\" action=\"admin.php\">

<input type=\"hidden\" name=\"action\" value=\"delpost\">

<input type=\"hidden\" name=\"id\" value=\"$id\">

<input type=\"hidden\" name=\"start\" value=\"$start\">";

echo"<table width=\"$tablewidth\" border=\"0\" cellspacing=\"1\" cellpadding=\"2\">

<tr><td class=\"normal\" align=\"center\">";

$paging = generate_pagination($index_url, $all_record, $itemperpage, $start);

echo "<a href=\"admin.php\">Administrare</a>";

if (!empty($paging)) echo " | ";

echo $paging;

echo "</td></tr></table>";

echo "

<img height=\"5\" src=\"images/space.gif\" width=\"$tablewidth\"><br>

<table width=\"$tablewidth\" border=\"0\" cellspacing=\"1\" cellpadding=\"5\" bgcolor=\"white\">

<tr bgcolor=\"$admheadercolor\">

<td align=\"center\" width=\"5%\">&nbsp;</td>

<td width=\"20%\" class=\"normal\"><b><font color=\"#FFFFFF\">Autorul</font></b></td>

<td width=\"65%\" class=\"normal\"><b><font color=\"#FFFFFF\">$data_topic[1]</font></b></td>

<td width=\"10%\">&nbsp;</td>

</tr>\n";

if ($this_page < $itemperpage) $looping = $this_page; else $looping = $itemperpage;

for ($i=1; $i<=$looping; $i++) {

$data = mysql_fetch_row($query) or die("Nici un anunt gasit!");

if ((($i+1) % 2) == 0) $kolor = $admrowcolor1; else $kolor = $admrowcolor2;

$tgl = substr($data[3],8,2) . "-" . substr($data[3],5,2) . "-" . substr($data[3],0,4);

echo "<tr bgcolor=\"$kolor\">";

if ($i <> 1)

echo "<td align=\"center\"><input type=\"checkbox\" name=\"check[]\" value=\"$data[0]\"></td>";

else echo "<td></td>";

echo "<td valign=\"top\" class=\"normal\">$tgl<br>";

$user = $data[2];

$user_mail = $data[4];

$user_web = $data[5];

echo "by <b>$user</b><br>";

if (!$user_mail == "") echo "<a href=\"mailto:$user_mail\"><img src=\"images/sym_email.gif\" border=\"0\"></a> ";

if ($user_web <> "" AND $user_web <> "http://") echo "<a href=\"$user_web\" target=\"_blank\"><img src=\"images/sym_www.gif\" border=\"0\"></a>";

echo "</td>";

echo "<td class=\"normal\">";

$hasil_text = mysql_query("SELECT * FROM forum_postext WHERE post_id=$data[0]");

$data_text = mysql_fetch_row($hasil_text) or die("Nici un anunt gasit!");

$kontet = smile($data_text[1]);

$kontet = auto_url($kontet);

echo "$kontet</td>";

echo "<td align=\"center\" class=\"normal\"><a href=\"admin.php?action=editpost&topicid=$id&id=$data[0]&start=$start\">editare</a></td></tr>";

}

echo " </table> <br> <table width=\"$tablewidth\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">

<tr> <td> <input type=\"submit\" value=\"Sterge inregistrarile selectate\">

</td> <td align=\"right\" valign=\"top\"> <font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">total inregistrari : <font color=\"#ff0000\">$all_record</font></font>

</td> </tr> </table> </form> ";

}

// Editare

function edittopic() {

global $start, $id;

$query = mysql_query("SELECT * FROM forum_topic WHERE topic_id=$id");

$data = mysql_fetch_row($query);

echo "

<center><form method=\"get\" action=\"admin.php\">

<input type=\"hidden\" name=\"action\" value=\"doedittopic\">

<input type=\"hidden\" name=\"id\" value=\"$id\">

<input type=\"hidden\" name=\"start\" value=\"$start\">

<table width=\"400\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">

<tr bgcolor=\"#f0f0f0\">

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Id</font></td>

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">$data[0]</font></td>

</tr> <tr>

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Data</font></td>

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">$data[3]</font></td>

</tr> <tr bgcolor=\"#f0f0f0\"> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Vizite</font></td>

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">$data[4]</font></td>

</tr> <tr> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Raspunsuri</font></td>

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">$data[5]</font></td>

</tr> <tr bgcolor=\"#f0f0f0\"> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Autor</font></td>

<td><input type=\"text\" name=\"poster\" size=\"30\" value=\"$data[2]\"></td>

</tr> <tr> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Titlu</font></td>

<td><input type=\"text\" name=\"title\" size=\"40\" value=\"$data[1]\"></td>

</tr> <tr> <td>&nbsp;</td> <td><input type=\"submit\" value=\"Modificare\"> <font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\"><a href=\"admin.php?action=browtopic&start=$start\">Inapoi</a></font></td>

</tr> </table> </form><p>&nbsp;</p>";

}

// Editare

function doedittopic() {

global $id, $poster, $title, $start;

if (trim($poster)=="" OR trim($title)=="") {

erro("Eroare");

}

$query = mysql_query("UPDATE forum_topic SET topic_poster='$poster', topic_title='$title' WHERE topic_id=$id");

if (mysql_affected_rows() <> 0) {

echo "<span class=\"error\">Anuntul a fost modificat! </span>";

} else {

echo "<span class=\"error\">Eroare la modificare, mai incercati</span>";

}

$urut = mysql_query("SELECT * FROM forum_post WHERE topic_id = $id ORDER BY post_time ASC");

$data_temp = mysql_fetch_row($urut);

$id_temp = $data_temp[0];

$update_name = mysql_query("UPDATE forum_post SET poster='$poster' WHERE post_id=$id_temp");

echo "<span class=\"normal\"><br><br><a href=\"admin.php?start=$start\">Inapoi</a></span><br><br><br>";

}

// Editare

function editpost() {

global $topicid, $start, $id;

$topic = mysql_query("SELECT * FROM forum_topic WHERE topic_id=$topicid");

$data_topic = mysql_fetch_row($topic);

$query = mysql_query("SELECT * FROM forum_post WHERE post_id=$id");

$data = mysql_fetch_row($query);

$get_post_text = mysql_query("SELECT * FROM forum_postext WHERE post_id=$id");

$data_post_text = mysql_fetch_row($get_post_text);

echo "

<center><form method=\"post\" action=\"admin.php\">

<input type=\"hidden\" name=\"action\" value=\"doeditpost\">

<input type=\"hidden\" name=\"id\" value=\"$id\">

<input type=\"hidden\" name=\"topicid\" value=\"$topicid\">

<input type=\"hidden\" name=\"start\" value=\"$start\">

<table width=\"400\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">

<tr> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Anunt</font></td>

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\" color=\"blue\"><b>$data_topic[1]</b></font></td>

</tr> <tr bgcolor=\"#f0f0f0\"> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Id</font></td>

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">$data[0]</font></td>

</tr> <tr> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Data</font></td>

<td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">$data[3]</font></td>

</tr> <tr bgcolor=\"#f0f0f0\"> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Autor</font></td>

<td><input type=\"text\" size=\"35\" name=\"poster\" value=\"$data[2]\"></td>

</tr> <tr> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Email</font></td>

<td><input type=\"text\" size=\"35\" name=\"email\" value=\"$data[4]\"></td>

</tr> <tr bgcolor=\"#f0f0f0\"> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Web</font></td>

<td><input type=\"text\" size=\"35\" name=\"web\" value=\"$data[5]\"></td>

</tr> <tr> <td><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Text Anunt</font></td>

<td><textarea name=\"postext\" rows=\"10\" cols=\"35\">$data_post_text[1]</textarea></td>

</tr> <tr> <td>&nbsp;</td> <td><input type=\"submit\" value=\"Update Data\"> <font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\"><a href=\"admin.php?action=browpost&id=$topicid&start=$start\">Inapoi</a></font></td>

</tr> </table> </form><hr noshade size=\"1\"></center>";}

// Editare

function doeditpost() {

global $topicid, $poster, $email, $web, $postext, $start, $id;

if (trim($poster)=="" or trim($email)=="" or trim($postext)=="") {

erro("Eroare!");

}

if (trim($web)=="http://") $web = "";

check_email($email);

$query_post_string = "UPDATE forum_post SET poster='$poster', email='$email', web='$web' WHERE post_id=$id";

$post_string = mysql_query($query_post_string);

if (mysql_affected_rows() <> 0) $edit1 = 1; else $edit1 = 0;

$query_postext_string = "UPDATE forum_postext SET post_text='$postext' WHERE post_id=$id";

$postext_string = mysql_query($query_postext_string);

if (mysql_affected_rows() <> 0) $edit2 = 1; else $edit2 = 0;

/*if (($edit1 == 1) AND ($edit2 == 1)) {

echo "<span class=\"error\">Update Success! Both tables affected.</span><br>";

} elseif (($edit1 == 1) OR ($edit2 == 1)) {

echo "<font face=\"$default_font\" size=2>Update Success! Only 1 table affected!</font>";

} else {

echo "<font face=\"$default_font\" size=2>No Records Affected!</font>";

} */

echo "<span class=\"error\">Modificare reusita</span>";

$check_topic = mysql_query("SELECT * FROM forum_post WHERE topic_id=$topicid ORDER BY post_time ASC");

$data_check = mysql_fetch_row($check_topic);

$id_check = $data_check[0];

if ($id_check == $id) {

$update_poster_query = "UPDATE forum_topic SET topic_poster='$poster' WHERE topic_id=$topicid";

$update_poster = mysql_query($update_poster_query);

}

echo "<br><br><span class=\"normal\"><a href=\"admin.php?action=browpost&id=$topicid&start=$start\">Inapoi la subiecte</a></span><br><br><br>";

}

// D E L E T E T O P I C

function deltopic() {

global $id, $check, $start;

$posting_deleted = 0;

$deleted = 0;

for ($i=0; $i<=count($check); $i++) {

if ($check[$i] <> "" ) {

$hapus = @mysql_query("DELETE FROM forum_topic WHERE topic_id=$check[$i]");

if (mysql_affected_rows() <> 0) {

$deleted++;

echo "<font face=\"verdana\" size=1 color=red>Topic with id: <b>$check[$i]</b> deleted!</font><br>";

$pilih_post = mysql_query("SELECT post_id FROM forum_post WHERE topic_id=$check[$i]");

if (@mysql_num_rows($pilih_post) <> 0) {

while ($data = mysql_fetch_row($pilih_post)) {

$hapus1 = mysql_query("DELETE FROM forum_postext WHERE post_id=$data[0]");

if(mysql_affected_rows() <> 0) {

$posting_deleted++;

echo "<font face=\"verdana\" size=1>Anuntul cu id-ul: <b>$data[0]</b> a fost sters deasemenea!</font><br>"; } }

$hapus2 = mysql_query("DELETE FROM forum_post WHERE topic_id=$check[$i]");

} } } }

if ($deleted == 0) echo "<br><br><span class=\"error\">Nici un topic sters!</span>";

else

echo "<br><br><span class=\"error\">Total de <font color=blue><b>$deleted</b></font> topicuri sterse!</span>";

if ($posting_deleted == 0) echo "<br><span class=\"error\">Nimic Sters!</span>";

else

echo "<br><span class=\"error\">In total <font color=blue><b>$posting_deleted</b></font> sterse deasemenea!</span>";

echo "<br><br><span class=\"normal\"><a href=\"admin.php?start=$start\">Inapoi la topic</a></span><br><br></font>";

}

// Sterge

function delpost() {

global $id, $check, $start;

$posting_deleted = 0;

for ($i=0; $i<=count($check); $i++) {

if ($check[$i] <> "" ) {

$hapus = @mysql_query("DELETE FROM forum_post WHERE post_id=$check[$i]");

$hapus1 = @mysql_query("DELETE FROM forum_postext WHERE post_id=$check[$i]");

if (mysql_affected_rows() <> 0) {

$posting_deleted++;

echo "<span class=\"normal\">Anuntul cu id-ul: <b>$check[$i]</b> a fost sters!</span><br>";

$kurangin = mysql_query("UPDATE forum_topic SET topic_replies=topic_replies – 1 WHERE topic_id=$id");

$reply = mysql_query("SELECT topic_replies FROM forum_topic WHERE topic_id=$id");

$reply_data = mysql_fetch_row($reply);

if ($reply_data[0] < 0) {

$delete_topic = mysql_query("DELETE FROM forum_topic WHERE topic_id=$id");

} } } }

$check_last = mysql_query("SELECT topic_last_post_id FROM forum_topic WHERE topic_id=$id");

$data = @mysql_fetch_row($check_last) or die("The topic is not exist or have been deleted!");

$check_post = mysql_query("SELECT post_id FROM forum_post WHERE topic_id=$id ORDER BY post_time DESC");

$data = @mysql_fetch_row($check_post) or die("No posting in this topic");

$update_las = mysql_query("UPDATE forum_topic SET topic_last_post_id = $data[0] WHERE topic_id = $id");

if ($posting_deleted == 0)

echo "<br><span class=\"error\">No Posting deleted!</span>";

else

echo "<br><span class=\"error\">total <font color=blue><b>$posting_deleted</b></font> posting deleted!</span>";

echo "<br><br>

<span class=\"normal\"><a href=\"admin.php?action=browpost&id=$id&start=$start\">Inapoi</a></span><br>

";

echo "<br><br>";

}

include("header.php");

switch ($action) {

case "":

browtopic();

break;

case "browtopic":

browtopic();

break;

case "edittopic":

edittopic();

break;

case "doedittopic":

doedittopic();

break;

case "deltopic":

deltopic();

break;

case "browpost":

browpost();

break;

case "editpost":

editpost();

break;

case "doeditpost":

doeditpost();

break;

case "delpost":

delpost($id);

break;

}

include("footer.php");

mysql_close();

index.php

<?php include("config.php"); include("lib.php"); include("header.php"); ?>

<table width="<?php echo $tablewidth; ?>" border="0" cellspacing="0" cellpadding="0">

<tr> <td> <table width="130" border="0" cellspacing="0" cellpadding="0">

<tr> <td> <table border="0" cellspacing="0" cellpadding="1" bgcolor="#CCCCCC" width="125">

<tr> <td> <table width="100%" border="0" cellspacing="0" cellpadding="3" bgcolor="#f5f5f5">

<tr> <td class="normal" align="center"><b>&nbsp;&nbsp;&nbsp;<a href="newtopic.php" class="none">Subiect Nou </a>&nbsp;&nbsp;</b></td>

</tr> </table> </td> </tr> </table> </td> </tr> </table> </td> <?php $hasil = mysql_query("SELECT post_id FROM forum_post");

$total_post = @mysql_num_rows($hasil) or die("<span class=\"error\">Nici un anunt gasit!</span>");

$hasil_topic = mysql_query("SELECT topic_id FROM forum_topic");

$total_topic = @mysql_num_rows($hasil_topic) or die("<span class=\"error\">Nici un anunt gasit!</span>");

?> <td class="normal" align="right">Anunturi: <b><?php echo $total_topic; ?></b> | Mesaje: <b><?php echo $total_post; ?></b>

<?php if (!isset($start) OR ($start == "")) $start = 0 ;

$query_jumlah = mysql_query("SELECT count(*) FROM forum_topic");

$data_jumlah = mysql_fetch_row($query_jumlah);

$all_record = $data_jumlah[0];

$query = mysql_query("SELECT * FROM forum_topic ORDER BY topic_time DESC LIMIT $start,$itemperpage");

$this_page = @mysql_num_rows($query) or die("<span class=\"error\">Nici un anunt gasit!</span>");

$paging = generate_pagination("index.php?action=none", $all_record, $itemperpage, $start);

if (!$paging == "") echo " | ";

echo $paging . "</td></tr></table>";

?> <img src="images/space.gif" width="100" height="5"><br> <table width="<?php echo $tablewidth; ?>" border="0" cellspacing="1" cellpadding="5" bgcolor="white">

<tr bgcolor="<?php echo $headercolor; ?>"> <td class="normal" width="15%"><font color="#FFFFFF"><b>Autor</b></font></td>

<td width="50%" class="normal"><strong><font color="#FFFFFF">Anunt</font></strong></td>

<td width="10%" align="center" class="normal"><strong><font color="#FFFFFF">Vizite</font></strong></td>

<td width="10%" align="center" class="normal"><strong><font color="#FFFFFF">Raspunsuri</font></strong></td>

<td width="15%" class="normal"><strong><font color="#FFFFFF">Ultimul raspuns </font></strong></td> </tr>

<?php if ($this_page < $itemperpage) $looping = $this_page; else $looping = $itemperpage;

for ($i=1; $i<=$looping; $i++) {

$counter = $end – $i;

$data = mysql_fetch_row($query) or die("Nici un anunt gasit!");

$nomor = $counter + 1;

if ((($i+1) % 2) == 0) $kolor = $rowcolor1; else $kolor = $rowcolor2;

$tgl = substr($data[3],8,2) . "-" . substr($data[3],5,2) . "-" . substr($data[3],0,4);

echo "<tr bgcolor=\"$kolor\">";

echo "<td valign=\"top\" class=\"normal\">$tgl<br>";

$hasil_user = mysql_query("SELECT * FROM forum_post WHERE topic_id=$data[0] ORDER BY post_time ASC");

$data_user = mysql_fetch_row($hasil_user) or die("Nici un anunt gasit!");

$user = $data_user[2]; $user_mail = $data_user[4]; $user_web = $data_user[5]; echo "by <b>$user</b><br>"; if (!$user_mail == "") { $user_mail = str_replace("@","-at-",$user_mail); $user_mail = str_replace(".","-dot-",$user_mail);

echo "<a href=\"#\"><img src=\"images/sym_email.gif\" border=\"0\" alt=\"$user_mail\"></a> "; }

if ((!$user_web == "") AND (!$user_web == "http://")) echo "<a href=\"$user_web\" target=\"_blank\"><img src=\"images/sym_www.gif\" border=\"0\"></a>";

echo "</td>";

echo "<td class=\"normal\"><a href=\"viewtopic.php?id=$data[0]\"><b>$data[1]</b></a><br>";

$hasil_post = mysql_query("SELECT * FROM forum_post WHERE topic_id=$data[0] ORDER BY post_time ASC");

$data_post = mysql_fetch_row($hasil_post) or die("Nici un anunt gasit!");

$hasil_text = mysql_query("SELECT post_id, SUBSTRING_INDEX(post_text,' ',20) FROM forum_postext WHERE post_id=$data_post[0]");

$data_text = mysql_fetch_row($hasil_text) or die("Nici un anunt gasit!");

$hasil_last = mysql_query("SELECT * FROM forum_post WHERE post_id=$data[6]");

$data_last = mysql_fetch_row($hasil_last) or die("Nici un anunt gasit!");

$tgl_last = substr($data_last[3],8,2) . "-" . substr($data_last[3],5,2) . "-" . substr($data_last[3],0,4);

$kontet = smile($data_text[1]); $kontet = auto_url($kontet); echo "$kontet …</td>"; echo "<td align=\"center\" class=\"normal\"><b>$data[4]</b></td> <td align=\"center\" class=\"normal\"><b>$data[5]</b></td>

<td align=\"center\" class=\"normal\">$tgl_last<br>"; $hasil_last_user = mysql_query("SELECT * FROM forum_post WHERE topic_id=$data[0] ORDER BY post_time DESC"); $data_last_user = mysql_fetch_row($hasil_last_user) or die("Nici un anunt gasit!");

$last = $data_last_user[2];

echo "by <b>$last</b></font></td></tr>";

} ?>

</table> <?php echo "<table width=\"$tablewidth\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">

<tr><td class=\"normal\" align=\"right\"> $paging </td></tr></table>"; ?>

<?php include("footer.php"); ?>

</p>

Anuntnou.php

<?php

session_start();

include("config.php");

include("lib.php");

include("header.php");

?>

<SCRIPT LANGUAGE="JavaScript">

function textCounter(field, countfield, maxlimit) {

if (field.value.length > maxlimit) // if too long…trim it!

field.value = field.value.substring(0, maxlimit);

// otherwise, update 'characters left' counter

else

countfield.value = maxlimit – field.value.length;

}

</script> <table width="200" border="0" cellspacing="0" cellpadding="1" bgcolor="#CCCCCC">

<tr> <td> <table width="100%" border="0" cellspacing="0" cellpadding="3" bgcolor="#f5f5f5">

<tr> <td class="normal" align="center"><b>&nbsp;&nbsp;&nbsp;<a href="index.php" class="none">Acasa</a>&nbsp;&nbsp;&nbsp;</b></td> </tr> </table> </td> </tr> </table> <br> <strong>Adaugare anunt! </strong> <br> <br> <form method="post" action="addtopic.php" name="posting"> <?php $pecah = explode(".",$REMOTE_ADDR);

$pecah3 = $pecah[0] . $pecah[1] . $pecah[2] . session_id(); ?>

<input type="hidden" name="verify" value="<?php echo md5($floodpass.$pecah3); ?>">

<table width="500" border="0" cellspacing="0" cellpadding="15" class="replyform" bgcolor="#FBFBF0">

<tr><td> <table width="100%" border="0" cellspacing="0" cellpadding="3"><tr>

<td width="25%" class="normal"><b>Nume<font color="#FF0000">*</font></b></td>

<td width="75%"> <input type="text" name="nama"> </td> </tr> <tr> <td class="normal"><b>Email<font color="#FF0000">*</font></b></td> <td width="72%"> <input type="text" name="email" size="30"> </td> </tr> <tr> <td class="normal"><b>Homepage</b></td> <td>

<input type="text" name="homepage" size="30" value="http://"> </td> </tr> <tr> <td class="normal"><b>Subiect<font color="#FF0000">*</font></b></td> <td> <input type="text" name="topic" size="40"> </td> </tr> <tr> <td class="normal" valign="top"><br><br><br>

<b>Text anunt <font color="#FF0000">*</font></b></td> <td class="normal"> <textarea name="topictext" rows="7" cols="35" onKeyDown="textCounter(this.form.topictext,this.form.remLen,<?php echo $maxchar; ?>);" onKeyUp="textCounter(this.form.topictext,this.form.remLen,<?php echo $maxchar; ?>);"></textarea><br>

Caractere Ramase: <input readonly type=text name=remLen size=3 maxlength=3 value="<?php echo $maxchar; ?>">

<table border="0" cellspacing="0" cellpadding="5">

<?php

$query_smile = mysql_query("SELECT MIN(id), code, smile_url, emotion FROM forum_smile GROUP BY emotion LIMIT 0,20");

$counter = 10;

while($data_smile = mysql_fetch_row($query_smile)) {

if (($counter % 10) == 0) echo "<tr>";

echo "<td><a href=\"javascript:void(0);\" onClick=\"document.posting.topictext.value+='$data_smile[1] ';\"><img src=\"images/$data_smile[2]\" border=\"0\" alt=\"$data_smile[3]\"></a></td>";

if (($counter % 10) == 9) echo "</tr>";

$counter++;

}

?>

</table> </td> </tr> <tr> <td>&nbsp;</td> <td> <input type="submit" name="Adaugare" value="Submit"> </td> </tr> </table></tr></table></form><?php include("footer.php"); ?>

Adaugtopic.php

<?php

session_start();

include("config.php");

include("lib.php");

$IP = $_POST["verify"];

$pecah = explode(".",$REMOTE_ADDR);

$pecah3 = $pecah[0] . $pecah[1] . $pecah[2] . session_id();

if ($IP != md5($floodpass.$pecah3)) {

exit();

}

if (trim($nama)=="" or trim($email=="") or trim($topic=="") or trim($topictext)=="") {

erro("Nu ati comppletat anuntul, campurile cu * sunt obligatorii");

}

if (trim($homepage)=="http://") $homepage = "";

check_email($email);

$nama = htmlspecialchars($nama);

$email = htmlspecialchars($email);

$homepage = htmlspecialchars($homepage);

$topic = htmlspecialchars($topic);

$test_comment = explode(" ",$topictext);

$jmltest = count($test_comment);

for ($t=0; $t<$jmltest; $t++) {

if (strlen(trim($test_comment[$t])) > 100) {

erro("Numarul maxim de caractere al unui cuvant este 100!");

}

}

$topictext = htmlspecialchars($topictext);

$topictext = str_replace("\n","<BR>",$topictext);

$tgl = date("Y-m-d H:i");

$ins1 = mysql_query("INSERT INTO forum_topic VALUES (' ', '$topic', '$nama', '$tgl', '0', '0', '0')");

$topic_rnd = mysql_insert_id();

$ins2 = mysql_query("INSERT INTO forum_post VALUES(' ', '$topic_rnd', '$nama', '$tgl', '$email', '$homepage')");

$post_rnd = mysql_insert_id();

$ins3 = mysql_query("INSERT INTO forum_postext VALUES($post_rnd, '$topictext')");

$ins4 = mysql_query("UPDATE forum_topic SET topic_last_post_id=$post_rnd WHERE topic_id = $topic_rnd");

$url = "Location: index.php";

header($url);

?>

Vezitopic.php

<?php

session_start();

if (!isset($_GET["id"])) header("Location: index.php");

include("config.php");

include("lib.php");

include("header.php");

$ins2 = mysql_query("UPDATE forum_topic SET topic_views=topic_views+1 WHERE topic_id=$id");

?>

<table width="<?php echo $tablewidth; ?>" border="0" cellspacing="0" cellpadding="0">

<tr>

<td>

<table width="230" border="0" cellspacing="0" cellpadding="0">

<tr>

<td>

<?php makebutton("Acasa", "index.php", "115"); ?>

</td>

<td><img src="images/space.gif" width="5" height="10"></td>

<td>

<?php makebutton("Raspunde", "#form", "115"); ?>

</td>

</tr>

</table>

</td>

<?php

$hasil_topic = mysql_query("SELECT * FROM forum_topic WHERE topic_id=$id");

$data_topic = mysql_fetch_row($hasil_topic) or die("No topic found!");

?>

<td class="normal" align="right">Vizite: <b><?php echo $data_topic[4]; ?></b> – Raspunsuri: <b><?php echo $data_topic[5]; ?></b>

<?php

if (!isset($start) OR ($start == "")) $start = 0 ;

$query_jumlah = mysql_query("SELECT count(*) FROM forum_post WHERE topic_id=$id");

$data_jumlah = mysql_fetch_row($query_jumlah);

$all_record = $data_jumlah[0];

$query = mysql_query("SELECT * FROM forum_post WHERE topic_id=$id ORDER BY post_time LIMIT $start, $itemperpage");

$this_page = mysql_num_rows($query) or die("No post records found!");

$paging = generate_pagination("viewtopic.php?id=$id", $all_record, $itemperpage, $start);

if (!$paging == "") echo " – ";

echo $paging . "</td></tr></table>";

?>

<img height="5" src="images/space.gif" width="<?php echo $tablewidth; ?>"><br>

<table width="<?php echo $tablewidth; ?>" border="0" cellspacing="1" cellpadding="5" bgcolor="white">

<tr bgcolor="<?php echo $headercolor; ?>">

<td width="25%" class="normal"><b><font color="#FFFFFF">Adaugat</font></b></td>

<td width="75%" class="normal"><b><font color="#FFFFFF"><?php echo $data_topic[1] ?></font></b></td>

</tr>

<?php

if ($this_page < $itemperpage) $looping = $this_page; else $looping = $itemperpage;

for ($i=1; $i<=$looping; $i++) {

$counter = $end – $i;

$data = mysql_fetch_row($query) or die("No records found!");

$nomor = $counter + 1;

if ((($i+1) % 2) == 0) $kolor = $rowcolor1; else $kolor = $rowcolor2;

$tgl = substr($data[3],8,2) . "-" . substr($data[3],5,2) . "-" . substr($data[3],0,4);

echo "<tr bgcolor=\"$kolor\">";

echo "<td valign=\"top\" class=\"normal\">$tgl<br>";

$user = $data[2];

$user_mail = $data[4];

$user_web = $data[5];

echo "by <b>$user</b><br>";

if (!$user_mail == "") {

$user_mail = str_replace("@","-at-",$user_mail);

$user_mail = str_replace(".","-dot-",$user_mail);

echo "<a href=\"#\"><img src=\"images/sym_email.gif\" border=\"0\" alt=\"$user_mail\"></a> ";

}

if (!$user_web == "") echo "<a href=\"$user_web\" target=\"_blank\"><img src=\"images/sym_www.gif\" border=\"0\"></a>";

echo "</td>";

echo "<td class=\"normal\">";

$hasil_text = mysql_query("SELECT * FROM forum_postext WHERE post_id=$data[0]");

$data_text = mysql_fetch_row($hasil_text) or die("No records found!");

$kontet = smile($data_text[1]);

$kontet = auto_url($kontet);

echo "$kontet</td></tr>";

}

?>

</table>

<?php

echo "<table width=\"$tablewidth\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">

<tr><td class=\"normal\" align=\"right\"> $paging </td></tr></table>";

?>

<img src="images/space.gif" width="100" height="5"><br><a name="form"></a>

<SCRIPT LANGUAGE="JavaScript">

function textCounter(field, countfield, maxlimit) {

if (field.value.length > maxlimit) // if too long…trim it!

field.value = field.value.substring(0, maxlimit);

// otherwise, update 'characters left' counter

else

countfield.value = maxlimit – field.value.length;

}

</script>

<form method="post" action="reply.php" name="posting">

<table width="500" border="0" cellspacing="0" cellpadding="10" class="replyform" bgcolor="#FBFBF0">

<tr>

<td>

<table width="100%" border="0" cellspacing="0" cellpadding="3">

<tr>

<td colspan="2" class="normal">

<?php

$pecah = explode(".",$REMOTE_ADDR);

$pecah3 = $pecah[0] . $pecah[1] . $pecah[2] . session_id();

?>

<input type="hidden" name="verify" value="<?php echo md5($floodpass.$pecah3); ?>">

<input type="hidden" name="id" value="<?php echo $id; ?>">

<span class="normal"><b><font color="#990000">Raspunde la anunt folosind aceasta forma :</font></b></span> </td>

</tr>

<tr>

<td colspan="2" class="normal">

<hr size="1" noshade>

</td>

</tr>

<tr>

<td width="28%" class="normal"><b>Nume <font color="#FF0000">*</font></b></td>

<td width="72%" class="normal">

<input type="text" name="nama">

</td>

</tr>

<tr>

<td width="28%" class="normal"><b>Email<font color="#FF0000">*</font></b></td>

<td width="72%" class="normal">

<input type="text" name="email" size="30">

</td>

</tr>

<tr>

<td width="28%" class="normal"><b>Homepage</b></td>

<td width="72%" class="normal">

<input type="text" name="homepage" size="30" value="http://">

</td>

</tr>

<tr>

<td width="28%" class="normal" valign="top"><br><br><br>

<b>Raspuns<font color="#FF0000">*</font></b></td>

<td width="72%" class="normal">

<textarea name="topictext" rows="7" cols="35" onKeyDown="textCounter(this.form.topictext,this.form.remLen,<?php echo $maxchar; ?>);" onKeyUp="textCounter(this.form.topictext,this.form.remLen,<?php echo $maxchar; ?>);"></textarea><br>

Caractere ramase:

<input readonly type=text name=remLen size=3 maxlength=3 value="<?php echo $maxchar; ?>">

<table border="0" cellspacing="0" cellpadding="5">

<?php

$query_smile = mysql_query("SELECT MIN(id), code, smile_url, emotion FROM forum_smile GROUP BY emotion LIMIT 0,20");

$counter = 10;

while($data_smile = mysql_fetch_row($query_smile)) {

if (($counter % 10) == 0) echo "<tr>";

echo "<td><a href=\"javascript:void(0);\" onClick=\"document.posting.topictext.value+='$data_smile[1] ';\"><img src=\"images/$data_smile[2]\" border=\"0\" alt=\"$data_smile[3]\"></a></td>";

if (($counter % 10) == 9) echo "</tr>";

$counter++;

}

?>

</table>

</td>

</tr>

<tr>

<td width="28%" class="normal">&nbsp;</td>

<td width="72%" class="normal">

<input type="submit" name="submit" value="Raspunde">

</td>

</tr>

</table>

</td>

</tr>

</table>

</form>

<?php include("footer.php"); ?>

Lib.php

<?php

if (!defined('PMA_GRAB_GLOBALS_INCLUDED')) {

define('PMA_GRAB_GLOBALS_INCLUDED', 1);

if (!empty($_GET)) {

extract($_GET, EXTR_OVERWRITE);

} else if (!empty($HTTP_GET_VARS)) {

extract($HTTP_GET_VARS, EXTR_OVERWRITE);

} // end if

if (!empty($_POST)) {

extract($_POST, EXTR_OVERWRITE);

} else if (!empty($HTTP_POST_VARS)) {

extract($HTTP_POST_VARS, EXTR_OVERWRITE);

} // end if

if (!empty($_FILES)) {

while (list($name, $value) = each($_FILES)) {

$$name = $value['tmp_name'];

}

} else if (!empty($HTTP_POST_FILES)) {

while (list($name, $value) = each($HTTP_POST_FILES)) {

$$name = $value['tmp_name'];

}

} // end if

if (!empty($_SERVER) && isset($_SERVER['PHP_SELF'])) {

$PHP_SELF = $_SERVER['PHP_SELF'];

} else if (!empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['PHP_SELF'])) {

$PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];

} // end if

} // $__PMA_GRAB_GLOBALS_LIB__

mysql_connect($dbhost,$dbuser,$dbpass) or die("Error – Connection to database is not established !");

@mysql_select_db($db) or die("Error – Can't open the database !");

function check_email($email) {

if(!ereg("([[:alnum:]\.\-]+)(\@[[:alnum:]\.\-]+\.+)", $email)) {

erro("Invalid email address!");

}

}

function smile($message) {

global $url_smiles;

$message = ' ' . $message;

if ($getsmiles = mysql_query("SELECT *, length(code) as length FROM forum_smile ORDER BY length DESC")) {

while ($smiles = mysql_fetch_array($getsmiles)) {

$smile_code = preg_quote($smiles[code]);

$smile_code = str_replace('/', '//', $smile_code);

$message = preg_replace("/([\n\\ \\.])$smile_code/si", '\1<IMG SRC="' . 'images' . '/' . $smiles[smile_url] . '">', $message);

}

}

$message = substr($message, 1);

return($message);

}

function auto_url($text) {

$ret = " " . $text;

$ret = preg_replace("#([\n ])([a-z]+?)://([^, \n\r]+)#i", "\\1<a href=\"\\2://\\3\" target=\"_blank\">\\2://\\3</a>", $ret);

$ret = preg_replace("#([\n ])www\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[^, \n\r]*)?)#i", "\\1<a href=\"http://www.\\2.\\3\\4\" target=\"_blank\">www.\\2.\\3\\4</a>", $ret);

$ret = preg_replace("#([\n ])([a-z0-9\-_.]+?)@([^, \n\r]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $ret);

$ret = substr($ret, 1);

return($ret);

}

function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = TRUE) {

$total_pages = ceil($num_items/$per_page);

if ( $total_pages == 1 ) {

return "";

}

$on_page = floor($start_item / $per_page) + 1;

$page_string = "";

if ( $total_pages > 10 ) {

$init_page_max = ( $total_pages > 3 ) ? 3 : $total_pages;

for($i = 1; $i < $init_page_max + 1; $i++) {

$page_string .= ( $i == $on_page ) ? "<b>" . $i . "</b>" : "<a href=\"$base_url&amp;start=" . ( ( $i – 1 ) * $per_page ) . "\">" . $i . "</a>";

if ( $i < $init_page_max ) {

$page_string .= ", ";

} }

if ( $total_pages > 3 ) {

if ( $on_page > 1 && $on_page < $total_pages ) {

$page_string .= ( $on_page > 5 ) ? " … " : ", ";

$init_page_min = ( $on_page > 4 ) ? $on_page : 5;

$init_page_max = ( $on_page < $total_pages – 4 ) ? $on_page : $total_pages – 4;

for($i = $init_page_min – 1; $i < $init_page_max + 2; $i++) {

$page_string .= ($i == $on_page) ? "<b>" . $i . "</b>" : "<a href=\"$base_url&amp;start=" . ( ( $i – 1 ) * $per_page ) . "\">" . $i . "</a>";

if ( $i < $init_page_max + 1 ) {

$page_string .= ", ";

} }

$page_string .= ( $on_page < $total_pages – 4 ) ? " … " : ", ";

}

else {

$page_string .= " … ";

}

for($i = $total_pages – 2; $i < $total_pages + 1; $i++) {

$page_string .= ( $i == $on_page ) ? "<b>" . $i . "</b>" : "<a href=\"$base_url&amp;start=" . ( ( $i – 1 ) * $per_page ) . "\">" . $i . "</a>";

if( $i < $total_pages ) {

$page_string .= ", ";

} } } }

else {

for($i = 1; $i < $total_pages + 1; $i++) {

$page_string .= ( $i == $on_page ) ? "<b>" . $i . "</b>" : "<a href=\"$base_url&amp;start=" . ( ( $i – 1 ) * $per_page ) . "\">" . $i . "</a>";

if ( $i < $total_pages ) {

$page_string .= ", ";

} } }

if ( $add_prevnext_text ) {

if ( $on_page > 1 ) {

$page_string = " <a href=\"$base_url&amp;start=" . ( ( $on_page – 2 ) * $per_page ) . "\">Prev</a>&nbsp;&nbsp;" . $page_string;

}

if ( $on_page < $total_pages ) {

$page_string .= "&nbsp;&nbsp;<a href=\"$base_url&amp;start=" . ( $on_page * $per_page ) . "\">Next</a>";

} }

$page_string = "Page: " . $page_string;

return $page_string;

}

function erro($message) {

global $tipe;

include("header.php");

if ($tipe == no) $title = "MESSAGE"; else $title = "ERROR!";

echo "

<table width=\"300\" border=\"0\" cellspacing=\"0\" cellpadding=\"10\" class=\"replyform\" bgcolor=\"#f0f0f0\">

<tr>

<td align=\"center\" class=\"normal\"><font size=\"3\" color=\"#CC0000\"><b>$title</b></font><br><br>

$message </td> </tr> </table> <br> <br> <table width=\"250\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"> <tr> <td> <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"#CCCCCC\" width=\"125\"> <tr> <td> <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" bgcolor=\"#f5f5f5\"> <tr> <td class=\"normal\" align=\"center\"><b>&nbsp;&nbsp;&nbsp;<a href=\"javascript:window.history.back()\" class=\"none\">Back</a>&nbsp;&nbsp;</b></td> </tr>

</table> </td> </tr> </table> </td> <td><img src=\"images/space.gif\" width=\"5\" height=\"10\"></td> <td> <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"#CCCCCC\" width=\"125\"> <tr> <td> <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" bgcolor=\"#f5f5f5\"> <tr> <td class=\"normal\" align=\"center\"><b>&nbsp;&nbsp;&nbsp;<a href=\"index.php\" class=\"none\">Home</a>&nbsp;&nbsp;&nbsp;</b></td>

</tr> </table> </td> </tr> </table> </td> </tr> </table><br><br><br>";

include("footer.php");

die();

}

function makebutton($xtext, $xlink, $xwidth) {

echo"

<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"#CCCCCC\" width=\"$xwidth\">

<tr> <td> <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" bgcolor=\"#f5f5f5\"> <tr> <td class=\"normal\" align=\"center\"><b>&nbsp;&nbsp;&nbsp;<a href=\"$xlink\" class=\"none\">$xtext</a>&nbsp;&nbsp;</b></td> </tr> </table> </td>

</tr> </table>"; }

$b2smiliestrans = array(

':-?' => 'icon_confused.gif',

'8)' => 'icon_cool.gif',

':cry:' => 'icon_cry.gif',

':oops:' => 'icon_redface.gif',

':evil:' => 'icon_evil.gif',

':))' => 'icon_lol.gif',

':x' => 'icon_mad.gif',

':p' => 'icon_razz.gif',

':roll:' => 'icon_rolleyes.gif',

':(' => 'icon_frown.gif',

':)' => 'icon_smile.gif',

':o' => 'icon_eek.gif',

':D' => 'icon_biggrin.gif',

':wink:' => 'icon_wink.gif'

);

if (!function_exists('smiliescmp')) {

function smiliescmp ($a, $b) {

if (strlen($a) == strlen($b)) {

return strcmp($a, $b);

}

return (strlen($a) > strlen($b)) ? -1 : 1;

}

}

uksort($b2smiliestrans, 'smiliescmp');

foreach($b2smiliestrans as $smiley => $img) {

$b2_smiliessearch[] = $smiley;

$smiley_masked = '';

for ($i = 0; $i < strlen($smiley); $i = $i + 1) {

$smiley_masked .= substr($smiley, $i, 1).chr(160);

}

$b2_smiliesreplace[] = "<img src='images/$img' alt='$smiley_masked' />";

}

function convert_smilies($content) {

global $smilies_directory, $use_smilies;

global $b2_smiliessearch, $b2_smiliesreplace;

if ($use_smilies) {

$content = str_replace($b2_smiliessearch, $b2_smiliesreplace, $content);

}

return ($content);

}

?>

Reply.php

<?php

session_start();

include("config.php");

include("lib.php");

$IP = $_POST["verify"];

$pecah = explode(".",$REMOTE_ADDR);

$pecah3 = $pecah[0] . $pecah[1] . $pecah[2] . session_id();

if ($IP != md5($floodpass.$pecah3)) {

exit();

}

if (trim($nama)=="" or trim($email=="") or trim($topictext)=="") {

erro("Eroare, * sunt obligatorii");

}

if (trim($homepage)=="http://") $homepage = "";

check_email($email);

$nama = htmlspecialchars($nama);

$email = htmlspecialchars($email);

$homepage = htmlspecialchars($homepage);

$test_comment = explode(" ",$topictext);

$jmltest = count($test_comment);

for ($t=0; $t<$jmltest; $t++) {

if (strlen(trim($test_comment[$t])) > 100) {

erro("Maxim 100 litere pe cuvant!");

}

}

$topictext = htmlspecialchars($topictext);

$topictext = str_replace("\n","<BR>",$topictext);

$tgl = date("Y-m-d H:i");

$ins1 = mysql_query("INSERT INTO forum_post VALUES(' ', '$id', '$nama', '$tgl', '$email', '$homepage')");

$this_post = mysql_insert_id();

$ins2 = mysql_query("INSERT INTO forum_postext VALUES($this_post, '$topictext')");

$ins2 = mysql_query("UPDATE forum_topic SET topic_replies=topic_replies+1, topic_last_post_id='$this_post' WHERE topic_id=$id");

$url = "Location: viewtopic.php?id=$id";

header($url);

?>

Similar Posts

  • Numere Naturale

    Numere naturale. Operați cu numere naturale Repere din istoria matematicii Precizăm, încă de la început, că matematica este universală și atotprezentă. Cultura și matematica s-au dezvoltat împreună de-a lungul vremii. Numerele sunt notate prin simboluri, dar culturi diferite ale omenirii au utilizat pentru ele simboluri diferite. Cuvântul calcul provine din cuvântul latin ,, calculus”- pietricică….

  • Promovarea Marcilor Prin Intermediul Retelelor Social Virtuale

    Cuprins Abstract…………………………………………………………………………..pg. 3 Introducere………………………………………………………………………pg. 4 1. Nevoi sociale în realitatea contemporană 1.1 Viața socială de azi……………………………………………………….pg. 5 1.2 Experiența comunicarii virtuale………………………………………… pg. 19 1.3 Ce sunt rețelele sociale virtuale?……………………………………………………….pg. 24 1.4 Tipuri de retele sociale virtuale…………………………………………..pg. 26 2. Cercetarea interactiunii intre marci și utilizatori în cadrul rețelelor sociale virtuale 2.1 Identificarea problemei și definirea scopului…

  • . Proiectarea Algoritmilor. Metode de Proiectare a Algoritmilor Orientate pe Problema

    Complexitatea algoritmilor Teoria complexitătii are ca obiect de studiu clasificarea problemelor, bazată pe timpul de executie si spatiul de lucru utilizat de algoritmi pentru solutionarea lor. Cînd se analizează algoritmi paraleli, se poate lua în considerare si numărul de procesoare. Desi teoria complexitătii a fost dezvoltată pentru probleme de decizie, aceasta nu este o restrictie…

  • Voip Si Its

    CUPRINS Introducere (VoIP și ITS) Capitolul 1. Sisteme Inteligente de Transport (ITS) 1.1. Generalități 1.2. Arhitecturi ITS la nivel național 1.3. Arhitecturi și topologii Ethernet în ITS 1.4. Arhitectura de comunicație 1.5. Aplicații practice ITS 1.6. Exemple de aplicații VoIP în ITS 1.7. ATMS 1.8. Funcțiile ATMS Capitolul 2. Interconectarea calculatoarelor și rețelele VoIP 2.1….

  • Aplicatie Intranet Pentru Unitatile de Invatamant Preuniversitar

    APLICAȚIE INTRANET PENTRU UNITĂȚILE DE ÎNVĂȚĂMÂNT PREUNIVERSITAR Cuprins Capitolul I Introducere În lucrarea de față se va urmării dezvoltarea aplicațiilor educaționale specifice școlilor preuniversitare, o privire de ansamblu asupra a tot ceea ce implică software educațional și a modalitaților de folosire ale acestuia. În acest sens, va fii necesară prezența calculatoarelor și a tehnologiei informației…

  • Cybermarketing

    MANAGEMENTUL AFACERILOR ELECTRONICE CYBERMARKETING Călinescu Andreea Prof. Univ. Dr. Soavă Ana-Maria Georgeta Craiova, 2016 INTRODUCERE În prezenta lucrare mi-am propus să evidențiez utilitatea cybermarketingului în viața de zi cu zi, să prezint avantajele folosirii zilnice a noilor tehnologii, respectiv eficiența Internetului în ceea ce privește culegerea informațiilor, prospectarea, achiziționarea sau rezervarea anumitor bunuri. Așa cum…