Redmine 4.1.1

This commit is contained in:
Manuel Cillero 2020-11-22 21:20:06 +01:00
parent 33e7b881a5
commit 3d976f1b3b
1593 changed files with 36180 additions and 19489 deletions

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -17,6 +19,13 @@
class Setting < ActiveRecord::Base
PASSWORD_CHAR_CLASSES = {
'uppercase' => /[A-Z]/,
'lowercase' => /[a-z]/,
'digits' => /[0-9]/,
'special_chars' => /[[:ascii:]&&[:graph:]&&[:^alnum:]]/
}
DATE_FORMATS = [
'%Y-%m-%d',
'%d/%m/%Y',
@ -34,7 +43,7 @@ class Setting < ActiveRecord::Base
'%I:%M %p'
]
ENCODINGS = %w(US-ASCII
ENCODINGS = %w(US-ASCII
windows-1250
windows-1251
windows-1252
@ -82,7 +91,6 @@ class Setting < ActiveRecord::Base
validates_numericality_of :value, :only_integer => true, :if => Proc.new { |setting|
(s = available_settings[setting.name]) && s['format'] == 'int'
}
attr_protected :id
# Hash used to cache setting values
@cached_settings = {}
@ -106,19 +114,18 @@ class Setting < ActiveRecord::Base
# Returns the value of the setting named name
def self.[](name)
v = @cached_settings[name]
v ? v : (@cached_settings[name] = find_or_default(name).value)
@cached_settings[name] ||= find_or_default(name).value
end
def self.[]=(name, v)
setting = find_or_default(name)
setting.value = (v ? v : "")
setting.value = v || ''
@cached_settings[name] = nil
setting.save
setting.value
end
# Updates multiple settings from params and sends a security notification if needed
# Updates multiple settings from params and sends a security notification if needed
def self.set_all_from_params(settings)
return nil unless settings.is_a?(Hash)
settings = settings.dup.symbolize_keys
@ -136,30 +143,41 @@ class Setting < ActiveRecord::Base
end
end
if changes.any?
Mailer.security_settings_updated(changes)
Mailer.deliver_settings_updated(User.current, changes)
end
nil
end
def self.validate_all_from_params(settings)
messages = []
if settings.key?(:mail_handler_body_delimiters) || settings.key?(:mail_handler_enable_regex_delimiters)
regexp = Setting.mail_handler_enable_regex_delimiters?
if settings.key?(:mail_handler_enable_regex_delimiters)
regexp = settings[:mail_handler_enable_regex_delimiters].to_s != '0'
end
if regexp
settings[:mail_handler_body_delimiters].to_s.split(/[\r\n]+/).each do |delimiter|
begin
Regexp.new(delimiter)
rescue RegexpError => e
messages << [:mail_handler_body_delimiters, "#{l('activerecord.errors.messages.not_a_regexp')} (#{e.message})"]
[
[:mail_handler_enable_regex_delimiters, :mail_handler_body_delimiters, /[\r\n]+/],
[:mail_handler_enable_regex_excluded_filenames, :mail_handler_excluded_filenames, /\s*,\s*/]
].each do |enable_regex, regex_field, delimiter|
if settings.key?(regex_field) || settings.key?(enable_regex)
regexp = Setting.send("#{enable_regex}?")
if settings.key?(enable_regex)
regexp = settings[enable_regex].to_s != '0'
end
if regexp
settings[regex_field].to_s.split(delimiter).each do |value|
begin
Regexp.new(value)
rescue RegexpError => e
messages << [regex_field, "#{l('activerecord.errors.messages.not_a_regexp')} (#{e.message})"]
end
end
end
end
end
if settings.key?(:mail_from)
begin
mail_from = Mail::Address.new(settings[:mail_from])
raise unless mail_from.address =~ EmailAddress::EMAIL_REGEXP
rescue
messages << [:mail_from, l('activerecord.errors.messages.invalid')]
end
end
messages
end
@ -254,19 +272,19 @@ class Setting < ActiveRecord::Base
def self.define_setting(name, options={})
available_settings[name.to_s] = options
src = <<-END_SRC
def self.#{name}
self[:#{name}]
end
src = <<~END_SRC
def self.#{name}
self[:#{name}]
end
def self.#{name}?
self[:#{name}].to_i > 0
end
def self.#{name}?
self[:#{name}].to_i > 0
end
def self.#{name}=(value)
self[:#{name}] = value
end
END_SRC
def self.#{name}=(value)
self[:#{name}] = value
end
END_SRC
class_eval src, __FILE__, __LINE__
end
@ -285,7 +303,7 @@ END_SRC
load_available_settings
load_plugin_settings
private
private
def force_utf8_strings(arg)
if arg.is_a?(String)
@ -318,4 +336,5 @@ private
end
setting
end
private_class_method :find_or_default
end