From 50c63d5c38934584e00ae6117bbbbffb4bad7654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 6 Sep 2023 19:02:07 +0200 Subject: [PATCH] Update user avatar in LDAP --- app/controllers/settings_controller.rb | 8 +++++++- app/models/user.rb | 11 ++++++++--- app/services/ldap_manager/update_avatar.rb | 12 ++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 app/services/ldap_manager/update_avatar.rb diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index 7a29675..dc969df 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -19,11 +19,17 @@ class SettingsController < ApplicationController def update @user.preferences.merge!(user_params[:preferences] || {}) @user.display_name = user_params[:display_name] + current_avatar_checksum = @user.avatar.attached? ? @user.avatar.blob.checksum : nil @user.avatar = user_params[:avatar] if user_params[:avatar].present? if @user.save if @user.display_name && (@user.display_name != @user.ldap_entry[:display_name]) - LdapManager::UpdateDisplayName.call(@user.dn, user_params[:display_name]) + LdapManager::UpdateDisplayName.call(@user.dn, @user.display_name) + end + + if @user.avatar.attached? && + (@user.avatar.blob.checksum != current_avatar_checksum) + LdapManager::UpdateAvatar.call(@user.dn, @user.avatar_base64) end redirect_to setting_path(@settings_section), flash: { diff --git a/app/models/user.rb b/app/models/user.rb index 02b7228..326226f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -10,9 +10,9 @@ class User < ApplicationRecord # has_one_attached :avatar do |attachable| - attachable.variant :small, resize_to_fill: [64, 64] - attachable.variant :medium, resize_to_fill: [256, 256] - attachable.variant :large, resize_to_fill: [512, 512] + attachable.variant :small, resize_to_fill: [64, 64], convert: :jpeg + attachable.variant :medium, resize_to_fill: [256, 256], convert: :jpeg + attachable.variant :large, resize_to_fill: [512, 512], convert: :jpeg end # @@ -167,6 +167,11 @@ class User < ApplicationRecord @display_name ||= ldap_entry[:display_name] end + + def avatar_base64(variant: :large) + Base64.strict_encode64 avatar.variant(variant).processed.download + end + def services_enabled ldap_entry[:service] || [] end diff --git a/app/services/ldap_manager/update_avatar.rb b/app/services/ldap_manager/update_avatar.rb new file mode 100644 index 0000000..aa3f437 --- /dev/null +++ b/app/services/ldap_manager/update_avatar.rb @@ -0,0 +1,12 @@ +module LdapManager + class UpdateAvatar < LdapManagerService + def initialize(dn, img_data) + @dn = dn + @img_data = img_data + end + + def call + replace_attribute @dn, :jpegPhoto, @img_data + end + end +end