FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour cabecera dbf
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
cabecera dbf
Posted: 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

____________________

Paco
Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM
cabecera dbf
Posted: Sun Oct 19, 2008 12:32 AM
He aqui la función:

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)
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
cabecera dbf
Posted: Mon Oct 20, 2008 04:15 PM

Gracias Alfredo lo probare
Saludos
Paco

____________________

Paco
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
cabecera dbf
Posted: 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

____________________

Paco
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
cabecera dbf
Posted: Tue Dec 16, 2008 03:33 PM

Gracias, revisado y funcionando,,,
salu2
paco

____________________

Paco
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
cabecera dbf
Posted: 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
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
cabecera dbf
Posted: Wed Dec 17, 2008 04: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

____________________

Paco
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
cabecera dbf
Posted: Wed Dec 17, 2008 04: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
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
cabecera dbf
Posted: Wed Dec 17, 2008 08: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

____________________

Paco
Posts: 94
Joined: Tue Mar 28, 2006 04:09 PM
cabecera dbf
Posted: 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
Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
cabecera dbf
Posted: 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:

Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
cabecera dbf
Posted: Thu Dec 18, 2008 03: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

____________________

Paco
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
cabecera dbf
Posted: Thu Dec 18, 2008 05: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 :-)


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



Manuel
Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
cabecera dbf
Posted: Thu Dec 18, 2008 07: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.

Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
cabecera dbf
Posted: Fri Dec 19, 2008 05:36 PM

Muchas gracias Francisco y Jose Vicente.

Un saludo



Manuel