Proyecto Final de Carrera (PFC) Ingeniería Informática (04/05)

Anuncio
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 ([email protected]).
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
[email protected]: 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>     ';
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>     ';
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">  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">  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">  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>     ';
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>     ';
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
Descargar