Class: Tuersteher::AccessRulesStorage

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/tuersteher.rb

Constant Summary collapse

DEFAULT_RULES_CONFIG_FILE =

in config-dir

'access_rules.rb'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeAccessRulesStorage

private initializer why this class is a singleton



46
47
48
49
50
51
# File 'lib/tuersteher.rb', line 46

def initialize
  @path_rules = []
  @model_rules = []
  @check_intervall = 300 # set default check interval to 5 minutes
  @mutex = Mutex.new
end

Instance Attribute Details

#check_intervallObject

check intervall in seconds to check config file



40
41
42
# File 'lib/tuersteher.rb', line 40

def check_intervall
  @check_intervall
end

#path_prefixObject

prefix for path-rules



41
42
43
# File 'lib/tuersteher.rb', line 41

def path_prefix
  @path_prefix
end

#rules_config_fileObject



90
91
92
# File 'lib/tuersteher.rb', line 90

def rules_config_file
  @rules_config_file ||= File.join(Rails.root, 'config', DEFAULT_RULES_CONFIG_FILE)
end

Instance Method Details

#denyObject

create new rule as deny-rule and add this to the model_rules array



166
167
168
169
# File 'lib/tuersteher.rb', line 166

def deny
  rule = grant
  rule.deny
end

#eval_rules(rules_definitions) ⇒ Object

evaluated rules_definitions and create path-/model-rules



95
96
97
98
99
100
101
102
# File 'lib/tuersteher.rb', line 95

def eval_rules rules_definitions
  @path_rules = []
  @model_rules = []
  eval rules_definitions, binding, (@rules_config_file||'no file')
  @was_read = true
  Tuersteher::TLogger.logger.info "Tuersteher::AccessRulesStorage: #{@path_rules.size} path-rules and #{@model_rules.size} model-rules loaded"
  extend_path_rules_with_prefix
end

#grantObject

create new rule as grant-rule and add this to the model_rules array



158
159
160
161
162
# File 'lib/tuersteher.rb', line 158

def grant
  rule = @current_rule_class.new(@current_rule_init)
  @current_rule_storage << rule
  rule.grant
end

#model(model_class) ⇒ Object

definiert Model-basierende Zugriffsregel

model_class: Model-Klassenname(als CLass oder String) oder :all fuer alle



142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/tuersteher.rb', line 142

def model model_class
  if block_given?
    @current_rule_class = ModelAccessRule
    @current_rule_init = model_class
    @current_rule_storage = @model_rules
    yield
    @current_rule_class = @current_rule_init = @current_rule_storage = nil
  else
    rule = ModelAccessRule.new(model_class)
    @model_rules << rule
    rule
  end
end

#model_rulesObject

get all model_rules as array of ModelAccessRule-Instances



64
65
66
67
# File 'lib/tuersteher.rb', line 64

def model_rules
  read_rules_if_needed
  @model_rules
end

#path(url_path) ⇒ Object

definiert HTTP-Pfad-basierende Zugriffsregel

path: :all fuer beliebig, sonst String mit der http-path beginnen muss,

wird als RegEX-Ausdruck ausgewertet


124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/tuersteher.rb', line 124

def path url_path
  if block_given?
    @current_rule_class = PathAccessRule
    @current_rule_init = url_path
    @current_rule_storage = @path_rules
    yield
    @current_rule_class = @current_rule_init = nil
  else
    rule = PathAccessRule.new(url_path)
    @path_rules << rule
    rule
  end
end

#path_rulesObject

get all path_rules as array of PathAccessRule-Instances



58
59
60
61
# File 'lib/tuersteher.rb', line 58

def path_rules
  read_rules_if_needed
  @path_rules
end

#read_rulesObject

Load AccesRules from file

config/access_rules.rb


106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/tuersteher.rb', line 106

def read_rules
  @was_read = false
  @mutex.synchronize do
    return if @was_read # dann hat ein anderer Thread bereits gelesen
    content = File.read self.rules_config_file
    if content
      eval_rules content
    end
  end
rescue => ex
  Tuersteher::TLogger.logger.error "Tuersteher::AccessRulesStorage - Error in rules: #{ex.message}\n\t"+ex.backtrace.join("\n\t")
end

#read_rules_if_neededObject



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/tuersteher.rb', line 70

def read_rules_if_needed
  if @was_read
    # im check_intervall pruefen ob AccessRules-File sich geƤndert hat
    t = Time.now.to_i
    @last_read_check ||= t
    if (t - @last_read_check) > @check_intervall
      @last_read_check = t
      cur_mtime = File.mtime(self.rules_config_file)
      @last_mtime ||= cur_mtime
      if cur_mtime > @last_mtime
        @last_mtime = cur_mtime
        read_rules
      end
    end
  else
    read_rules
  end
end

#ready?Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/tuersteher.rb', line 53

def ready?
  @was_read
end