SPS database
SPS database is a small SQLite database which stores some basic app information, the project encryption key pair, account information. The database is controlled by 3 SPS R6 classes:
- spsDb: basic database management, queries.
- spsEncryption: Interact with the SHA256 key pair in the database to encrypt
strings, and files. Also methods to view or change the key pair, inherits
spsDb
- spsAcount: use the encyption key pair to manage users and admin accounts in
SPS, inherits
spsDb
andspsEncryption
.
First to create a SPS project
suppressPackageStartupMessages(library(systemPipeShiny))
app_path <- "."
spsInit(app_path = app_path, overwrite = TRUE, open_files = FALSE)
## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at '/tmp/Rtmp3KQ3pG/SPS_20210422/config/sps.db'. DO NOT share this file with others or upload to open access domains.
## [SPS-INFO] 2021-04-22 15:45:04 Key md5 1d1f76c8eecddb382ee2db097d6edbe9
## [SPS-INFO] 2021-04-22 15:45:04 SPS project setup done!
You can see a database created on a SPS project initiation, you should see a message like this:
[SPS-DANGER] 2021-04-19 11:06:53 Done, Db created at
Then we can use different class methods to interact with the database.
spsDb
class
Reference manual under SPS Functions.
Create a class object:
mydb <- spsDb$new()
## [SPS-INFO] 2021-04-22 15:45:04 Created SPS database method container
create new db
If there is no database, we can create one:
# delete current one first
try(file.remove("config/sps.db"))
## [1] TRUE
# create a new one
mydb$createDb()
## [SPS-INFO] 2021-04-22 15:45:04 Creating SPS db...
## [SPS-DANGER] 2021-04-22 15:45:04 Done, Db created at 'config/sps.db'. DO NOT share this file with others or upload to open access domains.
## [SPS-INFO] 2021-04-22 15:45:04 Key md5 6306a50abcf3c7618566911a793b0405
If you create a new database, all information in the old database will be overwritten. All old information will be lost
Get tables
# meta info table
mydb$queryValue("sps_meta")
## info value
## 1 creation_date 20210422154504
# raw blob table to store keys
mydb$queryValue("sps_raw")
## info value
## 1 key blob[1.36 kB]
# account table
mydb$queryValue("sps_account")
## account pass
## 1 admin bef2094c429fa5b0ff7a37abc6bf8dd31c29fa2acd783a2303935d2b8664ea21
## 2 user 12842a62c410af0f4b4dc866283a90f7b7c42c9d5ca0d0e1c812dca11021b052
## role
## 1 admin
## 2 user
Insert new records(rows)
To add a new row, values of all columns needs to be passed in a SQL string
mydb$queryInsert("sps_meta", value = "'new1', '1'")
## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows
Or pass in a vector:
mydb$queryInsert("sps_meta", value = c("'new2'", "'2'"))
## [SPS-INFO] 2021-04-22 15:45:04 Inerted 1 rows
# check the new table
mydb$queryValue("sps_meta")
## info value
## 1 creation_date 20210422154504
## 2 new1 1
## 3 new2 2
change values
mydb$queryUpdate("sps_meta", value = '234', col = "value", WHERE = "info = 'new1'")
## [SPS-INFO] 2021-04-22 15:45:04 Updated 1 rows
# check the update
mydb$queryValue("sps_meta")
## info value
## 1 creation_date 20210422154504
## 2 new1 234
## 3 new2 2
remove values
mydb$queryDel("sps_meta", WHERE = "value = '234'")
## [SPS-INFO] 2021-04-22 15:45:05 Deleted 1 rows
# check again
mydb$queryValue("sps_meta")
## info value
## 1 creation_date 20210422154504
## 2 new2 2
spsEncryption
class
Reference manual under SPS Functions.
Start by creating a class object
my_ecpt <- spsEncryption$new()
## [SPS-INFO] 2021-04-22 15:45:05 Created SPS encryption method container
## [SPS-INFO] 2021-04-22 15:45:05 Default SPS-db found and is working
Get current key
To see the public and private keys (in {openssil{blk}} format):
# private
my_ecpt$keyGet()
## [2048-bit rsa private key]
## md5: 6306a50abcf3c7618566911a793b0405
# public
my_ecpt$keyGet()$pubkey
## [2048-bit rsa public key]
## md5: 6306a50abcf3c7618566911a793b0405
Change the encyption key
Be super careful to change the encryption key. This will result any file encrypted by the old key pair unlockable and the password of all current accounts invalid.
By default it will prevent you to change the key in case you accidentally run this method
my_ecpt$keyChange()
## [SPS-DANGER] 2021-04-22 15:45:05
## change this key will result all accounts' password failed to
## authenticate. You have to regenerate all password for all
## accounts. All encrypted file using the old key will fail to
## decrypt. There is NO way to RECOVER the old key, password
## and files. If you wish to continue, recall this function
## with `confirm = TRUE`.
Unless you are super sure with a confirmation
my_ecpt$keyChange(confirm = TRUE)
## [SPS-INFO] 2021-04-22 15:45:05 md5 42e4b167ba388a9e797608eb4e466a18
Encrypt files
# imagine a file has one line "test"
writeLines(text = "test", con = "test.txt")
my_ecpt$encrypt("test.txt", "test.bin", overwrite = TRUE)
Decrypt files
my_ecpt$decrypt("test.bin", "test_decpt.txt", overwrite = TRUE)
Check the decrypted file content
readLines('test_decpt.txt')
## [1] "test"
spsAcount
class
This class is discussed in details in the Accounts, login and admin.