cabecera dbf

cabecera dbf

Postby Francisco Horta » Sat Oct 18, 2008 11:59 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Alfredo Arteaga » Sun Oct 19, 2008 12:32 am

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)
User avatar
Alfredo Arteaga
 
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico

Postby Francisco Horta » Mon Oct 20, 2008 4:15 pm

Gracias Alfredo lo probare
Saludos
Paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Francisco Horta » Mon Dec 15, 2008 10:48 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Francisco Horta » Tue Dec 16, 2008 3:33 pm

Gracias, revisado y funcionando,,,
salu2
paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Manuel Valdenebro » Tue Dec 16, 2008 10:09 pm

Francisco Horta wrote:Gracias, revisado y funcionando,,,
salu2
paco


Francisco,

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

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby Francisco Horta » Wed Dec 17, 2008 4:23 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby karinha » Wed Dec 17, 2008 4:29 pm

Buenas Francisco...

Una duda:

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

Gracias,

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7446
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby Francisco Horta » Wed Dec 17, 2008 8:49 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby derpipu » Thu Dec 18, 2008 12:16 am

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
Luis Fernando Rubio Rubio
derpipu
 
Posts: 94
Joined: Tue Mar 28, 2006 4:09 pm
Location: Tequila, Jalisco Mexico

Postby José Vicente Beltrán » Thu Dec 18, 2008 12:09 pm

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:
User avatar
José Vicente Beltrán
 
Posts: 282
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España

Postby Francisco Horta » Thu Dec 18, 2008 3:24 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Manuel Valdenebro » Thu Dec 18, 2008 5:59 pm

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?
Last edited by Manuel Valdenebro on Fri Dec 19, 2008 7:16 am, edited 1 time in total.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby José Vicente Beltrán » Thu Dec 18, 2008 7:15 pm

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.
User avatar
José Vicente Beltrán
 
Posts: 282
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España

Postby Manuel Valdenebro » Fri Dec 19, 2008 5:36 pm

Muchas gracias Francisco y Jose Vicente.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 145 guests