Browse Source

initial mysql support

Nils Domrose 6 years ago
parent
commit
ff759397f6
55 changed files with 454 additions and 21 deletions
  1. 7 2
      Cargo.toml
  2. 8 4
      Dockerfile
  3. 0 0
      migrations/mysql/2018-01-14-171611_create_tables/down.sql
  4. 3 3
      migrations/mysql/2018-01-14-171611_create_tables/up.sql
  5. 0 0
      migrations/mysql/2018-02-17-205753_create_collections_and_orgs/down.sql
  6. 2 2
      migrations/mysql/2018-02-17-205753_create_collections_and_orgs/up.sql
  7. 0 0
      migrations/mysql/2018-04-27-155151_create_users_ciphers/down.sql
  8. 3 3
      migrations/mysql/2018-04-27-155151_create_users_ciphers/up.sql
  9. 0 0
      migrations/mysql/2018-05-08-161616_create_collection_cipher_map/down.sql
  10. 0 0
      migrations/mysql/2018-05-08-161616_create_collection_cipher_map/up.sql
  11. 0 0
      migrations/mysql/2018-05-25-232323_update_attachments_reference/down.sql
  12. 0 0
      migrations/mysql/2018-05-25-232323_update_attachments_reference/up.sql
  13. 0 0
      migrations/mysql/2018-06-01-112529_update_devices_twofactor_remember/down.sql
  14. 0 0
      migrations/mysql/2018-06-01-112529_update_devices_twofactor_remember/up.sql
  15. 0 0
      migrations/mysql/2018-07-11-181453_create_u2f_twofactor/down.sql
  16. 3 3
      migrations/mysql/2018-07-11-181453_create_u2f_twofactor/up.sql
  17. 0 0
      migrations/mysql/2018-08-27-172114_update_ciphers/down.sql
  18. 0 0
      migrations/mysql/2018-08-27-172114_update_ciphers/up.sql
  19. 0 0
      migrations/mysql/2018-09-10-111213_add_invites/down.sql
  20. 0 0
      migrations/mysql/2018-09-10-111213_add_invites/up.sql
  21. 0 0
      migrations/mysql/2018-09-19-144557_add_kdf_columns/down.sql
  22. 0 0
      migrations/mysql/2018-09-19-144557_add_kdf_columns/up.sql
  23. 0 0
      migrations/mysql/2018-11-27-152651_add_att_key_columns/down.sql
  24. 3 0
      migrations/mysql/2018-11-27-152651_add_att_key_columns/up.sql
  25. 7 0
      migrations/mysql/2019-05-26-216651_rename_key_and_type_columns/down.sql
  26. 7 0
      migrations/mysql/2019-05-26-216651_rename_key_and_type_columns/up.sql
  27. 9 0
      migrations/sqlite/2018-01-14-171611_create_tables/down.sql
  28. 62 0
      migrations/sqlite/2018-01-14-171611_create_tables/up.sql
  29. 8 0
      migrations/sqlite/2018-02-17-205753_create_collections_and_orgs/down.sql
  30. 31 0
      migrations/sqlite/2018-02-17-205753_create_collections_and_orgs/up.sql
  31. 0 0
      migrations/sqlite/2018-04-27-155151_create_users_ciphers/down.sql
  32. 34 0
      migrations/sqlite/2018-04-27-155151_create_users_ciphers/up.sql
  33. 1 0
      migrations/sqlite/2018-05-08-161616_create_collection_cipher_map/down.sql
  34. 5 0
      migrations/sqlite/2018-05-08-161616_create_collection_cipher_map/up.sql
  35. 0 0
      migrations/sqlite/2018-05-25-232323_update_attachments_reference/down.sql
  36. 14 0
      migrations/sqlite/2018-05-25-232323_update_attachments_reference/up.sql
  37. 1 0
      migrations/sqlite/2018-06-01-112529_update_devices_twofactor_remember/down.sql
  38. 3 0
      migrations/sqlite/2018-06-01-112529_update_devices_twofactor_remember/up.sql
  39. 8 0
      migrations/sqlite/2018-07-11-181453_create_u2f_twofactor/down.sql
  40. 15 0
      migrations/sqlite/2018-07-11-181453_create_u2f_twofactor/up.sql
  41. 0 0
      migrations/sqlite/2018-08-27-172114_update_ciphers/down.sql
  42. 3 0
      migrations/sqlite/2018-08-27-172114_update_ciphers/up.sql
  43. 1 0
      migrations/sqlite/2018-09-10-111213_add_invites/down.sql
  44. 3 0
      migrations/sqlite/2018-09-10-111213_add_invites/up.sql
  45. 0 0
      migrations/sqlite/2018-09-19-144557_add_kdf_columns/down.sql
  46. 7 0
      migrations/sqlite/2018-09-19-144557_add_kdf_columns/up.sql
  47. 0 0
      migrations/sqlite/2018-11-27-152651_add_att_key_columns/down.sql
  48. 1 1
      migrations/sqlite/2018-11-27-152651_add_att_key_columns/up.sql
  49. 7 0
      migrations/sqlite/2019-05-26-216651_rename_key_and_type_columns/down.sql
  50. 7 0
      migrations/sqlite/2019-05-26-216651_rename_key_and_type_columns/up.sql
  51. 2 2
      src/config.rs
  52. 12 0
      src/db/mod.rs
  53. 0 0
      src/db/schemas/mysql/schema.rs
  54. 172 0
      src/db/schemas/sqlite/schema.rs
  55. 5 1
      src/main.rs

+ 7 - 2
Cargo.toml

@@ -13,6 +13,8 @@ build = "build.rs"
 [features]
 # Empty to keep compatibility, prefer to set USE_SYSLOG=true
 enable_syslog = []
+mysql = []
+sqlite = []
 
 [target."cfg(not(windows))".dependencies]
 syslog = "4.0.1"
@@ -47,8 +49,11 @@ log = "0.4.6"
 fern = { version = "0.5.8", features = ["syslog-4"] }
 
 # A safe, extensible ORM and Query builder
-diesel = { version = "1.4.2", features = ["mysql", "chrono", "r2d2"] }
-diesel_migrations = { version = "1.4.0", features = ["mysql"] }
+diesel = { version = "1.4.2", features = ["mysql", "sqlite", "chrono", "r2d2"] }
+diesel_migrations = { version = "1.4.0", features = ["mysql", "sqlite"] }
+
+# Bundled SQLite                                           
+libsqlite3-sys = { version = "0.12.0", features = ["bundled"] }
 
 # Crypto library
 ring = "0.14.6"

+ 8 - 4
Dockerfile

@@ -23,6 +23,9 @@ RUN ls
 # we need the Rust compiler and Cargo tooling
 FROM rust as build
 
+# set sqlite as default for DB ARG for backward comaptibility
+ARG DB=sqlite
+
 # Using bundled SQLite, no need to install it
 # RUN apt-get update && apt-get install -y\
 #    sqlite3\
@@ -31,8 +34,8 @@ FROM rust as build
 
 # Install MySQL package
 RUN apt-get update && apt-get install -y \
-    libmysql++-dev \
-    --no-install-recommends \
+    libmariadb-dev\
+    --no-install-recommends\
  && rm -rf /var/lib/apt/lists/*
 
 # Creates a dummy project used to grab dependencies
@@ -47,7 +50,7 @@ COPY ./build.rs ./build.rs
 # Builds your dependencies and removes the
 # dummy project, except the target folder
 # This folder contains the compiled dependencies
-RUN cargo build --release
+RUN cargo build --features ${DB} --release
 RUN find . -not -path "./target*" -delete
 
 # Copies the complete project
@@ -59,7 +62,7 @@ RUN touch src/main.rs
 
 # Builds again, this time it'll just be
 # your actual source files being built
-RUN cargo build --release
+RUN cargo build --features ${DB} --release
 
 ######################## RUNTIME IMAGE  ########################
 # Create a new stage with a minimal image
@@ -74,6 +77,7 @@ ENV ROCKET_WORKERS=10
 RUN apt-get update && apt-get install -y\
     openssl\
     ca-certificates\
+    libmariadbclient-dev\
     --no-install-recommends\
  && rm -rf /var/lib/apt/lists/*
 

+ 0 - 0
migrations/2018-01-14-171611_create_tables/down.sql → migrations/mysql/2018-01-14-171611_create_tables/down.sql


+ 3 - 3
migrations/2018-01-14-171611_create_tables/up.sql → migrations/mysql/2018-01-14-171611_create_tables/up.sql

@@ -8,7 +8,7 @@ CREATE TABLE users (
   salt                BLOB     NOT NULL,
   password_iterations INTEGER  NOT NULL,
   password_hint       TEXT,
-  akey                TEXT     NOT NULL,
+  `key`               TEXT     NOT NULL,
   private_key         TEXT,
   public_key          TEXT,
   totp_secret         TEXT,
@@ -24,7 +24,7 @@ CREATE TABLE devices (
   updated_at    DATETIME NOT NULL,
   user_uuid     VARCHAR(40) NOT NULL REFERENCES users (uuid),
   name          TEXT     NOT NULL,
-  atype         INTEGER  NOT NULL,
+  type          INTEGER  NOT NULL,
   push_token    TEXT,
   refresh_token TEXT     NOT NULL
 );
@@ -36,7 +36,7 @@ CREATE TABLE ciphers (
   user_uuid         VARCHAR(40) NOT NULL REFERENCES users (uuid),
   folder_uuid       VARCHAR(40) REFERENCES folders (uuid),
   organization_uuid VARCHAR(40),
-  atype             INTEGER  NOT NULL,
+  type              INTEGER  NOT NULL,
   name              TEXT     NOT NULL,
   notes             TEXT,
   fields            TEXT,

+ 0 - 0
migrations/2018-02-17-205753_create_collections_and_orgs/down.sql → migrations/mysql/2018-02-17-205753_create_collections_and_orgs/down.sql


+ 2 - 2
migrations/2018-02-17-205753_create_collections_and_orgs/up.sql → migrations/mysql/2018-02-17-205753_create_collections_and_orgs/up.sql

@@ -22,9 +22,9 @@ CREATE TABLE users_organizations (
   org_uuid   VARCHAR(40) NOT NULL REFERENCES organizations (uuid),
 
   access_all BOOLEAN NOT NULL,
-  akey       TEXT    NOT NULL,
+  `key`      TEXT    NOT NULL,
   status     INTEGER NOT NULL,
-  atype      INTEGER NOT NULL,
+  type       INTEGER NOT NULL,
 
   UNIQUE (user_uuid, org_uuid)
 );

+ 0 - 0
migrations/2018-04-27-155151_create_users_ciphers/down.sql → migrations/mysql/2018-04-27-155151_create_users_ciphers/down.sql


+ 3 - 3
migrations/2018-04-27-155151_create_users_ciphers/up.sql → migrations/mysql/2018-04-27-155151_create_users_ciphers/up.sql

@@ -7,7 +7,7 @@ CREATE TABLE ciphers (
   user_uuid         VARCHAR(40) REFERENCES users (uuid), -- Make this optional
   organization_uuid VARCHAR(40) REFERENCES organizations (uuid), -- Add reference to orgs table
   -- Remove folder_uuid
-  atype              INTEGER  NOT NULL,
+  type              INTEGER  NOT NULL,
   name              TEXT     NOT NULL,
   notes             TEXT,
   fields            TEXT,
@@ -22,8 +22,8 @@ CREATE TABLE folders_ciphers (
   PRIMARY KEY (cipher_uuid, folder_uuid)
 );
 
-INSERT INTO ciphers (uuid, created_at, updated_at, user_uuid, organization_uuid, atype, name, notes, fields, data, favorite) 
-SELECT uuid, created_at, updated_at, user_uuid, organization_uuid, atype, name, notes, fields, data, favorite FROM oldCiphers;
+INSERT INTO ciphers (uuid, created_at, updated_at, user_uuid, organization_uuid, type, name, notes, fields, data, favorite) 
+SELECT uuid, created_at, updated_at, user_uuid, organization_uuid, type, name, notes, fields, data, favorite FROM oldCiphers;
 
 INSERT INTO folders_ciphers (cipher_uuid, folder_uuid)
 SELECT uuid, folder_uuid FROM oldCiphers WHERE folder_uuid IS NOT NULL;

+ 0 - 0
migrations/2018-05-08-161616_create_collection_cipher_map/down.sql → migrations/mysql/2018-05-08-161616_create_collection_cipher_map/down.sql


+ 0 - 0
migrations/2018-05-08-161616_create_collection_cipher_map/up.sql → migrations/mysql/2018-05-08-161616_create_collection_cipher_map/up.sql


+ 0 - 0
migrations/2018-05-25-232323_update_attachments_reference/down.sql → migrations/mysql/2018-05-25-232323_update_attachments_reference/down.sql


+ 0 - 0
migrations/2018-05-25-232323_update_attachments_reference/up.sql → migrations/mysql/2018-05-25-232323_update_attachments_reference/up.sql


+ 0 - 0
migrations/2018-06-01-112529_update_devices_twofactor_remember/down.sql → migrations/mysql/2018-06-01-112529_update_devices_twofactor_remember/down.sql


+ 0 - 0
migrations/2018-06-01-112529_update_devices_twofactor_remember/up.sql → migrations/mysql/2018-06-01-112529_update_devices_twofactor_remember/up.sql


+ 0 - 0
migrations/2018-07-11-181453_create_u2f_twofactor/down.sql → migrations/mysql/2018-07-11-181453_create_u2f_twofactor/down.sql


+ 3 - 3
migrations/2018-07-11-181453_create_u2f_twofactor/up.sql → migrations/mysql/2018-07-11-181453_create_u2f_twofactor/up.sql

@@ -1,15 +1,15 @@
 CREATE TABLE twofactor (
   uuid      VARCHAR(40) NOT NULL PRIMARY KEY,
   user_uuid VARCHAR(40) NOT NULL REFERENCES users (uuid),
-  atype      INTEGER  NOT NULL,
+  type      INTEGER  NOT NULL,
   enabled   BOOLEAN  NOT NULL,
   data      TEXT     NOT NULL,
 
-  UNIQUE (user_uuid, atype)
+  UNIQUE (user_uuid, type)
 );
 
 
-INSERT INTO twofactor (uuid, user_uuid, atype, enabled, data) 
+INSERT INTO twofactor (uuid, user_uuid, type, enabled, data) 
 SELECT UUID(), uuid, 0, 1, u.totp_secret FROM users u where u.totp_secret IS NOT NULL;
 
 UPDATE users SET totp_secret = NULL; -- Instead of recreating the table, just leave the columns empty

+ 0 - 0
migrations/2018-08-27-172114_update_ciphers/down.sql → migrations/mysql/2018-08-27-172114_update_ciphers/down.sql


+ 0 - 0
migrations/2018-08-27-172114_update_ciphers/up.sql → migrations/mysql/2018-08-27-172114_update_ciphers/up.sql


+ 0 - 0
migrations/2018-09-10-111213_add_invites/down.sql → migrations/mysql/2018-09-10-111213_add_invites/down.sql


+ 0 - 0
migrations/2018-09-10-111213_add_invites/up.sql → migrations/mysql/2018-09-10-111213_add_invites/up.sql


+ 0 - 0
migrations/2018-09-19-144557_add_kdf_columns/down.sql → migrations/mysql/2018-09-19-144557_add_kdf_columns/down.sql


+ 0 - 0
migrations/2018-09-19-144557_add_kdf_columns/up.sql → migrations/mysql/2018-09-19-144557_add_kdf_columns/up.sql


+ 0 - 0
migrations/2018-11-27-152651_add_att_key_columns/down.sql → migrations/mysql/2018-11-27-152651_add_att_key_columns/down.sql


+ 3 - 0
migrations/mysql/2018-11-27-152651_add_att_key_columns/up.sql

@@ -0,0 +1,3 @@
+ALTER TABLE attachments
+    ADD COLUMN
+    `key` TEXT;

+ 7 - 0
migrations/mysql/2019-05-26-216651_rename_key_and_type_columns/down.sql

@@ -0,0 +1,7 @@
+ALTER TABLE attachments CHANGE COLUMN akey `key` TEXT;
+ALTER TABLE ciphers CHANGE COLUMN atype type INTEGER NOT NULL;
+ALTER TABLE devices CHANGE COLUMN atype type INTEGER NOT NULL;
+ALTER TABLE twofactor CHANGE COLUMN atype type INTEGER NOT NULL;
+ALTER TABLE users CHANGE COLUMN akey `key` TEXT;
+ALTER TABLE users_organizations CHANGE COLUMN akey `key` TEXT;
+ALTER TABLE users_organizations CHANGE COLUMN atype type INTEGER NOT NULL;

+ 7 - 0
migrations/mysql/2019-05-26-216651_rename_key_and_type_columns/up.sql

@@ -0,0 +1,7 @@
+ALTER TABLE attachments CHANGE COLUMN `key` akey TEXT;
+ALTER TABLE ciphers CHANGE COLUMN type atype INTEGER NOT NULL;
+ALTER TABLE devices CHANGE COLUMN type atype INTEGER NOT NULL;
+ALTER TABLE twofactor CHANGE COLUMN type atype INTEGER NOT NULL;
+ALTER TABLE users CHANGE COLUMN `key` akey TEXT;
+ALTER TABLE users_organizations CHANGE COLUMN `key` akey TEXT;
+ALTER TABLE users_organizations CHANGE COLUMN type atype INTEGER NOT NULL;

+ 9 - 0
migrations/sqlite/2018-01-14-171611_create_tables/down.sql

@@ -0,0 +1,9 @@
+DROP TABLE users;
+
+DROP TABLE devices;
+
+DROP TABLE ciphers;
+
+DROP TABLE attachments;
+
+DROP TABLE folders;

+ 62 - 0
migrations/sqlite/2018-01-14-171611_create_tables/up.sql

@@ -0,0 +1,62 @@
+CREATE TABLE users (
+  uuid                TEXT     NOT NULL PRIMARY KEY,
+  created_at          DATETIME NOT NULL,
+  updated_at          DATETIME NOT NULL,
+  email               TEXT     NOT NULL UNIQUE,
+  name                TEXT     NOT NULL,
+  password_hash       BLOB     NOT NULL,
+  salt                BLOB     NOT NULL,
+  password_iterations INTEGER  NOT NULL,
+  password_hint       TEXT,
+  key                 TEXT     NOT NULL,
+  private_key         TEXT,
+  public_key          TEXT,
+  totp_secret         TEXT,
+  totp_recover        TEXT,
+  security_stamp      TEXT     NOT NULL,
+  equivalent_domains  TEXT     NOT NULL,
+  excluded_globals    TEXT     NOT NULL
+);
+
+CREATE TABLE devices (
+  uuid          TEXT     NOT NULL PRIMARY KEY,
+  created_at    DATETIME NOT NULL,
+  updated_at    DATETIME NOT NULL,
+  user_uuid     TEXT     NOT NULL REFERENCES users (uuid),
+  name          TEXT     NOT NULL,
+  type          INTEGER  NOT NULL,
+  push_token    TEXT,
+  refresh_token TEXT     NOT NULL
+);
+
+CREATE TABLE ciphers (
+  uuid              TEXT     NOT NULL PRIMARY KEY,
+  created_at        DATETIME NOT NULL,
+  updated_at        DATETIME NOT NULL,
+  user_uuid         TEXT     NOT NULL REFERENCES users (uuid),
+  folder_uuid       TEXT REFERENCES folders (uuid),
+  organization_uuid TEXT,
+  type              INTEGER  NOT NULL,
+  name              TEXT     NOT NULL,
+  notes             TEXT,
+  fields            TEXT,
+  data              TEXT     NOT NULL,
+  favorite          BOOLEAN  NOT NULL
+);
+
+CREATE TABLE attachments (
+  id          TEXT    NOT NULL PRIMARY KEY,
+  cipher_uuid TEXT    NOT NULL REFERENCES ciphers (uuid),
+  file_name   TEXT    NOT NULL,
+  file_size   INTEGER NOT NULL
+
+);
+
+CREATE TABLE folders (
+  uuid       TEXT     NOT NULL PRIMARY KEY,
+  created_at DATETIME NOT NULL,
+  updated_at DATETIME NOT NULL,
+  user_uuid  TEXT     NOT NULL REFERENCES users (uuid),
+  name       TEXT     NOT NULL
+);
+  

+ 8 - 0
migrations/sqlite/2018-02-17-205753_create_collections_and_orgs/down.sql

@@ -0,0 +1,8 @@
+DROP TABLE collections;
+
+DROP TABLE organizations;
+
+
+DROP TABLE users_collections;
+
+DROP TABLE users_organizations;

+ 31 - 0
migrations/sqlite/2018-02-17-205753_create_collections_and_orgs/up.sql

@@ -0,0 +1,31 @@
+CREATE TABLE collections (
+  uuid     TEXT NOT NULL PRIMARY KEY,
+  org_uuid TEXT NOT NULL REFERENCES organizations (uuid),
+  name     TEXT NOT NULL
+);
+
+CREATE TABLE organizations (
+  uuid          TEXT NOT NULL PRIMARY KEY,
+  name          TEXT NOT NULL,
+  billing_email TEXT NOT NULL
+);
+
+
+CREATE TABLE users_collections (
+  user_uuid       TEXT NOT NULL REFERENCES users (uuid),
+  collection_uuid TEXT NOT NULL REFERENCES collections (uuid),
+  PRIMARY KEY (user_uuid, collection_uuid)
+);
+
+CREATE TABLE users_organizations (
+  uuid       TEXT    NOT NULL PRIMARY KEY,
+  user_uuid  TEXT    NOT NULL REFERENCES users (uuid),
+  org_uuid   TEXT    NOT NULL REFERENCES organizations (uuid),
+
+  access_all BOOLEAN NOT NULL,
+  key        TEXT    NOT NULL,
+  status     INTEGER NOT NULL,
+  type       INTEGER NOT NULL,
+
+  UNIQUE (user_uuid, org_uuid)
+);

+ 0 - 0
migrations/sqlite/2018-04-27-155151_create_users_ciphers/down.sql


+ 34 - 0
migrations/sqlite/2018-04-27-155151_create_users_ciphers/up.sql

@@ -0,0 +1,34 @@
+ALTER TABLE ciphers RENAME TO oldCiphers;
+
+CREATE TABLE ciphers (
+  uuid              TEXT     NOT NULL PRIMARY KEY,
+  created_at        DATETIME NOT NULL,
+  updated_at        DATETIME NOT NULL,
+  user_uuid         TEXT     REFERENCES users (uuid), -- Make this optional
+  organization_uuid TEXT     REFERENCES organizations (uuid), -- Add reference to orgs table
+  -- Remove folder_uuid
+  type              INTEGER  NOT NULL,
+  name              TEXT     NOT NULL,
+  notes             TEXT,
+  fields            TEXT,
+  data              TEXT     NOT NULL,
+  favorite          BOOLEAN  NOT NULL
+);
+
+CREATE TABLE folders_ciphers (
+  cipher_uuid TEXT NOT NULL REFERENCES ciphers (uuid),
+  folder_uuid TEXT NOT NULL REFERENCES folders (uuid),
+
+  PRIMARY KEY (cipher_uuid, folder_uuid)
+);
+
+INSERT INTO ciphers (uuid, created_at, updated_at, user_uuid, organization_uuid, type, name, notes, fields, data, favorite) 
+SELECT uuid, created_at, updated_at, user_uuid, organization_uuid, type, name, notes, fields, data, favorite FROM oldCiphers;
+
+INSERT INTO folders_ciphers (cipher_uuid, folder_uuid)
+SELECT uuid, folder_uuid FROM oldCiphers WHERE folder_uuid IS NOT NULL;
+
+
+DROP TABLE oldCiphers;
+
+ALTER TABLE users_collections ADD COLUMN read_only BOOLEAN NOT NULL DEFAULT 0; -- False

+ 1 - 0
migrations/sqlite/2018-05-08-161616_create_collection_cipher_map/down.sql

@@ -0,0 +1 @@
+DROP TABLE ciphers_collections;

+ 5 - 0
migrations/sqlite/2018-05-08-161616_create_collection_cipher_map/up.sql

@@ -0,0 +1,5 @@
+CREATE TABLE ciphers_collections (
+  cipher_uuid       TEXT NOT NULL REFERENCES ciphers (uuid),
+  collection_uuid TEXT NOT NULL REFERENCES collections (uuid),
+  PRIMARY KEY (cipher_uuid, collection_uuid)
+);

+ 0 - 0
migrations/sqlite/2018-05-25-232323_update_attachments_reference/down.sql


+ 14 - 0
migrations/sqlite/2018-05-25-232323_update_attachments_reference/up.sql

@@ -0,0 +1,14 @@
+ALTER TABLE attachments RENAME TO oldAttachments;
+
+CREATE TABLE attachments (
+  id          TEXT    NOT NULL PRIMARY KEY,
+  cipher_uuid TEXT    NOT NULL REFERENCES ciphers (uuid),
+  file_name   TEXT    NOT NULL,
+  file_size   INTEGER NOT NULL
+
+);
+
+INSERT INTO attachments (id, cipher_uuid, file_name, file_size) 
+SELECT id, cipher_uuid, file_name, file_size FROM oldAttachments;
+
+DROP TABLE oldAttachments;

+ 1 - 0
migrations/sqlite/2018-06-01-112529_update_devices_twofactor_remember/down.sql

@@ -0,0 +1 @@
+-- This file should undo anything in `up.sql`

+ 3 - 0
migrations/sqlite/2018-06-01-112529_update_devices_twofactor_remember/up.sql

@@ -0,0 +1,3 @@
+ALTER TABLE devices
+    ADD COLUMN
+    twofactor_remember TEXT;

+ 8 - 0
migrations/sqlite/2018-07-11-181453_create_u2f_twofactor/down.sql

@@ -0,0 +1,8 @@
+UPDATE users
+SET totp_secret = (
+    SELECT twofactor.data FROM twofactor
+    WHERE twofactor.type = 0 
+    AND twofactor.user_uuid = users.uuid
+);
+
+DROP TABLE twofactor;

+ 15 - 0
migrations/sqlite/2018-07-11-181453_create_u2f_twofactor/up.sql

@@ -0,0 +1,15 @@
+CREATE TABLE twofactor (
+  uuid      TEXT     NOT NULL PRIMARY KEY,
+  user_uuid TEXT     NOT NULL REFERENCES users (uuid),
+  type      INTEGER  NOT NULL,
+  enabled   BOOLEAN  NOT NULL,
+  data      TEXT     NOT NULL,
+
+  UNIQUE (user_uuid, type)
+);
+
+
+INSERT INTO twofactor (uuid, user_uuid, type, enabled, data) 
+SELECT lower(hex(randomblob(16))) , uuid, 0, 1, u.totp_secret FROM users u where u.totp_secret IS NOT NULL;
+
+UPDATE users SET totp_secret = NULL; -- Instead of recreating the table, just leave the columns empty

+ 0 - 0
migrations/sqlite/2018-08-27-172114_update_ciphers/down.sql


+ 3 - 0
migrations/sqlite/2018-08-27-172114_update_ciphers/up.sql

@@ -0,0 +1,3 @@
+ALTER TABLE ciphers
+    ADD COLUMN
+    password_history TEXT;

+ 1 - 0
migrations/sqlite/2018-09-10-111213_add_invites/down.sql

@@ -0,0 +1 @@
+DROP TABLE invitations;

+ 3 - 0
migrations/sqlite/2018-09-10-111213_add_invites/up.sql

@@ -0,0 +1,3 @@
+CREATE TABLE invitations (
+    email   TEXT NOT NULL PRIMARY KEY
+);

+ 0 - 0
migrations/sqlite/2018-09-19-144557_add_kdf_columns/down.sql


+ 7 - 0
migrations/sqlite/2018-09-19-144557_add_kdf_columns/up.sql

@@ -0,0 +1,7 @@
+ALTER TABLE users
+    ADD COLUMN
+    client_kdf_type INTEGER NOT NULL DEFAULT 0; -- PBKDF2
+
+ALTER TABLE users
+    ADD COLUMN
+    client_kdf_iter INTEGER NOT NULL DEFAULT 5000;

+ 0 - 0
migrations/sqlite/2018-11-27-152651_add_att_key_columns/down.sql


+ 1 - 1
migrations/2018-11-27-152651_add_att_key_columns/up.sql → migrations/sqlite/2018-11-27-152651_add_att_key_columns/up.sql

@@ -1,3 +1,3 @@
 ALTER TABLE attachments
     ADD COLUMN
-    akey TEXT;
+    key TEXT;

+ 7 - 0
migrations/sqlite/2019-05-26-216651_rename_key_and_type_columns/down.sql

@@ -0,0 +1,7 @@
+ALTER TABLE attachments RENAME COLUMN akey TO key;
+ALTER TABLE ciphers RENAME COLUMN atype TO type;
+ALTER TABLE devices RENAME COLUMN atype TO type;
+ALTER TABLE twofactor RENAME COLUMN atype TO type;
+ALTER TABLE users RENAME COLUMN akey TO key;
+ALTER TABLE users_organizations RENAME COLUMN akey TO key;
+ALTER TABLE users_organizations RENAME COLUMN atype TO type;

+ 7 - 0
migrations/sqlite/2019-05-26-216651_rename_key_and_type_columns/up.sql

@@ -0,0 +1,7 @@
+ALTER TABLE attachments RENAME COLUMN key TO akey;
+ALTER TABLE ciphers RENAME COLUMN type TO atype;
+ALTER TABLE devices RENAME COLUMN type TO atype;
+ALTER TABLE twofactor RENAME COLUMN type TO atype;
+ALTER TABLE users RENAME COLUMN key TO akey;
+ALTER TABLE users_organizations RENAME COLUMN key TO akey;
+ALTER TABLE users_organizations RENAME COLUMN type TO atype;

+ 2 - 2
src/config.rs

@@ -204,8 +204,8 @@ make_config! {
         data_folder:            String, false,  def,    "data".to_string();
 
         /// Database URL
-        /// docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=bitwarden -p 3306:3306 -d mysql:5.7
-        database_url:           String, false,  auto,   |_c| format!("mysql://root:[email protected]:3306/bitwarden");
+        /// Database URL
+        database_url:           String, false,  auto,   |c| format!("{}/{}", c.data_folder, "db.sqlite3");
         /// Icon chache folder
         icon_cache_folder:      String, false,  auto,   |c| format!("{}/{}", c.data_folder, "icon_cache");
         /// Attachments folder

+ 12 - 0
src/db/mod.rs

@@ -2,6 +2,9 @@ use std::ops::Deref;
 
 use diesel::r2d2;
 use diesel::r2d2::ConnectionManager;
+#[cfg(feature = "sqlite")]
+use diesel::sqlite::SqliteConnection;
+#[cfg(feature = "mysql")]
 use diesel::mysql::MysqlConnection;
 use diesel::{Connection as DieselConnection, ConnectionError};
 
@@ -12,6 +15,9 @@ use rocket::{Outcome, Request, State};
 use crate::CONFIG;
 
 /// An alias to the database connection used
+#[cfg(feature = "sqlite")]
+type Connection = SqliteConnection;
+#[cfg(feature = "mysql")]
 type Connection = MysqlConnection;
 
 /// An alias to the type for a pool of Diesel MySQL connections.
@@ -21,7 +27,13 @@ type Pool = r2d2::Pool<ConnectionManager<Connection>>;
 pub struct DbConn(pub r2d2::PooledConnection<ConnectionManager<Connection>>);
 
 pub mod models;
+#[cfg(feature = "sqlite")]
+#[path = "schemas/sqlite/schema.rs"]
 pub mod schema;
+#[cfg(feature = "mysql")]
+#[path = "schemas/mysql/schema.rs"]
+pub mod schema;
+
 
 /// Initializes a database pool.
 pub fn init_pool() -> Pool {

+ 0 - 0
src/db/schema.rs → src/db/schemas/mysql/schema.rs


+ 172 - 0
src/db/schemas/sqlite/schema.rs

@@ -0,0 +1,172 @@
+table! {
+    attachments (id) {
+        id -> Text,
+        cipher_uuid -> Text,
+        file_name -> Text,
+        file_size -> Integer,
+        akey -> Nullable<Text>,
+    }
+}
+
+table! {
+    ciphers (uuid) {
+        uuid -> Text,
+        created_at -> Timestamp,
+        updated_at -> Timestamp,
+        user_uuid -> Nullable<Text>,
+        organization_uuid -> Nullable<Text>,
+        atype -> Integer,
+        name -> Text,
+        notes -> Nullable<Text>,
+        fields -> Nullable<Text>,
+        data -> Text,
+        favorite -> Bool,
+        password_history -> Nullable<Text>,
+    }
+}
+
+table! {
+    ciphers_collections (cipher_uuid, collection_uuid) {
+        cipher_uuid -> Text,
+        collection_uuid -> Text,
+    }
+}
+
+table! {
+    collections (uuid) {
+        uuid -> Text,
+        org_uuid -> Text,
+        name -> Text,
+    }
+}
+
+table! {
+    devices (uuid) {
+        uuid -> Text,
+        created_at -> Timestamp,
+        updated_at -> Timestamp,
+        user_uuid -> Text,
+        name -> Text,
+        atype -> Integer,
+        push_token -> Nullable<Text>,
+        refresh_token -> Text,
+        twofactor_remember -> Nullable<Text>,
+    }
+}
+
+table! {
+    folders (uuid) {
+        uuid -> Text,
+        created_at -> Timestamp,
+        updated_at -> Timestamp,
+        user_uuid -> Text,
+        name -> Text,
+    }
+}
+
+table! {
+    folders_ciphers (cipher_uuid, folder_uuid) {
+        cipher_uuid -> Text,
+        folder_uuid -> Text,
+    }
+}
+
+table! {
+    invitations (email) {
+        email -> Text,
+    }
+}
+
+table! {
+    organizations (uuid) {
+        uuid -> Text,
+        name -> Text,
+        billing_email -> Text,
+    }
+}
+
+table! {
+    twofactor (uuid) {
+        uuid -> Text,
+        user_uuid -> Text,
+        atype -> Integer,
+        enabled -> Bool,
+        data -> Text,
+    }
+}
+
+table! {
+    users (uuid) {
+        uuid -> Text,
+        created_at -> Timestamp,
+        updated_at -> Timestamp,
+        email -> Text,
+        name -> Text,
+        password_hash -> Binary,
+        salt -> Binary,
+        password_iterations -> Integer,
+        password_hint -> Nullable<Text>,
+        akey -> Text,
+        private_key -> Nullable<Text>,
+        public_key -> Nullable<Text>,
+        totp_secret -> Nullable<Text>,
+        totp_recover -> Nullable<Text>,
+        security_stamp -> Text,
+        equivalent_domains -> Text,
+        excluded_globals -> Text,
+        client_kdf_type -> Integer,
+        client_kdf_iter -> Integer,
+    }
+}
+
+table! {
+    users_collections (user_uuid, collection_uuid) {
+        user_uuid -> Text,
+        collection_uuid -> Text,
+        read_only -> Bool,
+    }
+}
+
+table! {
+    users_organizations (uuid) {
+        uuid -> Text,
+        user_uuid -> Text,
+        org_uuid -> Text,
+        access_all -> Bool,
+        akey -> Text,
+        status -> Integer,
+        atype -> Integer,
+    }
+}
+
+joinable!(attachments -> ciphers (cipher_uuid));
+joinable!(ciphers -> organizations (organization_uuid));
+joinable!(ciphers -> users (user_uuid));
+joinable!(ciphers_collections -> ciphers (cipher_uuid));
+joinable!(ciphers_collections -> collections (collection_uuid));
+joinable!(collections -> organizations (org_uuid));
+joinable!(devices -> users (user_uuid));
+joinable!(folders -> users (user_uuid));
+joinable!(folders_ciphers -> ciphers (cipher_uuid));
+joinable!(folders_ciphers -> folders (folder_uuid));
+joinable!(twofactor -> users (user_uuid));
+joinable!(users_collections -> collections (collection_uuid));
+joinable!(users_collections -> users (user_uuid));
+joinable!(users_organizations -> organizations (org_uuid));
+joinable!(users_organizations -> users (user_uuid));
+
+allow_tables_to_appear_in_same_query!(
+    attachments,
+    ciphers,
+    ciphers_collections,
+    collections,
+    devices,
+    folders,
+    folders_ciphers,
+    invitations,
+    organizations,
+    twofactor,
+    users,
+    users_collections,
+    users_organizations,
+);

+ 5 - 1
src/main.rs

@@ -191,7 +191,11 @@ fn check_web_vault() {
 // https://docs.rs/diesel_migrations/*/diesel_migrations/macro.embed_migrations.html
 #[allow(unused_imports)]
 mod migrations {
-    embed_migrations!();
+    
+    #[cfg(feature = "sqlite")]
+    embed_migrations!("migrations/sqlite");
+    #[cfg(feature = "mysql")]
+    embed_migrations!("migrations/mysql");
 
     pub fn run_migrations() {
         // Make sure the database is up to date (create if it doesn't exist, or run the migrations)