54 changed files with 1292 additions and 534 deletions
			
			
		
								
									
										File diff suppressed because it is too large
									
								
							
						
					@ -0,0 +1,104 @@ | 
				
			|||
# Using multistage build:  | 
				
			|||
# 	https://docs.docker.com/develop/develop-images/multistage-build/ | 
				
			|||
# 	https://whitfin.io/speeding-up-rust-docker-builds/ | 
				
			|||
####################### VAULT BUILD IMAGE  ####################### | 
				
			|||
FROM alpine:3.10 as vault | 
				
			|||
 | 
				
			|||
ENV VAULT_VERSION "v2.12.0" | 
				
			|||
 | 
				
			|||
ENV URL "https://github.com/dani-garcia/bw_web_builds/releases/download/$VAULT_VERSION/bw_web_$VAULT_VERSION.tar.gz" | 
				
			|||
 | 
				
			|||
RUN apk add --no-cache --upgrade \ | 
				
			|||
    curl \ | 
				
			|||
    tar | 
				
			|||
 | 
				
			|||
RUN mkdir /web-vault | 
				
			|||
WORKDIR /web-vault | 
				
			|||
 | 
				
			|||
SHELL ["/bin/ash", "-eo", "pipefail", "-c"] | 
				
			|||
 | 
				
			|||
RUN curl -L $URL | tar xz | 
				
			|||
RUN ls | 
				
			|||
 | 
				
			|||
########################## BUILD IMAGE  ########################## | 
				
			|||
# We need to use the Rust build image, because | 
				
			|||
# we need the Rust compiler and Cargo tooling | 
				
			|||
FROM rust:1.36 as build | 
				
			|||
 | 
				
			|||
# set mysql backend | 
				
			|||
ARG DB=postgresql | 
				
			|||
 | 
				
			|||
# Using bundled SQLite, no need to install it | 
				
			|||
# RUN apt-get update && apt-get install -y\ | 
				
			|||
#    --no-install-recommends \ | 
				
			|||
#    sqlite3\ | 
				
			|||
# && rm -rf /var/lib/apt/lists/* | 
				
			|||
 | 
				
			|||
# Install MySQL package | 
				
			|||
RUN apt-get update && apt-get install -y \ | 
				
			|||
    --no-install-recommends \ | 
				
			|||
    libpq-dev \ | 
				
			|||
    && rm -rf /var/lib/apt/lists/* | 
				
			|||
 | 
				
			|||
# Creates a dummy project used to grab dependencies | 
				
			|||
RUN USER=root cargo new --bin app | 
				
			|||
WORKDIR /app | 
				
			|||
 | 
				
			|||
# Copies over *only* your manifests and build files | 
				
			|||
COPY ./Cargo.* ./ | 
				
			|||
COPY ./rust-toolchain ./rust-toolchain | 
				
			|||
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 --features ${DB} --release | 
				
			|||
RUN find . -not -path "./target*" -delete | 
				
			|||
 | 
				
			|||
# Copies the complete project | 
				
			|||
# To avoid copying unneeded files, use .dockerignore | 
				
			|||
COPY . . | 
				
			|||
 | 
				
			|||
# Make sure that we actually build the project | 
				
			|||
RUN touch src/main.rs | 
				
			|||
 | 
				
			|||
# Builds again, this time it'll just be | 
				
			|||
# your actual source files being built | 
				
			|||
RUN cargo build --features ${DB} --release | 
				
			|||
 | 
				
			|||
######################## RUNTIME IMAGE  ######################## | 
				
			|||
# Create a new stage with a minimal image | 
				
			|||
# because we already have a binary built | 
				
			|||
FROM debian:stretch-slim | 
				
			|||
 | 
				
			|||
ENV ROCKET_ENV "staging" | 
				
			|||
ENV ROCKET_PORT=80 | 
				
			|||
ENV ROCKET_WORKERS=10 | 
				
			|||
 | 
				
			|||
# Install needed libraries | 
				
			|||
RUN apt-get update && apt-get install -y \ | 
				
			|||
    --no-install-recommends \ | 
				
			|||
    openssl \ | 
				
			|||
    ca-certificates \ | 
				
			|||
    curl \ | 
				
			|||
    sqlite3 \ | 
				
			|||
    libpq5 \ | 
				
			|||
    && rm -rf /var/lib/apt/lists/* | 
				
			|||
 | 
				
			|||
RUN mkdir /data | 
				
			|||
VOLUME /data | 
				
			|||
EXPOSE 80 | 
				
			|||
EXPOSE 3012 | 
				
			|||
 | 
				
			|||
# Copies the files from the context (Rocket.toml file and web-vault) | 
				
			|||
# and the binary from the "build" stage to the current stage | 
				
			|||
COPY Rocket.toml . | 
				
			|||
COPY --from=vault /web-vault ./web-vault | 
				
			|||
COPY --from=build app/target/release/bitwarden_rs . | 
				
			|||
 | 
				
			|||
COPY docker/healthcheck.sh ./healthcheck.sh | 
				
			|||
 | 
				
			|||
HEALTHCHECK --interval=30s --timeout=3s CMD sh healthcheck.sh || exit 1 | 
				
			|||
 | 
				
			|||
# Configures the startup! | 
				
			|||
CMD ["./bitwarden_rs"] | 
				
			|||
@ -0,0 +1,86 @@ | 
				
			|||
# Using multistage build:  | 
				
			|||
# 	https://docs.docker.com/develop/develop-images/multistage-build/ | 
				
			|||
# 	https://whitfin.io/speeding-up-rust-docker-builds/ | 
				
			|||
####################### VAULT BUILD IMAGE  ####################### | 
				
			|||
FROM alpine:3.10 as vault | 
				
			|||
 | 
				
			|||
ENV VAULT_VERSION "v2.12.0" | 
				
			|||
 | 
				
			|||
ENV URL "https://github.com/dani-garcia/bw_web_builds/releases/download/$VAULT_VERSION/bw_web_$VAULT_VERSION.tar.gz" | 
				
			|||
 | 
				
			|||
RUN apk add --no-cache --upgrade \ | 
				
			|||
    curl \ | 
				
			|||
    tar | 
				
			|||
 | 
				
			|||
RUN mkdir /web-vault | 
				
			|||
WORKDIR /web-vault | 
				
			|||
 | 
				
			|||
SHELL ["/bin/ash", "-eo", "pipefail", "-c"] | 
				
			|||
 | 
				
			|||
RUN curl -L $URL | tar xz | 
				
			|||
RUN ls | 
				
			|||
 | 
				
			|||
########################## BUILD IMAGE  ########################## | 
				
			|||
# Musl build image for statically compiled binary | 
				
			|||
FROM clux/muslrust:nightly-2019-07-08 as build | 
				
			|||
 | 
				
			|||
# set mysql backend | 
				
			|||
ARG DB=postgresql | 
				
			|||
 | 
				
			|||
ENV USER "root" | 
				
			|||
 | 
				
			|||
# Install needed libraries | 
				
			|||
RUN apt-get update && apt-get install -y \ | 
				
			|||
    --no-install-recommends \ | 
				
			|||
    libpq-dev \ | 
				
			|||
    && rm -rf /var/lib/apt/lists/* | 
				
			|||
 | 
				
			|||
WORKDIR /app | 
				
			|||
 | 
				
			|||
# Copies the complete project | 
				
			|||
# To avoid copying unneeded files, use .dockerignore | 
				
			|||
COPY . . | 
				
			|||
 | 
				
			|||
RUN rustup target add x86_64-unknown-linux-musl | 
				
			|||
 | 
				
			|||
# Make sure that we actually build the project | 
				
			|||
RUN touch src/main.rs | 
				
			|||
 | 
				
			|||
# Build | 
				
			|||
RUN cargo build --features ${DB} --release | 
				
			|||
 | 
				
			|||
######################## RUNTIME IMAGE  ######################## | 
				
			|||
# Create a new stage with a minimal image | 
				
			|||
# because we already have a binary built | 
				
			|||
FROM alpine:3.10 | 
				
			|||
 | 
				
			|||
ENV ROCKET_ENV "staging" | 
				
			|||
ENV ROCKET_PORT=80 | 
				
			|||
ENV ROCKET_WORKERS=10 | 
				
			|||
ENV SSL_CERT_DIR=/etc/ssl/certs | 
				
			|||
 | 
				
			|||
# Install needed libraries | 
				
			|||
RUN apk add --no-cache \ | 
				
			|||
        openssl \ | 
				
			|||
        postgresql-libs \ | 
				
			|||
        curl \ | 
				
			|||
        sqlite \ | 
				
			|||
        ca-certificates | 
				
			|||
 | 
				
			|||
RUN mkdir /data | 
				
			|||
VOLUME /data | 
				
			|||
EXPOSE 80 | 
				
			|||
EXPOSE 3012 | 
				
			|||
 | 
				
			|||
# Copies the files from the context (Rocket.toml file and web-vault) | 
				
			|||
# and the binary from the "build" stage to the current stage | 
				
			|||
COPY Rocket.toml . | 
				
			|||
COPY --from=vault /web-vault ./web-vault | 
				
			|||
COPY --from=build /app/target/x86_64-unknown-linux-musl/release/bitwarden_rs . | 
				
			|||
 | 
				
			|||
COPY docker/healthcheck.sh ./healthcheck.sh | 
				
			|||
 | 
				
			|||
HEALTHCHECK --interval=30s --timeout=3s CMD sh healthcheck.sh || exit 1 | 
				
			|||
 | 
				
			|||
# Configures the startup! | 
				
			|||
CMD ["./bitwarden_rs"] | 
				
			|||
@ -0,0 +1 @@ | 
				
			|||
ALTER TABLE twofactor ADD COLUMN last_used INTEGER NOT NULL DEFAULT 0; | 
				
			|||
@ -0,0 +1,13 @@ | 
				
			|||
DROP TABLE devices; | 
				
			|||
DROP TABLE attachments; | 
				
			|||
DROP TABLE users_collections; | 
				
			|||
DROP TABLE users_organizations; | 
				
			|||
DROP TABLE folders_ciphers; | 
				
			|||
DROP TABLE ciphers_collections; | 
				
			|||
DROP TABLE twofactor; | 
				
			|||
DROP TABLE invitations; | 
				
			|||
DROP TABLE collections; | 
				
			|||
DROP TABLE folders; | 
				
			|||
DROP TABLE ciphers; | 
				
			|||
DROP TABLE users; | 
				
			|||
DROP TABLE organizations; | 
				
			|||
@ -0,0 +1,121 @@ | 
				
			|||
CREATE TABLE users ( | 
				
			|||
  uuid                CHAR(36) NOT NULL PRIMARY KEY, | 
				
			|||
  created_at          TIMESTAMP NOT NULL, | 
				
			|||
  updated_at          TIMESTAMP NOT NULL, | 
				
			|||
  email               VARCHAR(255) NOT NULL UNIQUE, | 
				
			|||
  name                TEXT     NOT NULL, | 
				
			|||
  password_hash       BYTEA     NOT NULL, | 
				
			|||
  salt                BYTEA     NOT NULL, | 
				
			|||
  password_iterations INTEGER  NOT NULL, | 
				
			|||
  password_hint       TEXT, | 
				
			|||
  akey                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, | 
				
			|||
  client_kdf_type     INTEGER NOT NULL DEFAULT 0, | 
				
			|||
  client_kdf_iter INTEGER NOT NULL DEFAULT 100000 | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE devices ( | 
				
			|||
  uuid          CHAR(36) NOT NULL PRIMARY KEY, | 
				
			|||
  created_at    TIMESTAMP NOT NULL, | 
				
			|||
  updated_at    TIMESTAMP NOT NULL, | 
				
			|||
  user_uuid     CHAR(36) NOT NULL REFERENCES users (uuid), | 
				
			|||
  name          TEXT     NOT NULL, | 
				
			|||
  atype         INTEGER  NOT NULL, | 
				
			|||
  push_token    TEXT, | 
				
			|||
  refresh_token TEXT     NOT NULL, | 
				
			|||
  twofactor_remember TEXT | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE organizations ( | 
				
			|||
  uuid          VARCHAR(40) NOT NULL PRIMARY KEY, | 
				
			|||
  name          TEXT NOT NULL, | 
				
			|||
  billing_email TEXT NOT NULL | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE ciphers ( | 
				
			|||
  uuid              CHAR(36) NOT NULL PRIMARY KEY, | 
				
			|||
  created_at        TIMESTAMP NOT NULL, | 
				
			|||
  updated_at        TIMESTAMP NOT NULL, | 
				
			|||
  user_uuid         CHAR(36) REFERENCES users (uuid), | 
				
			|||
  organization_uuid CHAR(36) REFERENCES organizations (uuid), | 
				
			|||
  atype             INTEGER  NOT NULL, | 
				
			|||
  name              TEXT     NOT NULL, | 
				
			|||
  notes             TEXT, | 
				
			|||
  fields            TEXT, | 
				
			|||
  data              TEXT     NOT NULL, | 
				
			|||
  favorite          BOOLEAN  NOT NULL, | 
				
			|||
  password_history  TEXT | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE attachments ( | 
				
			|||
  id          CHAR(36) NOT NULL PRIMARY KEY, | 
				
			|||
  cipher_uuid CHAR(36) NOT NULL REFERENCES ciphers (uuid), | 
				
			|||
  file_name   TEXT    NOT NULL, | 
				
			|||
  file_size   INTEGER NOT NULL, | 
				
			|||
  akey        TEXT | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE folders ( | 
				
			|||
  uuid       CHAR(36) NOT NULL PRIMARY KEY, | 
				
			|||
  created_at TIMESTAMP NOT NULL, | 
				
			|||
  updated_at TIMESTAMP NOT NULL, | 
				
			|||
  user_uuid  CHAR(36) NOT NULL REFERENCES users (uuid), | 
				
			|||
  name       TEXT     NOT NULL | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE collections ( | 
				
			|||
  uuid     VARCHAR(40) NOT NULL PRIMARY KEY, | 
				
			|||
  org_uuid VARCHAR(40) NOT NULL REFERENCES organizations (uuid), | 
				
			|||
  name     TEXT NOT NULL | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE users_collections ( | 
				
			|||
  user_uuid       CHAR(36) NOT NULL REFERENCES users (uuid), | 
				
			|||
  collection_uuid CHAR(36) NOT NULL REFERENCES collections (uuid), | 
				
			|||
  read_only       BOOLEAN NOT NULL DEFAULT false, | 
				
			|||
  PRIMARY KEY (user_uuid, collection_uuid) | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE users_organizations ( | 
				
			|||
  uuid       CHAR(36) NOT NULL PRIMARY KEY, | 
				
			|||
  user_uuid  CHAR(36) NOT NULL REFERENCES users (uuid), | 
				
			|||
  org_uuid   CHAR(36) NOT NULL REFERENCES organizations (uuid), | 
				
			|||
 | 
				
			|||
  access_all BOOLEAN NOT NULL, | 
				
			|||
  akey       TEXT    NOT NULL, | 
				
			|||
  status     INTEGER NOT NULL, | 
				
			|||
  atype      INTEGER NOT NULL, | 
				
			|||
 | 
				
			|||
  UNIQUE (user_uuid, org_uuid) | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE folders_ciphers ( | 
				
			|||
  cipher_uuid CHAR(36) NOT NULL REFERENCES ciphers (uuid), | 
				
			|||
  folder_uuid CHAR(36) NOT NULL REFERENCES folders (uuid), | 
				
			|||
  PRIMARY KEY (cipher_uuid, folder_uuid) | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE ciphers_collections ( | 
				
			|||
  cipher_uuid       CHAR(36) NOT NULL REFERENCES ciphers (uuid), | 
				
			|||
  collection_uuid CHAR(36) NOT NULL REFERENCES collections (uuid), | 
				
			|||
  PRIMARY KEY (cipher_uuid, collection_uuid) | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE twofactor ( | 
				
			|||
  uuid      CHAR(36) NOT NULL PRIMARY KEY, | 
				
			|||
  user_uuid CHAR(36) NOT NULL REFERENCES users (uuid), | 
				
			|||
  atype     INTEGER  NOT NULL, | 
				
			|||
  enabled   BOOLEAN  NOT NULL, | 
				
			|||
  data      TEXT     NOT NULL, | 
				
			|||
  UNIQUE (user_uuid, atype) | 
				
			|||
); | 
				
			|||
 | 
				
			|||
CREATE TABLE invitations ( | 
				
			|||
    email   VARCHAR(255) NOT NULL PRIMARY KEY | 
				
			|||
); | 
				
			|||
@ -0,0 +1,26 @@ | 
				
			|||
ALTER TABLE attachments ALTER COLUMN id TYPE CHAR(36); | 
				
			|||
ALTER TABLE attachments ALTER COLUMN cipher_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE users ALTER COLUMN uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE users ALTER COLUMN email TYPE VARCHAR(255); | 
				
			|||
ALTER TABLE devices ALTER COLUMN uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE devices ALTER COLUMN user_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE organizations ALTER COLUMN uuid TYPE CHAR(40); | 
				
			|||
ALTER TABLE ciphers ALTER COLUMN uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE ciphers ALTER COLUMN user_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE ciphers ALTER COLUMN organization_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE folders ALTER COLUMN uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE folders ALTER COLUMN user_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE collections ALTER COLUMN uuid TYPE CHAR(40); | 
				
			|||
ALTER TABLE collections ALTER COLUMN org_uuid TYPE CHAR(40); | 
				
			|||
ALTER TABLE users_collections ALTER COLUMN user_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE users_collections ALTER COLUMN collection_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE users_organizations ALTER COLUMN uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE users_organizations ALTER COLUMN user_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE users_organizations ALTER COLUMN org_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE folders_ciphers ALTER COLUMN cipher_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE folders_ciphers ALTER COLUMN folder_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE ciphers_collections ALTER COLUMN cipher_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE ciphers_collections ALTER COLUMN collection_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE twofactor ALTER COLUMN uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE twofactor ALTER COLUMN user_uuid TYPE CHAR(36); | 
				
			|||
ALTER TABLE invitations ALTER COLUMN email TYPE VARCHAR(255); | 
				
			|||
@ -0,0 +1,27 @@ | 
				
			|||
-- Switch from CHAR() types to VARCHAR() types to avoid padding issues. | 
				
			|||
ALTER TABLE attachments ALTER COLUMN id TYPE TEXT; | 
				
			|||
ALTER TABLE attachments ALTER COLUMN cipher_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE users ALTER COLUMN uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE users ALTER COLUMN email TYPE TEXT; | 
				
			|||
ALTER TABLE devices ALTER COLUMN uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE devices ALTER COLUMN user_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE organizations ALTER COLUMN uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE ciphers ALTER COLUMN uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE ciphers ALTER COLUMN user_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE ciphers ALTER COLUMN organization_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE folders ALTER COLUMN uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE folders ALTER COLUMN user_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE collections ALTER COLUMN uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE collections ALTER COLUMN org_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE users_collections ALTER COLUMN user_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE users_collections ALTER COLUMN collection_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE users_organizations ALTER COLUMN uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE users_organizations ALTER COLUMN user_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE users_organizations ALTER COLUMN org_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE folders_ciphers ALTER COLUMN cipher_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE folders_ciphers ALTER COLUMN folder_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE ciphers_collections ALTER COLUMN cipher_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE ciphers_collections ALTER COLUMN collection_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE twofactor ALTER COLUMN uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE twofactor ALTER COLUMN user_uuid TYPE VARCHAR(40); | 
				
			|||
ALTER TABLE invitations ALTER COLUMN email TYPE TEXT; | 
				
			|||
@ -0,0 +1 @@ | 
				
			|||
ALTER TABLE twofactor ADD COLUMN last_used INTEGER NOT NULL DEFAULT 0; | 
				
			|||
@ -0,0 +1 @@ | 
				
			|||
ALTER TABLE twofactor ADD COLUMN last_used INTEGER NOT NULL DEFAULT 0; | 
				
			|||
@ -1 +1 @@ | 
				
			|||
nightly-2019-08-27 | 
				
			|||
nightly-2019-10-14 | 
				
			|||
 | 
				
			|||
@ -0,0 +1,173 @@ | 
				
			|||
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, | 
				
			|||
        last_used -> Integer, | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
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, | 
				
			|||
); | 
				
			|||
| 
		 After Width: | Height: | Size: 9.7 KiB  | 
					Loading…
					
					
				
		Reference in new issue