Skip to content

Commit

Permalink
Release OpenProject 12.4.4
Browse files Browse the repository at this point in the history
  • Loading branch information
ulferts committed Feb 15, 2023
2 parents 91ec40a + 0604be0 commit 472fb4b
Show file tree
Hide file tree
Showing 158 changed files with 7,060 additions and 545 deletions.
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ gem 'email_validator', '~> 2.2.3'
gem 'json_schemer', '~> 0.2.18'
gem 'ruby-duration', '~> 3.2.0'

# Fix mail gem to be at least 2.8.1
gem 'mail', '>= 2.8.1'

# provide compatible filesystem information for available storage
gem 'sys-filesystem', '~> 1.4.0', require: false

Expand Down
3 changes: 2 additions & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,7 @@ GEM
loofah (2.19.1)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.8.0.1)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
net-pop
Expand Down Expand Up @@ -1067,6 +1067,7 @@ DEPENDENCIES
listen (~> 3.7.0)
livingstyleguide (~> 2.1.0)
lograge (~> 0.12.0)
mail (>= 2.8.1)
matrix (~> 0.4.2)
meta-tags (~> 2.18.0)
mini_magick (~> 4.11.0)
Expand Down
6 changes: 3 additions & 3 deletions app/controllers/custom_styles_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,15 @@ def touch_icon_download
end

def logo_delete
file_delete(:remove_logo!)
file_delete(:remove_logo)
end

def favicon_delete
file_delete(:remove_favicon!)
file_delete(:remove_favicon)
end

def touch_icon_delete
file_delete(:remove_touch_icon!)
file_delete(:remove_touch_icon)
end

def update_colors
Expand Down
7 changes: 7 additions & 0 deletions app/models/custom_style.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,12 @@ def digest
image.local_file.path
end
end

define_method "remove_#{name}" do
image = send(name)
image&.remove!

update_column name, nil
end
end
end
8 changes: 7 additions & 1 deletion app/models/setting/mail_settings.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,14 @@ def reload_mailer_settings!
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.delivery_method = Setting.email_delivery_method if Setting.email_delivery_method

if Setting.email_delivery_method == :smtp
case Setting.email_delivery_method
when :smtp
reload_smtp_settings!
when :sendmail
ActionMailer::Base.sendmail_settings = {
location: Setting.sendmail_location,
arguments: Setting.sendmail_arguments
}
end
rescue StandardError => e
Rails.logger.error "Unable to set ActionMailer settings (#{e.message}). " \
Expand Down
59 changes: 31 additions & 28 deletions app/services/oauth_clients/connection_manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ module OAuthClients
class ConnectionManager
# Nextcloud API endpoint to check if Bearer token is valid
AUTHORIZATION_CHECK_PATH = '/ocs/v1.php/cloud/user'.freeze
TOKEN_IS_FRESH_DURATION = 10.seconds.freeze

attr_reader :user, :oauth_client

Expand Down Expand Up @@ -61,19 +62,25 @@ def get_access_token(scope: [], state: nil)
# The bearer/access token has expired or is due for renew for other reasons.
# Talk to OAuth2 Authorization Server to exchange the renew_token for a new bearer token.
def refresh_token
# There should already be an existing token,
# otherwise this method has been called too early (internal flow error).
oauth_client_token = get_existing_token
if oauth_client_token.nil?
return service_result_with_error(I18n.t('oauth_client.errors.refresh_token_called_without_existing_token'))
OAuthClientToken.transaction do
oauth_client_token = OAuthClientToken.lock('FOR UPDATE').find_by(user_id: @user, oauth_client_id: @oauth_client.id)

if oauth_client_token.present?
if (Time.current - oauth_client_token.updated_at) > TOKEN_IS_FRESH_DURATION
service_result = request_new_token(refresh_token: oauth_client_token.refresh_token)

if service_result.success?
update_oauth_client_token(oauth_client_token, service_result.result)
else
service_result
end
else
ServiceResult.success(result: oauth_client_token)
end
else
service_result_with_error(I18n.t('oauth_client.errors.refresh_token_called_without_existing_token'))
end
end

# Get the Rack::OAuth2::Client and call access_token!, then return a ServiceResult.
service_result = request_new_token(refresh_token: oauth_client_token.refresh_token)
return service_result unless service_result.success?

# Updated tokens, handle model checking errors and return a ServiceResult
update_oauth_client_token(oauth_client_token, service_result.result)
end

# Returns the URI of the "authorize" endpoint of the OAuth2 Authorization Server.
Expand All @@ -99,7 +106,18 @@ def code_to_token(code)
if oauth_client_token.present?
update_oauth_client_token(oauth_client_token, service_result.result)
else
oauth_client_token = create_new_oauth_client_token(service_result.result)
rack_access_token = service_result.result
oauth_client_token =
OAuthClientToken.create(
user: @user,
oauth_client: @oauth_client,
origin_user_id: rack_access_token.raw_attributes[:user_id], # ID of user at OAuth2 Authorization Server
access_token: rack_access_token.access_token,
token_type: rack_access_token.token_type, # :bearer
refresh_token: rack_access_token.refresh_token,
expires_in: rack_access_token.raw_attributes[:expires_in],
scope: rack_access_token.scope
)
end

ServiceResult.success(result: oauth_client_token)
Expand Down Expand Up @@ -237,21 +255,6 @@ def build_basic_rack_oauth_client
)
end

# Create a new OpenProject token object based on the return values
# from a Rack::OAuth2::AccessToken::Bearer token
def create_new_oauth_client_token(rack_access_token)
OAuthClientToken.create(
user: @user,
oauth_client: @oauth_client,
origin_user_id: rack_access_token.raw_attributes[:user_id], # ID of user at OAuth2 Authorization Server
access_token: rack_access_token.access_token,
token_type: rack_access_token.token_type, # :bearer
refresh_token: rack_access_token.refresh_token,
expires_in: rack_access_token.raw_attributes[:expires_in],
scope: rack_access_token.scope
)
end

# Update an OpenProject token based on updated values from a
# Rack::OAuth2::AccessToken::Bearer after a OAuth2 refresh operation
def update_oauth_client_token(oauth_client_token, rack_oauth2_access_token)
Expand Down
4 changes: 3 additions & 1 deletion app/workers/rake_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

##
# Invoke a rake task while safely loading the tasks only once
# to ensure they are neither loaded nor executed twice.
# to ensure they are only loaded once.
module RakeJob
attr_reader :task_name, :args

Expand All @@ -46,6 +46,8 @@ def perform(task_name, *args)
def invoke
load_tasks!
task.invoke *args
ensure
task&.reenable
end

##
Expand Down
42 changes: 21 additions & 21 deletions config/locales/crowdin/ca.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ ca:
main-menu-border-color: "Vora del menú principal"
custom_colors: "Colors personalitzats"
customize: "Personalitza la teva instal·lació d'OpenProject amb el teu propi logotip i colors."
enterprise_notice: "As a special 'Thank you!' for their financial contribution to develop OpenProject, this tiny add-on is only available for Enterprise edition support subscribers."
enterprise_notice: "Com un \"Gràcies!\" especial per la contribució financera al desenvolupament d'OpenProject, aquest petit add-on només està disponible pels subscriptors de l'edició Enterprise."
enterprise_more_info: "Nota: el logotip utilitzat serà accessible públicament."
manage_colors: "Edita les opcions de selecció de colors"
instructions:
Expand All @@ -64,23 +64,23 @@ ca:
main-menu-bg-color: "Color de fons del menú lateral de l'esquerra."
theme_warning: Canviant el tema substituiràs el teu estil personalitzat. El disseny es perdrà. Estàs segur que vols continuar?
enterprise:
upgrade_to_ee: "Upgrade to the Enterprise edition"
add_token: "Upload an Enterprise edition support token"
upgrade_to_ee: "Actualitza a l'edició Enterprise"
add_token: "Carrega un token de suport de l'edició Enterprise"
delete_token_modal:
text: "Are you sure you want to remove the current Enterprise edition token used?"
text: "Estàs segur que vols eliminar el token de l'edició Enterprise utilitzat?"
title: "Eliminar el token"
replace_token: "Substitueix el teu token de suport actual"
order: "Order Enterprise on-premises edition"
paste: "Paste your Enterprise edition support token"
required_for_feature: "This add-on is only available with an active Enterprise edition support token."
order: "Ordena l'edició Enterpise on-premises"
paste: "Enganxa el teu token de suport de l'edició Enterprise"
required_for_feature: "Aquest add-om només està disponible amb un token de suport de l'edició Enterprise."
enterprise_link: "Per a més informació, cliqueu aquí."
start_trial: 'Inicia la prova gratuïta'
book_now: 'Reserva ara'
get_quote: 'Obtenir un pressupost'
buttons:
upgrade: "Actualitza ara"
contact: "Contacta amb nosaltres per una demostració"
enterprise_info_html: "is an Enterprise <span class='spot-icon spot-icon_enterprise-addons'></span> add-on."
enterprise_info_html: "és un add-on de l'edició Enterprise <span class='spot-icon spot-icon_enterprise-badge'></span>."
upgrade_info: "Si us plau, actualitza a una versió de pagament per tal d'activar i començar a utilitzar aquesta funcionalitat en el teu equip."
journal_aggregation:
explanation:
Expand Down Expand Up @@ -319,7 +319,7 @@ ca:
settings: "Configuració"
form_configuration: "Configuració del formulari"
more_info_text_html: >
Enterprise edition allows you to customize form configuration with these additional add-ons: <br> <ul class="%{list_styling_class}"> <li><b>Add new attribute groups</b></li> <li><b>Rename attribute groups</b></li> <li><b>Add a table of related work packages</b></li> </ul>
L'edició Enterprise et permet personalitzar la configuració de formularis amb aquests add-ons extra: <br> <ul class="%{list_styling_class}"><ul class="%{list_styling_class}"> <li><b>Afegeix nous grups d'atributs</b></li> <li><b>Canvia el nom dels grups d'atributs</b></li> <li><b>Afegeix una taula de paquets de treball relacionats</b></li> </ul>
projects: "Projectes"
enabled_projects: "Projectes habilitats"
edit_query: "Edita la taula"
Expand Down Expand Up @@ -583,7 +583,7 @@ ca:
confirmation: "no coincideix amb el %{attribute}."
could_not_be_copied: "%{dependency} no s'ha pogut copiar (completament)."
does_not_exist: "no existeix."
error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition"
error_enterprise_only: "%{action} només està disponible en l'edició Enterprise d'OpenProject"
error_unauthorized: "no és possible accedir."
error_readonly: "es va intentar d'escriure-hi però no és modificable."
email: "no és una adreça de correu electrònic vàlida."
Expand Down Expand Up @@ -633,7 +633,7 @@ ca:
auth_source:
attributes:
tls_certificate_string:
invalid_certificate: "The provided SSL certificate is invalid: %{additional_message}"
invalid_certificate: "El certificat SSL proporcionat és invàlid: %{additional_message}"
format: "%{message}"
attachment:
attributes:
Expand Down Expand Up @@ -1259,11 +1259,11 @@ ca:
ee:
upsale:
form_configuration:
description: "Customize the form configuration with these additional add-ons:"
description: "Personalitza la configuració del formulari amb aquests add-ons extres:"
add_groups: "Afegir un nou atribut de grups"
rename_groups: "Canviar de nom atribut de grups"
project_filters:
description_html: "Filtering and sorting on custom fields is an Enterprise edition add-on."
description_html: "Filtrar i ordenar camps personalitzats és un add-on de l'edició Enterprise."
enumeration_activities: "Activitats de rastrejament del temps"
enumeration_work_package_priorities: "Prioritats dels paquets de treball"
enumeration_reported_project_statuses: "Estats de projecte notificats"
Expand All @@ -1285,7 +1285,7 @@ ca:
error_cookie_missing: 'La cookie d''OpenProject no s''ha trobat. Assegureu-vos que les cookies estan habilitades, ja que aquesta aplicació no pot funcionar correctament sense.'
error_custom_option_not_found: "L'opció no existeix."
error_enterprise_activation_user_limit: "El teu compte no s'ha pogut activar (límit d'usuaris assolit). Si us plau, contacte amb el teu administrador per obtenir accés."
error_enterprise_token_invalid_domain: "The Enterprise edition is not active. Your Enterprise token's domain (%{actual}) does not match the system's host name (%{expected})."
error_enterprise_token_invalid_domain: "L'edició Enterprise no està activa. El domini del token Enterprise (%{actual}) no concorda amb el nom d'allotjament del sistema (%{expected})."
error_failed_to_delete_entry: 'Error a l''eliminar aquesta entrada.'
error_in_dependent: "Error en intentar alterar objectes dependents: %{dependent_class} #%{related_id} -%{related_subject}: %{error}" #%{related_id} -%{related_subject}: %{error}"
error_in_new_dependent: "Error en intentar crear objectes dependents: %{dependent_class} #%{related_id} -%{related_subject}: %{error}" #%{related_id} -%{related_subject}: %{error}"
Expand Down Expand Up @@ -1373,10 +1373,10 @@ ca:
blocks:
community: "Comunitat OpenProject"
upsale:
title: "Upgrade to Enterprise edition"
title: "Actualitza a l'edició Enterprise"
more_info: "Més informació"
links:
upgrade_enterprise_edition: "Upgrade to Enterprise edition"
upgrade_enterprise_edition: "Actualitza a l'edició Enterprise"
postgres_migration: "Migrant la teva instal·lació a PostgreSQL"
user_guides: "Guies d'usuari"
faq: "Preguntes Més Freqüents"
Expand Down Expand Up @@ -1592,7 +1592,7 @@ ca:
label_enumerations: "Enumeracions"
label_enterprise: "Enterprise"
label_enterprise_active_users: "%{current}/%{limit} usuaris actius registrats"
label_enterprise_edition: "Enterprise edition"
label_enterprise_edition: "Edició Enterprise."
label_environment: "Entorn"
label_estimates_and_time: "Estimacions i temps"
label_equals: "és"
Expand Down Expand Up @@ -2600,11 +2600,11 @@ ca:
text_custom_field_hint_activate_per_project_and_type: >
Els camps personalitzats han d'activar-se per classe de paquet de treball i per projecte.
text_wp_custom_field_html: >
The Enterprise edition will add these additional add-ons for work packages' custom fields: <br> <ul> <li><b>Allow multi-select for custom fields of type List or User</b></li> </ul>
L'edició Enterprise afegirà add-ons extra pels camps personalitzats de paquets de treball: <br> <ul> <li><b>Permet múltiple selecció dels camps personalitzats pels estils Llista o Usuari</b></li> </ul>
text_wp_status_read_only_html: >
The Enterprise edition will add these additional add-ons for work packages' statuses fields: <br> <ul> <li><b>Allow to mark work packages to read-only for specific statuses</b></li> </ul>
L'edició Enterprise afegirà add-ons extra pels estats de paquets de treball: <br> <ul> <li><b>Permet marcar paquets de treball com a només lectura per a estats específics</b></li> </ul>
text_project_custom_field_html: >
The Enterprise edition will add these additional add-ons for projects' custom fields: <br> <ul> <li><b>Add custom fields for projects to your Project list to create a project portfolio view</b></li> </ul>
L'edició Enterprise afegirà add-ons extra pels camps personalitzats de projectes: <br> <ul> <li><b>Afegeix camps personalitzats pels teus projectes a la teva llista de projectes per crear una vista de cartera de projectes</b></li> </ul>
text_custom_logo_instructions: >
Es recomana un logo blanc amb fons transparent. Per a un millor resultat tant en pantalles retina o convencionals assegura't que la teva imatge té unes dimensions de 460px per 60px.
text_custom_favicon_instructions: >
Expand Down Expand Up @@ -2906,7 +2906,7 @@ ca:
warning_user_limit_reached: >
Límit d'usuaris assolit. No pots activar cap més usuari. Si us plau, <a href="%{upgrade_url}">actualitza el teu pla</a> o bloqueja a membres per permetre nous usuaris.
warning_user_limit_reached_instructions: >
You reached your user limit (%{current}/%{max} active users). Please contact [email protected] to upgrade your Enterprise edition plan and add additional users.
Has assolit el nombre d'usuaris límit (%{current}/%{max} usuaris actius. Si us plau, posa't en contacte amb [email protected] per actualitzar la teva edició Enterpirse i afegir nous usuaris.
warning_protocol_mismatch_html: >
warning_bar:
Expand Down
6 changes: 3 additions & 3 deletions config/locales/crowdin/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -865,7 +865,7 @@ de:
category: "Kategorie"
status: "Arbeitspaket-Status"
member: "Mitglied"
news: "Nachrichten"
news: "Neuigkeiten"
notification:
one: "Benachrichtigung"
other: "Benachrichtigungen"
Expand Down Expand Up @@ -1719,7 +1719,7 @@ de:
label_new: "Neu"
label_new_features: "Neue Funktionen"
label_new_statuses_allowed: "Neuer Status"
label_news_singular: "Nachricht"
label_news_singular: "Neuigkeit"
label_news_added: "Neuigkeit hinzugefügt"
label_news_comment_added: "Kommentar einer Nachricht hinzugefügt"
label_news_latest: "Aktuellste Nachrichten"
Expand Down Expand Up @@ -2944,7 +2944,7 @@ de:
warning: >
Änderungen an Arbeitstagen können den Start und das Ende aller Arbeitspakete in allen Projekten in dieser Instanz beeinflussen.
journal_note:
changed: _**Arbeitstage ** geändert (%{changes})._
changed: _**Arbeitstage** geändert (%{changes})._
days:
working: "%{day} ist jetzt ein Arbeitstag"
non_working: "%{day} ist jetzt kein Arbeitstag"
Expand Down
8 changes: 4 additions & 4 deletions config/locales/crowdin/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2607,11 +2607,11 @@ es:
text_custom_field_hint_activate_per_project_and_type: >
Los campos personalizados se deben activar en cada tipo de paquete de trabajo y en cada proyecto por separado.
text_wp_custom_field_html: >
The Enterprise edition will add these additional add-ons for work packages' custom fields: <br> <ul> <li><b>Allow multi-select for custom fields of type List or User</b></li> </ul>
La edición Enterprise añadirá estos add-ons extra para los campos personalizados de los paquetes de trabajo: <br> <ul> <li><b>Permitir la selección múltiple de campos personalizados de tipo Lista o Usuario</b></li> </ul>
text_wp_status_read_only_html: >
The Enterprise edition will add these additional add-ons for work packages' statuses fields: <br> <ul> <li><b>Allow to mark work packages to read-only for specific statuses</b></li> </ul>
La edición Enterprise añadirá estos add-ons extras para los campos de estado de los paquetes de trabajo: <br> <ul> <li><b>Permitir marcar como solo lectura los paquetes de trabajo en estados específicos</b></li> </ul>
text_project_custom_field_html: >
The Enterprise edition will add these additional add-ons for projects' custom fields: <br> <ul> <li><b>Add custom fields for projects to your Project list to create a project portfolio view</b></li> </ul>
La edición Enterprise añadirá estos add-ons extra para los campos personalizados de los proyectos: <br> <ul> <li><b>Añadir campos personalizados para proyectos a tu lista de proyectos para crear una vista porfolio de proyectos</b></li> </ul>
text_custom_logo_instructions: >
Se recomienda usar un logotipo blanco sobre un fondo transparente. Para obtener los mejores resultados, tanto en pantallas convencionales como en las del tipo Retina, asegúrese de que las dimensiones de la imagen sean de 460 × 60 px.
text_custom_favicon_instructions: >
Expand Down Expand Up @@ -2912,7 +2912,7 @@ es:
warning_user_limit_reached: >
Alcanzado el límite de usuarios. No se puede activar ningún usuario más. <a href="%{upgrade_url}">actualice su plan</a> o bloquee miembros para permitir usuarios adicionales.
warning_user_limit_reached_instructions: >
You reached your user limit (%{current}/%{max} active users). Please contact [email protected] to upgrade your Enterprise edition plan and add additional users.
Has alcanzado el límite de usuarios (%{current}/%{max} usuarios activos). Por favor, contacta con [email protected] para mejorar tu plan de edición Enterprise y añadir usuarios adicionales.
warning_protocol_mismatch_html: >
warning_bar:
Expand Down
Loading

0 comments on commit 472fb4b

Please sign in to comment.