diff --git a/README.md b/README.md index c348900..2f4dc5d 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The idea of [æneria](https://aeneria.com) is to display energy consumption and ## Screenshots -![Screenshot of æneria](./doc/screenshots/screenshot1.png) +![Capture d’écran de æneria](./doc/screenshots/preview-1.png) ## Documentation and resources diff --git a/README_fr.md b/README_fr.md index 4277f4f..cdb869e 100644 --- a/README_fr.md +++ b/README_fr.md @@ -25,7 +25,7 @@ L'idée de [æneria](https://aeneria.com) est d'afficher la consommation d'éner ## Captures d’écran -![Capture d’écran de æneria](./doc/screenshots/screenshot1.png) +![Capture d’écran de æneria](./doc/screenshots/preview-1.png) ## Documentations et ressources diff --git a/conf/.env b/conf/.env index 2ecf0d2..73ef891 100644 --- a/conf/.env +++ b/conf/.env @@ -32,10 +32,23 @@ AENERIA_DEMO_MODE=0 # Welcome message AENERIA_WELCOME_MESSAGE='

Bienvenue sur æneria

' -### Enedis Data Hub ### +# æneria proxy URL (no trailing slash !) +AENERIA_PROXY_URL=https://proxy.aeneria.com +# should the app use æneria proxy (1 for yes, 0 for no) +AENERIA_PROXY_FOR_ENEDIS=1 +AENERIA_PROXY_FOR_GRDF=1 + +# Enedis Data Hub ENEDIS_CLIENT_ID=noneed ENEDIS_CLIENT_SECRET=noneed ENEDIS_REDIRECT_URI=noneed -ENEDIS_ENDPOINT_AUTH=https://proxy.aeneria.com/enedis-data-connect -ENEDIS_ENDPOINT_TOKEN=https://proxy.aeneria.com/enedis-data-connect +ENEDIS_ENDPOINT_AUTH=https://mon-compte-particulier.enedis.fr +ENEDIS_ENDPOINT_TOKEN=https://gw.prd.api.enedis.fr ENEDIS_ENDPOINT_DATA=https://gw.prd.api.enedis.fr + +# Grdf adict +GRDF_CLIENT_ID=noneed +GRDF_CLIENT_SECRET=noneed +GRDF_REDIRECT_URI=noneed +GRDF_ENDPOINT_AUTH=https://sofit-sso-oidc.grdf.fr +GRDF_ENDPOINT_DATA=https://api.grdf.fr diff --git a/conf/aeneria.cron b/conf/aeneria.cron index 66f1fc9..cd76412 100644 --- a/conf/aeneria.cron +++ b/conf/aeneria.cron @@ -1,2 +1,2 @@ -__MINUTES__ __HOUR__-23/3 * * * __APP__ /usr/bin/php__PHPVERSION__ __INSTALL_DIR__/bin/console aeneria:fetch-data -*/15 * * * * __APP__ /usr/bin/php__PHPVERSION__ __INSTALL_DIR__/bin/console aeneria:pending-action:process-expired +__MINUTES__ __HOUR__-23/3 * * * __APP__ /usr/bin/php__PHPVERSION__ __INSTALL_DIR__/app/bin/console aeneria:fetch-data +*/15 * * * * __APP__ /usr/bin/php__PHPVERSION__ __INSTALL_DIR__/app/bin/console aeneria:pending-action:process-expired diff --git a/conf/nginx.conf b/conf/nginx.conf index ddda443..88f164e 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -2,7 +2,7 @@ location __PATH__/ { # Path to source - alias __INSTALL_DIR__/public/; + alias __INSTALL_DIR__/app/public/; client_body_timeout 60m; proxy_read_timeout 60m; diff --git a/doc/screenshots/preview-1.png b/doc/screenshots/preview-1.png new file mode 100644 index 0000000..c813783 Binary files /dev/null and b/doc/screenshots/preview-1.png differ diff --git a/doc/screenshots/preview-2.png b/doc/screenshots/preview-2.png new file mode 100644 index 0000000..fc1bb90 Binary files /dev/null and b/doc/screenshots/preview-2.png differ diff --git a/doc/screenshots/preview-3.png b/doc/screenshots/preview-3.png new file mode 100644 index 0000000..0df0919 Binary files /dev/null and b/doc/screenshots/preview-3.png differ diff --git a/doc/screenshots/screenshot1.png b/doc/screenshots/screenshot1.png deleted file mode 100644 index 3e5d59b..0000000 Binary files a/doc/screenshots/screenshot1.png and /dev/null differ diff --git a/manifest.toml b/manifest.toml index d69b9d7..bb38549 100644 --- a/manifest.toml +++ b/manifest.toml @@ -2,10 +2,10 @@ packaging_format = 2 id = "aeneria" name = "æneria" -description.en = "Dashboard to analyse your energy consumption data from Linky & weather" -description.fr = "Tableau de bord pour analyser votre consomation d'énergie à partir des données d'un Linky et de la météo" +description.en = "Dashboard to analyse your energy consumption data from Linky, Gazpar & weather" +description.fr = "Tableau de bord pour analyser votre consomation d'énergie à partir des données d'un compteur Linky et/ou Gazpar et de la météo" -version = "1.1.6~ynh5" +version = "2.0.0~ynh1" maintainers = ["Simon Mellerin"] @@ -20,9 +20,9 @@ yunohost = ">= 11.2" architectures = "all" multi_instance = true -ldap = false +ldap = true -sso = false +sso = true disk = "50M" ram.build = "50M" @@ -46,10 +46,9 @@ ram.runtime = "50M" default = false [resources] - [resources.sources.main] - url = "https://statics.aeneria.com/aeneria-app-1.1.6.tar.gz" - sha256 = "2923c3aee79a02154c2168537a18250abe6a3a84fd7b4a5f0309bd7ad604a98b" - + [resources.sources.main] + url = "https://statics.aeneria.com/aeneria-app-2.0.0.tar.gz" + sha256 = "8a36dc2634178e6f087893aca6459ef7cbe7ad9e436c829a7f05f88a8a304571" [resources.system_user] @@ -59,7 +58,7 @@ ram.runtime = "50M" main.url = "/" [resources.apt] - packages = "postgresql, apt-transport-https, postgresql-contrib, php7.4-zip, php7.4-pgsql, php7.4-xml, php7.4-intl, php7.4-mbstring, php7.4-gd, php7.4-curl, php7.4-bcmath, php7.4-opcache" + packages = "postgresql, apt-transport-https, postgresql-contrib, php8.2-zip, php8.2-pgsql, php8.2-xml, php8.2-intl, php8.2-gd, php8.2-curl, php8.2-bcmath, php8.2-opcache" [resources.database] type = "postgresql" diff --git a/scripts/install b/scripts/install index 1fa354e..74fd115 100644 --- a/scripts/install +++ b/scripts/install @@ -45,10 +45,10 @@ ynh_add_fpm_config #================================================= ynh_script_progression --message="Configuring $app..." --weight=1 -ynh_add_config --template=".env" --destination="$install_dir/.env" +ynh_add_config --template=".env" --destination="$install_dir/app/.env" # Restrict rights to aeneria user only -chmod 600 "$install_dir/.env" +chmod 600 "$install_dir/app/.env" #================================================= # INSTALL AENERIA @@ -56,7 +56,7 @@ chmod 600 "$install_dir/.env" ynh_script_progression --message="Installing aeneria..." --weight=1 # Install aeneria -pushd $install_dir +pushd $install_dir/app ynh_exec_as $app php$phpversion bin/console aeneria:install "$app" -n # Create admin user mail=$(ynh_user_get_info --username="$admin" --key='mail') diff --git a/scripts/upgrade b/scripts/upgrade index bea1232..79ec4fd 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -79,10 +79,10 @@ chmod 644 "/etc/cron.d/$app" #================================================= ynh_script_progression --message="Configuring $app..." --weight=1 -ynh_add_config --template=".env" --destination="$install_dir/.env" +ynh_add_config --template=".env" --destination="$install_dir/app/.env" # Restrict rights to aeneria user only -chmod 600 "$install_dir/.env" +chmod 600 "$install_dir/app/.env" #================================================= # UPGRADE AENERIA @@ -90,7 +90,7 @@ chmod 600 "$install_dir/.env" ynh_script_progression --message="Upgrading $app..." --weight=1 # Install dependencies and aeneria -pushd $install_dir +pushd $install_dir/app ynh_exec_as $app php$phpversion bin/console cache:clear -n ynh_exec_as $app php$phpversion bin/console doctrine:migrations:migrate -n @@ -104,7 +104,7 @@ pushd $install_dir fi # Regenerate RSA keys - ynh_exec_as $app php$phpversion bin/console aeneria:generate-key --force -n + ynh_exec_as $app php$phpversion bin/console aeneria:generate-key -n popd #================================================= diff --git a/sources/patches/app-00-ldap-auth.patch b/sources/patches/app-00-ldap-auth.patch index 09ec5aa..20042b8 100644 --- a/sources/patches/app-00-ldap-auth.patch +++ b/sources/patches/app-00-ldap-auth.patch @@ -1,12 +1,14 @@ -commit c7a763a0fae7e1933f280b29bd2a1911b01f7170 +commit 19648694faaf973e7b4b0de1dbe49710e14a8ce7 Author: Simon Mellerin -Date: Fri Nov 27 12:19:02 2020 +0100 +Date: Fri Dec 22 17:22:41 2023 +0100 -diff --git a/config/packages/security.yaml b/config/packages/security.yaml -index 15ef608..8516775 100644 ---- a/config/packages/security.yaml -+++ b/config/packages/security.yaml -@@ -10,6 +10,8 @@ security: + Yunohost ldap + +diff --git a/app/config/packages/security.yaml b/app/config/packages/security.yaml +index 6c4457f1..ea1f3dc9 100644 +--- a/app/config/packages/security.yaml ++++ b/app/config/packages/security.yaml +@@ -11,6 +11,8 @@ security: entity: class: App\Entity\User property: username @@ -15,10 +17,10 @@ index 15ef608..8516775 100644 firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ -@@ -20,6 +22,10 @@ security: - provider: app_user_provider - authenticators: - - App\Security\LoginFormAuthenticator +@@ -23,6 +25,10 @@ security: + login_path: security.login + check_path: security.login + enable_csrf: true + http_basic_ldap: + provider: user_provider_yunohost + service: yunohost.ldap @@ -26,14 +28,14 @@ index 15ef608..8516775 100644 logout: path: security.logout target: security.login -diff --git a/config/services.yaml b/config/services.yaml -index 533c244..9362ef5 100644 ---- a/config/services.yaml -+++ b/config/services.yaml -@@ -70,3 +70,16 @@ services: +diff --git a/app/config/services.yaml b/app/config/services.yaml +index 4410bfc5..71b9ba86 100644 +--- a/app/config/services.yaml ++++ b/app/config/services.yaml +@@ -105,3 +105,16 @@ services: - Aeneria\EnedisDataConnectApi\Service\DataConnectServiceInterface: - alias: Aeneria\EnedisDataConnectApi\Service\DataConnectService + Aeneria\GrdfAdictApi\Client\GrdfAdictClientInterface: + alias: Aeneria\GrdfAdictApi\Client\GrdfAdictClient + + yunohost.provider.ldap: + class: App\Security\YunohostLdapUserProvider @@ -47,14 +49,16 @@ index 533c244..9362ef5 100644 + class: Symfony\Component\Ldap\Adapter\ExtLdap\Adapter + arguments: + - host: "localhost" -diff --git a/src/Security/YunohostLdapUserProvider.php b/src/Security/YunohostLdapUserProvider.php +diff --git a/app/src/Security/YunohostLdapUserProvider.php b/app/src/Security/YunohostLdapUserProvider.php new file mode 100644 -index 0000000..39ba1e8 +index 00000000..09ad20c6 --- /dev/null -+++ b/src/Security/YunohostLdapUserProvider.php -@@ -0,0 +1,123 @@ ++++ b/app/src/Security/YunohostLdapUserProvider.php +@@ -0,0 +1,102 @@ + -+ * @author Charles Sarrazin -+ * @author Robin Chalas + */ +class YunohostLdapUserProvider implements UserProviderInterface +{ -+ /** @var LdapInterface */ -+ private $ldap; -+ /** @var string */ -+ private $baseDn; -+ /** @var string */ -+ private $searchDn; -+ /** @var string */ -+ private $searchPassword; -+ /** @var string[] */ -+ private $defaultRoles; -+ /** @var string */ -+ private $uidKey; -+ /** @var string */ -+ private $defaultSearch; -+ /** @var UserRepository */ -+ private $userRepository; ++ private string $defaultSearch = '(uid={username})'; + + public function __construct( -+ LdapInterface $ldap, -+ string $baseDn, -+ string $searchDn = null, -+ string $searchPassword = null, -+ array $defaultRoles = [], -+ UserRepository $userRepository -+ ) { -+ $this->ldap = $ldap; -+ $this->baseDn = $baseDn; -+ $this->searchDn = $searchDn; -+ $this->searchPassword = $searchPassword; -+ $this->defaultRoles = $defaultRoles; -+ $this->defaultSearch = '(uid={username})'; -+ -+ $this->userRepository = $userRepository; -+ } ++ private LdapInterface $ldap, ++ private string $baseDn, ++ private UserRepository $userRepository, ++ private ?string $searchDn = null, ++ private ?string $searchPassword = null, ++ ) {} + + /** + * {@inheritdoc} + */ + public function loadUserByUsername(string $username) + { ++ trigger_deprecation('symfony/security-core', '5.3', 'Method "%s()" is deprecated, use loadUserByIdentifier() instead.', __METHOD__); ++ ++ return $this->loadUserByIdentifier($username); ++ } ++ ++ /** ++ * {@inheritdoc} ++ */ ++ public function loadUserByIdentifier(string $identifier): UserInterface ++ { + try { + $this->ldap->bind($this->searchDn, $this->searchPassword); -+ $username = $this->ldap->escape($username, '', LdapInterface::ESCAPE_FILTER); -+ $query = str_replace('{username}', $username, $this->defaultSearch); ++ $username = $this->ldap->escape($identifier, '', LdapInterface::ESCAPE_FILTER); ++ $query = str_replace('{username}', $identifier, $this->defaultSearch); + $search = $this->ldap->query($this->baseDn, $query); + } catch (ConnectionException $e) { -+ throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username), 0, $e); ++ throw new UserNotFoundException(sprintf('User "%s" not found.', $identifier), 0, $e); + } + + $entries = $search->execute(); + $count = \count($entries); + -+ if (!$count) { -+ die($username . 'ldap pas trouvé'); -+ throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username)); -+ } -+ + if ($count > 1) { -+ throw new UsernameNotFoundException('More than one user found.'); ++ throw new UserNotFoundException('More than one user found.'); + } + + $entry = $entries[0]; + -+ $username = $this->getAttributeValue($entry, 'mail'); ++ $identifier = $this->getAttributeValue($entry, 'mail'); + -+ return $this->userRepository->findOneBy(['username' => $username]); ++ return $this->userRepository->findOneBy(['username' => $identifier]); + } + + /** @@ -176,4 +157,3 @@ index 0000000..39ba1e8 + return $values[0]; + } +} ---