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 @@ Ubuntu -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 @@
- +