Proyecto Final de Carrera (PFC) Ingeniería Informática (04/05) Alumnos Profesor Rubén Devesa Insa Benet Campderrich PROYECTO FINA DE CARRERA (PFC) - Desarrollo de una INTRANET corporativa - ÍNDICE 1. 2. Introducción 6 1.1. ¿Porqué usar Intranet? 6 1.2. Características y Beneficios 6 1.3. Nuevo Paradigma de la Información 7 1.4. Objetivos 7 Herramientas empleadas 2.1. PHP v4.3.3 8 8 2.1.1. Qué es PHP? 8 2.1.2. ¿Qué se puede hacer con PHP? 9 2.1.3. Breve inicio de PHP 9 2.1.4. PHP en el servidor 10 2.2. MySQL Database 11 2.2.1. Introducción 11 2.2.2. ¿POR QUE MySQL? 12 2.2.3. Características 12 2.2.4. Arquitectura 14 2.2.5. Funcionamiento 14 2.3. APACHE WEB SERVER v1.3 15 2.3.1. Introducción 15 2.3.2. Características 16 2.3.3. Protocolo http 16 2.3.4. Obtener el servidor 19 Rubén Devesa Insa (Ingeniería Informática 04-05) 2 2.3.5. Configuración 20 2.3.6. Documentación 22 2.3.7. Proyectos asociados 22 2.4. 3. PHPMyAdmin 23 2.4.1. Introducción 23 2.4.2. Funcionamiento 23 Análisis 25 3.1. Descripción del problema 25 3.2. Investigación del problema 25 3.3. Solución al problema 26 3.4. Documentación de los requisitos de procesos funcionales 27 3.4.1. Definición de actores 27 3.4.2. Diagrama de casos de uso 28 3.4.3. Caso de uso del subsistema gestión usuarios 29 3.4.4. Caso de uso del subsistema gestión departamentos 29 3.4.5. Descripción textual de los casos de uso 30 3.4.6. Descripción textual del caso de uso del subsistema Gestión de Usuarios. 36 3.4.7. Descripción textual del caso de uso del subsistema Gestión de Departamentos. 38 4. 5. Diseño 41 4.1. Modularidad 41 4.2. Diagrama de clases 44 4.3. Seguridad 45 Desarrollo 47 5.1. Implementación 47 5.2. Juegos de pruebas 61 5.2.1. JP1. Acceso usuario 61 5.2.2. JP2.Nuevo usuario 62 Rubén Devesa Insa (Ingeniería Informática 04-05) 3 5.2.3. JP3.Nuevo anuncio 63 6. Conclusiones 64 7. Bibliografía 66 8. ANEXO I 67 8.1. Instalación 67 8.1.1. Instalación de Apache 67 8.1.2. Instalación de PHP4 68 8.1.3. Configuración httpd.conf para Apache 1.3.X 70 8.1.4. Probando nuestro servidor Apache 72 8.1.5. Instalación de MySQL 73 8.1.6. Instalación de phpMyAdmin 74 8.1.7. Notas finales 75 Rubén Devesa Insa (Ingeniería Informática 04-05) 4 Desarrollo de una INTRANET corporativa (Septiembre-2005) Desarrollo de una INTRANET corporativa (Sept’05) 1. Introducción Una Intranet es una infraestructura de comunicación basada en los estándares de comunicación de Internet y el en los del World Wide Web. Por lo tanto, las herramientas usadas para crear una Intranet son idénticas a las mismas de Internet y las aplicaciones Web. La diferencia principal de la Intranet es que al acceso a la información publicada esta restringido a clientes dentro del grupo de la Intranet. 1.1. ¿Porqué usar Intranet? Una Intranet básica puede ser instalada en un espacio breve de tiempo (horas o días) y puede servir como un "depósito de información" para la compañía completa. Características y Beneficios Nuevo Paradigma de la Información Publicación en Base a la Demanda Reducción de Costos Desarrollo de Aplicaciones Cliente/Servidor 1.2. Características y Beneficios Una Intranet tiene las siguientes características: • Rápido Diseño. • Escalabilidad. • Fácil navegación. • Accesible para la mayoría de las plataformas de cómputo. • Integra la estrategia de cómputo distribuido. • Adaptable a los sistemas de información propietarios. • Uso de multimedia. Todas estas características generan una serie de beneficios para la empresa: • Requiere poca inversión para su inicio • Ahorra tiempo y costos en comparación de la distribución de información tradicional (papel). • Su estrategia de cómputo distribuido utiliza los recursos de cómputo mas efectivamente. Rubén Devesa Insa (Ingeniería Informática 04-05) 6 Desarrollo de una INTRANET corporativa (Sept’05) • Tiene una interface sencilla y flexible (vínculos). • Independiente de la plataforma. 1.3. Nuevo Paradigma de la Información La Intranet propone el concepto de usar un navegador de Web como la interface para ofrecer toda la cantidad de información necesaria. Las ventajas de este nuevo paradigma son: • Reduce el tiempo de aprendizaje de los usuarios. • Simplifica la instalación de aplicaciones. • Presenta diferentes tipos de información: texto, gráficas, sonido y video. • Actua como "front-end" para las aplicaciones cliente-servidor. • Permite el acceso a bases de datos. 1.4. Objetivos La Intranet tiene los siguientes objetivos principales: • constituirse en un medio de comunicación • facilitar el acceso a la información • transformarse en un vehículo de capacitación • permitir el trabajo colaborativo Rubén Devesa Insa (Ingeniería Informática 04-05) 7 Desarrollo de una INTRANET corporativa (Sept’05) 2. Herramientas empleadas 2.1. PHP v4.3.3 2.1.1. Qué es PHP? PHP (acrónimo de "PHP: Hypertext Preprocessor") es un lenguaje interpretado de alto nivel embebido en páginas HTML y ejecutado en el servidor. ...que significa realmente esta definición...? Un ejemplo nos aclarará las cosas: <html> <head> <title>Ejemplo PHP</title> </head> <body> <?php echo "Hola, este es un ejemplo con PHP!"; ?> </body> </html> Se puede comprobar que no es lo mismo que un script CGI escrito en otro lenguaje de programación como Perl o C – En vez de escribir un programa con muchos comandos para crear una salida en HTML, escribimos el código HTML con cierto código PHP embebido (introducido) en el mismo, que producirá cierta salida (en nuestro ejemplo, producir un texto). El código PHP se incluye entre etiquetas especiales de comienzo y final que nos permitirán entrar y salir del modo PHP. Lo que distingue a PHP de la tecnología Javascript, la cual se ejecuta en la máquina cliente, es que el código PHP es ejecutado en el servidor. Si tuviésemos un script similar al de nuestro ejemplo en nuestro servidor, el cliente solamente recibiría el resultado de su ejecución en el servidor, sin ninguna posibilidad de determinar que código ha producido el resultado recibido. El servidor web puede ser incluso configurado para que procese todos los ficheros HTML con PHP. Rubén Devesa Insa (Ingeniería Informática 04-05) 8 Desarrollo de una INTRANET corporativa (Sept’05) 2.1.2. ¿Qué se puede hacer con PHP? Al nivel más básico, PHP puede hacer cualquier cosa que se pueda hacer con un script CGI, como procesar la información de formularios, generar páginas con contenidos dinámicos, o mandar y recibir cookies. Quizás la característica más potente y destacable de PHP es su soporte para una gran cantidad de bases de datos. Escribir un interfaz vía web para una base de datos es una tarea simple con PHP. Las siguientes bases de datos están soportadas actualmente: Bases de datos soportadas por PHP Adabas D Ingres Dbase InterBase Oracle (OCI7 and OCI8) PostgreSQL Empress FrontBase Solid FilePro mSQL Sybase IBM DB2 MySQL Velocis Informix ODBC Unix dbm PHP también soporta el uso de otros servicios que usen protocolos como IMAP, SNMP, NNTP, POP3, HTTP y derivados. También se pueden abrir sockets de red directos (raw sockets) e interactuar con otros protocolos. 2.1.3. Breve inicio de PHP PHP fue concebido en otoño de 1994 por Rasmus Lerdorf (rasmus@php.net). Las primeras versiones no distribuidas al público fueron usadas en un sus páginas web para mantener un control sobre quien consultaba su currículum. La primera versión disponible para el público a principios de 1995 fue conocida como "Herramientas para paginas web personales"(Personal Home Page Tools). Consistían en un analizador sintáctico muy simple que solo entendía unas cuantas macros y una serie de utilidades comunes en las páginas web de entonces, un libro de visitas, un contador y otras pequeñas cosas. El analizador sintáctico fue reescrito a mediados de 1995 y fue nombrado PHP/FI version 2. Rubén Devesa Insa (Ingeniería Informática 04-05) 9 Desarrollo de una INTRANET corporativa (Sept’05) FI viene de otro programa que Rasmus había escrito y que procesaba los datos de formularios. Así que combinó las "Herramientas para paginas web personales", el "intérprete de formularios", añadió soporte para mSQL y PHP/FI vio la luz. PHP/FI creció a gran velocidad y la gente empezó a contribuir en el código. Es difícil dar estadísticas exactas, pero se estima que a finales de 1996 PHP/FI se estaba usando al menos en 15.000 páginas web alrededor del mundo. A mediados de 1997 este número había crecido a mas de 50.000. A mediados de 1997 el desarrollo del proyecto sufrió un profundo cambio, dejó de ser un proyecto personal de Rasmus, al cual habían ayudado un grupo de usuarios y se convirtió en un proyecto de grupo mucho más organizado. El analizador sintáctico se rescribió desde el principio por Zeev Suraski y Andi Gutmans y este nuevo analizador estableció las bases para PHP versión 3. Gran cantidad de codigo de PHP/FI fue portado a PHP3 y otra gran cantidad fue escrito completamente de nuevo. Hoy en día, tanto PHP/FI como PHP5 se distribuyen en un gran número de productos comerciales tales como el servidor web "C2’s StrongHold"y Redhat Linux. Una estimación conservativa basada en estadísticas de NetCraft (http://www.netcraft.com/) (ver también Estudio de NetCraft sobre servidores web (http://www.netcraft.com/survey/)), es que más de 1.000.000 de servidores alrededor del mundo usan PHP. Para hacernos una idea, este número es mayor que el número de servidores que utilizan el "Netscape’s Enterprise server"en Internet. A la vez que todo esto está pasando, el trabajo de desarrollo de la próxima generación de PHP está en marcha. Esta versión utiliza el potente motor de scripts Zend (http://www.zend.com/) para proporcionar altas prestaciones, así como soporta otros servidores web, además de apache, que corren PHP como módulo nativo. 2.1.4. PHP en el servidor Visión genérica de la correcta instalación y posterior configuración de la herramienta PHP en nuestro servidor APACHE: Rubén Devesa Insa (Ingeniería Informática 04-05) 10 Desarrollo de una INTRANET corporativa (Sept’05) 2.2. MySQL Database 2.2.1. Introducción A grandes rasgos, podemos decir que MySQL es el gestor de bases de datos SQL más popular que existe en la actualidad, además de su atractivo a la hora de obtenerlo, no suponiendo ningún tipo de coste pues es totalmente gratuito, formando parte del mundo Open Source. MySQL es un servidor de Base de Datos multiusuario y es cliente/servidor que consta de un daemon en el servidor llamado mysqld y muchos programas clientes y diferentes bibliotecas. Las metas principales de MySQL son rapidez, robustez y facilidad de uso. Se desarrolló desde 1979, originalmente porque TcX requería un servidor SQL que debía manejar base de datos muy grandes en un orden de magnitud más rápido que cualquier vendedor de base de datos podría ofrecernos. TcX esta usando MySQL 1.0 desde 1996 en un ambiente con más de 40 bases de datos que contienen 10.000 tablas, de los cuales más de 500 tienen más de 7 millones de registros. Esto es aproximadamente 100 gigabytes de datos. Rubén Devesa Insa (Ingeniería Informática 04-05) 11 Desarrollo de una INTRANET corporativa (Sept’05) La base en el cual se construye MySQL es un conjunto de rutinas que se han usado en un ambiente de producción muy exigente por muchos años. Aunque MySQL sigue en proceso de desarrollo, ya ofrece un conjunto de funciones muy rica y muy útil. Inicialmente Sistemas Operativos Lenguajes (API’s) Actualidad Unix y Solaris UNÍX, Linux, OS2, Solaris, SunOS, HP-UX, SCO OpenServer,Win95, Win98, win2000 y WNT, XP, 2003, entre otros. C y PERL C, C++,CommonLisp, Delphi, Eiffel, Java, PHP, Python, ODBC, Perl y otros. 2.2.2. ¿POR QUE MySQL? MySQL es muy rápido, confiable, robusto y fácil de usar tanto para volúmenes de datos grandes como pequeños (siempre, claro está, comparada con las de su categoría, como veremos mas adelante). Además tiene un conjunto muy practico de características desarrolladas en cooperación muy cercana con los usuarios. Sin embargo bajo constante desarrollo, MySQL hoy en día ofrece un rico y muy útil conjunto de funciones. La conectividad, velocidad y seguridad hace de MySQL altamente conveniente para acceder a bases de datos en Internet. 2.2.3. Características Como gestor de bases de datos relacionales, MySQL ofrece infinidad de ventajas, caracterizándose por muchas de ellas. Estas son algunas de sus características: • Totalmente multi-threaded, esto significa que puede usar multiples CPU.s sin poblemas. • Presenta multilples APIs como ser C, C++, Java, Perl, Delphi, ODBC y otros. Rubén Devesa Insa (Ingeniería Informática 04-05) 12 Desarrollo de una INTRANET corporativa (Sept’05) • Trabaja con diferentes plataformas como Linux, OS/2, Solaris, SunOS, Windows 95/98, Windows NT entre otros. • Tiene muchos tipos de columnas: enteros de 1,2,3,4 y 8 bytes de tamaño, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME,TIMESTAMP, YEAR, SET Y ENUM. • Las funciones SQL son implementados a través de librerías altamente optimizadas. • Soporta distintas funciones en las sentencias WHERE y SELECT. • Puede mezclar tablas de diferentes bases de datos en la misma consulta. • Los sistemas de Password y privilegios son bastante flexibles y seguros, los cuales permiten verificación de host. • MySQL tiene su driver ODBC (Open-DataBase-Connectivity) para trabajar sobre Windows95 o Windows NT. De esa manera una aplicación como Delphi, C++ Builder, Excel, FoxPro, Paradox, Pawerbuilder, Visual C++, Access, Visual Basic puede conectarse a MySql. • Son permitidos16 índices por tabla. Cada índice puede tener de 1 a 15 columnas. El tamaño máximo de un índice es de 256 bytes. • Maneja grandes bases de datos. TcX usa MySQL con base de datos que contienen 50.000.000 registros. • Todas las columnas tienen valores por defecto. • Tiene un sistema de asignación de memoria muy rápido, basado en Thread. • Incluye myisamchk, un utilitario muy rápido para verificar, optimizar y reparar las tablas de una base de datos. • Se puede usar alias sobre tablas y columnas. • DELETE, INSERT, REPLACE y UPDATE retornan el numero de filas que han sido afectadas. • Los nombres de funciones no tienen conflicto con nombres de columnas y tablas. • Por ejemplo, ABS es una nombre de columna válida. La única restricción es que para llamar a una función, no esta permitido dejar ningún espacio entre el nombre de la función y el .(. que sigue. • Todos los programas de MySQL se pueden invocar con las opciones --help or -? para obtener ayuda online. • Los clientes se conectan al servidor MySQL por conexiones TCP/ IP o Unix sockets, o named pipes bajo NT. Rubén Devesa Insa (Ingeniería Informática 04-05) 13 Desarrollo de una INTRANET corporativa (Sept’05) • El comando SHOW puede ser usado para obtener informacion de base de datos, tablas e indices. El comando EXPLAIN puede ser usado para determinar como optimizar las consultas. • El código de MySQL es poco redundante. • Los algoritmos usan bastante cache, si existe disponibilidad de memoria. • MySQL ha realizado muchas optimizaciones para maximizar la velocidad: o Muchos joins son hechos en una sola barrida. o Muy pocos joins requieren tablas temporales. o Usa algoritmos de búsquedas binarias. o Usa librerías altamente optimizadas. 2.2.4. Arquitectura Descripción de la arquitectura seguida por MySQL: 2.2.5. Funcionamiento Una vez realizada la instalación de este gestor de bases de datos de forma correcta, podremos comprobar su funcionamiento a través de su interfaz similar a la mostrada en la siguiente imagen: Rubén Devesa Insa (Ingeniería Informática 04-05) 14 Desarrollo de una INTRANET corporativa (Sept’05) 2.3. APACHE WEB SERVER v1.3 2.3.1. Introducción El servidor web Apache es uno de los mayores triunfos del software libre. En Diciembre de 1997 tenía una cuota de mercado cercana al 45% y en Julio del 2000 ya estaba por encima del 60%, según los estudios de Netcraft que ya se han establecido como la referencia dentro del mercado de servidores web. Esta es la primera cifra que hace que cualquier responsable de la estrategia Internet de una empresa tenga que tomar a Apache como el servidor de referencia. Apache era inicialmente unos parches al servidor que de WWW de NCSA conocido como httpd (principios de 1995). Al igual que GNU/Linux, fue un proyecto que atrajo a mucha gente por el gran interés de su objetivo: lograr el servidor web más rápido, más eficiente y con mayor funcionalidad desde el enfoque del software libre. Y ha sido un objetivo que se ha logrado con creces. Sólo hacían sobras en Apache ciertos aspectos de rendimiento, fundamentalmente por no utilizar hebras de ejecución. Este aspecto se va a solucionar en el próximo Apache 2.0, un nuevo paso de Apache. Rubén Devesa Insa (Ingeniería Informática 04-05) 15 Desarrollo de una INTRANET corporativa (Sept’05) Con un enorme equipo de voluntarios a lo largo y ancho de toda la red, se han logrado estos objetivos, logrando batir a compañías comerciales de la talla de Microsoft y Netscape. Y no sólo se ha logrado batir a los servidores web de grandes compañías: se ha logrado atraer al todopoderoso IBM que está apoyando Apache tanto a nivel de soporte como de desarrollo. La incorporación de empresas al desarrollo de proyectos de software abierto es una característica que ha brotado en el año 2000. Otros ejemplos son Corel, Dell etc. 2.3.2. Características Apache es un servidor web flexible, rápido y eficiente, continuamente actualizado y adaptado a los nuevos protocolos http. Entre sus características destacan: • Multiplataforma • Es un servidor de web conforme al protocolo HTTP/1.1 • Modular: Puede ser adaptado a diferentes entornos y necesidades, con los diferentes módulos de apoyo • que proporciona, y con la API de programación de módulos, para el desarrollo de módulos específicos. • Basado en hebras en la versión 2.0 • Incentiva la realimentación de los usuarios, obteniendo nuevas ideas, informes de fallos y parches para la solución de los mismos. • Se desarrolla de forma abierta • Extensible: gracias a ser modular se han desarrollado diversas extensiones entre las que destaca PHP, un lenguaje de programación del lado del servidor. 2.3.3. Protocolo http El protocolo HTTP es el que da vida a Internet, y gracias al cual, los clientes y servidores se pueden comunicar. Se puede pensar que esta es la parte más compleja del Web. Pues bien, este protocolo se diseñó con la sencillez en mente, por lo que es de lo más trivial. El funcionamiento básico es que el cliente estable una conexión TCP con el servidor, hace una petición, el servidor le responde y se cierra la conexión. Rubén Devesa Insa (Ingeniería Informática 04-05) 16 Desarrollo de una INTRANET corporativa (Sept’05) Para hacernos una idea de su sencillez, en la primera versión ampliamente utilizada del protocolo (1.0), el cliente solo podía invocar tres operaciones en el servidor: • GET para pedir una página, • HEAD para pedir la cabecera de una página • POST para enviar datos a una URL. Un forma más precisa del funcionamiento de este protocolo: A. El cliente envía una petición al servidor. Dicha petición está compuesta por un método a invocar en el servidor (URI) y una versión del protocolo, seguida por un mensaje compatible con MIME con los parámetros de la petición, información del cliente, y un cuerpo opcional con más datos para el servidor. Un ejemplo sería: GET /index.html HTTP/1.0 Accept: text/plain Accept: text/html Accept: */* User-Agent: Un Agente de Usuario Cualquiera B. El servidor responde con una línea de estado, incluyendo la versión del protocolo del mensaje y si la petición tuvo éxito o fracaso, con un código de resultado, seguido de un mensaje compatible con MIME con información del servidor, metainformación (datos a cerca de la información) de la entidad solicitada y un cuerpo opcional con la entidad solicitada. Un ejemplo sería: Rubén Devesa Insa (Ingeniería Informática 04-05) 17 Desarrollo de una INTRANET corporativa (Sept’05) HTTP/1.0 200 OK Server: MDMA/0.1 MIME-version: 1.0 Content-type: text/html Last-Modified: Thu Jul 7 00:25:33 2004 Content-Length: 2004 <title> Página web del IEEE </title> <hr> .................................................... </hr> <h2> Proyectos desarrollados en Internet </h2> ..................................................... Pero como todo en el Web, este protocolo ya es mucho más potente que en su versión original. Los propios creadores del HTTP lo describen como: "un protocolo de nivel de aplicación orientado a sistemas distribuidos, para la colaboración e hypermedia. Un protocolo genérico, sin estado, orientado a objetos y que puede ser utilizado para muchas aplicaciones, como servidores de nombres y sistemas de gestión de objetos distribuidos, a través de las extensiones de los métodos de petición. Una característica de este protocolo es la negociación de los tipos y representación de los datos, permitiendo que los sistemas no dependan del tipo de datos que se utilicen". Las últimas versiones de HTTP vienen recogidas dentro de la RFC 2068, y además ofrece una serie de características: • Conexiones persistentes: ya no se cierra la conexión tras el envío de cada parte de un documento, evitando la sobrecarga del establecimiento de conexiones TCP. • Varias peticiones simultáneas: un cliente puede realizar varias peticiones utilizando una única conexión, sin esperar a la respuesta del servidor para cada una de ellas. • Negociación del contenido: se asignan diferentes valores a las características de la comunicación, entre ellos cuanto se puede degradar la calidad de la conexión, • Nuevos métodos: junto a GET, POST y HEAD aparecen los métodos DELETE para borrar un recurso del servidor asociado al URI de borrado, TRACE para ver que está recibiendo el servidor de lo que él envía, PUT para enviar datos a un recurso asociado a una URI, PATCH para aplicar correcciones en un recurso asociado a Rubén Devesa Insa (Ingeniería Informática 04-05) 18 Desarrollo de una INTRANET corporativa (Sept’05) una URI, COPY para copiar unos recursos identificados por una URI en otro lugar determinada URI en uno destino determinado, MOVE para mover el recurso identificado por la URI a otro lugar, DELETE para borrar un recurso asociado a una URI, LINK para establecer enlaces entre diferentes recursos, UNLINK para quitar enlaces establecidos previamente por LINK, OPTIONS para que el cliente pueda obtener del servidor sus características, WRAPPED que permite unir varias peticiones y recubrirlas con algún tipo de filtrado (encriptación por ejemplo). • Nuevo método de autenticación: en la RFC 2069 se describe un nuevo método de autenticación, en el cual las claves de acceso van encriptadas por la red. 2.3.4. Obtener el servidor Como es habitual en el mundo del software libre, el servidor de web Apache lo podemos obtener de su lugar original, o bien de espejos a lo largo y ancho de todo el mundo, entre ellos varios en España. El fichero que nos deberemos bajar es "apache_1.3b3.tar.gz" en el que se incluyen las fuentes del servidor. Con ello obtendremos una estructura de directorios como la que sigue: • /apache_1.3b3/cgi-bin: cgi-bin de utilidad genérica • /conf: ficheros de configuración de apache • /docs: documentación y FAQ de apache 1.3 • /htdocs: páginas html del servidor • /icons: iconos que utiliza el servidor • /src: fuentes de apache En el directorio principal "apache_1.3b3" encontramos ya un "Makefile" que se puede ejecutar directamente con el make en este directorio, y el servidor web es construido sin ningún problema. Rubén Devesa Insa (Ingeniería Informática 04-05) 19 Desarrollo de una INTRANET corporativa (Sept’05) 2.3.5. Configuración Los ficheros de configuración de Apache se buscan por defecto dentro del directorio “/usr/local/apache/conf" aunque esto es algo configurable. Allí deben de estar presentes los ficheros: • httpd.conf: fichero principal de configuración de Apache. • srm.conf: fichero de definición del espacio de nombres que los usuarios ven del servidor de web. En este fichero también se especifica donde se encuentran los cgi-bin, los iconos, el tipo de documento por defecto, como se responde ante los errores, que fichero es el índice dentro de un directorio, donde está la página personal de los usuarios del sistema. • access.conf: fichero de control de acceso global a los datos del servidor de web. En el se especifica los permisos de accesos a directorios, ficheros y URLs dentro del servidor, así como diferentes configuraciones. • mime.types: fichero de control de los tipos MIME que son enviados al cliente en función de la extensión del fichero. Rubén Devesa Insa (Ingeniería Informática 04-05) 20 Desarrollo de una INTRANET corporativa (Sept’05) El fichero principal es httpd.conf, por lo que a continuación se describe de forma genérica sus parámetros principales. Httpd.conf Es el fichero de configuración principal de Apache. Se muestran a continuación las principales opciones de dicho fichero, que el usuario debe editar para adaptarlas a su situación concreta Standalone o inetd El servidor de web puede ser ServerType: arrancado, bien como un demonio individual, o bien como un demonio más dentro del conjunto de demonios que arranca inetd. Dadas las características de un servidor de web, que suele recibir peticiones de forma constante, es mejor arrancarlo de forma independiente, y no desde el inetd. Port 80: HostnameLookups on-off: Puerto desde el que escucha el servidor de web. Un usuario del sistema, sin derechos de superusuario, solo puede utilizar puertos por encima del 1024. Dentro de los logs del servidor, se intenta traducir la dirección IP del cliente que ha hecho la petición a un nombre utilizando DNS o no. El intento de traducción lleva asociada unas comunicaciones que pueden reducir el rendimiento del servidor User www-data Group #-1: Identidad del usuario bajo el que se ejecuta el servidor. Si es diferente de la del usuario que lanza el demonio, el usuario que lanza el demonio debe de ser root. ServerAdmin Dirección de correo del usuario responsable de la acs@ieeesb.etsit.upm.es: administración del servidor de web, y al que se enviaran mensajes en caso de errores. Timeout 300: El número de segundos tras el cual se envía o se recibe el fin de plazo de una petición. Para permitir la existencia de conexiones persistentes KeepAlive On: (HTTP 1.1), es decir, de que por una misma conexión se puedan enviar varias peticiones HTTP. Número máximo de peticiones que se pueden cursar MaxKeepAliveRequests 100 por una misma conexión. En caso de poner 0, el número será ilimitado. Cuantas más peticiones se puedan cursar por una misma conexión, mejor será el rendimiento de la comunicación, al evitar establecer nuevas conexiones TCP, que son muy costosas. Rubén Devesa Insa (Ingeniería Informática 04-05) 21 Desarrollo de una INTRANET corporativa (Sept’05) MaxKeepAliveRequests 100 Número de segundos máximos en los que se esperará la siguiente petición. Número máximo de clientes que pueden conectarse al MaxClients 150: servidor de web. Debe ser un número relativamente alto, ya que una vez superado, ningún cliente más podrá acceder a la información. Es una método de protección, que evita que el sistema pueda quedar totalmente bloqueado. StartServers 5: ... Número de servidores que se lanzan inicialmente. ... 2.3.6. Documentación Sin lugar a dudas es la documentación de Apache lo que más ha ganado en las últimas versiones de Apache. Se incluye junto con el fichero de la distribución, y tras la instalación, está dentro del directorio: /usr/local/apache/docs. 2.3.7. Proyectos asociados Hay muchos proyectos asociados a Apache cuyo objetivo es aumentar su funcionalidad. Es necesario destacar dos de ellos: uno muy útil para los desarrolladores, conocido como PHP (anteriormente descrito), y otro orientado a la privacidad de las comunicaciones, Apache-SSL. PHP En la programación de aplicaciones en Internet, es importante las herramientas de programación que se utilizan tanto en el lado del cliente, como del servidor. El lector puede haber utilizado lenguajes como Javascript, JScript, o VBScript del lado del cliente, para aumentar la funcionalidad de las páginas HTML. De forma similar, hay lenguajes de programación del lado del servidor, que se introducen dentro de las páginas HTML. En el servidor de web Apache, un lenguaje de programación que se puede embeber en las páginas HTML se conoce como PHP. Es un lenguaje similar a Perl, y muy sencillo de utilizar. Es un lenguaje en constante desarrollo, y cuya principal característica es que proporciona una librería de funciones que permite acceder a las principales bases de datos del mercado (Adabas, Ilustra de Informix, Oracle, MySQL, PostgresSQL entre muchas otras), lo que facilita mucho la integración del web con el mundo de las bases de datos. PHP en la actualidad ha alcanzado la versión 4.0, y en cada nueva versión se aumenta su funcionalidad. Es un lenguaje muy potente en la programación del lado del servidor, y que sustituye de forma elegante a la programación de cgi-bin. Rubén Devesa Insa (Ingeniería Informática 04-05) 22 Desarrollo de una INTRANET corporativa (Sept’05) Apache-SSL El comercio electrónico es el campo que va a arrastrar a Internet con más fuerza, y es uno de los sectores con mayores perspectivas de futuro. En la actualidad, el único freno al comercio electrónico en Internet es la seguridad, o la falta de ella. Debido al gran interés que hay, se están desarrollando rápidamente estándares que aseguran la seguridad en Internet, en especial, dentro del web. Apache-SSL pero con nuevas características de seguridad, como son la encriptación y la autenticación. Lo que más puede sorprender, es que dichos parches son también de libre distribución, utilizándose una librería de encriptación (RSA, DES, MD5 ?) libre distribución. El mundo de la encriptación está lleno de connotaciones militares, y depende mucho del país en el que estemos, de las utilidades de encriptación que podamos utilizar. En España no hay ningún problema en utilizar por ejemplo, la encriptación RSA de 128 bits, pero en el caso de utilizar dicha encriptación en comunicaciones internacionales, las cosas se complican mucho. 2.4. PHPMyAdmin 2.4.1. Introducción PhpMyAdmin es un programa de libre distribución en PHP, creado por una comunidad sin ánimo de lucro, que sólo trabaja en el proyecto por el afán de superación. Es una herramienta muy completa que permite acceder a todas las funciones típicas de la base de datos MySQL a través de una interfaz web muy intuitiva. La aplicación está formada por un conjunto de archivos escritos en PHP que podemos copiar en un directorio de nuestro servidor web, de modo que, cuando accedemos a esos archivos, nos muestran unas páginas donde podemos encontrar las bases de datos a las que tenemos acceso en nuestro servidor de bases de datos y todas sus tablas. La herramienta nos permite crear tablas, insertar datos en las tablas existentes, navegar por los registros de las tablas, editarlos y borrarlos, borrar tablas y un largo etcétera, incluso ejecutar sentencias SQL y hacer un backup de la base de datos. 2.4.2. Funcionamiento Imagen inicial que podemos ver una vez que accedamos a la aplicación desde nuestro navegador: Rubén Devesa Insa (Ingeniería Informática 04-05) 23 Desarrollo de una INTRANET corporativa (Sept’05) Rubén Devesa Insa (Ingeniería Informática 04-05) 24 Desarrollo de una INTRANET corporativa (Sept’05) 3. Análisis 3.1. Descripción del problema Hoy por hoy, Internet está en todos lados: los anuncios publicitarios y programas televisivos tienen sus propias direcciones en el World Wide Web, (el más popular de los servicios de Internet), no obstante lo cual se encuentra sólo en el 20% de los servidores de Internet. Y toda esta atención hace aparecer a Internet como el tema de computación por excelencia que se maneja en estos días. Pero sin embargo, si bien el tema Internet sigue siendo apasionante, es la Intranet, la Internet Interna, la que se postula como la gran revolución tecnológica de la información para lo que resta del siglo. La Intranet es una red interna de grandes corporaciones que se sirve de Internet y de sus recursos y herramientas para comunicarse. La Intranet es una red que permite, por ejemplo, a una empresa comunicar los supuestos de trabajo entre diferentes sucursales utilizando los recursos poderosos de una misma red: Internet. Estos puestos de trabajo en realidad están conectados a una única red, pero con características muy especiales. Es la potencia de Internet, pero usándola dentro de una empresa. Son redes que funcionan dentro de las corporaciones y a su vez tienen una puerta hacia Internet de manera tal que nadie –a no ser que tenga la correcta contraseña y esté habilitado- pueda entrar a esas Intranets. 3.2. Investigación del problema La Intranet impacta en las operaciones de la corporación, su eficiencia, su desarrollo y fundamentalmente nivela su cultura. Imaginemos este escenario: una compañía tiene20 sucursales dispersas por el mundo y 1000 personas que necesitan acceder en tiempo y forma a noticias de la compañía: cambios políticos corporativos, los procedimientos de recursos humanos y aunque parezca simple, pero crucial, documentos tales como guías de teléfonos, especificaciones de productos y valiosa información de marketing. Rubén Devesa Insa (Ingeniería Informática 04-05) 25 Desarrollo de una INTRANET corporativa (Sept’05) Normalmente se usa material impreso, tales como manuales de procedimientos, listas de precios, orientaciones de ventas, etc. este material impreso es caro y su producción consume mucho tiempo. Una vez creado, debe responderse estas preguntas referidas a su distribución y difusión. ¿Cómo puede se garantizar que toda la gente ha recibido exactamente lo que ellos necesitan? ¿Seguro que ellos tienen las últimas versiones y que son las correctas? ¿Seguro que ellos saben todos por igual los detalles de estrategia comercial de la empresa o de que existe una información que ha cambiado y recién ahora está disponible? El problema que, debido a la naturaleza cambiante de cualquier organización en el negocio frenético de hoy a nivel mundial, la vida útil de cualquier material impreso interno se reduce tan rápidamente que, en muchos casos, el personal que lo necesita, dispone de él cuando ya no tiene validez. Muchas horas corporativas se pierden simplemente confirmando y averiguando la validez de información. Hay que tomar en cuenta además del costo directo de preparación, el de composición gráfica, producción, distribución y envío. Añadir costes laborales y el hecho que en cualquier momento la mayoría de los documentos pueden requerir una o varias reimpresiones. En el negocio competitivo de hoy, el acceso oportuno a la información precisa nunca ha sido tan crucial como lo es ahora. El ejemplo visto supune la existencia de 20 sucursales y 1000 empleados, pero la realidad es que este problema es igualmente importante teniendo sólo 2 sucursales y 20 personas. 3.3. Solución al problema El problema descrito no es nuevo y ha habido diversos intentos de resolverlo explotando las tecnologías de computadoras ya implementadas, con grados diferentes de éxito y por lo general insatisfactorias. Por ejemplo, el correo electrónico (e-mail) atiborra innecesariamente los buzones de empleados, o la carga de las aplicaciones clientes servidor a las que se les acaba por responsabilizar con el mantenimiento y actualización de la información. La solución al problema requiere de tecnología que –para poder entregar la información a demanda cómo y cuándo se necesita- pueda garantizar que la Rubén Devesa Insa (Ingeniería Informática 04-05) 26 Desarrollo de una INTRANET corporativa (Sept’05) información sea la última y la más precisa disponible. La solución a este problema la provee una de las tecnologías disponibles de Internet. Y así es como el nacimiento de Intranet ha llegado a ser una realidad a partir de 1995: la Intranet Corporativa. En muchas empresas de gran porte, las Intranets han crecido. Según investigaciones realizadas, a finales del 2000 ya existían más de 15000 Intranets. Se estima que hoy, tres cuartos de los servidores Web atienden el uso corporativo interno; se cree que entre el 70 u 80 por ciento de los servidores Web se utilizarán par atender las necesidades de las Intranets Corporativas. 3.4. Documentación de los requisitos de procesos funcionales 3.4.1. Definición de actores Este apartado contiene los diferentes actores que se han identificado, y que según su condición, interactúan de forma diferente con el sistema. ACT–01 Usuario Descripción Este actor representa a los usuarios que quieren acceder a una sesión determinada. Comentarios ninguno ACT–02 Administrador (Superusuario - Root) Descripción Este actor representa al usuario que se encargará de gestionar los recursos y privilegios ofrecidos al resto de usuarios. Supone un usuario con la totalidad de privilegios. Comentarios Este actor deberá ser el primer usuario que haya que crear en el momento de la instalación de la aplicación en su totalidad. Inicialmente será el que genere toda la información relevante de la base de datos. Rubén Devesa Insa (Ingeniería Informática 04-05) 27 Desarrollo de una INTRANET corporativa (Sept’05) 3.4.2. Diagrama de casos de uso Rubén Devesa Insa (Ingeniería Informática 04-05) 28 Desarrollo de una INTRANET corporativa (Sept’05) 3.4.3. Caso de uso del subsistema gestión usuarios 3.4.4. Caso de uso del subsistema gestión departamentos Rubén Devesa Insa (Ingeniería Informática 04-05) 29 Desarrollo de una INTRANET corporativa (Sept’05) 3.4.5. Descripción textual de los casos de uso A continuación se documenta más detalladamente el comportamiento del sistema desde el punto de vista de usuario determinando sus requisitos funcionales. Caso de uso Inicio Sesión Datos Información de la sesión del nuevo usuario Función Añadir un nuevo usuario a la sesión. Actor Usuario, Administrador Precondición La nueva sesión no consta en la Intranet corporativa. Postcondición La nueva sesión queda incorporada en la Intranet corporativa. Proceso 1. El usuario que intenta acceder a una sesión introduce los datos necesarios para su acceso (login y password). 2. El sistema comprueba que los datos introducidos son correctos. 3. La Intranet corporativa queda actualizada con una nueva sesión. Alternativas de proceso y excepciones 2.a. El usuario intenta acceder con unos datos erróneos. 2.a.1. El sistema avisa que el usuario que intenta acceder no lo puede hacer. Rubén Devesa Insa (Ingeniería Informática 04-05) 30 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Acceso a las opciones de Webmail Datos Información para acceder al Webmail Función Añadir un nuevo usuario al Webmail. Actor Usuario, Administrador Precondición Ninguna. Postcondición La nueva sesión queda incorporada en el Webmail. Proceso Alternativas de proceso y excepciones 1. El usuario accede a las opciones que ofrece el módulo de Webmail. 1.a. El usuario intenta acceder y no lo consigue por causas desconocidas (caída del servidor p.e.). 1.a.1. El sistema avisa que el usuario que intenta acceder no lo puede hacer. Caso de uso Acceso a las opciones de Mensajería Datos Información para acceder a la Mensajería Función Añadir un nuevo usuario a la Mensajería. Actor Usuario, Administrador Precondición Ninguna. Postcondición La nueva sesión queda incorporada en la Mensajería. Proceso Alternativas de proceso y excepciones 1. El usuario accede a las opciones que ofrece el módulo de Mensajería. 1.a. El usuario intenta acceder y no lo consigue por causas desconocidas (caída del servidor p.e.). 1.a.1. El sistema avisa que el usuario que intenta acceder no lo puede hacer. Rubén Devesa Insa (Ingeniería Informática 04-05) 31 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Acceso a las opciones de Archivos Datos Información para acceder a los Archivos Función Añadir un nuevo usuario a los Archivos. Actor Usuario, Administrador Precondición Ninguna. Postcondición La nueva sesión queda incorporada en los Archivos. Proceso Alternativas de proceso y excepciones 1. El usuario accede a las opciones que ofrece el módulo de Archivos. 1.a. El usuario intenta acceder y no lo consigue por causas desconocidas (caída del servidor p.e.). 1.a.1. El sistema avisa que el usuario que intenta acceder no lo puede hacer. Caso de uso Acceso a las opciones de Tareas Datos Información para acceder a las Tareas Función Añadir un nuevo usuario a las Tareas. Actor Usuario, Administrador Precondición Ninguna. Postcondición La nueva sesión queda incorporada en las Tareas. Proceso Alternativas de proceso y excepciones 1. El usuario accede a las opciones que ofrece el módulo de Tareas. 1.a. El usuario intenta acceder y no lo consigue por causas desconocidas (caída del servidor p.e.). 1.a.1. El sistema avisa que el usuario que intenta acceder no lo puede hacer. Rubén Devesa Insa (Ingeniería Informática 04-05) 32 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Acceso a las opciones de Contactos Datos Información para acceder a los Contactos Función Añadir un nuevo usuario a los Contactos. Actor Usuario, Administrador Precondición Ninguna. Postcondición La nueva sesión queda incorporada en los Contactos. Proceso Alternativas de proceso y excepciones 1. El usuario accede a las opciones que ofrece el módulo de Contactos. 1.a. El usuario intenta acceder y no lo consigue por causas desconocidas (caída del servidor p.e.). 1.a.1. El sistema avisa que el usuario que intenta acceder no lo puede hacer. Caso de uso Acceso a las opciones de Foro Datos Información para acceder a los Foros Función Añadir un nuevo usuario a los Foros. Actor Usuario, Administrador Precondición Ninguna. Postcondición La nueva sesión queda incorporada en los Foros. Proceso Alternativas de proceso y excepciones 1. El usuario accede a las opciones que ofrece el módulo de Foros. 1.a. El usuario intenta acceder y no lo consigue por causas desconocidas (caída del servidor p.e.). 1.a.1. El sistema avisa que el usuario que intenta acceder no lo puede hacer. Rubén Devesa Insa (Ingeniería Informática 04-05) 33 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Acceso a las opciones de Anuncios Datos Información para acceder a los Anuncios Función Añadir un nuevo usuario a los Anuncios. Actor Usuario, Administrador Precondición Ninguna. Postcondición La nueva sesión queda incorporada en los Anuncios. Proceso Alternativas de proceso y excepciones 1. El usuario accede a las opciones que ofrece el módulo de Anuncios. 1.a. El usuario intenta acceder y no lo consigue por causas desconocidas (caída del servidor p.e.). 1.a.1. El sistema avisa que el usuario que intenta acceder no lo puede hacer. Caso de uso Autenticación Datos Información necesaria para que se pueda producir el acceso del usuario Función Asegurar la autentificación en el acceso privado del usuario. Actor Administrador Precondición Los datos introducidos por el usuario, deberán haber sido contrastados con los que realmente se almacenan el la base de datos. Postcondición Determinar la autenticidad del nuevo usuario . Proceso 1. Se recibe un inicio de sesión por parte de un usuario con una serie de información privada. 2. Se contrasta con la almacenada en al BD. Alternativas de proceso y excepciones 2.a. No consigue determinar la autenticidad del usuario. 2.a.1. Caso de uso NO Autenticación. Rubén Devesa Insa (Ingeniería Informática 04-05) 34 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso NO Autenticación Datos Información necesaria para que se pueda producir el acceso del usuario Función Asegurar la autentificación en el acceso privado del usuario. Actor Administrador Precondición No se consigue determinar la autenticidad del usuario. Postcondición Abandono del proceso de acceso por parte del usuario desconocido. Proceso Alternativas proceso excepciones 1. El sistema informa al nuevo usuario que no se puede acceder a la sesión. de y Ninguna Caso de uso Gestión Usuarios Datos Información necesaria para gestionar todos los datos referentes a los usuarios. Función Asegurar la perfecta gestión de los usuarios. Actor Administrador Precondición Ninguna Postcondición Ejecución de forma correcta cualquiera de las opciones que ofrece el módulo de gestión de usuarios. Proceso Alternativas proceso excepciones 1. Seleccionar la opción necesaria en cada momento dentro de un conjunto de opciones que ofrece el módulo de usuarios. de y Ninguna Rubén Devesa Insa (Ingeniería Informática 04-05) 35 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Gestión Departamentos Datos Información necesaria para gestionar todos los datos referentes a los Departamentos. Función Asegurar la perfecta gestión de los Departamentos. Actor Administrador Precondición Ninguna Postcondición Ejecución de forma correcta cualquiera de las opciones que ofrece el módulo de gestión de Departamentos. Proceso 1. Seleccionar la opción necesaria en cada momento dentro de un conjunto de opciones que ofrece el módulo de Departamentos. Alternativas proceso excepciones de y Ninguna 3.4.6. Descripción textual del caso de uso del subsistema Gestión de Usuarios. Caso de uso Generar Nuevo Usuario Datos Información necesaria para incorporar un nuevo usuario que pueda acceder a la Intranet corporativa. Función Incorporar la información de un nuevo usuario. Actor Administrador Precondición Ninguna Postcondición La información del nuevo usuario ha sido incorporado. Proceso Alternativas proceso excepciones 1. Se introduce la información necesaria para que el usuario pueda acceder de forma correcta y segura a la Intranet corporativa. de y Ninguna Rubén Devesa Insa (Ingeniería Informática 04-05) 36 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Eliminar Usuario Datos Información necesaria para eliminar un usuario. Función Eliminar la información de un usuario. Actor Administrador Precondición Ninguna Postcondición La información del nuevo usuario ha sido eliminada. Proceso 1. Se elimina la información necesaria con la que el usuario pueda acceder de forma correcta y segura a la Intranet corporativa. Alternativas proceso excepciones de y Ninguna Caso de uso Modificar Usuario Datos Información necesaria para modificar un usuario. Función Modificar la información de un usuario. Actor Administrador Precondición Ninguna Postcondición La información del nuevo usuario ha sido modificada. Proceso 1. Selecciona el usuario que se quiere modificar. 2. Se determina qué tipo de información se quiere modificar del usuario seleccionado. Alternativas proceso excepciones de y Ninguna Rubén Devesa Insa (Ingeniería Informática 04-05) 37 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Consultar/Editar Usuario Datos Información necesaria para consultar un usuario. Función Consultar la información de un usuario. Actor Administrador Precondición Ninguna Postcondición La información del nuevo usuario ha sido consultada. Proceso 1. Selecciona el usuario que se quiere consultar. 2. Se determina qué tipo de información se quiere consultar del usuario seleccionado. Alternativas proceso excepciones de y Ninguna 3.4.7. Descripción textual del caso de uso del subsistema Gestión de Departamentos. Caso de uso Generar Nuevo Departamento Datos Información necesaria para incorporar un nuevo departamento que pueda acceder a la Intranet corporativa. Función Incorporar la información de un nuevo departamento. Actor Administrador Precondición Ninguna Postcondición La información del nuevo departamento ha sido incorporado. Proceso Alternativas proceso excepciones 2. Se introduce la información necesaria para que se pueda acceder al departamento y quede registrado en la Intranet corporativa. de y Ninguna Rubén Devesa Insa (Ingeniería Informática 04-05) 38 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Eliminar Departamento Datos Información necesaria para eliminar un departamento. Función Eliminar la información de un departamento. Actor Administrador Precondición Ninguna Postcondición La información del departamento ha sido eliminada. Proceso Alternativas proceso excepciones 1. Se elimina la información necesaria del departamento seleccionado. de y Ninguna Caso de uso Modificar Departamento Datos Información necesaria para modificar un departamento. Función Modificar la información de un departamento. Actor Administrador Precondición Ninguna Postcondición La información del departamento ha sido modificada. Proceso 1. Selecciona el departamento que se quiere modificar. 2. Se determina qué tipo de información se quiere modificar del departamento seleccionado. Alternativas proceso excepciones de y Ninguna Rubén Devesa Insa (Ingeniería Informática 04-05) 39 Desarrollo de una INTRANET corporativa (Sept’05) Caso de uso Consultar/Editar Departamento Datos Información necesaria para consultar un departamento. Función Consultar la información de un departamento. Actor Administrador Precondición Ninguna Postcondición La información del departamento ha sido consultada. Proceso 1. Selecciona el departamento que se quiere consultar. 2. Se determina qué tipo de información se quiere departamento del usuario seleccionado. Alternativas proceso excepciones de y Ninguna Rubén Devesa Insa (Ingeniería Informática 04-05) 40 Desarrollo de una INTRANET corporativa (Sept’05) 4. Diseño El diseño del sistema con el que dar solución al problema planteado consta de un combinación de clases, cada una de ella con las características necesarias para obtener las funcionalidades requeridas: altas de usuarios, anuncios, contactos, foros, acceso a la base de datos, etc... Por lo tanto, el uso y creación de estas clases lo podemos ver desde el punto de vista de una serie de componentes o módulos que ofrecen las características necesarias para conseguir esta combinación. A través de la herencia se ha obtenido como resultado unos componentes propios que ofrezcan las posibilidades a la solución, mediante operaciones que serán utilizadas o reestablecidas según el propósito a realizar. Inicialmente hay que destacar la división de los módulos en los propios pertenecientes al usuario administrador y los módulos propios del resto de usuarios. 4.1. Modularidad A continuación se describen los módulos que forma parte de la aplicación: Mod_administrador mod_admin_classes Módulo donde se implementa la clase principal con una serie de funciones comunes al resto de clases del administrador. Estas clases heredarán de la principal. mod_admin_departamentos Módulo donde se implementa la clase necesaria y sus respectivos formularios para gestionar todas las operaciones referentes a los departamentos. mod_admin_usuarios mod_admin_img Módulo donde se implementa la clase necesaria y sus respectivos formularios para gestionar todas las operaciones referentes a los usuarios. Módulo Rubén Devesa Insa (Ingeniería Informática 04-05) donde se almacenan todas las 41 Desarrollo de una INTRANET corporativa (Sept’05) imágenes utilizadas dentro del módulo del administrador. mod_admin_mysql Módulo donde se implementa todas las operaciones necesarias para acceder a la base de datos. Mod_usuarios mod_anuncios Módulo donde se implementa la clase necesaria y sus respectivos formularios para gestionar todas las operaciones referentes a los anuncios. Módulo mod_mensajería donde se implementa la clase necesaria y sus respectivos formularios para gestionar todas las operaciones referentes a la mensajería interna. Módulo mod_tareas donde se implementa la clase necesaria y sus respectivos formularios para gestionar todas las operaciones referentes a las tareas de los usuarios. mod_mensajes_foros Módulo donde se implementa la clase necesaria y sus respectivos formularios para gestionar todas las operaciones referentes a las tareas de los foros. Mod_install mod_sqlCreate Módulo donde se implementa las operaciones necesarias para la creación de la base de datos con sus respectivas tablas. mod_sqlInitial Módulo donde se implementa las operaciones necesarias para la inicialización de la base de datos con sus respectivas tablas. mod_sqlReset Módulo donde se implementa las operaciones necesarias para el reseteo de la base de datos con sus respectivas tablas. Rubén Devesa Insa (Ingeniería Informática 04-05) 42 Desarrollo de una INTRANET corporativa (Sept’05) Mod_comun mod_interface Módulo donde se implementa las interfaces utilizadas por el resto de módulos. mod_mysql Módulo donde se implementa las operaciones propias de cada modulo que accedan a la base de datos. mod_estilo Módulo donde se implementa las operaciones necesarias para el reseteo de la base de datos con sus respectivas tablas. mod_config Módulo donde se implementa toda la información de configuración de la intranet. mod_estilo Módulo donde se implementa toda la información de los estilos seguidos por el resto de módulos. mod_sesion Módulo donde se implementa toda la información de la sesión establecida en la intranet. Mod_images Módulo mod_imgComunes mod_miniImg donde se almacenan imágenes comunes utilizadas módulo de los usuarios. todas las dentro del Módulo donde se almacenan todas las imágenes comunes de un tamaño más pequeño que las anteriores y que son utilizadas dentro del módulo de los usuarios. Rubén Devesa Insa (Ingeniería Informática 04-05) 43 Desarrollo de una INTRANET corporativa (Sept’05) 4.2. Diagrama de clases Rubén Devesa Insa (Ingeniería Informática 04-05) 44 Desarrollo de una INTRANET corporativa (Sept’05) 4.3. Seguridad Hoy en día la mayoría de las páginas web utilizan bases de datos para poder desarrollar portales dinámicos y así hacerlos más atractivos a la vez que útiles. Pero esta información que se guarda en la base de datos tiene que tener algún tipo de protección. Es por ello que algunos campos se guardan encriptados en la base de datos, principalmente cuando una página requiere el nombre de usuario y contraseña, esta última se encripta y se guarda en la Base de datos. En lo que se refiere a la seguridad de la aplicación, la idea es proteger la información personal de los usuarios, y para ello, los passwords de éstos se protegen a través de su encriptación con MD5. PHP ofrece la función MD5 (Message Digest 5), que es una función hash irreversible (de un sólo sentido) , es decir, encripta el password tecleado por el usuario y es imposible que partiendo desde la cadena encriptada se vuelva a la contraseña origen. Por esto mismo no hay problema de que alguien pueda acceder al campo encriptado de la base de datos. Como en la base de datos se guarda la contraseña encriptada, cuando un usuario quiere acceder, habrá que realizar una comparación entre el password que introduce encriptado en MD5, y lo que tenemos en la base de datos, (que es la contraseña encriptada en MD5), si coincide se le permite el acceso, si no, se rechaza. Hay que tener en cuenta que esto no es 100% seguro, puesto que la contraseña se encripta en el servidor, entonces al enviar la contraseña desde el cliente al servidor podría ser interceptada. Para hacernos una idea, el algoritmo MD5 convierte el mensaje en un bloque múltiplo de 512 bits, (si hace falta añadirá bits por el final). Luego coge el primer bloque de 512 bits del mensaje y realiza diversas operaciones lógicas con los 128 bits de cuatro vectores iniciales ABCD de 32 bits cada uno. (Dichos vectores tendrán el valor inicial que nosotros queramos). Como resultado obtiene una salida de 128 bits que se convierte en el nuevo conjunto de los 4 vectores ABCD. Se repite el algoritmo hasta procesar el último bloque del mensaje. Al terminar, el algoritmo devuelve los últimos 128 bits de estas operaciones. Rubén Devesa Insa (Ingeniería Informática 04-05) 45 Desarrollo de una INTRANET corporativa (Sept’05) A continuación se muestra la forma que ofrece PHP para proteger el password a través de MD5, que a su vez ha sido el utilizado en esta aplicación: <? $pwd = md5 ( $pwd); ?> Rubén Devesa Insa (Ingeniería Informática 04-05) 46 Desarrollo de una INTRANET corporativa (Sept’05) 5. Desarrollo La aplicación que se ha desarrollado proporciona la posibilidad de establecer un medio de comunicación dentro de una supuesta red interna de servicios de una empresa utilizando las tecnologías derivadas de Internet y accediendo a una base de datos. Genera la posibilidad de disfrutar de una comunicación rápida y fluida entre las diferentes áreas y servicios. 5.1. Implementación Debido al gran tamaño de los ficheros se decide mostrar la implementación de algunos de los más relevantes para el sistema: index.php <?php session_start(); require_once("comun/sesion.php"); require_once("comun/config.php"); require_once("comun/mod_interface/lib_interface.php"); require_once("comun/mod_mysql/lib_mysql.php"); seguridadHeader(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title><?php escribirTitulo();?> Acceso a la Intranet</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" href="comun/estilo.css" type="text/css"> </head> <body> <table width="100%" height="100%"> <tr><td align="center" valign="middle"> <?php if ( $_POST['user']=="" || $_POST['pass']=="" ) { ?> <form method="POST" action="index.php"> <b>LOGIN</b> <br><input type="text" name="user" maxlength="10" size="20"> <br><b>PASSWORD</b> <br><input type="password" name="pass" maxlength="10" size="20"> <p><input type="submit" class="boton" value="Entrar"></p> </form> <?php //$fActual = obtenerFecha("time()"); //echo obtenerFecha("time()"); echo "Fecha actual : " . date('d-m-Y',time()); //echo fecha(); } else { $usuario= $_POST['user']; $password= $_POST['pass']; if ( limpiezaDatos($usuario) && limpiezaDatos($password) ){ $Conexion_ID = 0; $Conexion_ID = mysql_connect($Servidor, $Usuario); if (!$Conexion_ID || !@mysql_select_db($BaseDatos, $Conexion_ID) ) { session_destroy(); //echo "$BaseDatos"; echo "Problemas al conectar a la Base de datos"; echo "<br><a href='index.php'>Volver a intentarlo</a>"; } else { $Consulta_ID= 0; $codpassword= md5($password); Rubén Devesa Insa (Ingeniería Informática 04-05) 47 Desarrollo de una INTRANET corporativa (Sept’05) $sentencia= "SELECT * FROM Usuarios WHERE login='$usuario' AND password='$codpassword'"; $Consulta_ID = @mysql_query($sentencia, $Conexion_ID); if (!$Consulta_ID) { //echo "$BaseDatos<br>$Consulta_ID<br>"; session_destroy(); echo "Problemas al conectar a la Base de datos"; echo "<br><a href='index.php'>Volver a intentarlo</a>"; } else { // No ha encontrado ningún usuario if (mysql_num_rows($Consulta_ID) == 0){ session_destroy(); echo "Usuario o Password incorrectos"; echo "<br><a href='index.php'>Volver a intentarlo</a>"; } else { $row = mysql_fetch_array($Consulta_ID); conectarSesion($row['id'],$row['nombre'],$row['tipo']); echo "¡¡¡ usuario correcto !!!"; echo "<br>bienvenido: ". $row['nombre'] ." - ". $row['tipo']; // Miro los privilegios que tiene el usuario que entra if ( soyUsuario() ) { $quesoy= "usuario"; echo "<br><a href='./mod_usuarios/index.php'>ENTRAR</a>"; }else if ( soyAdministrador() ) { $quesoy= "administrador"; echo "<br><a href='./mod_administrador/index.php'>ENTRAR</a>"; } else { $quesoy= "nadie"; } } } } mysql_close($Conexion_ID); } else { session_destroy(); echo "Texto no permitido en el login o password"; echo "<br><a href='index.php'>Volver a intentarlo</a>"; } } ?> </td></tr> </table> </body> </html> usuarios.class.php <?php require_once("../../comun/sesion.php"); require_once("../../comun/mod_interface/lib_interface.php"); require_once("../mod_admin_classes/base.class.php"); class usuarios extends base Rubén Devesa Insa (Ingeniería Informática 04-05) 48 Desarrollo de una INTRANET corporativa (Sept’05) { function usuarios ($usuario,$id=0) { $this->base('us',$usuario,$id); $this->base_item="Usuarios"; $this->raiz="Usuarios"; $this->colorlayer="#DDDDDD"; } /******************************************************************************** Funcion que muestra todos los usuarios que estan almacenados en la Base de Datos -- p_contenido() -********************************************************************************/ function p_contenido() { //listamos los usuarios. echo '<br><TABLE border="1" width="100%" cellpadding="0" cellspacing="0" align="MIDDLE">'; echo "<TR><TD width='20'></TD> <TD width='20'></TD> <TD width='20'></TD><TD width='20'></TD> <TD width='70'></TD><TD align='right' width='70'></TD> <TD align='center' width='100'></TD><TD></TD></TR>"; $sentencia = "SELECT id,nombre,apellidos,tipo,email,departamento FROM Usuarios ORDER BY departamento"; $qid=$this->bdatos->query($sentencia); $cantidad=$this->bdatos->numrows($qid); for ($i=0;$i<$cantidad;$i++) { $aux=$this->bdatos->fetcharray($qid); $usuario=$aux['nombre']; $email=$aux['email']; $tipo=$aux['tipo']; $idu=$aux['id']; $nombre=$this->nombre($aux['id']); $apellidos=$aux['apellidos']; $departamento=$aux['departamento']; $url_editar ="./editarUsuario.php?user=".$idu; $marcar=$this->marcar_fila('#FAFAFA'); echo "<TR bgcolor='#F9AC39' $marcar>"; echo "<td> <a href='$url_editar'><img src='../../images/imgComunes/editar.gif' border='0' alt='Editar'></a></td>"; echo "<td class='textogris'>$usuario</td>"; echo "<td class='texto'>$nombre</td>"; echo "<td class='texto'>$apellidos</td>"; echo "<td class='texto'>$email</td>"; echo "<td class='texto'>$tipo</td>"; echo "<td class='texto'>$departamento</td>"; echo "</tr>"; } echo "</table>"; escribirPie(); } /*************************************************************************************** Funcion que crea la primera barra de herramientas asociada a los usuarios (crear,borrar) -- p_barra() -***************************************************************************************/ function p_barra() { echo '<table width="100%" border="1" align="center"><tr><td>'; $url_añadir="./formInUsuarios.php"; $url_borrar="./formFindUsuarios.php"; Rubén Devesa Insa (Ingeniería Informática 04-05) 49 Desarrollo de una INTRANET corporativa (Sept’05) echo "<a href='$url_añadir'><img src='../mod_admin_images/usuarios/aUsuario.gif' border='0'></a>"; echo "<a href='$url_borrar'><img src='../mod_admin_images/usuarios/borrarUsuario.gif' border='0'>"; echo '</td></tr></table>'; } function p_direccion() { echo '<br><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr><td><img src="tra.gif" width="1" height="1"></td> </tr></table> &nbsp;&nbsp;&nbsp;&nbsp;'; echo '<class="texto"><strong>Usuarios</strong>'; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr><td><img src="tra.gif" width="1" height="1"></td> </tr> </table>'; } function option_tipo($tipo='e') { if ($tipo=='Administrador') $admin="selected"; if ($tipo=='e') $e="selected"; if ($tipo=='c') $c="selected"; if ($tipo=='p') $p="selected"; $texto="<option value='Administrador' $admin>Administrador</option>"; $texto="<option value='e' $e>Empleado</option>"; $texto.="<option value='c' $c>Cliente</option>"; $texto.="<option value='p' $p>Proveedor</option>"; return $texto; } /* function pertenece_dep($user,$dep) { $comando="select * from usudep where idu=$user and idd=$dep;"; $qid=$this->bdatos->query($comando); $cantidad=$this->bdatos->numrows($qid); if ($cantidad>0) return true; else return false; }*/ function option_dep($user) { $comando="select id,nombre from departamentos order by nombre;"; $qid=$this->bdatos->query($comando); $cantidad=$this->bdatos->numrows($qid); for ($i=0;$i<$cantidad;$i++) { $aux=$this->bdatos->fetcharray($qid); $s=""; if ($this->pertenece_dep($user,$aux['id'])) $s="selected"; $nombre=$aux['nombre']; $idt=$aux['id']; $texto.="<option value='$idt' $s>$nombre</option>"; } return $texto; } } //fin de la clase USUARIO ?> departamentos.class.php <?php require_once("../../comun/sesion.php"); require_once("../../comun/mod_interface/lib_interface.php"); require_once("../mod_admin_classes/base.class.php"); class departamentos extends base Rubén Devesa Insa (Ingeniería Informática 04-05) 50 Desarrollo de una INTRANET corporativa (Sept’05) { function departamentos ($usuario,$id=0) { $this->base('de',$usuario,$id); $this->base_item="Departamentos"; $this->raiz="Departamentos"; $this->colorlayer="#DDDDDD"; } function p_contenido() { //listamos los departamentos. echo '<br><TABLE border="1" width="60%" cellpadding="0" cellspacing="0" align="MIDDLE">'; echo "<TR><TD width='20'></TD> <TD width='20'></TD> <TD width='20'></TD></TR>"; $sentencia = "SELECT id,nombre,fecha FROM Departamentos"; $qid=$this->bdatos->query($sentencia); $cantidad=$this->bdatos->numrows($qid); for ($i=0;$i<$cantidad;$i++) { $aux=$this->bdatos->fetcharray($qid); $usuario=$aux['nombre']; $fecha=$aux['fecha']; $idu=$aux['id']; $url_editar ="./editarDepartamentos.php?user=".$idu; $marcar=$this->marcar_fila('#FAFAFA'); echo "<TR bgcolor='#F9AC39' $marcar>"; echo "<td> <a href='$url_editar'><img src='../../images/imgComunes/editar.gif' border='0' alt='Editar'></a></td>"; echo "<td class='textogris'>$usuario</td>"; echo "<td class='texto'>".date("d/m/Y",$fecha)."</td>"; echo "</tr>"; } echo "</table>"; escribirPie(); } function p_barra() { echo '<table width="100%" border="1"><tr><td>'; $url_añadir="./formInDepartamentos.php"; $url_borrar="./formFindDepartamentos.php"; echo "<a href='$url_añadir'><img src='../mod_admin_images/departamentos/aGrupo.gif' border='0'></a>"; echo "<a href='$url_borrar'><img src='../mod_admin_images/departamentos/borrarGrupo.gif' border='0'>"; echo '</td></tr></table>'; } function p_direccion() { echo '<br><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr><td><img src="tra.gif" width="1" height="1"></td> </tr></table> &nbsp;&nbsp;&nbsp;&nbsp;'; echo '<class="texto"><strong>Departamentos - Grupos</strong>'; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr><td><img src="tra.gif" width="1" height="1"></td> </tr> </table>'; } } //fin de la clase departamentos Rubén Devesa Insa (Ingeniería Informática 04-05) 51 Desarrollo de una INTRANET corporativa (Sept’05) ?> anuncios.class.php <?php require_once("../comun/sesion.php"); require_once("../comun/config.php"); require_once("../comun/mod_mysql/lib_mysql.php"); require_once("../comun/mod_interface/lib_interface.php"); seguridadHeader(); class anuncios { function anuncios ($usuario,$id=0) { $this->base('an',$usuario,$id); $this->base_item="anuncios"; $this->colorlayer="#DDDDDD"; $this->raiz="Anuncios"; } function p_contenido() { //listar recibidos $recibido=$this->listar_recibidos(); if ($recibido!="") { echo $recibido; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td><img src="tra.gif" width="1" height="1"></td> </tr> </table>'; echo "<br>"; } $enviados=$this->listar_enviados(); if ($enviados!="") { echo '<br><font class="texto">&nbsp;&nbsp;Mis anuncios</font>'; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"><tr> <td><img src="tra.gif" width="1" height="1"></td></tr></table>'; echo $enviados; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"><tr> <td><img src="tra.gif" width="1" height="1"></td></tr></table>'; echo "<br>"; } } /******************************************************************************** ********************************* Funcion que crea la página apropiada cogiendo los datos de la Base de Datos -- p_pagina() -********************************************************************************* ********************************/ function p_pagina() { $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $starttime = $mtime; Rubén Devesa Insa (Ingeniería Informática 04-05) 52 Desarrollo de una INTRANET corporativa (Sept’05) echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" href="../../comun/estilo.css" type="text/css"> </head> <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" >'; $this->estilo(); echo '<form name="form_crear_dir" method="post" enctype="multipart/formdata" action="">'; $this->p_error(); if ($this->ocultar_pagina==1) exit; $this->p_barra(); $this->p_layer(); $this->p_direccion(); // Barra con el nombre "usuarios" if (sizeof($this->tipo)==1) echo "<table width='100%' border='0' cellspacing='0' cellpadding='0' ><tr> <td width='1' valign='top' height='100%'><span id='tree'></span></td> <td valign='top'>"; $this->p_contenido(); if (sizeof($this->tipo)==1) echo "</td></tr></table>"; } function ultimos_anuncios() { $sentencia = "SELECT titulo,fecha,propietario,id FROM anuncios WHERE estado=1 ORDER BY fecha desc;"; $Conexion_ID= 0; $Consulta_ID= 0; $Servidor= "localhost"; $Usuario= "root"; $BaseDatos= "proyecto"; $Conexion_ID= MySql_Conectar($Servidor,$Usuario,$BaseDatos); if ( $Conexion_ID == -1 ){ echo "<p>Error: no es posible conectarse a la base de datos"; echo "<br><a href='index.php'>Volver</a>"; } elseif ( $Conexion_ID == -2 ) { echo "<p>Error: no se ha podido acceder a la base de datos"; echo "<br><a href='index.php'>Volver</a>"; } else { $Consulta_ID= MySql_Sql_Sentencia($sentencia,$Conexion_ID); if ( $Consulta_ID == 0 ){ echo "<p>Error al ejecutar la sentencia. Usuario no consultado"; echo "<br><a href='index.php'>Volver</a>"; } else { $cantidad = numregistros($Consulta_ID); while ($row = mysql_fetch_array($Consulta_ID)) { $idUser = $_SESSION['id']; $idi=$row['id']; $enviado_por=$row['propietario']; $asunto=htmlspecialchars($row['titulo']); $fecha=date("d/m/Y",$row['fecha']); $nombre=nombre($enviado_por); $ca++; $texto.="<font class='formtexto'><a href='mod_anuncios/editarAnuncios.php?id=0'>$asunto</a></font> <br><font class='textomini'><a href='mod_anuncios/editarAnuncios.php?id=$idUser'>$nombre $fecha </a></font><br>"; if ($ca>5) break; }//fin del for // 'editarAnuncios.php?id=0 if ($cantidad==0) return "Sin anuncios"; Rubén Devesa Insa (Ingeniería Informática 04-05) 53 Desarrollo de una INTRANET corporativa (Sept’05) return "<a href='editarAnuncios.php?id=0'>".$texto."</a>"; } } MySql_Desconectar($Conexion_ID); escribirPie(); } } ?> mensajeria.class.php <?php //include("base.class.php"); class instantaneo { function instantaneo ($usuario,$id=0) { $this->base('i',$usuario,$id); $this->base_item="instantaneo"; $this->colorlayer="#FFFFBB"; $this->raiz="Instantaneo"; } function p_contenido() { //listar recibidos $recibido=$this->listar_recibidos(); if ($recibido!="") { echo '<br><font class="texto">&nbsp;&nbsp;Recibidos</font>'; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr><td><img src="tra.gif" width="1" height="1"></td></tr></table>'; echo $recibido; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr><td><img src="tra.gif" width="1" height="1"></td></tr></table>'; echo "<br>"; } $enviados=$this->listar_enviados(); if ($enviados!="") { echo '<br><font class="texto">&nbsp;&nbsp;Enviados</font>'; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr><td><img src="tra.gif" width="1" height="1"></td></tr></table>'; echo $enviados; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr><td><img src="tra.gif" width="1" height="1"></td></tr></table>'; echo "<br>"; } } /******************************************************************************* Funcion que crea la página apropiada cogiendo los datos de la Base de Datos -- p_pagina() -********************************************************************************/ Rubén Devesa Insa (Ingeniería Informática 04-05) 54 Desarrollo de una INTRANET corporativa (Sept’05) function p_pagina() { $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $starttime = $mtime; echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" href="../../comun/estilo.css" type="text/css"> </head> <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" >'; //$this->estilo(); echo '<form name="form_crear_dir" method="post" enctype="multipart/formdata" action="">'; //$this->p_error(); if ($this->ocultar_pagina==1) exit; $this->p_barra(); //$this->p_layer(); $this->p_direccion(); // Barra con el nombre "usuarios" if (sizeof($this->tipo)==1) echo "<table width='100%' border='0' cellspacing='0' cellpadding='0' ><tr> <td width='1' valign='top' height='100%'><span id='tree'></span></td> <td valign='top'>"; $this->p_contenido(); if (sizeof($this->tipo)==1) echo "</td></tr></table>"; } function p_barra() { echo '<table width="100%" border="1"><tr><td>'; echo "<a href='formInAnuncio.php?'><img src='../../images/imgComunes/i/amensaje.gif' border='0'></a>"; echo "<a href='formDelAnuncios.php'><img src='../../images/imgComunes/i/borrar.gif' border='0'></a>"; echo '</td></tr></table>'; } function p_direccion() { echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td><img src="tra.gif" width="1" height="1"></td> </tr> </table> &nbsp;&nbsp;&nbsp;&nbsp;'; echo '<a href="instantaneo.php?id=0" class="texto">Mensajes instantaneos</a>'; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td><img src="tra.gif" width="1" height="1"></td> </tr> </table>'; } function listar_recibidos() { $texto=""; $usuario=$this->propietario; $comando="select asunto,idd,fecha,leido,id from instantaneo where propietario=$usuario and idp=$usuario order by fecha desc;"; $qid=$this->bdatos->query($comando); $cantidad=$this->bdatos->numrows($qid); Rubén Devesa Insa (Ingeniería Informática 04-05) 55 Desarrollo de una INTRANET corporativa (Sept’05) $texto.='<TABLE border="0" width="100%" cellpadding="0" cellspacing="0" align="MIDDLE" >'; $texto.="<TR> <TD width='20'></TD> <TD width='20'></TD> <TD width='20'></TD> <TD width='20'></TD> <TD width='20'></TD> <TD></TD> <TD align='right' width='50'></TD> <TD align='center' width='100'></TD> <TD width='125'></TD> </TR>"; for ($i=0;$i<$cantidad;$i++) { $aux=$this->bdatos->fetcharray($qid); $idi=$aux['id']; $enviado_por=$aux['idd']; $asunto=htmlspecialchars($aux['asunto']); $fecha=$this->fecha($aux['fecha']); $leido=$aux['leido']; $marcar=$this->marcar_fila('#FAFAFA'); $texto.="<TR bgcolor='#FAFAFA' $marcar>"; $texto.=$this->botones_item($idi); $texto.="<TD><INPUT TYPE='CHECKBOX' name='item[]' value='$idi'></TD>"; $texto.="<TD><div align='center'><img src='/img/i/icono$leido.gif' width='17' height='14'></div></TD>"; //nombre $url=$this->href_minif("ver",$idi); $texto.="<TD><A href='javascript:void(0)' onclick='$url' class='textogris'>$asunto</A></TD>"; //tamaño $texto.="<TD nowrap align='right'></TD>"; //fecha $texto.="<TD align='right'><font class='texto'>".$fecha."</font></TD>"; //propietario $texto.="<TD align='right'><font class='texto'>".$this>nombre($enviado_por)."</font></TD>"; $texto.='</TR>'; $texto.=""; } $texto.='</table>'; if ($cantidad==0) return ""; return $texto; } } //fin de la clase instantaneo //////////////////////////// //////////////////////////// //////////////////////////// ?> lib_mysql.php <?php /* [ MySql_Conectar Retorna la id de Retorna -1 si no Retorna -2 si no */ ] la conexion si todo ha ido correctamente se ha podido conectar correctamente se puede escoger la base de datos function MySql_Conectar($Servidor,$Usuario,$BaseDatos){ $Conexion_ID = 0; // Conectamos al servidor $Conexion_ID = mysql_connect($Servidor, $Usuario); if (!$Conexion_ID) { return -1; } // seleccionamos la base de datos if (!@mysql_select_db($BaseDatos, $Conexion_ID)) { return -2; } // Si hemos tenido éxito conectando devuelve el identificador de la conexión, sino devuelve 0 return $Conexion_ID; } /* [ MySql_Desconectar ] Retorna true si todo ha ido bien Retorna false si no ha ido bien */ function MySql_Desconectar($Conexion_ID){ Rubén Devesa Insa (Ingeniería Informática 04-05) 56 Desarrollo de una INTRANET corporativa (Sept’05) if ( mysql_close($Conexion_ID) ){ return true; } else { return false; } } /* [ MySql_Sql_Update ] Retorna 0 si se pasa la sentencia vacía o no se ha ejecutado la sentencia correctamente Retorna $Consulta_ID si la sentencia ha sido correcta */ function MySql_Sql_Sentencia($sentencia,$Conexion_ID){ $Consulta_ID= 0; if ($sentencia == "") { return 0; } //ejecutamos la consulta $Consulta_ID = @mysql_query($sentencia,$Conexion_ID); if (!$Consulta_ID) { return 0; } // Si hemos tenido éxito en la consulta devuelve el identificador de la conexión, sino devuelve 0 return $Consulta_ID; } /* [ numcampos ]-- Devuelve el número de campos de la BD */ function numcampos($Consulta_ID) { return mysql_num_fields($Consulta_ID); } /* [ numregistros ]-- Devuelve el número de registros de la BD */ function numregistros($Consulta_ID){ return mysql_num_rows($Consulta_ID); } /* [ nombrecampo ]-- Function utilizada por Listar que muestra el nombre del campo de la Bd */ function nombrecampo($numcampo,$Consulta_ID) { return mysql_field_name($Consulta_ID, $numcampo); } function nombre($idn) { if ($idn==0) return '---'; $comando="SELECT nombre FROM Usuarios WHERE id=$idn"; $qid=@mysql_query($comando); $aux=mysql_fetch_array($qid); return $aux['nombre']; } ?> lib_mysql.php <? function seguridadHeader(){ // Fecha en el pasado header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // siempre modificado header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // HTTP/1.1 header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); // HTTP/1.0 header("Pragma: no-cache"); } function desconectarSesion(){ $_SESSION= array(); session_destroy(); } function limpiezaDatos($datos){ $chungos= "!·%&/()=?¿+[]{}-|@#'\"\\"; $result= true; $i=0; Rubén Devesa Insa (Ingeniería Informática 04-05) 57 Desarrollo de una INTRANET corporativa (Sept’05) while ( $i<strlen($chungos) && $result==true ){ $j= 0; while ( $j<strlen($datos) && $result==true ){ if ( $datos[$j]==$chungos[$i]){ $result= false; } $j++; } $i++; } return $result; } function conectarSesion($idusuario,$usuario,$admin){ $_SESSION['id']= $idusuario; $_SESSION['user']= $usuario; $_SESSION['admin']= $admin; } function soyUsuario(){ if( isset($_SESSION['user']) && $_SESSION['admin']=="usuario" ){ return true; } else { return false; } } function soyAdministrador(){ if( isset($_SESSION['user']) && $_SESSION['admin']=="administrador" ){ return true; } else { return false; } } ?> mensajes_foro.class.php <?php include("base.class.php"); class mensajes_foro extends base { var $id_foro; var $per_raiz; function mensajes_foro ($usuario,$id=0,$idf) { $this->base('f',$usuario,$id); $this->base_item="foro"; $this->colorlayer="#CCCCFF"; $this->id_foro=$idf; $usuario=$this->propietario; $permiso=new permisos($usuario); $this->per_raiz=$permiso->permiso('f',$id); $this->raiz="Foros"; } function p_contenido() { $id=$this->id; $id_foro=$this->id_foro; //iniciamos los permisos $usuario=$this->propietario; $permiso=new permisos($usuario); //comprobar permisos del foro $this->per_raiz=$permiso->permiso('f',$id); //un elemento bloqueado no puede ser editado dentro $lock=$this->existe_item_bloqueado($id_foro); $comando="select id,fecha,titulo,mensaje,propietario from mensajesforo where idp=$id_foro order by fecha;"; $qid=$this->bdatos->query($comando); Rubén Devesa Insa (Ingeniería Informática 04-05) 58 Desarrollo de una INTRANET corporativa (Sept’05) $n_rows=$this->bdatos->numrows($qid); for($i=0;$i<$n_rows;$i++) { $aux=$this->bdatos->fetcharray($qid); $idm=$aux['id']; $fecha=$this->fecha($aux['fecha']); $titulo=htmlspecialchars($aux['titulo']); $mensaje=nl2br(htmlspecialchars($aux['mensaje'])); $propietario_m=$aux['propietario']; $nombre_p=$this->nombre($propietario_m); $url_cambiar=$this->href_minif("cambiar_item",$idm); $url_borrar="?submit=4&item=$idm&id=$id&idf=$id_foro"; echo " <table width='100%' border='0' cellpadding='0' cellspacing='5' bgcolor='#EEF7FE'> <tr> <td width='150' valign='top' bgcolor='#DEF1FF'><font class='texto'>$nombre_p<br>$fecha</font>"; if (($propietario_m==$this->propietario)||($this->propietario==-1)) echo "<br><br><a href='javascript:void(0)' onclick='$url_cambiar' class='texto'><img src='/img/f/cmensaje.gif' align='absmiddle' border='0' width='16' height='16'>Editar </a><br><a href='$url_borrar' class='texto' onClick=\"return confirm('¿Confirma el borrado?')\"> <img src='/img/f/bmensaje.gif' border='0' align='absmiddle' width='16' height='16'>Borrar</a>"; echo "</td> <td valign='top'><table width='100%' border='0' cellspacing='0' cellpadding='0'> <tr> <td bgcolor='#EEF7FE' class='blancotrans'><font class='textonegro'>$titulo</font></td> </tr> <tr> <td valign='top' bgcolor='#EEF7FE' class='texto'>$mensaje</td> </tr> </table></td> </tr> </table>"; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#CCCCCC"> <tr> <td><img src="tra.gif" width="1" height="1"></td> </tr> </table>'; } } function p_direccion() { $id=$this->id; $id_foro=$this->id_foro; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td><img src="tra.gif" width="1" height="1"></td> </tr> </table> &nbsp;&nbsp;&nbsp;&nbsp;'; echo $this->direccion_url($id); echo " :: "; echo "<a href='?id=$id&idf=$id_foro' class='texto'>".$this>nombre_item($id_foro)."</a>"; echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td><img src="tra.gif" width="1" height="1"></td> </tr> </table>'; } function p_pagina() //genera toda la página { echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <script src="/intranet.js"></script> </head> <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">'; Rubén Devesa Insa (Ingeniería Informática 04-05) 59 Desarrollo de una INTRANET corporativa (Sept’05) $this->estilo(); echo '<form name="form_crear_dir" method="post" enctype="multipart/form-data" action="">'; $this->p_error(); $this->p_barra(); $this->p_layer(); $this->p_direccion(); $this->p_contenido(); echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td><img src="tra.gif" width="1" height="1"></td> </tr> </table>'; echo '</form>'; $this->p_iframe(); echo '</body> </html>'; } function direccion_url($dir) { $tipo=$this->tipo; $comando="select idp from directorio$tipo where id=$dir;"; $qid=$this->bdatos->query($comando); $aux=$this->bdatos->fetcharray($qid); if ($aux['idp']!=0) $texto.=$this->direccion_url($aux['idp']); else $texto="<a href='foros.php?id=0' class='texto'>$this->raiz</a>"; $texto.=" :: <a href='foros.php?id=$dir' class='texto'>".$this->nombre_dir($dir)."</a> "; return $texto; } function p_barra() { echo '<table width="100%" height="60" border="0" cellpadding="0" cellspacing="0"> <tr> <td>'; if (($this->per_raiz=='w')&&($this->existe_item_bloqueado($this->id_foro)!=1)) { $url_item=$this->href_minif("crear_item"); echo "<a href='javascript:void(0)' onclick='$url_item' class='texto' ><img src='/img/f/amensaje.gif' border='0'></a>"; } echo '</td> </tr> </table>'; } } //fin de la clase foros ?> Rubén Devesa Insa (Ingeniería Informática 04-05) 60 Desarrollo de una INTRANET corporativa (Sept’05) 5.2. Juegos de pruebas 5.2.1. JP1. Acceso usuario Acceso usuario Usuario correcto Rubén Devesa Insa (Ingeniería Informática 04-05) Usuario incorrecto 61 Desarrollo de una INTRANET corporativa (Sept’05) 5.2.2. JP2.Nuevo usuario Creación de un nuevo usuario por parte del administrador. Correcto Rubén Devesa Insa (Ingeniería Informática 04-05) Incorrecto 62 Desarrollo de una INTRANET corporativa (Sept’05) 5.2.3. JP3.Nuevo anuncio Nuevo anuncio insertado correctamente Lista anuncios actualizada Rubén Devesa Insa (Ingeniería Informática 04-05) 63 Desarrollo de una INTRANET corporativa (Sept’05) 6. Conclusiones La utilización de la tecnología de Internet y, en especial, de la tecnología World Wide Web para crear INTRANETs dentro de una organización está provocando profundos cambios en la cultura corporativa de las empresas y organizaciones. Dichos cambios se plasman en la significativa evolución de los actuales modelos de flujo de la información interna y de trabajo en grupo, en los que están comprometidas todas las tareas funcionales de la organización ya que, en definitiva, todos son potenciales generadores y beneficiarios de la información corporativa. Diseñar, desarrollar e implantar una Intranet Corporativa, requiere un trabajo previo de estrategia en términos de planificación y conceptualización del servicio que se ofrece atender en la organización. En la nueva economía hay sólo una razón: que la Intranet sea un sistema que apoye el desempeño de la gente. Uno de los factores de éxito en la Intranet, es orientarla primero a los procesos medulares del negocio. La arquitectura de contenido requerida para este fin deberá permitir manejar tanto el contenido de naturaleza estructurada como el no estructurado. Lo relativo a los procesos medulares del negocio, su cadena, insumos, subprocesos, productos y resultados, requerimientos de información y de conocimiento; etc. son imprescindibles para el levantamiento de la arquitectura de la Intranet. Es el turno de los usuarios, ¡usuarios a la obra! La participación de los usuarios en una Intranet puede ser de varias maneras no excluyentes: de manera individual, agrupados en comunidades de conocimiento o comunidades prácticas, y como expertos de contenido en las secciones de información de su competencia. Para la construcción de una robusta Intranet, se recomienda armar al menos dos equipos de desarrollo, uno que se encargue del portal horizontal basado en los procesos medulares del negocio y el segundo de los portales verticales basados en los criterios institucionales, servicios al personal, productos y servicios, flujo de documentos y contenido o de bases de conocimiento. Ambos equipos deberán trabajar de manera coordinada, integrada y alineada. Es importante que el portal vertical de contenido deberá convertirse en una base Rubén Devesa Insa (Ingeniería Informática 04-05) 64 Desarrollo de una INTRANET corporativa (Sept’05) de conocimientos para la organización, base fundamental para la implantación de la gerencia del conocimiento. Dependiendo de la naturaleza y carga del contenido, la dotación de software deberá ir de acuerdo a la implantación de la Intranet corporativa. Rubén Devesa Insa (Ingeniería Informática 04-05) 65 Desarrollo de una INTRANET corporativa (Sept’05) 7. Bibliografía Intranet con Win NT 4.0 Ed. Rama, 2000 Técnicas criptográficas de protección de datos. Ed. Rama, 2000. Como construir una Intranet. Ed. Addison –Wesley, 1995 Protocolos de comunicaciones para sistemas abiertos. Ed. Addison – Wesley, 1996. http://barrapunto.com Fundación Apache (http://www.apache.org) http://www.apache-ssl.org http://www.netcraft.co.uk/Survey/ http://www.apacheweek.com/ http://www.develnet.es/apache/ http://www.cs.us.es/archive/apache/ http://ftp.rediris.es/ftp/mirror/apache/ http://slug.ctv.es/mirror/apache_httpd/ http://www.arrakis.es/pub/apache/ http://php.iquest.net http://dev.apache.org/project-plan.html Rubén Devesa Insa (Ingeniería Informática 04-05) 66 Desarrollo de una INTRANET corporativa (Sept’05) 8. ANEXO I 8.1. Instalación 8.1.1. Instalación de Apache Deberemos descargar el Apache en su versión para windows. Para ello podemos acceder por la siguiente URL: http://httpd.apache.org/download.cgi En cualquier caso, podemos encontrar cualquier archivo necesario en la carpeta httpd/binaries/win32 del servidor que usemos para la descarga (pincharíamos en Other files y eso nos conduciría al servidor seleccionado). Lo que es importante destacar es que lo que hay que destacar son los Binarios (Binary) para Windows (Win32), no los códigos fuente. Buscaremos la última versión de este tipo (1.3.x). La última versión estable era la 1.3.33, y el archivo que tenemos que bajar es: apache_1.3.33-win32-x86no_src.exe También puede existir el mismo archivo pero con extensión msi, en este caso podríamos bajarlo si disponemos del Windows Installer, la ventaja es que ocupa menos. Bien, una vez que lo tengamos, ejecutamos el instalador y vamos recorriendo las pantallas hasta que salga una donde nos piden unos datos, en cuyo caso pondremos: Network Domain: 127.0.0.1 Server Name: 127.0.0.1 Administrator's Email Address: nuestro e-mail Run when started manually, only for me. Seleccionamos esta opción. Rubén Devesa Insa (Ingeniería Informática 04-05) 67 Desarrollo de una INTRANET corporativa (Sept’05) La IP 127.0.0.1 es la dirección IP asociada a nuestra máquina, es decir el host local o vulgarmente conocido como Localhost. Es importante decir que a la hora de probar tus scripts en modo local, da igual que pongas 127.0.0.1 o localhost. Finalmente, recordar que el Apache se instala por defecto en la carpeta: C:\Archivos de programa\Apache Group\Apache\ 8.1.2. Instalación de PHP4 Procedemos a descargar el PHP para Windows. El archivo está localizado en la sección Downloads, apartado Windows Binaries, y es el Zip Package (no el installer, aunque éste ocupe menos luego no nos servirá). Para la versión 4.3.10, es: PHP 4.3.10 zip package [7,405Kb]. Según vayan saliendo nuevas versiones podrás irlas encontrando en la citada sección downloads. Una vez descargado todo el ZIP, nos creamos una carpeta en el sitio donde queramos instalar los archivos del servidor (PHP, MySQL...), por ejemplo nos creamos una carpeta en la raíz del disco duro y que quede así: C:\Servidor\ Ahora extraemos los archivos del ZIP de PHP dendro de esa carpeta. En este caso se crea la carpeta C:\Servidor\php-4.3.10-Win32\ pero como no nos gusta su nombre procedemos a renombrarla a C:\Servidor\PHP\ Y ahora hay que coger el php4ts.dll (localizado en C:\Servidor\PHP\php4ts.dll) y copiarlo al directorio System (en Windows 9x) o System32 (NT,2000,XP,2003) de la carpeta del Windows. Si hay otro archivo en System o System32 lo sobreescribimos. Igualmente coger los archivos que Rubén Devesa Insa (Ingeniería Informática 04-05) 68 Desarrollo de una INTRANET corporativa (Sept’05) están en la carpeta C:\Servidor\PHP\dlls\ y copiarlos a la carpeta System o System32 igual que hicimos con el archivo php4ts.dll Configuración del archivo php.ini El siguiente paso es configurar el php.ini. Renombramos o copiamos el archivo C:\Servidor\PHP\php.ini-dist y le ponemos php.ini Ahora lo editamos con el mismo block de notas. Si lo necesitáramos (lee antes la explicación), editamos la línea register_globals = Off y la colocamos el valor: register_globals = On ¿Qué hago con register_globals? ¿ON u OFF? Activar esta directiva nos permite asumir que las variables son globales y pueden llegar por cualquier método (POST, GET, COOKIE, SERVER, etc). Así, por ejemplo, si utilizamos una variable global de sesión o cookie se puede suplantar fácilmente mediante una variable por url, con lo cual nuestro script no es seguro. Un buen programador de PHP tendría la directiva en OFF y usaría los arrays globales ($HTTP_X_VARS) o los superglobales $_POST, $_GET, etc., que están disponibles a partir de la versión 4.1.X de PHP. ¿Y por qué? Pues por esos temas de seguridad en los script y porque debemos acostumbrarnos a no manejar variables globales ya que en un futuro el PHP tendrá la opción en OFF por defecto y no podremos cambiarla. Sin embargo, por temas de compatibilidad con script antiguos o que hagan uso de variables globales, podría interesarnos activar esta característica, pero repito que lo deseable sería tenerla en OFF y hacer uso de los arrays globales o superglobales. A continuación vamos a indicar a PHP dónde se guardan las extensiones. Dentro del php.ini buscamos extension_dir y le ponemos la carpeta que contiene los archivos php_xxx.dll, que por defecto es la carpeta extensions dentro de PHP. IMPORTANTE: durante toda la configuración de directorios, debes utilizar esta barra "/" y no esta "\", además de ponerlo entre comillas. O sea, que debe quedar así: ; Directory in which the loadable extensions (modules) reside. extension_dir = "C:/Servidor/PHP/extensions/" Además podemos activar las extensiones que queramos o necesitemos, para lo cual buscamos Windows Extensions y para cargar las extensiones les quitamos el ; de delante. Por ejemplo, si quisiéramos cargar la extensión gd2.dll (para manejar las funciones PHP relativas a imágenes) deberíamos cambiar ;extension=php_gd2.dll por extension=php_gd2.dll Puedes ver para Rubén Devesa Insa (Ingeniería Informática 04-05) 69 Desarrollo de una INTRANET corporativa (Sept’05) qué sirve cada extensión en el Manual oficial de PHP. Como nota adicional, resaltar que hay algunas extensiones que requieren de librerías extra que no vienen en el paquete completo de PHP, y para hacerlas funcionar tendremos que buscar dichas librerías. No actives todas las librerías a diestro y siniestro porque luego saldrán errores de que no se encuentra tal archivo; antes de instalar una librería, comprueba que en la carpeta de PHP tienes los archivos DLL correspondientes. Ahora, si vamos a hacer pruebas con upload de archivos via HTTP, debemos indicar el directorio donde los archivos se almacenarán temporalmente. Para ello buscamos upload_tmp_dir y le damos el valor de una carpeta que exista. Por ejemplo, en nuestro directorio C:\Servidor\PHP\ creamos una carpeta uploads, por lo que quedará algo así: ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). upload_tmp_dir = "C:/Servidor/PHP/uploads/" Si queremos cambiar el tamaño máximo de los archivo que pueden subirse via HTTP, buscamos upload_max_filesize y cambiamos el valor por defecto que trae, 2M (2 MB), por el que queramos. No se recomienda poner un valor alto. ; Maximum allowed size for uploaded files. upload_max_filesize = 2M Para trabajar con sesiones, debemos especificar un directorio donde se guarden los archivos temporales. Al igual que 2 pasos antes, buscamos session.save_path y le damos el valor de un directorio que exista (o lo creamos): session.save_path = "C:/Servidor/PHP/sessions/" A continuación copiamos el php.ini a la carpeta C:\Windows\ o C:\WinNT\ según nuestra versión de Windows. ¡Ahora vamos a decirle al Apache que tenemos el PHP! 8.1.3. Configuración httpd.conf para Apache 1.3.X Buscamos Dynamic Shared Object (DSO) Support que es donde se cargan los módulos. Ahí vamos a cargar el módulo de PHP para Apache, dando la dirección del archivo php4apache.dll (PHP4): Rubén Devesa Insa (Ingeniería Informática 04-05) 70 Desarrollo de una INTRANET corporativa (Sept’05) #Example: #LoadModule foo_module modules/mod_foo.so # Y ahora añadimos justo debajo: LoadModule php4_module C:/Servidor/PHP/sapi/php4apache.dll De tal manera que para PHP4 tiene que quedar así: # Example: # LoadModule foo_module modules/mod_foo.so # LoadModule php4_module C:/Servidor/PHP/sapi/php4apache.dll Ahora bajamos un poco por el httpd.conf y llamamos al módulo mod_php4.c: ClearModuleList AddModule mod_php4.c #AddModule mod_vhost_alias.c Vale, ahora buscamos en el httpd.conf el modulo mod_dir.c y nos sale esto: <IfModule mod_dir.c> DirectoryIndex index.html </IfModule> Modificamos la línea central para que si entramos en un directorio tipo http://127.0.0.1/directorio/ nos autoejecute el index predeterminado (si existe) y no nos salga un mensaje de error. Puedes usar más nombres si lo prefieres. Se ejecutarán por orden: si no encuentra el primero, pasa al segundo; si no está el segundo, pasa al tercero, y así sucesivamente hasta que si no encuentra ninguno entonces da error. En la siguiente línea, si en nuestro directorio tenemos un index.htm y un index.php, por defecto se ejecutará el index.htm ya que está antes. DirectoryIndex index.html index.htm index.php index.php3 index.php4 index.phtml Añadimos: AddType application/x-httpd-php .php .php3 .php4 .phtml AddType application/x-httpd-php-source .phps La primera indica las extensiones que serán interpretadas por el Apache. Por ejemplo podemos añadir la extensión .htm o .html para que el Apache ejecute el código PHP contenido en esas páginas (es decir, el uso de código PHP no está limitado exclusivamente a archivos *.PHP). La segunda sirve para que si Rubén Devesa Insa (Ingeniería Informática 04-05) 71 Desarrollo de una INTRANET corporativa (Sept’05) entras en una página loquesea.phps entonces se muestra el código PHP a color, muy útil si queremos por ejemplo mostrar el código fuente a color en una página. De tal forma que al final todo queda así: <IfModule mod_dir.c> DirectoryIndex index.html index.htm index.php index.php3 index.php4 index.phtml AddType application/x-httpd-php .php .php3 .php4 .phtml AddType application/x-httpd-php-source .phps </IfModule> El directorio predeterminado para guardar nuestras páginas es el htdocs del Apache: C:\Archivos de programa\Apache Group\Apache\htdocs\ Pero podemos cambiarlo fácilmente. Buscamos DocumentRoot y nos sale esto: DocumentRoot "C:/Archivos de programa/Apache Group/Apache/htdocs" Nosotros sustituimos la carpeta htdocs del Apache por la que queramos. Todos los archivos que vayas a probar con el Apache deberán estar localizados en esta carpeta. Por ejemplo nos creamos una carpeta WEB dentro del directorio del servidor: DocumentRoot "C:/Servidor/WEB/" Y ya podemos guardar el archivo httpd.conf 8.1.4. Probando nuestro servidor Apache Ahora vamos a probar el Apache y PHP, para lo cual deberemos arrancar el Apache. Para Apache 1.3.X sólo tenemos que arrancar el apache.exe de la carpeta del Apache para iniciar el servidor, con lo cual nos sale una ventanita de MS-Dos donde nos indicará que está activo (running) o no. Basta cerrar la ventanita de MS-Dos para desactivar el Apache. Si todo ha ido bien, podemos crear un archivo llamado por ejemplo info.php dentro de la carpeta de nuestra web cuyo contenido sea exclusivamente el siguiente: <? phpinfo(); ?> Si accedemos mediante nuestro navegador a la dirección http://127.0.0.1/info.php o http://localhost/info.php (recuerda que 127.0.0.1 = Rubén Devesa Insa (Ingeniería Informática 04-05) 72 Desarrollo de una INTRANET corporativa (Sept’05) localhost) con el Apache activo deberemos visualizar una página de información de PHP. Si no sale, algo ha fallado, revisa los pasos. 8.1.5. Instalación de MySQL Web oficial: http://www.mysql.com/ Existen dos tipos de archivo descargable, en ZIP y en EXE. Yo prefiero el ZIP porque es descomprimir y listo, y luego para actualizar la versión es más sencillo. El instalador EXE lleva un setup muy majo, por defecto se instala en C:\MySQL\ Recomiendo elegir otra ruta de instalación, y por ejemplo lo vamos a hacer en C:\Servidor\MySQL\ para tener el PHP y MySQL en la misma carpeta. Una vez finalizada la instalación, solo hay que llamar al winmysqladmin.exe que estaría en C:\Servidor\MySQL\bin\ y la primera vez que lo ejecutemos nos pide un nombre de usuario y contraseña, que introduciremos sin mayor complicación. Por ejemplo podemos poner el usuario "Pepe" y la contraseña "hola". Ahora al lado del reloj saldrá un semáforo. Si el semáforo se pone en verde, perfecto, si no, algo ha fallado. Rubén Devesa Insa (Ingeniería Informática 04-05) 73 Desarrollo de una INTRANET corporativa (Sept’05) Por defecto, MySQL crea un usuario de nombre root y sin contraseña, y éste es el usuario que usaremos en nuestros script o en las aplicaciones que nos lo pidan (foros, PHP Nuke, etc.). 8.1.6. Instalación de phpMyAdmin Web oficial: http://www.phpmyadmin.net/ PhpMyAdmin es una utilidad que nos sirve para inteactuar con una base de datos de forma muy sencilla y desde una interfaz web. Nos sirve por ejemplo para crear bases de datos, tablas, borrar o modificar dados, añadir registros, hacer copias de seguridad, etc. Es una aplicación tan útil que casi todos los hosting con MySQL disponen de ella, por ello se analizará su instalación. Además, vamos a usarlo para crear los usuarios MySQL para así poder utilizar las bases de datos de forma segura. Al ser una aplicación escrita en PHP, necesita de Apache y MySQL para poder funcionar. Si accedemos a la página oficial, nos encontramos en la sección de downloads con una lista de links, y el que tenemos que elegir es el ZIP de la última versión. En nuestro caso vamos a utilizar la versión 2.6.1 de esta aplicación, que es la versión disponible en la fecha de actualización de este manual. La instalación es relativamente sencilla: extraer todo el ZIP en la carpeta raíz de nuestra web. OJO: en la carpeta de nuestra web, C:\Servidor\WEB\ y no dentro de la carpeta del PHP o similares. Como pone un nombre extraño a la carpeta, mejor la renombramos a phpmyadmin, de forma que quedaria algo así: C:\Servidor\WEB\phpmyadmin\ Rubén Devesa Insa (Ingeniería Informática 04-05) 74 Desarrollo de una INTRANET corporativa (Sept’05) Ahora vamos a hacer una pequeña configuración del phpMyAdmin. Para ello debemos editar el archivo config.inc.php y, leyendo de arriba hacia abajo, buscamos la primera aparición de la siguiente línea: $cfg[' PmaAbsoluteUri' ]=' ' ; Debemos darle la ruta absoluta donde tenemos el phpMyAdmin. En nuestro caso sería así: $cfg[' PmaAbsoluteUri' ]=' http://localhost/phpmyadmin/' ; Recuerda que podemos poner localhost o 127.0.0.1 (a gusto del consumidor). Ahora buscamos si nos aparece algo como esto: $cfg[' blowfish_secret' ]=' ' ; Le pondremos una cadena de caracteres cualquiera, que servirá de semilla para la encriptación de contraseñas al usar la autentificación con cookies: $cfg[' blowfish_secret' ]=' aqui puedes poner lo que quieras' ; Y guardaremos el archivo, pero no lo cerraremos. Puedes probar phpMyAdmin para ver si funciona, ya sabes: http://localhost/phpmyadmin/ 8.1.7. Notas finales Ahora ya puedes empezar a hacer tus pruebas en PHP y MySQL. Hay que recordar que estamos trabajando con programas servidores, con lo cual estos programas tienen que estar activos cuando vayamos a hacer nuestras pruebas. Esto quiere decir que el Apache debe estar conectado (debe estar activado para poder interpretar los script) y que el script debe estar dentro de la carpeta especificada anteriormente en Documentroot, además también MySQL debe estar funcionando para trabajar con bases de datos, y debemos tener tener el servidor de correo funcionando con conexión a internet si vamos a usar funciones de envío de email. Una nota importante es que tanto Apache como MySQL pueden ejecutarse como servicio del sistema. Esto quiere decir que, aunque no veamos ningún icono en la barra de tareas, ambos están funcionando de forma oculta. Esto puede resultar útil si los usamos a menudo, pues nos evitamos el tener que ejecutar Apache y MySQL para hacer las pruebas. Pero si deseas quitarlo, deberemos usar la utilidad msconfig para evitar que arranquen de inicio: Inico - Ejecutar - msconfig y en la pestaña Servicios desmarcaremos el Apache y MySQL. Al reiniciar el ordenador, ya no se ejecutarán como servicio del sistema y tendremos que arrancarlos manualmente. Rubén Devesa Insa (Ingeniería Informática 04-05) 75 Desarrollo de una INTRANET corporativa (Sept’05) Si no usamos estos servidores como servicio, habrá que arrancarlos manualmente. MySQL se arranca ejecutando el winmysqladmin.exe que está en la carpeta bin del directorio de MySQL. El Apache 2.0.X se arranca desde el acceso directo Monitor Apache Servers que se crea en el grupo de iconos en el menú Inicio. Y el Apache 1.3.X se arranca también desde un acceso directo que se crea al archivo apache.exe Para el servidor de correo no tendremos problemas, abrir o cerrar el programa y listo. Resaltar que todas las configuraciones de este proyecto han sido elaborados bajo un sistema Windows XP Professional. Si tenemos un programa cortafuegos instalado en el ordenador, es posible que tengamos que abrir los puertos que se nos soliciten para que funcione el invento. También debemos tener cuidado si tenemos el IIS funcionando, para que no se peguen el Apache y el IIS entre sí. Rubén Devesa Insa (Ingeniería Informática 04-05) 76