diff --git a/app/Console/Commands/ImportAccounts.php b/app/Console/Commands/ImportAccounts.php
new file mode 100644
index 00000000000..286e3db7db8
--- /dev/null
+++ b/app/Console/Commands/ImportAccounts.php
@@ -0,0 +1,134 @@
+option('ldap_uri') ?? '127.0.0.1';
+ $ldap_attr_mail = $this->option('ldap_attr_mail') ?? 'mail';
+ $ldap_attr_firstname = $this->option('ldap_attr_firstname') ?? 'givenName';
+ $ldap_attr_lastname = $this->option('ldap_attr_lastname') ?? 'sn';
+
+ $ldap_user = $this->option('ldap_user');
+ if (empty($ldap_user)) {
+ $this->error($this::ERROR_MISSING_LDAP_USER);
+ }
+
+ $ldap_pass = $this->option('ldap_pass');
+ if (empty($ldap_pass)) {
+ $this->error($this::ERROR_MISSING_LDAP_PASS);
+ }
+
+ $ldap_base = $this->option('ldap_base');
+ if (empty($ldap_base)) {
+ $this->error($this::ERROR_MISSING_LDAP_BASE);
+ }
+
+ $ldap_filter = $this->option('ldap_filter');
+ if (empty($ldap_filter)) {
+ $this->error($this::ERROR_MISSING_LDAP_FILTER);
+ }
+
+ if (empty($ldap_user) || empty($ldap_pass) || empty($ldap_base) || empty($ldap_filter)) {
+ return;
+ }
+
+ $ldap_conn = ldap_connect($ldap_uri);
+ if (! $ldap_conn) {
+ $this->error('Could not connect to LDAP URI');
+
+ return;
+ }
+ if (! ldap_set_option($ldap_conn, LDAP_OPT_PROTOCOL_VERSION, 3)) {
+ $this->error('Could not set LDAP protocol v3');
+
+ return false;
+ }
+
+ try {
+ $bind = ldap_bind($ldap_conn, $ldap_user, $ldap_pass);
+ if (! $bind) {
+ $this->error('Could not bind with given LDAP credentials');
+
+ return;
+ }
+ } catch (\Exception $e) {
+ $this->error($e->getMessage());
+
+ return;
+ }
+
+ $ldap_res = [];
+ try {
+ $ldap_res = ldap_search($ldap_conn, $ldap_base, $ldap_filter, [$ldap_attr_mail, $ldap_attr_firstname, $ldap_attr_lastname]);
+ } catch (\Exception $e) {
+ $this->error($e->getMessage());
+
+ return;
+ }
+
+ $ldap_data = ldap_get_entries($ldap_conn, $ldap_res);
+
+ for ($i = 0; $i < $ldap_data['count']; $i++) {
+ if (! (isset($ldap_data[$i][$ldap_attr_mail]) && $ldap_data[$i][$ldap_attr_mail]['count'] > 0)) {
+ continue;
+ }
+ $user_mail = $ldap_data[$i][$ldap_attr_mail][0];
+ $user_firstname = 'John';
+ $user_lastname = 'Doe';
+ $user_password = bin2hex(random_bytes(64));
+ if (isset($ldap_data[$i][$ldap_attr_firstname]) && $ldap_data[$i][$ldap_attr_firstname]['count'] > 0) {
+ $user_firstname = $ldap_data[$i][$ldap_attr_firstname][0];
+ }
+ if (isset($ldap_data[$i][$ldap_attr_lastname]) && $ldap_data[$i][$ldap_attr_lastname]['count'] > 0) {
+ $user_lastname = $ldap_data[$i][$ldap_attr_lastname][0];
+ }
+ $this->info('Importing user "'.$user_mail.'"');
+ try {
+ Account::createDefault($user_firstname, $user_lastname, $user_mail, $user_password);
+ } catch (\Exception $import_error) {
+ $this->warn('Could not import user "'.$user_mail.'": '.$import_error->getMessage());
+ }
+ }
+ }
+}
diff --git a/database/migrations/2017_01_28_222114_remove_viewed_at_from_contacts.php b/database/migrations/2017_01_28_222114_remove_viewed_at_from_contacts.php
index c572a5a67e8..e8c0971d52f 100644
--- a/database/migrations/2017_01_28_222114_remove_viewed_at_from_contacts.php
+++ b/database/migrations/2017_01_28_222114_remove_viewed_at_from_contacts.php
@@ -13,11 +13,11 @@ class RemoveViewedAtFromContacts extends Migration
*/
public function up()
{
- Schema::table('contacts', function (Blueprint $table) {
- $table->dropColumn(
- 'viewed_at'
- );
- });
+ if (Schema::hasColumn('contacts', 'viewed_at')) {
+ Schema::table('contacts', function (Blueprint $table) {
+ $table->dropColumn('viewed_at');
+ });
+ }
}
/**
@@ -27,8 +27,10 @@ public function up()
*/
public function down()
{
- Schema::table('contacts', function (Blueprint $table) {
- $table->dateTime('viewed_at')->nullable();
- });
+ if (! Schema::hasColumn('contacts', 'viewed_at')) {
+ Schema::table('contacts', function (Blueprint $table) {
+ $table->dateTime('viewed_at')->nullable();
+ });
+ }
}
}
diff --git a/docs/installation/providers/ubuntu.md b/docs/installation/providers/ubuntu.md
index e85fe1a2082..b4b706b35e1 100644
--- a/docs/installation/providers/ubuntu.md
+++ b/docs/installation/providers/ubuntu.md
@@ -2,7 +2,7 @@
-Monica can run on [Ubuntu 18.04 (Bionic Beaver)](http://releases.ubuntu.com/18.04/).
+Monica can run on [Ubuntu 22.04 (Jammy Jellyfish)](http://releases.ubuntu.com/22.04/).
- [Prerequisites](#prerequisites)
- [Types of databases](#types-of-databases)
@@ -35,6 +35,13 @@ sudo apt update
sudo apt install -y git
```
+**Unzip:** Unzip is required but was not installed by default. Install it with:
+
+```sh
+sudo apt update
+sudo apt install -y unzip
+```
+
**Apache:** Apache should come pre-installed with your server. If it's not, install it with:
```sh
@@ -55,9 +62,7 @@ Then install php 8.1 with these extensions:
```sh
sudo apt update
-sudo apt install -y php8.1 php8.1-bcmath php8.1-cli php8.1-curl php8.1-common \
- php8.1-fpm php8.1-gd php8.1-gmp php8.1-intl php-json php8.1-mbstring \
- php8.1-mysql php8.1-opcache php8.1-redis php8.1-xml php8.1-zip
+sudo apt install -y php8.1-{bcmath,cli,curl,common,fpm,gd,gmp,intl,mbstring,mysql,opcache,redis,xml,zip}
```
**Composer:** After you're done installing PHP, you'll need the [Composer](https://getcomposer.org/download/) dependency manager.
@@ -74,7 +79,7 @@ rm -f composer-setup.php
**Node.js:** Install node.js with package manager.
```sh
-curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
+curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
```
@@ -115,7 +120,7 @@ cd /var/www/monica
# Get latest tags from GitHub
git fetch
# Clone the desired version
-git checkout tags/v2.18.0
+git checkout tags/v4.0.0
```
### 2. Setup the database
@@ -157,16 +162,23 @@ exit
1. `cp .env.example .env` to create your own version of all the environment variables needed for the project to work.
2. Update `.env` to your specific needs
- - set `DB_USERNAME` and `DB_PASSWORD` with the settings used behind.
+ - Update database information.
+ ```diff
+ - DB_USERNAME=homestead
+ - DB_PASSWORD=secret
+ + DB_USERNAME=monica
+ # Use the password you created.
+ + DB_PASSWORD=strongpassword
+ ```
- configure a [mailserver](/docs/installation/mail.md) for registration & reminders to work correctly.
- set the `APP_ENV` variable to `production`, `local` is only used for the development version. Beware: setting `APP_ENV` to `production` will force HTTPS. Skip this if you're running Monica locally.
-3. Run `composer install --no-interaction --no-dev` to install all packages.
-4. Run `yarn install` to install frontend packages, then `yarn run production` to build the assets (js, css).
-5. Run `php artisan key:generate` to generate an application key. This will set `APP_KEY` with the right value automatically.
-6. Run `php artisan setup:production -v` to run the migrations, seed the database and symlink folders.
+4. Run `composer install --no-interaction --no-dev` to install all packages.
+5. Run `yarn install` to install frontend packages, then `yarn run production` to build the assets (js, css).
+6. Run `php artisan key:generate` to generate an application key. This will set `APP_KEY` with the right value automatically.
+7. Run `php artisan setup:production -v` to run the migrations, seed the database and symlink folders.
- You can use `email` and `password` parameter to setup a first account directly: `php artisan setup:production --email=your@email.com --password=yourpassword -v`
-7. _Optional_: Setup the queues with Redis, Beanstalk or Amazon SQS: see optional instruction of [generic installation](generic.md#setup-queues)
-8. _Optional_: Setup the access tokens to use the API follow optional instruction of [generic installation](generic.md#setup-access-tokens)
+8. _Optional_: Setup the queues with Redis, Beanstalk or Amazon SQS: see optional instruction of [generic installation](generic.md#setup-queues)
+9. _Optional_: Setup the access tokens to use the API follow optional instruction of [generic installation](generic.md#setup-access-tokens)
### 4. Configure cron job
@@ -207,11 +219,11 @@ sudo a2enmod rewrite
sudo nano /etc/apache2/sites-available/monica.conf
```
-Then, in the `nano` text editor window you just opened, copy the following - swapping the `**YOUR IP ADDRESS/DOMAIN**` with your server's IP address/associated domain:
+Then, in the `nano` text editor window you just opened, copy the following - swapping the `monica.example.com` with your server's IP address/associated domain:
```html
- ServerName **YOUR IP ADDRESS/DOMAIN**
+ ServerName monica.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/monica/public
diff --git a/resources/views/journal/add.blade.php b/resources/views/journal/add.blade.php
index 4c8a84ba4a1..b0846219f1a 100644
--- a/resources/views/journal/add.blade.php
+++ b/resources/views/journal/add.blade.php
@@ -39,7 +39,7 @@