qPassword

Control de acceso por usuario al programa, módulos u opciones.

Hija de
No tiene clase padre.

Variables
cArchivo Nombre del archivo con la información del control de acceso (solo lectura)
cAlias Alias del archivo con la información del control de acceso (solo lectura)
cAutoriza Usuario que autoriza cuando se pide autorización de otra persona (solo lectura)
nOpor Número de intentos que se dan para dar la clave correcta, por defecto son 3
lSiErr Indica si muestra el mensaje de clave incorrecta, por defecto es .t.
aTipAccesos Textos utilizados para la asignación de derechos, puede cambiarse el texto de cada una de las opciones, pero no el derecho correspondiente
bUpdateAdm Codeblock que se evalua para cargar la configuración superadmin si se guarda la configuración del usuario en el mismo archivo de passwords, devido a que superadmin no guarda la información en el archivo, este codeblock es el lugar donde se cargan esos datos, es el equivalente a bUpdateUsr para superadmin
bUpdateUsr Codeblock que se evalua para cargar la configuración del usuario si se guarda en el mismo archivo de passwords, esta información es totalmente independiente al control de derechos, y no es utilizada por qPassword para nada, simplemente da opción al programador para manejar información del usuario en el mismo archivo de control de acceso.
Este codeblock recibe como parámetro el alias del archivo.
bUpdateSin Codeblock que se evalua para cargar la configuración cuando no se tiene acceso si se guarda la configuración del usuario en el mismo archivo de passwords, es el equivalente a bUpdateUsr para cuando el usuario no dio la clave correcta
cUsuario Clave o nombre de usuario utilizado para accesar (solo lectura)
cPassword Password del usuario (solo lectura)
cNombre Nombre del usuraio (solo lectura)
cKey Llave utilizada para la encriptación de la información
cTitulo Título utilizado para la ventana que pide el password, por defecto ""
cTxt Texto que se antepone a la clave de usuario cuando se tiene asinga un objeto para poder mostrarlo, ya sea por el método new() o por el método mustraUsr(), por defecto "Usuario: "
lCambPswd Indica si el usuario debe cambiar el password la siguiente ocación que ingrese al programa (solo lectura)
lBloqueado Indica si el usuario está bloqueado, por lo cual no se le dará acceso aunque de el password correcto (solo lectura)
lDefault Indica si el botón aceptar es DEFAULT, o sea, que se activa al dar enter aunque no tenga el foco, por defecto es .t.
lVerPsw Indica si se muestran los passwords de los usuarios en el browse del módulo de mantenimiento
lSuperAdmin Indica si el usuario es superadmin (super administrador) (solo lectura)
nCampo Número del campo que contiene los derechos que se utilizan para este objeto, por defecto es 2
nTamMinPsw Tamaño mínimo que deberá tener el password, por defecto es cero (0)
lPswAdmin Indica si se permite el acceso a todas las opciones que piden passwrod utilizando la clave de superadmini indicada en bPswAdmin en lugar del password del usuario.
bPswAdmin Codeblock que permite el acceso con la clave de superadmin indicar la clave de superadmin, recibe como parámetros usuario y password, y debe devolver un valor lógico, por defecto se tienen { || .f. }.
lMinusculas Indica si permite difrenciar el password en mayúsculas y minúsculas, por defecto es .t.
xBloqueaDBF Codeblock, nombre de función o apuntador a la función que se encargará de bloquear o desbloquer el archivo DBF, esto permite encriptar el archivo o cualquier operación para encriptar el archivo, esta función tiene que realizar algo simple y que no cree conflictos con el uso del archivo en el abmiente compartido (SHARED) de xBase, la función es llamada en tres ocaciones:
   1. Antes de abrir el archivo, se envían como argumentos el nombre del archivo y verdadero (.t.)
   2. Si el archivo se abre en modo compartido (SHARED), despues de abrir el archivo
   3. Si el archivo se abre de manera exclusiva, al momento de cerrar el archivo
Esta función debe devolver .t. o .f., lo que indica si se realizó la operación correctamente porque será considerada al momento de abrir el archivo, si devuelve .f. no se abrirá, ni siquiera se hará el intento.
Si no se indica, simplemente se abre el archivo de manera normal.
xHelpPass Clave de la ayuda para el diálogo cuando pregunta el password
xHelpConf Clave de la ayuda para el diálogo cuando pregunta el password por confirmación
nHlpUsua Clave de ayuda para el GET que pide usuario
nHlpPswd Clave de ayuda para el GET que pide el password
nHlpAcep Clave de ayuda para el botón "Aceptar"
nHlpCanc Clave de ayuda para el botón "Cancelar"

Métodos
new() Método constructor
muestraUsr() Indica el objeto que mostrará el nombre del usuario
password() Pide el password para el control de acceso o indica si se tiene acceso de lectura a algún módulo según los derecho asignados (para esta segunda opción es recomendable usar el método permiso() en lugar de éste)
permiso() Indica si el usuario tiene acceso a determinado módulo u opción
confirmar() Si el usuario tiene acceso a una opción, pide el password únicamente para confirmar, si no tiene acceso ni siquiera pide el password
accesos() Abre la opción de mantenimiento del control de accesos
asignPswd() Permite cambiar el password del usuario
indices() Permite agregar los índices para generar índices dentro de los comandos dbfs/end dbf o su equivalente en llamado a métodos de un entorno para poder dar mantenimiento a índices y depuración (pack) del archivo de passwords
cambiaUsuario() Carga los datos del usuario indicado y borra la información del actual

Descripción
Permite el control de acceso al programa, módulos del mismo u opciones determinadas de las siguientes maneras:
   1. Solicitud de password a un usuario para dar acceso y controlar la consulta, escritura y borrado de acuerdo a las definiciones utilizadas.
   2. Pedir password por módulo u opción para mayor seguridad.
   3. Solicitar el passoword de otro usuario para permitir el acceso a determinada opción.

El control de acceso puede ser regulado de acuerdo al archivo de control de acceso, o por una función definida por el usuario, para esto, habría que enviar el codeblock con el llamado a la función al momento de pedir el password.

Se debe tener un ícono como recurso con el nombre "KEY01" que se mostrará en el diálogo que pide el password, no es obligatorio, si no se tiene, simplemente dejara vacío ese espacio.

Archivo de control de accesos
El archivo utilizado para el control de usuario esencialmente debe tener solamente dos campos:
1. El primero siempre será utilizado por qPassword para el control de usuario, y deberá ser tipo caracter de tamaño 51.
2. Deberá tener otro campo, por defecto se utiliza el segundo, aunque esto se indica en la variable de instancia ::nCampo, deberá ser tipo caracter, el tamaño indica el número de módulos u opciones que permitira controlar qPassword, cada caracter controla 8 opciones.
3. Permite tener más campos, esto puede aprovecharse para:
   a) Utilizar un solo archivo para controlar el acceso a varios programas, cada programa tendra los derechos indicados en un campo distinto, el cual se indicará en la variable de instancia ::nCampo
   b) Permite guardar alguna información adicional al control de accesos en este mismo archivo, esta podrá ser accesada mediante el codeblock de la variable de isntancia ::bUpdateUsr en la opcion de mantenimiento de claves de acceso.
   c) Permite utilizar campos adicionales para uso independiente al control de qPassword.

No importan los nombres utilizados para el primer campo ni para el utilizado para guardar los permisos, estos son utilizados por qPassword considerando siempre el primero para uso de control interno y el indicado en ::nCampo para los permisos.

No es necesario utilizar todos las opciones permitidas por el tamaño del campo de permisos, y tampoco es necesario utilizar todos en orden, el número total de permisos será el tamaño del campo multiplicado por 8, y se identificarán por el número correspondiente, pueden utilizarse por ejemplo los permisos 6, 18 y 42 solamente, y no afectara el no utilizar los demas, esto se deja a discresion del programador, pero si el campo tiene un tamaño de 15 caracteres, el número maximo de opciones será 8 x 15 = 120, esto quiere decir que no se puede utilizar 121 para identificar un módulo.

El nombre del archivo se indica al momento de crear el objeto qPassword, por defecto es "password.dbf"

Definiciónes dederechos
Las definiciones de los derechos están incluidas en el archivo qSoft.ch, y son los niveles de permisos utilizados por qPassword:
Definición     Valor     Permiso
PSW_NEGADO   0   Sin acceso
PSW_LECTURA   1   Permiso de consulta
PSW_ESCRITURA   2   Lectura y escritura
PSW_BORRADO   3   Lectura, escritura y borrado

Métodos

new( cKey, olMostrar, xHelpPass, xHelpConf, cArchivo, lSiErr, nOpor )
Este método crea un objeto qPassword.
Devuelve: Una referencia al objeto.
cKey Llave utilizada para encriptar la información dentro del archivo
olMostrar Indica donde se mostrará el usuario activo:
.t. - Lo muestra en la barra de mensajes de la venta principal, si no hay barra, la crea
objeto - Es el objeto donde se mostrará (say, get, etc.)
Si no se envía, no muestra el usuario
xHelpPass Clave de la ayuda para el diálogo cuando pregunta el password
xHelpConf Clave de la ayuda para el diálogo cuando pregunta el password por confirmación
cArchivo Nombre del archivo DBF con la información del control de acceso, no es necesario envíar la extensión, si no se envía, tomará la extensión predeterminada, si no se envía será "password.dbf"
lSiErr Indica si muestra (.t.) o no (.f.) el mensaje de clave incorrecta, si no se envía se muestra
nOpor Número de oportunidades que se dan para dar la clave correcta, si no se envía se dán 3 intentos

muestraUsr( olMostrar )
Agrega un archivo para ser abierto.
Devuelve: NIL.
olMostrar Indica donde se mostrará el usuario activo:
.t. - Lo muestra en la barra de mensajes de la venta principal, si no hay barra, la crea
objeto - Es el objeto donde se mostrará (say, get, etc.)
Si no se envía, no muestra el usuario

password( xModulo, cTitulo, xAyuda, lSiErr, nOpor )
1. Pide el password para el control de acceso
2. Si se envía un número dentro del rango de control de accesos, indica si se tiene acceso de cualquier tipo a algún módulo según los derecho asignados, es recomendable usar el método permiso() en lugar de password() para esta opción, ya que realmente lo que hace el método password() es hacer un llamado al método permiso().
3. Si se envía -1 para pedir autorización de otra persona y el acceso es permitido, se guardará el usuario que dió el acceso en la variable de instancia ::cAutoriza, de negarse el acceso, o no utilizar esta opción, se asignará el valor NIL a dicha variable.
Todas las opciones que piden password permite el acceso al usuarios con la clave de superadmin si se asignó clave en bPswAdmin yla variable de instancia lPswAdmin es verdadera (.t.).
Devuelve: Valor lógico indicando si se tiene acceso (.t.) o no (.f.).
xModulo Si se envía:
1. "superadmin" en minuscula, pide la clave de Super Administrador, superadmin es el usuario maestro, no se puede eliminar y tiene acceso a todas las opciones, ni siquiera aparece en la opción de mantenimiento de usuarios.
2. cadena de caracteres difrente a "superadmin", pide el password correspondiente a ese usuario.
3. número 0 (cero), pide usuario y el password y carga la información para poder validar los de usuario. Esta es la opción indicada para cuando se quiere pedir el usuario al inicio del programa, también puede llamarse si se quiere cambiar de usuario sin tener que salir del programa.
4. número permitido en el rango de derechos, devuelve .t. o .f. indicando si tiene ese derecho permitido o no, para esta opción es recomendable utilizar utilizar el método permiso() en lugar de password()
5. número -1, pide usuario y el password unicamente para validar si se le dá acceso a esa opción, pero
sigue concervando los datos del usuario que tiene acceso al programa. Esto opción, por ejemplo, puede utilizarse para pedir la autorización de un supervisor. Si se otorga el acceso, el usuario que autorizó es guardado en la variable ::cAutoriza.
6. codeblock , pide usuario y password, pero en lugar de validar el acceso con la información del archivo de control de accesos, evalúa el codeblock para validar el acceso, el resultado debe ser verdadero (.t.), cualquier otro resultado se
considera como acceso negado, el codeblock recibe como parámetros el usuario y password.
7. valor lógico, devuelve el mismo valor lógico como respuesta de autorización
8. cualquier otro dato, pregunta la clave de superadmin (punto 1)
cTitulo Título para la ventana que pide el password, si o se envía tomará el de la variabe de instancia ::cTitulo
xAyuda Clave para la ayuda, si no se envía, toma la de la variable de instancia ::xHelpPass
lSiErr Indica si muestra (.t.) o no (.f.) el mensaje de clave incorrecta, si no se envía toma el de la variable de instancia ::lSiErr
nOpor Número de oportunidades que se dan para dar la clave correcta, si no se envía toma el de la variable de instancia ::nOpor

permiso( nModulo, nPermiso )
Indica si el usuario tiene acceso a un módulo u opción.
Devuelve: Valor lógico indicando si se tiene acceso (.t.) o no (.f.).
nModulo Número del módulo que se quiere accesar
nPermiso Número del permiso que se pide para tener acceso

confirmar( nModulo, cTitulo, xAyuda, lSiErr, nOpor )
Permite confirmar el password del usuario para evitar que alguien tenga acceso a determinada opción cuando el usuario se distrae de su computadora, si el usuario tiene acceso a una opción, pide el password únicamente para confirmar, si no tiene acceso ni siquiera pide el password.
Devuelve: Valor lógico indicando si se tiene acceso (.t.) o no (.f.).
nModulo Número del módulo que se quiere accesar
cTitulo Título para la ventana que pide el password, si o se envía tomará el de la variabe de instancia ::cTitulo
xAyuda Clave para la ayuda, si no se envía, toma la de la variable de instancia ::xHelpConf, si ésta no tiene, tomará la de ::xHelpPass
lSiErr Indica si muestra (.t.) o no (.f.) el mensaje de clave incorrecta, si no se envía toma el de la variable de instancia ::lSiErr
nOpor Número de oportunidades que se dan para dar la clave correcta, si no se envía toma el de la variable de instancia ::nOpor

accesos( xModulo, aOpciones, bMenu, nMenuInfo, nOpor, xAyuda, aConfig )
Módulo de mantenimiento de acceso a usuarios, permite también dar mantenimiento a opciones adicionales si se asignó codeblock a la variable ::bUpdateUsr.
Devuelve: Valor lógico indicando si se tiene acceso (.t.) o no (.f.).
xModulo Tipo de validación que se usará para permitir el acceso al módulo de mantenimiento de accesos a usuarios, generalmente se envía el número de módulo asignado, pero puede utilizarse cualquier opción permitida en el parámetro xModulo del método password()
aOpciones Matriz con el control de opciones consideradas para el control de accesos, cada elemento de la matriz debe ser una matriz, de uno o dos elementos, donde:
1. El primier elemento será el texto mostrado o si es número, el manejador de un bitmap, el cual puede ser solo informativo o utilizado como nombre del módulo, dependiendo del valor del segundo elemento.
2. El segundo elemento, puede ser opcional, si no se tiene, o su valor es nil, indicará que se trata de una línea informativa, en caso contrario, debera contener un número, el cual será utilizado como la clave del módulo par el control de acceso, no debe olvidarse que el número no debe ser mayor al delimitado en el campo de permisos.
bMenu Codeblock que devolverá el objeto tMenu mostrado, este codeblock recibe como parámetro un codeblock que se encargará de la creación del menú para el mantenimiento de control de accesos. Si no se envía bMenu, se utilizará el menú predeterminado como menú.
Ejemplo:
bMenu := { | bMenuAccesos | menuPrincipal( bMenuAccesos ) }

function menuPrincipal( bMenuAccesos )
local oMenu
menu oMenu
   menuItem "Mi opción"
      menu
         menuItem "Opcion 1" action msgInfo( 1 )
         menuItem "Opcion 2" action msgInfo( 2 )
         menuItem "Opcion 3" action msgInfo( 3 )
      endMenu
   eval( bMenuAccesos )
   menuItem "Mi otra opción"
      menu
         menuItem "Opcion 4" action msgInfo( 4 )
         menuItem "Opcion 5" action msgInfo( 5 )
         menuItem "Opcion 6" action msgInfo( 6 )
      endMenu
endMenu
return oMenu
nMenuInfo Numero de la opción donde se muestra el menú MDI en caso de tratarse de una ventana MDI
xAyuda Clave para la ayuda si es que se pide password, si no se envía, toma la de la variable de instancia ::xHelpPass
aConfig Matriz con la configuración adicional para el usuario, si no se envía solamente se utilizará el control de permisos y derechos, cada elemento de la matriz debe ser una matriz de seis elementos que contendrá cada una de las opciones de la configuración del usuario, la estructura de cada elemento debe ser:
1. Texto o manejador de un bitmap que mostrará para identificar la opción.
2. Codeblock que mostrará el valor del campo, generalmente será { || alias->campo }.
3. Codeblock que guardara la información cuando se modifique la opción, el codeblock recibe como parámetro el nuevo valor a grabar, generalmente será { | x | alias->campo := x }.
4. Valor que mostrará el GET al momento de la edición por si se quisiera mostrar, por ejemplo, si se muestra un número el codeblock del punto 2 tendrá que convertir el número en cadena de caracteres, pero en el GET debera capturarse un númro. Si no se envía, se utilizará el valor mostrado en el elemento 2.
5. Mascarilla para el GET (PICTURE).
6. Codeblock con el valid para el GET, si no se envía, no se valida la captura, el codeblock recibe un parametro con el objeto del GET.

asignPswd( lPidePass, oUsr )
Permite cambiar el password del usuario
Devuelve: Valor lógico indicando si se realizó el cambio (.t.) o no (.f.).
lPidePass Indica si se pide el password actual del usuario para poder cambiarlo (.t.) o no se pide (.f.), si no se envía, no se pide el password
oUsr Objeto qPassword del usuario al que se le quiere cambiar el password, si no se envía, se cambia el password del objeto actual

indices( oDbfs )
Permite agregar los índices para generar índices dentro de los comandos DBFS/END DBFS o su equivalente en llamado a métodos de un entorno para poder dar mantenimiento a índices y depuración (pack) del archivo de passwords
dbfs oEntorno
   oPswd:indice( oEntorno )
dbfs reindex oEntorno

Devuelve: NIL.
oDbfs Objeto qEntorno en el que se incluirán los índices

cambiaUsuario( cUsr )
Carga los datos del usuario indicado y borra la información del actual. Esta opción no pide usuario ni password, simplemente substituye la información actual por la de otro usuario.
Devuelve: .t.
cUsr Usuario que se desea cargar

Ejemplo

#include "qSoft.ch"

oUsr := qPassword():new( "Mi llave", .t. )
if oUsr:password( 0 )
   menu oMenu
      menuItem "Usuarios" action
      menuItem "Consulta" action consulta() when oUsr:permiso( 11, PSW_LECTURA )
      menuItem "Editar"   action editar()   when oUsr:permiso( 12, PSW_ESCRITURA )
      menuItem "Eliminar" action eliminar() when oUsr:permiso( 13, PSW_BORRADO )
   endMenu
   define window oWnd menu oMenu
   activate window oWnd
else
   msgStop( "Acceso denegado" )
endIf