Compare commits

...

34 Commits

Author SHA1 Message Date
Jan Schöppach
3c703f517d
Update to .NET 8.0 to fix building with bitwarden v2024.2.2 (#187)
* Update to .NET 8.0 to fix building with bitwarden v2024.2.2

* Also update license gen to .NET 8.0
2024-02-22 23:16:34 +00:00
Rakesh
b93c9487eb
Update License to use Secrets Manager fully (#182) 2024-01-19 18:02:14 +00:00
Ayitaka
e173c06320
Updated license version to 12, added SM options, increased max seats (short to int) (#172)
* - Updated license version to 12
- Added new SM license options

* Change seats, smseats, smserviceaccounts from short to int, like they are in the Bitwarden server code, to allow for the accurate maximum amount of seats
2023-11-29 12:07:21 +00:00
Ayitaka
80c0808e72
Update licenseGen with latest version and options (#165)
- Changed Version to 10
- Uncommented UseScim
- Added UseCustomPermissions
2023-04-21 14:24:41 +02:00
h44z
b819fe0c7d
update to dotnet 6.0 (#148) (#150) 2022-09-01 14:43:34 -07:00
h44z
960894cff4
update/remove json lib (#146)
* update/remove json lib

* remove json lib
2022-08-16 13:34:17 -07:00
h44z
6038a8668b
License gen fixes (#145)
* set default storage space to max (#122)

* update license fields to newest version

* strange characters for non-interactive mode (#123)
2022-08-16 22:32:39 +02:00
Alexander Detsch
101f078a98
Update README, E-Mail Verification constraint (#140)
thanks =)
2022-06-27 22:01:37 +02:00
Grommish
338ea68b08
BitBetter: update build.sh / update-bitwarden.sh (#135)
* BitBetter: update build.sh / update-bitwarden.sh

Bitwarden has changed the way they report version numbers for
self-hosted installations.

Fixes https://github.com/jakeswenson/BitBetter/issues/134

Credit to @Ayitaka for the fix

Tested and Verified, Updated install to 1.47.1

Signed-off-by: Donald Hoskins <grommish@gmail.com>

* Update build.sh

Remove extraneous comment
2022-04-08 21:49:08 -07:00
h44z
a58baf0186
Update README (#132)
- Update tested version
 - Add hint for upgrading from versions prior to 1.46.2
 - Add hint for Families Organization license
2022-03-22 11:49:13 +00:00
h44z
50cdb10b2c
Fix #128 (#129)
Fix #128
2022-03-21 21:20:32 +01:00
Reliacon Developer
d2377d0f84
Update bitwarden.sh path (#127)
* Update bitwarden.sh path

* Update update-bitwarden.sh

Co-authored-by: Alex Pearce <alexpearce92@gmail.com>
2022-03-03 19:28:02 +01:00
Grommish
0f2f9274cf
update-bitwarden.sh: Fix relative path (#111)
* update-bitwarden.sh: Fix relative path

update-bitwarden.sh attempted to update BitBetter via
./build.sh, but if run via crontab, you aren't in
the BitBetter directory.

Fixed to find it correctly.

Signed-off-by: Donald Hoskins <grommish@gmail.com>

* Update update-bitwarden.sh

Co-authored-by: h44z <christoph.h@sprinternet.at>

Co-authored-by: h44z <christoph.h@sprinternet.at>
2021-08-31 11:40:37 +02:00
clanto007
af2d744061
fix '3.1.0' was not found (#116)
* Update build.sh

* Update Dockerfile

* Update bitBetter.csproj

* Update Dockerfile

* Update Dockerfile

* Update licenseGen.csproj

* Apply suggestions from code review

Co-authored-by: h44z <christoph.h@sprinternet.at>

* Update src/licenseGen/Dockerfile

Co-authored-by: h44z <christoph.h@sprinternet.at>

* Update src/licenseGen/Dockerfile

Co-authored-by: h44z <christoph.h@sprinternet.at>
2021-08-31 10:18:29 +02:00
captainhook
a17681e82b
fix integer type (#110)
fix integer type for GenerateOrgLicense's "Seats" value
2021-08-09 18:10:49 +02:00
captainhook
21bffcf262
Update update-bitwarden.sh (#95)
Prune Docker images to reclaim space
2021-03-17 10:38:54 +01:00
p0thi
59ee2e3c3a
Make update-bitwarden.sh able to run non-interactive (#90)
* make update-bitwarden.sh able to run non-interactive

* changed script to be runnable by bash 3.x & README entry edited
2021-01-27 14:51:13 +01:00
kerenon
7ddf01fdf6
MaxStorageGb customization (#88)
* MaxStorageGb customization

* Defaulting to short.MaxValue if user entry is blank

* Update text prompt
2020-11-26 13:04:18 +00:00
captainhook
46934b0ddd
Update README.md (#84)
Correct licenseGen build step

Co-authored-by: h44z <christoph.h@sprinternet.at>
2020-10-06 14:52:55 +01:00
Joe S
a5516220fd
Fix wrong directory mistake, fix grammer (#83)
Fixed the license generator section
2020-10-06 15:49:47 +02:00
h44z
91d0155725
Fix build.sh and update script (#75) (#77)
* possible fix for #75

* Remove outdated bitbetter images as suggested by Ayitaka

* Fix exit status if no old images have been removed
2020-09-19 23:36:15 +01:00
h44z
f2b3b1babf
Updates 1.34.0 (#69)
* Use latest release of bitwarden as base image (#67, #66)

* Add a script which simplifies Bitwarden updates

* fix typo

* Add UseApi

* Updated version, created update section

* Workaround for docker-compose --ignore-pull-failures bugs (4377 and 7127)

* use version from docker script

* check if bitbetter images are outdated

Co-authored-by: Lework <kuailemy123@163.com>
Co-authored-by: Jake Swenson <jakeswenson@users.noreply.github.com>
Co-authored-by: Jeff Alyanak <jeff@alyanak.ca>
2020-09-10 15:39:20 -04:00
captainhook
7d8f0b1082
Make Sso available in org license (#73)
* Exclude cert.cert from git

* Use latest release of bitwarden as base image (#67, #66)

* Add a script which simplifies Bitwarden updates

* fix typo

* Add UseApi

* Updated version, created update section

* Workaround for docker-compose --ignore-pull-failures bugs (4377 and 7127)

* use version from docker script

* check if bitbetter images are outdated

* Make Sso available in org license

Add `UseSso` var and enable

* Update README.md

Co-authored-by: Christoph Haas <christoph.h@sprinternet.at>
Co-authored-by: Lework <kuailemy123@163.com>
Co-authored-by: Captainhook <ec14018@qmul.ac.uk>
2020-09-10 15:36:44 -04:00
h44z
6527ac8362
Exclude cert.cert from git (#68) 2020-09-10 11:59:12 -07:00
accolon
faf7833f44
Make policies available in generated org licenses. (#56)
* Make policies available in generated org licenses.

* Change license version to current value used in BitWarden. Add info about compatibility in README file.
2020-03-17 12:19:18 +00:00
Michiel Hazelhof
006fa1fecf
Update .net core and newtonsoft.json
Co-authored-by: Michiel Hazelhof <m.hazelhof@fyn.nl>

Due to compatibility issues laid out in issue #53:

Update from .net core 2.0 to 3.1 and newtonsoft.json 12.0.1 to 12.0.3.
2020-03-14 07:00:25 -04:00
Jan Schöppach
9c62a6f2ca
Update README.md (#50)
* Update README.md

Added note that testing has been done up to Bitwarden 1.32.0.

Replaced editing of `docker-compose.yml` with the update-resistant usage
of `docker-compose.override.yml`
2020-02-27 13:05:29 -05:00
Jeff Alyanak
a2189a874e
Updated Readme (#44)
* Updated Readme

Better description of dependencies, updated readme.

* Fixed default key directory

Script was not looking in the right place for the auto-generated key directory. This patch fixes issue #35.

* Cleans up Key Directory Patch

Key directory path fix was echoing the directory when run.
2020-01-18 14:33:03 -05:00
Jeff Alyanak
d98d4cad6a
Fixed default key directory (#46)
* Fixed default key directory

Script was not looking in the right place for the auto-generated key directory. This patch fixes issue #35.

* Cleans up Key Directory Patch

Key directory path fix was echoing the directory when run.
2019-12-27 19:25:41 -05:00
Vinrobot
3e44d7347b Improve build and scripts (#30)
* Use absolute path rather than relative path in scripts

* Remove src/bitBetter/.keys/cert.cert

* Build licenseGen in Docker
This way we don't have to install dotnet sdk on the host

* Build bitBetter in Docker
This way we don't have to install dotnet sdk on the host

* Change DIR in run.sh to point to the project root

* Replace echo in Dockerfiles by set -x and set -e

* Use same Dockerfile for api and identity images

* Update README.md

* Update CircleCI config
The Docker Executor can't mount volume.
https://support.circleci.com/hc/en-us/articles/360007324514
https://circleci.com/docs/2.0/executor-types/#using-machine

* Make scripts work with sh

* Remove the container used to build bitBetter
2019-07-07 12:18:27 -04:00
Jan Schöppach
5d01d3c661 Fix recreation of keys on every execution (#27)
* Fix recreation of keys on every execution
2019-06-19 09:34:33 -04:00
Jeff Alyanak
6c8789cd67
License Generator Interactive Mode (#23)
* Added a Key Generating script

To make the keygen process a bit easier I've added a `generate-keys.sh` script that can be found in the `.keys` directory. It will generate the key & cert and bundle them into the required pkcs#12 file.

I've updated the readme to include instructions on the script.

* Generate bitbetter/identiry container with modified Core.dll

Added the generation of a second modified container, bitbetter/identity, which contains the modified dll. Fixes #12.

This works on my testing environment but has not gone through extensive testing. I'd recommend a review and cleanup of this commit before it is merged into the develop or master branches.

* Updated Docs

I've taken the steps written out by @online-stuff and consolidated/organized them into the README. This closes #13.

In a future update it might be worth adding a docs/ directory and breaking the readme into several docs that link to one another.

* Updated build.sh

Build now checks for and creates missing .keys directories.

* Added subj to allow for non-interactive use.

* Generate keys on build.

* Circle-ci needs to gen keys to test build

* Generate keys if they don't exist.

Don't overwrite if keys already exist.

* Generate keys online in the .keys directory

* Updated README.md

* Added initial interactive options

* Functional implementation of licensegen interactive mode.

* Bumped Newtonson.Json version

Never versions of the dotnet-sdk have issues with older Newtonsoft versions. 12.0.1 seems to satisfy the widest variety of sdk versions.

* Removing old readme

* Removed Duplicate Section

* Fixed typo

This fixes and closes issue #24.
2019-06-05 14:19:39 -04:00
Jeff Alyanak
15371c362c
Bitbetter identity Core.dll (#14)
* Added a Key Generating script

To make the keygen process a bit easier I've added a `generate-keys.sh` script that can be found in the `.keys` directory. It will generate the key & cert and bundle them into the required pkcs#12 file automatically when running the build script if none already exist.

* Generate bitbetter/identiry container with modified Core.dll

Added the generation of a second modified container, bitbetter/identity, which contains the modified dll. Fixes #12.

This works on my testing environment but has not gone through extensive testing. I'd recommend a review and cleanup of this commit before it is merged into the develop or master branches.
2019-05-25 18:12:10 -04:00
Jeff Alyanak
5f85d83e45 Updated Docs (#15)
* Updated Docs

I've taken the steps written out by @online-stuff and consolidated/organized them into the README. This closes #13.

In a future update it might be worth adding a docs/ directory and breaking the readme into several docs that link to one another.

* Fixed Broken section Links
2019-05-20 22:21:10 -07:00
18 changed files with 576 additions and 187 deletions

View File

@ -1,15 +1,15 @@
version: 2
jobs:
build:
docker:
- image: microsoft/dotnet:2-sdk
machine: true
steps:
- checkout
- run:
name: Print the Current Time
command: date
- setup_remote_docker
- run: { name: 'Get docker', command: 'curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh' }
- run:
name: Generate Keys
command: ./.keys/generate-keys.sh
- run:
name: Build script
command: ./build.sh

3
.gitignore vendored
View File

@ -4,4 +4,5 @@ obj/
*.dll
*.pem
.vscode/
*.pfx
*.pfx
*.cert

View File

@ -1 +0,0 @@
Need an empty folder

20
.keys/generate-keys.sh Executable file
View File

@ -0,0 +1,20 @@
#!/bin/sh
# Check for openssl
command -v openssl >/dev/null 2>&1 || { echo >&2 "openssl required but not found. Aborting."; exit 1; }
DIR=`dirname "$0"`
DIR=`exec 2>/dev/null;(cd -- "$DIR") && cd -- "$DIR"|| cd "$DIR"; unset PWD; /usr/bin/pwd || /bin/pwd || pwd`
# Remove any existing key files
[ ! -e "$DIR/cert.pem" ] || rm "$DIR/cert.pem"
[ ! -e "$DIR/key.pem" ] || rm "$DIR/key.pem"
[ ! -e "$DIR/cert.cert" ] || rm "$DIR/cert.cert"
[ ! -e "$DIR/cert.pfx" ] || rm "$DIR/cert.pfx"
# Generate new keys
openssl req -x509 -newkey rsa:4096 -keyout "$DIR/key.pem" -out "$DIR/cert.cert" -days 36500 -subj '/CN=www.mydom.com/O=My Company Name LTD./C=US' -outform DER -passout pass:test
openssl x509 -inform DER -in "$DIR/cert.cert" -out "$DIR/cert.pem"
openssl pkcs12 -export -out "$DIR/cert.pfx" -inkey "$DIR/key.pem" -in "$DIR/cert.pem" -passin pass:test -passout pass:test
ls

174
README.md
View File

@ -1,61 +1,167 @@
# BitBetter
This project is a tool to modify bitwardens core dll to allow me to self license.
Beware this does janky IL magic to rewrite the bitwarden core dll and install my self signed certificate.
BitBetter is is a tool to modify Bitwarden's core dll to allow you to generate your own individual and organisation licenses. **You must have an existing installation of Bitwarden for BitBetter to modify.**
Yes, there still are quite a few things that need to be fixed. Updates and Organization Buiness Name is hardcoded to Bitbetter, are the first to things to fix.. Better handling of the User-GUID comes to mind too.
Please see the FAQ below for details on why this software was created.
Credit to https://github.com/h44z/BitBetter and https://github.com/jakeswenson/BitBetter
_Beware! BitBetter does janky stuff to rewrite the bitwarden core dll and allow the installation of a self signed certificate. Use at your own risk!_
## Building
Credit to https://github.com/h44z/BitBetter and https://github.com/jakeswenson/BitBetter
To build your own `bitwarden/api` image run
# Table of Contents
- [BitBetter](#bitbetter)
- [Table of Contents](#table-of-contents)
- [Getting Started](#getting-started)
- [Dependencies](#dependencies)
- [Setting up BitBetter](#setting-up-bitbetter)
- [Building BitBetter](#building-bitbetter)
- [Note: Manually generating Certificate & Key](#note-manually-generating-certificate--key)
- [Updating Bitwarden and BitBetter](#updating-bitwarden-and-bitbetter)
- [Generating Signed Licenses](#generating-signed-licenses)
- [Note: Alternative Ways to Generate License](#note-alternative-ways-to-generate-license)
- [FAQ: Questions you might have.](#faq-questions-you-might-have)
- [Why build a license generator for open source software?](#why-build-a-license-generator-for-open-source-software)
- [Shouldn't you have reached out to Bitwarden to ask them for alternative licensing structures?](#shouldnt-you-have-reached-out-to-bitwarden-to-ask-them-for-alternative-licensing-structures)
- [Footnotes](#footnotes)
# Getting Started
The following instructions are for unix-based systems (Linux, BSD, macOS), it is possible to use a Windows systems assuming you are able to enable and install [WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10).
## Dependencies
Aside from docker, which you also need for Bitwarden, BitBetter requires the following:
* Bitwarden (tested with 1.47.1, might work on lower versions)
* openssl (probably already installed on most Linux or WSL systems, any version should work)
## Setting up BitBetter
With your dependencies installed, begin the installation of BitBetter by downloading it through Github or using the git command:
```bash
git clone https://github.com/jakeswenson/BitBetter.git
```
## Building BitBetter
Now that you've set up your build environment, you can **run the main build script** to generate a modified version of the `bitwarden/api` and `bitwarden/identity` docker images.
From the BitBetter directory, simply run:
```bash
./build.sh
```
replace anywhere `bitwarden/api` is used with `bitbetter/api` and give it a go. no promises
This will create a new self-signed certificate in the `.keys` directory if one does not already exist and then create a modified version of the official `bitwarden/api` called `bitbetter/api` and a modified version of the `bitwarden/identity` called `bitbetter/identity`.
## Issuing your own licenses
You may now simply create the file `/path/to/bwdata/docker/docker-compose.override.yml` with the following contents to utilize the modified images.
The repo is setup to replace the licesning signing cert in bitwarden.core with your own personal self signed cert (`cert.pfx`)
If you want to be able to sign your own licenses obviously you'll have to replace it with your own self signed cert.
```yaml
version: '3'
services:
api:
image: bitbetter/api
### Signing licesnses
There is a tool included to generate a license (see `src/liceseGen/`)
generate a PFX above using a password of `test` and then build the tool using:
```bash
./src/licenseGen/build.sh
identity:
image: bitbetter/identity
```
This tool build ontop of the bitbetter/api container image so make sure you've built that above using the root `./build.sh` script.
You'll also want to edit the `/path/to/bwdata/scripts/run.sh` file. In the `function restart()` block, comment out the call to `dockerComposePull`.
After that you can run the tool using:
> Replace `dockerComposePull`<br>with `#dockerComposePull`
You can now start or restart Bitwarden as normal and the modified api will be used. **It is now ready to accept self-issued licenses.**
---
### Note: Manually generating Certificate & Key
If you wish to generate your self-signed cert & key manually, you can run the following commands.
```bash
cd ~/BitBetter/src/licenseGen
./run.sh ~/BitBetter/.keys/cert.pfx user "Name" "EMail" "User-GUID"
./run.sh ~/BitBetter/.keys/cert.pfx org "Name" "EMail" "Install-ID used to install the server"
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.cert -days 36500 -outform DER -passout pass:test
openssl x509 -inform DER -in cert.cert -out cert.pem
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem -passin pass:test -passout pass:test
```
# Questions (you might have?)
> Note that the password here must be `test`.<sup>[1](#f1)</sup>
I'll work on updates in the next couple weeks, right now, I just wanted something to start with.
---
## But why? Its open source?
## Updating Bitwarden and BitBetter
Yes, bitwarden is great. If I didn't care about it i wouldn't be doing this.
I was bothered that if i want to host bitwarden myself, at my house,
for my family to use (with the ability to share access) I would still have to pay a monthly ENTERPRISE organization fee.
To host it myself. And maintain it myself. Basically WTH was bitwarden doing that I was paying them for?
To update Bitwarden, the provided `update-bitwarden.sh` script can be used. It will rebuild the BitBetter images and automatically update Bitwarden afterwards. Docker pull errors can be ignored for api and identity images.
## You should have reached out to bitwarden
You can either run this script without providing any parameters in interactive mode (`./update-bitwarden.sh`) or by setting the parameters as follows, to run the script in non-interactive mode:
```bash
./update-bitwarden.sh param1 param2 param3
```
`param1`: The path to the directory containing your bwdata directory
Thanks, good idea. And I did. Currently they're not focused on solving this issue - yet.
To be clear i'm totally happy to give them my money. Offer a perpetual server license, and i'd pay for it. Let me license the server, period. Allow an orginzation to have Premium for all users.. 500 seats, let the 500 users in the orginzation have the Premium features too.
`param2`: If you want the docker-compose file to be overwritten (either `y` or `n`)
`param3`: If you want the bitbetter images to be rebuild (either `y` or `n`)
If you are updating from versions <= 1.46.2, you may need to run `update-bitwarden.sh` twice to complete the update process.
## Generating Signed Licenses
There is a tool included in the directory `src/licenseGen/` that will generate new individual and organization licenses. These licenses will be accepted by the modified Bitwarden because they will be signed by the certificate you generated in earlier steps.
First, from the `BitBetter/src/licenseGen` directory, **build the license generator**.<sup>[2](#f2)</sup>
```bash
./build.sh
```
In order to run the tool and generate a license you'll need to get a **user's GUID** in order to generate an **invididual license** or the server's **install ID** to generate an **Organization license**. These can be retrieved most easily through the Bitwarden [Admin Portal](https://help.bitwarden.com/article/admin-portal/).
**The user must have a verified email address at the time of license import, otherwise Bitwarden will reject the license key. Nevertheless, the license key can be generated even before the user's email is verified.**
If you generated your keys in the default `BitBetter/.keys` directory, you can **simply run the license gen in interactive mode** from the `Bitbetter` directory and **follow the prompts to generate your license**.
```bash
./src/licenseGen/run.sh interactive
```
**The license generator will spit out a JSON-formatted license which can then be used within the Bitwarden web front-end to license your user or org!**
---
### Note: Alternative Ways to Generate License
If you wish to run the license gen from a directory aside from the root `BitBetter` one, you'll have to provide the absolute path to your cert.pfx.
```bash
./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx interactive
```
Additional, instead of interactive mode, you can also pass the parameters directly to the command as follows.
```bash
./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx user "Name" "E-Mail" "User-GUID" ["Storage Space in GB"] ["Custom LicenseKey"]
./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx org "Name" "E-Mail" "Install-ID used to install the server" ["Storage Space in GB"] ["Custom LicenseKey"]
```
---
# FAQ: Questions you might have.
## Why build a license generator for open source software?
We agree that Bitwarden is great. If we didn't care about it then we wouldn't be doing this. We believe that if a user wants to host Bitwarden themselves, in their house, for their family to use and with the ability to share access, they would still have to pay a **monthly** enterprise organization fee. When hosting and maintaining the software yourself there is no need to pay for the level of service that an enterprise customer needs.
Unfortunately, Bitwarden doesn't seem to have any method for receiving donations so we recommend making a one-time donation to your open source project of choice for each BitBetter license you generate if you can afford to do so.
## Shouldn't you have reached out to Bitwarden to ask them for alternative licensing structures?
In the past we have done so but they were not focused on the type of customer that would want a one-time license and would be happy to sacrifice customer service. We believe the features that are currently behind this subscription paywall to be critical ones and believe they should be available to users who can't afford an enterprise payment structure. We'd even be happy to see a move towards a Gitlab-like model where premium features are rolled out *first* to the enterprise subscribers before being added to the fully free version.
UPDATE: Bitwarden now offers a cheap license called [Families Organization](https://bitwarden.com/pricing/) that provides premium features and the ability to self-host Bitwarden for six persons.
# Footnotes
<a name="#f1"><sup>1</sup></a> If you wish to change this you'll need to change the value that `src/licenseGen/Program.cs` uses for its `GenerateUserLicense` and `GenerateOrgLicense` calls. Remember, this is really unnecessary as this certificate does not represent any type of security-related certificate.
<a name="#f2"><sup>2</sup></a>This tool builds on top of the `bitbetter/api` container image so make sure you've built that above using the root `./build.sh` script.
I'm still in the testing/evaluating phase. If I am hosting the server/data, let me license the server, period. How many licenses does one user need to have...

View File

@ -1,95 +0,0 @@
These are the commands I used (and a few of my notes) for a minimal Debian Stretch install..
Software Selection - "SSH server" and 'standard system utilities" only
sudo apt-get update
sudo apt-get install vim vim-doc vim-scripts wget curl git
sudo apt-get dist-upgrade
sudo reboot
---The next few lines I setup my server authentication and other misc profile settings you can skip until sudo apt-get
ssh-keygen
echo "ssh-rsa AA...1Q== " >> .ssh/authorized_keys
echo ":set mouse=" >> .vimrc
echo "set nocompatible" >> .vimrc
vi .bashrc
sudo visudo ---- tom ALL=(ALL) NOPASSWD:ALL
sudo vi /etc/ssh/sshd_config - Enable 'PermitRootLogin prohibit-password' and 'PasswordAuthentication no'
sudo apt-get update
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce
sudo systemctl status docker
sudo usermod -aG docker ${USER}
exit
id -nG
docker version
docker info
docker run hello-world
sudo curl -L --fail https://github.com/docker/compose/releases/download/1.23.1/run.sh -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg
sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
wget -q https://packages.microsoft.com/config/debian/9/prod.list
sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list
curl -s -o bitwarden.sh https://raw.githubusercontent.com/bitwarden/core/master/scripts/bitwarden.sh && sudo chmod u+x bitwarden.sh
./bitwarden.sh install
sudo apt-get update
sudo apt-get install dotnet-sdk-2.1
git clone https://github.com/online-stuff/BitBetter.git
cd BitBetter/src/licenseGen/
dotnet add package Newtonsoft.Json --version 11.0.0
cd ~/BitBetter/src/bitBetter
dotnet add package Newtonsoft.Json --version 11.0.0
cd ~/BitBetter/.keys
rm *
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.cert -days 36500 -outform DER -passout pass:test
openssl x509 -inform DER -in cert.cert -out cert.pem
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem -passin pass:test -passout pass:test
cd ~/BitBetter
./build.sh
cd src/licenseGen/
./build.sh
cd ~
vi ~/bwdata/docker/docker-compose.yml - Change image: bitwarden/api:1.26.0 to image: bitbetter/api
vi ~/bwdata/env/global.override.env - Enter mail__smtp relay settings
vi ~/bwdata/scripts/run.sh - function restart() { dockerComposePull to #dockerComposePull
./bitwarden start
----Server should be up and running.. Create a user account
cd ~/BitBetter/src/licenseGen/
./build.sh
./run.sh ~/BitBetter/.keys/cert.pfx user "Name" "EMail" "User-GUID"
Get User-GUID from the admin portal of the BitWarden server
./run.sh ~/BitBetter/.keys/cert.pfx org "Name" "EMail" "Install-ID used to install the server from bitwarden.com/host"

View File

@ -1,13 +1,28 @@
#!/bin/bash
#!/bin/sh
mkdir ./src/bitBetter/.keys
DIR=`dirname "$0"`
DIR=`exec 2>/dev/null;(cd -- "$DIR") && cd -- "$DIR"|| cd "$DIR"; unset PWD; /usr/bin/pwd || /bin/pwd || pwd`
BW_VERSION=$(curl -sL https://go.btwrdn.co/bw-sh-versions | grep '^ *"'coreVersion'":' | awk -F\: '{ print $2 }' | sed -e 's/,$//' -e 's/^"//' -e 's/"$//')
cp .keys/cert.cert ./src/bitBetter/.keys
echo "Building BitBetter for BitWarden version $BW_VERSION"
cd ./src/bitBetter
# If there aren't any keys, generate them first.
[ -e "$DIR/.keys/cert.cert" ] || "$DIR/.keys/generate-keys.sh"
dotnet restore
dotnet publish
[ -e "$DIR/src/bitBetter/.keys" ] || mkdir "$DIR/src/bitBetter/.keys"
docker build --pull . -t bitbetter/api # --squash
cp "$DIR/.keys/cert.cert" "$DIR/src/bitBetter/.keys"
docker run --rm -v "$DIR/src/bitBetter:/bitBetter" -w=/bitBetter mcr.microsoft.com/dotnet/sdk:8.0 sh build.sh
docker build --no-cache --build-arg BITWARDEN_TAG=bitwarden/api:$BW_VERSION --label com.bitwarden.product="bitbetter" -t bitbetter/api "$DIR/src/bitBetter" # --squash
docker build --no-cache --build-arg BITWARDEN_TAG=bitwarden/identity:$BW_VERSION --label com.bitwarden.product="bitbetter" -t bitbetter/identity "$DIR/src/bitBetter" # --squash
docker tag bitbetter/api bitbetter/api:latest
docker tag bitbetter/identity bitbetter/identity:latest
docker tag bitbetter/api bitbetter/api:$BW_VERSION
docker tag bitbetter/identity bitbetter/identity:$BW_VERSION
# Remove old instances of the image after a successful build.
ids=$( docker images bitbetter/* | grep -E -v -- "CREATED|latest|${BW_VERSION}" | awk '{ print $3 }' )
[ -n "$ids" ] && docker rmi $ids || true

Binary file not shown.

View File

@ -1,12 +1,11 @@
FROM bitwarden/api
ARG BITWARDEN_TAG
FROM ${BITWARDEN_TAG}
COPY bin/Debug/netcoreapp2.0/publish/* /bitBetter/
COPY bin/Release/netcoreapp8.0/publish/* /bitBetter/
COPY ./.keys/cert.cert /newLicensing.cer
RUN dotnet /bitBetter/bitBetter.dll && \
echo "modified dll" && \
RUN set -e; set -x; \
dotnet /bitBetter/bitBetter.dll && \
mv /app/Core.dll /app/Core.orig.dll && \
mv /app/modified.dll /app/Core.dll && \
echo "replaced dll" && \
rm -rf /bitBetter && rm -rf /newLicensing.cer && \
echo "cleaned up"
rm -rf /bitBetter && rm -rf /newLicensing.cer

View File

@ -51,10 +51,10 @@ namespace bitwardenSelfLicensor
var existingCert = new X509Certificate2(x.GetResourceData());
Console.WriteLine($"Existing Cert Thumbprin: {existingCert.Thumbprint}");
Console.WriteLine($"Existing Cert Thumbprint: {existingCert.Thumbprint}");
X509Certificate2 certificate = new X509Certificate2(cert);
Console.WriteLine($"New cert Thumbprint: {certificate.Thumbprint}");
Console.WriteLine($"New Cert Thumbprint: {certificate.Thumbprint}");
var ctor = licensingType.GetConstructors().Single();

View File

@ -2,11 +2,11 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<TargetFramework>netcoreapp8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Mono.Cecil" Version="0.10.0-beta6" />
<PackageReference Include="Mono.Cecil" Version="0.11.2" />
</ItemGroup>
</Project>

7
src/bitBetter/build.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/bash
set -e
set -x
dotnet restore
dotnet publish

View File

@ -1,5 +1,17 @@
FROM mcr.microsoft.com/dotnet/sdk:8.0 as build
WORKDIR /licenseGen
COPY . /licenseGen
RUN set -e; set -x; \
dotnet add package Newtonsoft.Json --version 13.0.1 \
&& dotnet restore \
&& dotnet publish
FROM bitbetter/api
COPY bin/Debug/netcoreapp2.0/publish/* /app/
COPY --from=build /licenseGen/bin/Release/netcoreapp8.0/publish/* /app/
ENTRYPOINT [ "dotnet", "/app/licenseGen.dll", "--core", "/app/Core.dll", "--cert", "/cert.pfx" ]
ENTRYPOINT [ "dotnet", "/app/licenseGen.dll", "--core", "/app/Core.dll", "--cert", "/cert.pfx" ]

View File

@ -33,11 +33,141 @@ namespace bitwardenSelfLicensor
certExists() && coreExists();
}
app.Command("interactive", config =>
{
string buff="", licensetype="", name="", email="", businessname="";
short storage = 0;
bool valid_guid = false, valid_installid = false;
Guid guid = new Guid(), installid = new Guid();
config.OnExecute(() =>
{
if (!verifyTopOptions())
{
if (!coreExists()) config.Error.WriteLine($"Cant find core dll at: {coreDll.Value()}");
if (!certExists()) config.Error.WriteLine($"Cant find certificate at: {cert.Value()}");
config.ShowHelp();
return 1;
}
WriteLine("Interactive license mode...");
while (licensetype == "")
{
WriteLine("What would you like to generate, a [u]ser license or an [o]rg license?");
buff = Console.ReadLine();
if(buff == "u")
{
licensetype = "user";
WriteLineOver("Okay, we will generate a user license.");
while (valid_guid == false)
{
WriteLine("Please provide the user's guid — refer to the Readme for details on how to retrieve this. [GUID]:");
buff = Console.ReadLine();
if (Guid.TryParse(buff, out guid))valid_guid = true;
else WriteLineOver("The user-guid provided does not appear to be valid.");
}
}
else if (buff == "o")
{
licensetype = "org";
WriteLineOver("Okay, we will generate an organization license.");
while (valid_installid == false)
{
WriteLine("Please provide your Bitwarden Install-ID — refer to the Readme for details on how to retrieve this. [Install-ID]:");
buff = Console.ReadLine();
if (Guid.TryParse(buff, out installid)) valid_installid = true;
else WriteLineOver("The install-id provided does not appear to be valid.");
}
while (businessname == "")
{
WriteLineOver("Please enter a business name, default is BitBetter. [Business Name]:");
buff = Console.ReadLine();
if (buff == "") businessname = "BitBetter";
else if (checkBusinessName(buff)) businessname = buff;
}
}
else
{
WriteLineOver("Unrecognized option \'" + buff + "\'. ");
}
}
while (name == "")
{
WriteLineOver("Please provide the username this license will be registered to. [username]:");
buff = Console.ReadLine();
if ( checkUsername(buff) ) name = buff;
}
while (email == "")
{
WriteLineOver("Please provide the email address for the user " + name + ". [email]");
buff = Console.ReadLine();
if ( checkEmail(buff) ) email = buff;
}
while (storage == 0)
{
WriteLineOver("Extra storage space for the user " + name + ". (max.: " + short.MaxValue + "). Defaults to maximum value. [storage]");
buff = Console.ReadLine();
if (string.IsNullOrWhiteSpace(buff))
{
storage = short.MaxValue;
}
else
{
if (checkStorage(buff)) storage = short.Parse(buff);
}
}
if (licensetype == "user")
{
WriteLineOver("Confirm creation of \"user\" license for username: \"" + name + "\", email: \"" + email + "\", Storage: \"" + storage + " GB\", User-GUID: \"" + guid + "\"? Y/n");
buff = Console.ReadLine();
if ( buff == "" || buff == "y" || buff == "Y" )
{
GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name, email, storage, guid, null);
}
else
{
WriteLineOver("Exiting...");
return 0;
}
}
else if (licensetype == "org")
{
WriteLineOver("Confirm creation of \"organization\" license for business name: \"" + businessname + "\", username: \"" + name + "\", email: \"" + email + "\", Storage: \"" + storage + " GB\", Install-ID: \"" + installid + "\"? Y/n");
buff = Console.ReadLine();
if ( buff == "" || buff == "y" || buff == "Y" )
{
GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name, email, storage, installid, businessname, null);
}
else
{
WriteLineOver("Exiting...");
return 0;
}
}
return 0;
});
});
app.Command("user", config =>
{
var name = config.Argument("Name", "your name");
var email = config.Argument("Email", "your email");
var userIdArg = config.Argument("User ID", "your user id");
var storage = config.Argument("Storage", "extra storage space in GB. Maximum is " + short.MaxValue + " (optional, default = max)");
var key = config.Argument("Key", "your key id (optional)");
var help = config.HelpOption("--help | -h | -?");
@ -64,7 +194,6 @@ namespace bitwardenSelfLicensor
return 1;
}
if (string.IsNullOrWhiteSpace(userIdArg.Value) || !Guid.TryParse(userIdArg.Value, out Guid userId))
{
config.Error.WriteLine($"User ID not provided");
@ -72,7 +201,20 @@ namespace bitwardenSelfLicensor
return 1;
}
GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, userId, key.Value);
short storageShort = 0;
if (!string.IsNullOrWhiteSpace(storage.Value))
{
var parsedStorage = double.Parse(storage.Value);
if (parsedStorage > short.MaxValue || parsedStorage < 0)
{
config.Error.WriteLine("The storage value provided is outside the accepted range of [0-" + short.MaxValue + "]");
config.ShowHelp("org");
return 1;
}
storageShort = (short) parsedStorage;
}
GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, storageShort, userId, key.Value);
return 0;
});
@ -82,6 +224,8 @@ namespace bitwardenSelfLicensor
var name = config.Argument("Name", "your name");
var email = config.Argument("Email", "your email");
var installId = config.Argument("InstallId", "your installation id (GUID)");
var storage = config.Argument("Storage", "extra storage space in GB. Maximum is " + short.MaxValue + " (optional, default = max)");
var businessName = config.Argument("BusinessName", "name for the organization (optional)");
var key = config.Argument("Key", "your key id (optional)");
var help = config.HelpOption("--help | -h | -?");
@ -118,7 +262,20 @@ namespace bitwardenSelfLicensor
return 1;
}
GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, installationId, key.Value);
short storageShort = 0;
if (!string.IsNullOrWhiteSpace(storage.Value))
{
var parsedStorage = double.Parse(storage.Value);
if (parsedStorage > short.MaxValue || parsedStorage < 0)
{
config.Error.WriteLine("The storage value provided is outside the accepted range of [0-" + short.MaxValue + "]");
config.ShowHelp("org");
return 1;
}
storageShort = (short) parsedStorage;
}
GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, storageShort, installationId, businessName.Value, key.Value);
return 0;
});
@ -143,12 +300,71 @@ namespace bitwardenSelfLicensor
}
}
static void GenerateUserLicense(X509Certificate2 cert, string corePath,
string userName, string email, Guid userId, string key)
// checkUsername Checks that the username is a valid username
static bool checkUsername(string s)
{
if ( string.IsNullOrWhiteSpace(s) ) {
WriteLineOver("The username provided doesn't appear to be valid.\n");
return false;
}
return true; // TODO: Actually validate
}
// checkBusinessName Checks that the Business Name is a valid username
static bool checkBusinessName(string s)
{
if ( string.IsNullOrWhiteSpace(s) ) {
WriteLineOver("The Business Name provided doesn't appear to be valid.\n");
return false;
}
return true; // TODO: Actually validate
}
// checkEmail Checks that the email address is a valid email address
static bool checkEmail(string s)
{
if ( string.IsNullOrWhiteSpace(s) ) {
WriteLineOver("The email provided doesn't appear to be valid.\n");
return false;
}
return true; // TODO: Actually validate
}
// checkStorage Checks that the storage is in a valid range
static bool checkStorage(string s)
{
if (string.IsNullOrWhiteSpace(s))
{
WriteLineOver("The storage provided doesn't appear to be valid.\n");
return false;
}
if (double.Parse(s) > short.MaxValue || double.Parse(s) < 0)
{
WriteLineOver("The storage value provided is outside the accepted range of [0-" + short.MaxValue + "].\n");
return false;
}
return true;
}
// WriteLineOver Writes a new line to console over last line.
static void WriteLineOver(string s)
{
Console.SetCursorPosition(0, Console.CursorTop -1);
Console.WriteLine(s);
}
// WriteLine This wrapper is just here so that console writes all look similar.
static void WriteLine(string s)
{
Console.WriteLine(s);
}
static void GenerateUserLicense(X509Certificate2 cert, string corePath, string userName, string email, short storage, Guid userId, string key)
{
var core = AssemblyLoadContext.Default.LoadFromAssemblyPath(corePath);
var type = core.GetType("Bit.Core.Models.Business.UserLicense");
var licenseTypeEnum = core.GetType("Bit.Core.Enums.LicenseType");
var license = Activator.CreateInstance(type);
@ -161,13 +377,14 @@ namespace bitwardenSelfLicensor
set("Id", userId);
set("Name", userName);
set("Email", email);
set("MaxStorageGb", short.MaxValue);
set("Premium", true);
set("MaxStorageGb", storage == 0 ? short.MaxValue : storage);
set("Version", 1);
set("Issued", DateTime.UtcNow);
set("Refresh", DateTime.UtcNow.AddYears(100).AddMonths(-1));
set("Expires", DateTime.UtcNow.AddYears(100));
set("Trial", false);
set("LicenseType", Enum.Parse(licenseTypeEnum, "User"));
set("Hash", Convert.ToBase64String((byte[])type.GetMethod("ComputeHash").Invoke(license, new object[0])));
set("Signature", Convert.ToBase64String((byte[])type.GetMethod("Sign").Invoke(license, new object[] { cert })));
@ -175,12 +392,13 @@ namespace bitwardenSelfLicensor
Console.WriteLine(JsonConvert.SerializeObject(license, Formatting.Indented));
}
static void GenerateOrgLicense(X509Certificate2 cert, string corePath,
string userName, string email, Guid instalId, string key)
static void GenerateOrgLicense(X509Certificate2 cert, string corePath, string userName, string email, short storage, Guid instalId, string businessName, string key)
{
var core = AssemblyLoadContext.Default.LoadFromAssemblyPath(corePath);
var type = core.GetType("Bit.Core.Models.Business.OrganizationLicense");
var licenseTypeEnum = core.GetType("Bit.Core.Enums.LicenseType");
var planTypeEnum = core.GetType("Bit.Core.Enums.PlanType");
var license = Activator.CreateInstance(type);
@ -194,25 +412,38 @@ namespace bitwardenSelfLicensor
set("Id", Guid.NewGuid());
set("Name", userName);
set("BillingEmail", email);
set("BusinessName", "BitBetter");
set("BusinessName", string.IsNullOrWhiteSpace(businessName) ? "BitBetter" : businessName);
set("Enabled", true);
set("Plan", "Custom");
set("PlanType", (byte)6);
set("Seats", (short)32767);
set("Plan", "Enterprise (Annually)");
set("PlanType", Enum.Parse(planTypeEnum, "EnterpriseAnnually"));
set("Seats", int.MaxValue);
set("MaxCollections", short.MaxValue);
set("UsePolicies", true);
set("UseSso", true);
set("UseKeyConnector", true);
set("UseScim", true);
set("UseGroups", true);
set("UseEvents", true);
set("UseDirectory", true);
set("UseTotp", true);
set("Use2fa", true);
set("MaxStorageGb", short.MaxValue);
set("UseApi", true);
set("UseResetPassword", true);
set("UseCustomPermissions", true);
set("MaxStorageGb", storage == 0 ? short.MaxValue : storage);
set("SelfHost", true);
set("UsersGetPremium", true);
set("Version", 4);
set("UsePasswordManager", true);
set("UseSecretsManager", true);
set("SmSeats", int.MaxValue);
set("SmServiceAccounts", int.MaxValue);
set("Version", 14); //This is set to 14 to use LimitCollectionCreationDeletion can be changed to 13 to just use Secrets Manager
set("Issued", DateTime.UtcNow);
set("Refresh", DateTime.UtcNow.AddYears(100).AddMonths(-1));
set("Expires", DateTime.UtcNow.AddYears(100));
set("Trial", false);
set("LicenseType", Enum.Parse(licenseTypeEnum, "Organization"));
set("LimitCollectionCreationDeletion", true); //This will be used in the new version of BitWarden but can be applied now
set("Hash", Convert.ToBase64String((byte[])type.GetMethod("ComputeHash").Invoke(license, new object[0])));
set("Signature", Convert.ToBase64String((byte[])type.GetMethod("Sign").Invoke(license, new object[] { cert })));

View File

@ -1,11 +1,6 @@
#!/bin/bash
#!/bin/sh
script_dir=`cd $(dirname $0); pwd`
cd $script_dir
dotnet restore
dotnet publish
docker build . -t bitbetter/licensegen # --squash
DIR=`dirname "$0"`
DIR=`exec 2>/dev/null;(cd -- "$DIR") && cd -- "$DIR"|| cd "$DIR"; unset PWD; /usr/bin/pwd || /bin/pwd || pwd`
docker build -t bitbetter/licensegen "$DIR" # --squash

View File

@ -2,12 +2,12 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<TargetFramework>netcoreapp8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.CommandLineUtils" Version="1.1.1" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
</ItemGroup>

View File

@ -1,12 +1,26 @@
#!/bin/bash
#!/bin/sh
script_dir=`cd $(dirname $0); pwd`
DIR=`dirname "$0"`
DIR=`exec 2>/dev/null;(cd -- "$DIR") && cd -- "$DIR"|| cd "$DIR"; unset PWD; /usr/bin/pwd || /bin/pwd || pwd`
if [ "$#" -lt "1" ]; then
echo "USAGE: $0 <ABSOLUTE PATH TO CERT.PFX> [License Gen args...]"
# Grab the absolute path to the default pfx location
cert_path="$DIR/../../.keys/cert.pfx"
if [ "$#" -lt "2" ]; then
echo "USAGE: $0 <ABSOLUTE PATH TO CERT.PFX> <License Gen action> [License Gen args...]"
echo "ACTIONS:"
echo " interactive"
echo " user"
echo " org"
exit 1
fi
cert_path=$1
shift
docker run -it -v "$cert_path:/cert.pfx" bitbetter/licensegen "$@"
cert_path="$1"
action="$2"
shift
if [ $action = "interactive" ]; then
docker run -it --rm -v "$cert_path:/cert.pfx" bitbetter/licensegen "$@"
else
docker run --rm -v "$cert_path:/cert.pfx" bitbetter/licensegen "$@"
fi

85
update-bitwarden.sh Executable file
View File

@ -0,0 +1,85 @@
#!/bin/bash
ask () {
local __resultVar=$1
local __result="$2"
if [ -z "$2" ]; then
read -p "$3" __result
fi
eval $__resultVar="'$__result'"
}
SCRIPT_BASE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
BW_VERSION=$(curl -sL https://go.btwrdn.co/bw-sh-versions | grep '^ *"'coreVersion'":' | awk -F\: '{ print $2 }' | sed -e 's/,$//' -e 's/^"//' -e 's/"$//')
echo "Starting Bitwarden update, newest server version: $BW_VERSION"
# Default path is the parent directory of the BitBetter location
BITWARDEN_BASE="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )"
# Get Bitwarden base from user (or keep default value) or use first argument
ask tmpbase "$1" "Enter Bitwarden base directory [$BITWARDEN_BASE]: "
BITWARDEN_BASE=${tmpbase:-$BITWARDEN_BASE}
# Check if directory exists and is valid
[ -d "$BITWARDEN_BASE" ] || { echo "Bitwarden base directory $BITWARDEN_BASE not found!"; exit 1; }
[ -f "$BITWARDEN_BASE/bitwarden.sh" ] || { echo "Bitwarden base directory $BITWARDEN_BASE is not valid!"; exit 1; }
# Check if user wants to recreate the docker-compose override file
RECREATE_OV="y"
ask tmprecreate "$2" "Rebuild docker-compose override? [Y/n]: "
RECREATE_OV=${tmprecreate:-$RECREATE_OV}
if [[ $RECREATE_OV =~ ^[Yy]$ ]]
then
{
echo "version: '3'"
echo ""
echo "services:"
echo " api:"
echo " image: bitbetter/api:$BW_VERSION"
echo ""
echo " identity:"
echo " image: bitbetter/identity:$BW_VERSION"
echo ""
} > $BITWARDEN_BASE/bwdata/docker/docker-compose.override.yml
echo "BitBetter docker-compose override created!"
else
echo "Make sure to check if the docker override contains the correct image version ($BW_VERSION) in $BITWARDEN_BASE/bwdata/docker/docker-compose.override.yml!"
fi
# Check if user wants to rebuild the bitbetter images
docker images bitbetter/api --format="{{ .Tag }}" | grep -F -- "${BW_VERSION}" > /dev/null
retval=$?
REBUILD_BB="n"
REBUILD_BB_DESCR="[y/N]"
if [ $retval -ne 0 ]; then
REBUILD_BB="y"
REBUILD_BB_DESCR="[Y/n]"
fi
ask tmprebuild "$3" "Rebuild BitBetter images? $REBUILD_BB_DESCR: "
REBUILD_BB=${tmprebuild:-$REBUILD_BB}
if [[ $REBUILD_BB =~ ^[Yy]$ ]]
then
$SCRIPT_BASE/build.sh
echo "BitBetter images updated to version: $BW_VERSION"
fi
# Now start the bitwarden update
cd $BITWARDEN_BASE
./bitwarden.sh updateself
# Update the bitwarden.sh: automatically patch run.sh to fix docker-compose pull errors for private images
awk '1;/function downloadRunFile/{c=6}c&&!--c{print "sed -i '\''s/dccmd pull/dccmd pull --ignore-pull-failures || true/g'\'' $SCRIPTS_DIR/run.sh"}' $BITWARDEN_BASE/bitwarden.sh > tmp_bw.sh && mv tmp_bw.sh $BITWARDEN_BASE/bitwarden.sh
chmod +x $BITWARDEN_BASE/bitwarden.sh
echo "Patching bitwarden.sh completed..."
./bitwarden.sh update
# Prune Docker images without at least one container associated to them.
echo "Pruning Docker images without at least one container associated to them..."
docker image prune -a
cd $SCRIPT_BASE
echo "Bitwarden update completed!"