Page 1 of 2

cabecera dbf

PostPosted: Sat Oct 18, 2008 11:59 pm
by Francisco Horta
Existe alguna funcion para cambiar/corregir la cabecera de las dbf de mi sistema para poder abrirlas "unicamente" desde el sistema o en dado caso regresarla a su forma original para abrirlas desde cualquier dbu para dbfs? lo quiero hacer por seguridad en lugar de encriptar todos los datos.
gracias
paco

PostPosted: Sun Oct 19, 2008 12:32 am
by Alfredo Arteaga
He aqui la función:

Code: Select all  Expand view
FUNCTION DbProtect(cDbf,nAction)
   LOCAL nHandle:=0, cFile
   LOCAL cBuffer:=Space(32)
   IF !File(cDbf)
      nHandle:=FOpen(cFile,FO_READWRITE+FO_SHARED)
      DEFAULT nAction:=1
      IF nHandle!=-1
         IF FRead(nHandle,@cBuffer,32)==32
            IF nAction==0       // Proteger
               IF SubStr(cBuffer,1,1)<>Chr(26)
                  cBuffer:=Chr(26)+SubStr(cBuffer,1,31)
               ENDIF
            ELSE                // Desproteger
               IF SubStr(cBuffer,1,1)==Chr(26)
                  cBuffer:=SubStr(cBuffer,2,31)+ Chr(0)
               ENDIF
            ENDIF
            FSeek(nHandle,0)
            FWrite(nHandle,cBuffer,32)
         ENDIF
         FClose(nHandle)
      ENDIF
   ENDIF
RETURN (NIL)

PostPosted: Mon Oct 20, 2008 4:15 pm
by Francisco Horta
Gracias Alfredo lo probare
Saludos
Paco

PostPosted: Mon Dec 15, 2008 10:48 pm
by Francisco Horta
Que tal Alfredo,
Intente probando asi al cerrar mi aplicacion:

oDbf:="Clientes.Dbf"
DbProtect(oDbf,0)

inmediatamente cargo el dbwide y si me bare la dbf, como hago para que no la pueda abrir?
salu2
paco

PostPosted: Tue Dec 16, 2008 3:33 pm
by Francisco Horta
Gracias, revisado y funcionando,,,
salu2
paco

PostPosted: Tue Dec 16, 2008 10:09 pm
by Manuel Valdenebro
Francisco Horta wrote:Gracias, revisado y funcionando,,,
salu2
paco


Francisco,

¿Podias explicarnos como lo has hecho? ¿Como abres y cierras las dbf?

PostPosted: Wed Dec 17, 2008 4:23 pm
by Francisco Horta
Que tal Manuel,
te comento como lo hago

1.tengo una funcion para abrir las dbf, antes de abrirla verifico si esta protegida con esto:
IF lFileProtect("MiArchivo.dbf")
DbProtect("MiArchivo.dbf",1) // con el 1 se desprotege
ENDIF
--> aqui ya abro la dbf
2. Al cerrar la dbf vuelvo a proteger la dbf
DbProtect("MiArchivo.dbf",0) // con el 0 se protege

aqui dejo las funciones del autor Alfredo Arteaga, gracias Alfredo.


FUNCTION lFileProtect(cDbf)
LOCAL nHandle :=0
LOCAL cBuffer :=Space(32)
LOCAL lRet :=.F.
IF (nHandle:=FOpen(cDbf,FO_READWRITE+FO_SHARED))!=-1
IF FRead(nHandle,@cBuffer,32)==32
lRet:=IF(SubStr(cBuffer,1,1)==Chr(26),.T.,.F.)
ENDIF
FClose(nHandle)
ELSE
MsgInfo("Error, No se pudo abrir la Base de Datos "+cDbf,"Verifique !!")
ENDIF
RETURN (lRet)


FUNCTION DbProtect(cDbf,nAction)
LOCAL nHandle:=0
LOCAL cBuffer:=Space(32)
nHandle:=FOpen(cDbf,FO_READWRITE+FO_SHARED)
DEFAULT nAction:=1
IF nHandle!=-1
IF FRead(nHandle,@cBuffer,32)==32
IF nAction==0 // Proteger
IF SubStr(cBuffer,1,1)<>Chr(26)
cBuffer:=Chr(26)+SubStr(cBuffer,1,31)
ENDIF
ELSE // Desproteger
IF SubStr(cBuffer,1,1)==Chr(26)
cBuffer:=SubStr(cBuffer,2,31)+ Chr(0)
ENDIF
ENDIF
FSeek(nHandle,0)
FWrite(nHandle,cBuffer,32)
ENDIF
FClose(nHandle)
ENDIF
RETURN (NIL)


Saludos
Paco

PostPosted: Wed Dec 17, 2008 4:29 pm
by karinha
Buenas Francisco...

Una duda:

Y se hay una falla elétrica? El que ocorri? No te causa problemas?

Gracias,

Saludos.

PostPosted: Wed Dec 17, 2008 8:49 pm
by Francisco Horta
Karinha,
De hecho si, porque algunas dbf estarian sin bloqueo, pero o puedes controlar con un flag para si el sistema tuvo una salida anormal y antes de arrancar el sistema comprobar si estan protegidas o desprotegidas.
En caso de que sea en red (server sin ups, raro!!) desde cualqueir otra terminal con energia electrica puede seguir protegiendo y desprotegiendo sin problemas, ya que siempre busca la validacion de la misma
salu2
paco

PostPosted: Thu Dec 18, 2008 12:16 am
by derpipu
Amigo Pancho, y que pasa si el sistema se utiliza en red, y internamente se abren y cierran las mismas bds en varias estaciones de trabajo, no truena ?

Saludos

PostPosted: Thu Dec 18, 2008 12:09 pm
by José Vicente Beltrán
Hola a todos después de mucho tiempo.

Yo lo que hago es:
1. cambiar la cabecera para poder abrir la base de datos
2. abrir la base de datos
3. cambiar la cabecera al estado anterior
4. trabajar normalmente con la BD

De esta forma si otros terminales de la red necesitan abrir la BD siempre se la encontrarán cerrada y pueden ejecutar los cuatro puntos anteriores.

Y por supuesto si hay fallo electrico y/o de red las BD siempre se quedan protegidas de las miradas curiosas

Saludos :shock:

PostPosted: Thu Dec 18, 2008 3:24 pm
by Francisco Horta
Luis,
Efectivamente como comenta vicente asi mismo funciona, el cambio de cabeceras las ejecutas dentro de las funciones al abrir y cerrar las bases de datos.. y siempre validas, por lo tanto aunque este en red, si una terminal va a usar determinada base de datos, verifica si esta o no cambiada la cabecera y tons aplica lo que se necesite.

salu2
paco

PostPosted: Thu Dec 18, 2008 5:59 pm
by Manuel Valdenebro
José Vicente Beltrán wrote:Hola a todos después de mucho tiempo.

Yo lo que hago es:
1. cambiar la cabecera para poder abrir la base de datos
2. abrir la base de datos
3. cambiar la cabecera al estado anterior
4. trabajar normalmente con la BD

De esta forma si otros terminales de la red necesitan abrir la BD siempre se la encontrarán cerrada y pueden ejecutar los cuatro puntos anteriores.

Y por supuesto si hay fallo electrico y/o de red las BD siempre se quedan protegidas de las miradas curiosas

Saludos :shock:


Jose Vicente, ¿puedes indicarnos como lo haces con detalle?

PostPosted: Thu Dec 18, 2008 7:15 pm
by José Vicente Beltrán
Basicamente hago lo siguiente:

//----------- para abrir la BD ------------------//
protege( "OFF", file ) //pone la cabecera normal
USE file NEW
protege( "ON", file ) //cambia la cabecera para impedir la apertura
//------------------------------------------------//
...
a partir de aquí uso normal
...
CLOSE file // fin de la aplicación


#include "FiveWin.ch"
#define PROT_SIN_DBT CHR(255)
#define PROT_CON_DBT CHR(254)
#define PROT_CON_FTP CHR(253)
#define DESPROT_SIN_DBT CHR(3)
#define DESPROT_CON_DBT CHR(131)
#define DESPROT_CON_FTP CHR(245)

//---------------------------------------------------------------------
function Protege(cModo, cFicheroDBF)
local nManejador, cCabecera, cescribe:= ""

//se abre el fichero a bajo nivel para lectura-escritura
nManejador = FOpen ( cFicheroDBF , 2 )

//Leemos el primer byte
cCabecera := FReadStr( nManejador , 1 )

if cModo == "ON" // busca codigo de protección
do case
case cCabecera == DESPROT_SIN_DBT
cEscribe := PROT_SIN_DBT

case cCabecera == DESPROT_CON_DBT
cEscribe := PROT_CON_DBT

case cCabecera == DESPROT_CON_FTP
cEscribe := PROT_CON_FTP

otherwise
Fclose ( nManejador )
return .T.

endcase
else // busca código de desprotección
do case
case cCabecera == PROT_SIN_DBT
cEscribe := DESPROT_SIN_DBT

case cCabecera == PROT_CON_DBT
cEscribe := DESPROT_CON_DBT

case cCabecera == PROT_CON_FTP
cEscribe := DESPROT_CON_FTP

otherwise
Fclose ( nManejador )
return .T.

endcase
endif

// mueve el puntero al principio del fichero
Fseek( nManejador, 0, 0 )
FWrite( nManejador, cEscribe, 1 )
Fclose( nManejador )
return .t.

PostPosted: Fri Dec 19, 2008 5:36 pm
by Manuel Valdenebro
Muchas gracias Francisco y Jose Vicente.