I'm with a personal proyect using python and sqlite3, the case is that i use fernet to encrypt the db file, but at decrypt the db it turn in a read only db and give me error at try do an INSERT.
sqlite3.OperationalError: attempt to write a readonly database
I try edit the linux permissions using chmod 664 and 777 but nothing seems work it still as only read db
----- EDIT WITH MORE INFO
I use local file and connect using sqlite3, i create a clase for manage the db
class DataBaseManager(object):
def __init__(self,db):
self.con = sqlite3.connect(db)
self.cur = self.con.cursor()
def inicializar(self):
checkTableStore = self.cur.execute(
"""SELECT name FROM sqlite_master WHERE type='table' AND name='store'; """
).fetchall()
if checkTableStore == []:
self.cur.execute(
"""create table store(
........
)"""
)
def __del__(self):
self.con.close
if in the first execution and the db file doesn't exist create it with the DataBaseManager(dbfile) and after check if the table that i need is created or not and create if not exist with DataBaseManager.inicializar()
keyfile = input("keyfile: ")
dbfile = "pstore.db"
dbencrypt = "pstore.enc"
dbm = DataBaseManager(dbfile)
DataBaseManager.inicializar()
For encrypt and decrypt i use a key generated with fernet
def encryptdb(keyfile, dbfile, dbencrypt):
with open(keyfile, "rb") as openkeyfile:
key = openkeyfile.read()
fernet = Fernet(key)
with open (dbfile, "rb") as opendbfile:
decrypteddb = opendbfile.read()
encrypted = fernet.encrypt(decrypteddb)
with open (dbencrypt, "wb") as encrypteddb:
encrypteddb.write(encrypted)
def decryptdb(keyfile, dbfile, dbencrypt):
with open(keyfile, "rb") as openkeyfile:
key = openkeyfile.read()
fernet = Fernet(key)
with open (dbencrypt, "rb") as openenc:
encrypteddb = openenc.read()
decrypted = fernet.decrypt(encrypteddb)
with open (dbfile, "wb") as decrypteddb:
decrypteddb.write(decrypted)
Before than made the encrypt i can do inserts without problem, but after encrypt and decrypt i got the problem that the database is only read
Ok, solved.
I tryed use a second file to save the db encrypted. But i proved save the encrypted output of fernet in the sabe db file that existed, it don't give to me the ro error after decrypt.