bizside 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/images/jquery-treeTable/images/toggle-collapse-dark.png +0 -0
  3. data/app/assets/images/jquery-treeTable/images/toggle-collapse-light.png +0 -0
  4. data/app/assets/images/jquery-treeTable/images/toggle-expand-dark.png +0 -0
  5. data/app/assets/images/jquery-treeTable/images/toggle-expand-light.png +0 -0
  6. data/app/assets/javascripts/bizside.js +1 -0
  7. data/app/assets/javascripts/jquery-treeTable/jquery.treeTable.js +400 -0
  8. data/app/assets/stylesheets/bizside.css +3 -0
  9. data/app/assets/stylesheets/jquery-treeTable/jquery.treeTable.css.erb +55 -0
  10. data/lib/bizside/acl/access_control_utils.rb +36 -0
  11. data/lib/bizside/acl/available_helper.rb +65 -0
  12. data/lib/bizside/acl/controller_helper.rb +15 -0
  13. data/lib/bizside/acl.rb +6 -0
  14. data/lib/bizside/active_record_logger.rb +3 -0
  15. data/lib/bizside/audit/job_logger.rb +14 -0
  16. data/lib/bizside/audit/logger.rb +35 -0
  17. data/lib/bizside/audit_log.rb +158 -0
  18. data/lib/bizside/cache/entry.rb +112 -0
  19. data/lib/bizside/cache/file_store.rb +167 -0
  20. data/lib/bizside/cache/store.rb +237 -0
  21. data/lib/bizside/cache_util.rb +47 -0
  22. data/lib/bizside/cache_utils.rb +10 -0
  23. data/lib/bizside/carrierwave.rb +48 -0
  24. data/lib/bizside/config.rb +63 -0
  25. data/lib/bizside/configurations/mail.rb +37 -0
  26. data/lib/bizside/configurations/prefix.rb +25 -0
  27. data/lib/bizside/configurations/storage.rb +28 -0
  28. data/lib/bizside/coverage/launch.rb +25 -0
  29. data/lib/bizside/coverage/rcov_formatter.rb +13 -0
  30. data/lib/bizside/cron_validator.rb +62 -0
  31. data/lib/bizside/cucumber.rb +1 -0
  32. data/lib/bizside/engine.rb +4 -0
  33. data/lib/bizside/file_converter.rb +56 -0
  34. data/lib/bizside/file_uploader.rb +71 -0
  35. data/lib/bizside/gengou.rb +46 -0
  36. data/lib/bizside/gengou.yml +5 -0
  37. data/lib/bizside/hanaita_conf.rb +88 -0
  38. data/lib/bizside/implicit_ftps.rb +29 -0
  39. data/lib/bizside/itamae_conf.rb +186 -0
  40. data/lib/bizside/job_utils.rb +285 -0
  41. data/lib/bizside/log_analyzer.rb +122 -0
  42. data/lib/bizside/mailer.rb +56 -0
  43. data/lib/bizside/query_builder.rb +78 -0
  44. data/lib/bizside/railtie.rb +80 -0
  45. data/lib/bizside/record_has_warnings.rb +4 -0
  46. data/lib/bizside/resque.rb +141 -0
  47. data/lib/bizside/rsync.rb +40 -0
  48. data/lib/bizside/safe_pty.rb +17 -0
  49. data/lib/bizside/shib_utils.rb +18 -0
  50. data/lib/bizside/show_exceptions.rb +18 -0
  51. data/lib/bizside/sql_utils.rb +45 -0
  52. data/lib/bizside/string_io.rb +39 -0
  53. data/lib/bizside/string_utils.rb +157 -0
  54. data/lib/bizside/task_helper.rb +263 -0
  55. data/lib/bizside/tasks.rb +6 -0
  56. data/lib/bizside/test_help.rb +17 -0
  57. data/lib/bizside/uploader/content_type_validator.rb +39 -0
  58. data/lib/bizside/uploader/default_extensions.yml +15 -0
  59. data/lib/bizside/uploader/exif.rb +43 -0
  60. data/lib/bizside/uploader/extension_whitelist.rb +26 -0
  61. data/lib/bizside/uploader/filename_validator.rb +31 -0
  62. data/lib/bizside/user_agent/action_view/action_view_4.rb +56 -0
  63. data/lib/bizside/user_agent/action_view/use_variant.rb +4 -0
  64. data/lib/bizside/user_agent/action_view.rb +10 -0
  65. data/lib/bizside/user_agent/controller_helper.rb +51 -0
  66. data/lib/bizside/user_agent.rb +108 -0
  67. data/lib/bizside/validations.rb +8 -0
  68. data/lib/bizside/version.rb +3 -0
  69. data/lib/bizside/view_helper.rb +10 -0
  70. data/lib/bizside/warning.rb +24 -0
  71. data/lib/bizside/yes.rb +16 -0
  72. data/lib/bizside.rb +96 -0
  73. data/lib/cron_validator.rb +3 -0
  74. data/lib/gengou.rb +3 -0
  75. data/lib/job_utils.rb +3 -0
  76. data/lib/query_builder.rb +3 -0
  77. data/lib/record_has_warnings.rb +3 -0
  78. data/lib/sql_utils.rb +3 -0
  79. data/lib/string_utils.rb +3 -0
  80. data/lib/user_agent.rb +3 -0
  81. data/lib/yes.rb +3 -0
  82. data/rails/locales/ja.yml +12 -0
  83. data/validations/collection_presence_validator.rb +15 -0
  84. data/validations/email_validator.rb +1 -0
  85. data/validations/ip_address_validator.rb +22 -0
  86. data/validations/tel_validator.rb +28 -0
  87. data/validations/url_validator.rb +30 -0
  88. data/validations/zip_validator.rb +35 -0
  89. metadata +467 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9dcc6b0f9213ae2af553a733bccf759947c3815a9942c10c6942ad790920c4ec
4
+ data.tar.gz: 93a2466cbd7420b711fc9d2ca8a4d910bb2507054fc52b60a32b5268bb614349
5
+ SHA512:
6
+ metadata.gz: f8e2f4bd706c81e0a9029af91a19af46835843e44b5074809bda0f17331eb66284da30723a57e5133220d168db5ea07b49c874198d06bc077654021d94d92cd0
7
+ data.tar.gz: 31bfb0c73147bcf7246d8378cc6b426d834fc989bca781d684ce7016f586070aa45e0c3a4ea7b65592b5c0c268becfcd1a279d8f0afcb624a4612d542558f2c3
@@ -0,0 +1 @@
1
+ //= require_tree ./jquery-treeTable
@@ -0,0 +1,400 @@
1
+ /*
2
+ * jQuery treeTable Plugin VERSION
3
+ * http://ludo.cubicphuse.nl/jquery-plugins/treeTable/doc/
4
+ *
5
+ * Copyright 2011, Ludo van den Boom
6
+ * Dual licensed under the MIT or GPL Version 2 licenses.
7
+ */
8
+ (function($) {
9
+ // Helps to make options available to all functions
10
+ // TODO: This gives problems when there are both expandable and non-expandable
11
+ // trees on a page. The options shouldn't be global to all these instances!
12
+ var options;
13
+ var defaultPaddingLeft;
14
+ var persistStore;
15
+ var rootOfChildClass;//child-of-root-6形式。rootの直下を示すclass文字列
16
+
17
+ $.fn.treeTable = function(opts) {
18
+ options = $.extend({}, $.fn.treeTable.defaults, opts);
19
+
20
+ if(options.persist) {
21
+ persistStore = new Persist.Store(options.persistStoreName);
22
+ }
23
+
24
+ return this.each(function() {
25
+ $(this).addClass("treeTable").find("tbody tr").each(function() {
26
+ // Skip initialized nodes.
27
+ if (!$(this).hasClass('initialized')) {
28
+ var isRootNode = ($(this)[0].className.search(options.childPrefix) == -1);
29
+
30
+ if (isRootNode) {
31
+ $(this).addClass('trroot');
32
+ rootOfChildClass = options.childPrefix + $(this).attr("id");
33
+ }
34
+ // To optimize performance of indentation, I retrieve the padding-left
35
+ // value of the first root node. This way I only have to call +css+
36
+ // once.
37
+ if (isRootNode && isNaN(defaultPaddingLeft)) {
38
+ defaultPaddingLeft = parseInt($($(this).children("td")[options.treeColumn]).css('padding-left'), 10);
39
+ }
40
+
41
+ // Set child nodes to initial state if we're in expandable mode.
42
+ if(!isRootNode && options.expandable && options.initialState == "collapsed") {
43
+ $(this).addClass('ui-helper-hidden');
44
+ }
45
+
46
+ // If we're not in expandable mode, initialize all nodes.
47
+ // If we're in expandable mode, only initialize root nodes.
48
+ if(!options.expandable || isRootNode || options.lazyLoad) {
49
+ initialize($(this));
50
+ }
51
+ }
52
+ });
53
+ });
54
+ };
55
+
56
+ $.fn.treeTable.defaults = {
57
+ childPrefix: "child-of-",
58
+ clickableNodeNames: false,
59
+ expandable: true,
60
+ indent: 19,
61
+ childRight: 0,
62
+ initialState: "collapsed",
63
+ onNodeShow: null,
64
+ onNodeHide: null,
65
+ treeColumn: 0,
66
+ persist: false,
67
+ persistStoreName: 'treeTable',
68
+ stringExpand: "Expand",
69
+ stringCollapse: "Collapse",
70
+ leafIconPath: "",
71
+ lazyLoad: false,
72
+ onNodeLoad: null
73
+ };
74
+
75
+ //Expand all nodes
76
+ $.fn.expandAll = function() {
77
+ $(this).find("tr").each(function() {
78
+ $(this).expand();
79
+ });
80
+ };
81
+
82
+ //Collapse all nodes
83
+ $.fn.collapseAll = function() {
84
+ $(this).find("tr").each(function() {
85
+ $(this).collapse();
86
+ });
87
+ };
88
+
89
+ // Recursively hide all node's children in a tree
90
+ $.fn.collapse = function() {
91
+ return this.each(function() {
92
+ $(this).removeClass("expanded").addClass("collapsed");
93
+
94
+ if (options.persist) {
95
+ persistNodeState($(this));
96
+ }
97
+
98
+ childrenOf($(this)).each(function() {
99
+ if(!$(this).hasClass("collapsed")) {
100
+ $(this).collapse();
101
+ }
102
+
103
+ $(this).addClass('ui-helper-hidden');
104
+
105
+ if($.isFunction(options.onNodeHide)) {
106
+ options.onNodeHide.call(this);
107
+ }
108
+
109
+ });
110
+ });
111
+ };
112
+
113
+ // Recursively show all node's children in a tree
114
+ $.fn.expand = function() {
115
+ return this.each(function() {
116
+ $(this).removeClass("collapsed").addClass("expanded");
117
+
118
+ if (options.persist) {
119
+ persistNodeState($(this));
120
+ }
121
+
122
+ childrenOf($(this)).each(function() {
123
+ initialize($(this));
124
+
125
+ if($(this).is(".expanded.parent")) {
126
+ $(this).expand();
127
+ }
128
+
129
+ $(this).removeClass('ui-helper-hidden');
130
+
131
+ if($.isFunction(options.onNodeShow)) {
132
+ options.onNodeShow.call(this);
133
+ }
134
+ });
135
+ });
136
+ };
137
+
138
+ // 現在の設定を一つ取得
139
+ $.fn.getoption = function(key) {
140
+ return options[key];
141
+ };
142
+
143
+ // Reveal a node by expanding all ancestors
144
+ $.fn.reveal = function() {
145
+ $(ancestorsOf($(this)).reverse()).each(function() {
146
+ initialize($(this));
147
+ $(this).expand().show();
148
+ });
149
+
150
+ return this;
151
+ };
152
+
153
+ // Add an entire branch to +destination+
154
+ $.fn.appendBranchTo = function(destination) {
155
+ var node = $(this);
156
+ var parent = parentOf(node);
157
+
158
+ var ancestorNames = $.map(ancestorsOf($(destination)), function(a) { return a.id; });
159
+
160
+ // Conditions:
161
+ // 1: +node+ should not be inserted in a location in a branch if this would
162
+ // result in +node+ being an ancestor of itself.
163
+ // 2: +node+ should not have a parent OR the destination should not be the
164
+ // same as +node+'s current parent (this last condition prevents +node+
165
+ // from being moved to the same location where it already is).
166
+ // 3: +node+ should not be inserted as a child of +node+ itself.
167
+ if($.inArray(node[0].id, ancestorNames) == -1 && (!parent || (destination.id != parent[0].id)) && destination.id != node[0].id) {
168
+ indent(node, ancestorsOf(node).length * options.indent * -1); // Remove indentation
169
+
170
+ if(parent) { node.removeClass(options.childPrefix + parent[0].id); }
171
+
172
+ node.addClass(options.childPrefix + destination.id);
173
+ move(node, destination); // Recursively move nodes to new location
174
+ indent(node, ancestorsOf(node).length * options.indent);
175
+ }
176
+
177
+ return this;
178
+ };
179
+
180
+ // Add reverse() function from JS Arrays
181
+ $.fn.reverse = function() {
182
+ return this.pushStack(this.get().reverse(), arguments);
183
+ };
184
+
185
+ // Toggle an entire branch
186
+ $.fn.toggleBranch = function() {
187
+ if($(this).hasClass("collapsed")) {
188
+ if (options.lazyLoad && !$(this).hasClass('loaded')) {
189
+ if($.isFunction(options.onNodeLoad)) {
190
+ options.onNodeLoad.call(this, $(this));
191
+ }
192
+ }
193
+ $(this).expand();
194
+ } else {
195
+ $(this).collapse();
196
+ }
197
+
198
+ return this;
199
+ };
200
+
201
+ // Private関数だったmoveを無理やりpublicにしたもの。set要素は無いです。
202
+ $.fn.setmove = function(node, destination) {
203
+ return move(node, destination);
204
+ };
205
+
206
+ //子の有無を抜きにして矢印を設定
207
+ //treetableプラグインは▼矢印がつくかどうかを子があるかどうかで判断しており、
208
+ //Explorerのようなフォルダとファイルの区別がない。
209
+ //それでは困るため、ここで指定したnodeは子の有無にかかわらず▼矢印をつける。
210
+ $.fn.setNodeArrow = function(node) {
211
+ var childNodes = childrenOf(node);
212
+
213
+ if(!node.hasClass("parent")) {
214
+ node.addClass("parent");
215
+ }
216
+
217
+ if(node.hasClass("parent")) {
218
+ var cell = $(node.children("td")[options.treeColumn]);
219
+ var padding = getPaddingLeft(cell) + options.indent;
220
+
221
+ childNodes.each(function() {
222
+ if($(this).hasClass(rootOfChildClass)){
223
+ }else{
224
+ padding = padding - options.childRight;
225
+ }
226
+ $(this).children("td")[options.treeColumn].style.paddingLeft = (padding + options.childRight) + "px";
227
+ });
228
+
229
+ if(options.expandable) {
230
+ var newLink = '<a href="#" title="' + options.stringExpand + '" style="margin-left: ' + (-1)*(options.indent) + 'px; padding-left: ' + options.indent + 'px" class="expander"></a>';
231
+
232
+ cell.find('a[title="' + options.stringExpand + '"]').remove();
233
+
234
+ if(options.clickableNodeNames) {
235
+ cell.wrapInner(newLink);
236
+ } else {
237
+ cell.html(newLink+cell.html());
238
+ }
239
+
240
+ $(cell[0].firstChild).click(function() { node.toggleBranch(); return false; }).mousedown(function() { return false; });
241
+ $(cell[0].firstChild).keydown(function(e) { if(e.keyCode == 13) { node.toggleBranch(); return false; }});
242
+
243
+ if(options.clickableNodeNames) {
244
+ cell[0].style.cursor = "pointer";
245
+ $(cell).click(function(e) {
246
+ // Don't double-toggle if the click is on the existing expander icon
247
+ if (e.target.className != 'expander') {
248
+ node.toggleBranch();
249
+ }
250
+ });
251
+ }
252
+
253
+ if (options.persist && getPersistedNodeState(node)) {
254
+ node.addClass('expanded');
255
+ }
256
+
257
+ // Check for a class set explicitly by the user, otherwise set the default class
258
+ if(!(node.hasClass("expanded") || node.hasClass("collapsed"))) {
259
+ node.addClass(options.initialState);
260
+ }
261
+
262
+ if(node.hasClass("expanded")) {
263
+ node.expand();
264
+ }
265
+ }
266
+ }
267
+ return this;
268
+ };
269
+
270
+ // === Private functions
271
+
272
+ function ancestorsOf(node) {
273
+ var ancestors = [];
274
+ while(node = parentOf(node)) {
275
+ ancestors[ancestors.length] = node[0];
276
+ }
277
+ return ancestors;
278
+ };
279
+
280
+ function childrenOf(node) {
281
+ return $(node).siblings("tr." + options.childPrefix + node[0].id);
282
+ };
283
+
284
+ function getPaddingLeft(node) {
285
+ var paddingLeft = parseInt(node[0].style.paddingLeft, 10);
286
+ return (isNaN(paddingLeft)) ? defaultPaddingLeft : paddingLeft;
287
+ }
288
+
289
+ function indent(node, value) {
290
+ var cell = $(node.children("td")[options.treeColumn]);
291
+ cell[0].style.paddingLeft = getPaddingLeft(cell) + value + "px";
292
+
293
+ childrenOf(node).each(function() {
294
+ indent($(this), value);
295
+ });
296
+ };
297
+
298
+ function initialize(node) {
299
+ if(!node.hasClass("initialized")) {
300
+ node.addClass("initialized");
301
+
302
+ var childNodes = childrenOf(node);
303
+
304
+ if(!node.hasClass("parent") && (childNodes.length > 0 || options.lazyLoad)) {
305
+ node.addClass("parent");
306
+ }
307
+
308
+ if(node.hasClass("parent")) {
309
+ var cell = $(node.children("td")[options.treeColumn]);
310
+ var padding = getPaddingLeft(cell) + options.indent;
311
+
312
+ childNodes.each(function() {
313
+ if($(this).hasClass(rootOfChildClass)){
314
+ }else{
315
+ padding = padding - options.childRight;
316
+ }
317
+ $(this).children("td")[options.treeColumn].style.paddingLeft = (padding + options.childRight) + "px";
318
+ });
319
+
320
+ if(options.expandable) {
321
+ var newLink = '<a href="#" title="' + options.stringExpand + '" style="margin-left: ' + (-1)*(options.indent) + 'px; padding-left: ' + options.indent + 'px" class="expander"></a>';
322
+
323
+ if(options.clickableNodeNames) {
324
+ cell.wrapInner(newLink);
325
+ } else {
326
+ cell.html(newLink+cell.html());
327
+ }
328
+
329
+ $(cell[0].firstChild).click(function() { node.toggleBranch(); return false; }).mousedown(function() { return false; });
330
+ $(cell[0].firstChild).keydown(function(e) { if(e.keyCode == 13) { node.toggleBranch(); return false; }});
331
+
332
+ if(options.clickableNodeNames) {
333
+ cell[0].style.cursor = "pointer";
334
+ $(cell).click(function(e) {
335
+ // Don't double-toggle if the click is on the existing expander icon
336
+ if (e.target.className != 'expander') {
337
+ node.toggleBranch();
338
+ }
339
+ });
340
+ }
341
+
342
+ if (options.persist && getPersistedNodeState(node)) {
343
+ node.addClass('expanded');
344
+ }
345
+
346
+ // Check for a class set explicitly by the user, otherwise set the default class
347
+ if(!(node.hasClass("expanded") || node.hasClass("collapsed"))) {
348
+ node.addClass(options.initialState);
349
+ }
350
+
351
+ if(node.hasClass("expanded")) {
352
+ node.expand();
353
+ }
354
+ }
355
+ }
356
+ }
357
+ };
358
+
359
+ function move(node, destination) {
360
+ node.insertAfter(destination);
361
+ childrenOf(node).reverse().each(function() { move($(this), node[0]); });
362
+ };
363
+
364
+ function parentOf(node) {
365
+ var classNames = node[0].className.split(' ');
366
+
367
+ for(var key=0; key<classNames.length; key++) {
368
+ if(classNames[key].match(options.childPrefix)) {
369
+ return $(node).siblings("#" + classNames[key].substring(options.childPrefix.length));
370
+ }
371
+ }
372
+
373
+ return null;
374
+ };
375
+
376
+ //saving state functions, not critical, so will not generate alerts on error
377
+ function persistNodeState(node) {
378
+ if(node.hasClass('expanded')) {
379
+ try {
380
+ persistStore.set(node.attr('id'), '1');
381
+ } catch (err) {
382
+
383
+ }
384
+ } else {
385
+ try {
386
+ persistStore.remove(node.attr('id'));
387
+ } catch (err) {
388
+
389
+ }
390
+ }
391
+ }
392
+
393
+ function getPersistedNodeState(node) {
394
+ try {
395
+ return persistStore.get(node.attr('id')) == '1';
396
+ } catch (err) {
397
+ return false;
398
+ }
399
+ }
400
+ })(jQuery);
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require_tree ./jquery-treeTable
3
+ */
@@ -0,0 +1,55 @@
1
+ /* jQuery treeTable stylesheet
2
+ *
3
+ * This file contains styles that are used to display the tree table. Each tree
4
+ * table is assigned the +treeTable+ class.
5
+ * ========================================================================= */
6
+
7
+ /* jquery.treeTable.collapsible
8
+ * ------------------------------------------------------------------------- */
9
+ .treeTable tr td .expander {
10
+ cursor: pointer;
11
+ padding: 0;
12
+ zoom: 1; /* IE7 Hack */
13
+ }
14
+
15
+ .treeTable tr td a.expander {
16
+ background-position: left center;
17
+ background-repeat: no-repeat;
18
+ color: #000;
19
+ text-decoration: none;
20
+ }
21
+
22
+ .treeTable tr.collapsed td a.expander {
23
+ background-image: url(<%= asset_path 'jquery-treeTable/images/toggle-expand-dark.png' %>);
24
+ }
25
+
26
+ .treeTable tr.expanded td a.expander {
27
+ background-image: url(<%= asset_path 'jquery-treeTable/images/toggle-collapse-dark.png' %>);
28
+ }
29
+
30
+ /* jquery.treeTable.sortable
31
+ * ------------------------------------------------------------------------- */
32
+ .treeTable tr.selected, .treeTable tr.accept {
33
+ background-color: #3875d7;
34
+ }
35
+
36
+ .treeTable tr.selected a.expander, .treeTable tr.accept a.expander {
37
+ color: #fff;
38
+ }
39
+
40
+ .treeTable tr.collapsed.selected td a.expander, .treeTable tr.collapsed.accept td a.expander {
41
+ background-image: url(<%= asset_path 'jquery-treeTable/images/toggle-expand-light.png' %>);
42
+ }
43
+
44
+ .treeTable tr.expanded.selected td a.expander, .treeTable tr.expanded.accept td a.expander {
45
+ background-image: url(<%= asset_path 'jquery-treeTable/images/toggle-collapse-light.png' %>);
46
+ }
47
+
48
+ .treeTable .ui-draggable-dragging {
49
+ color: #000;
50
+ z-index: 1;
51
+ }
52
+
53
+ /* Layout helper taken from jQuery UI. This way I don't have to require the
54
+ * full jQuery UI CSS to be loaded. */
55
+ .ui-helper-hidden { display: none; }
@@ -0,0 +1,36 @@
1
+ # アクセス制御のユーティリティクラス
2
+ class Bizside::Acl::AccessControlUtils
3
+
4
+ @@access_control = nil
5
+
6
+ def self.init(reload = false)
7
+ if reload or @@access_control.nil?
8
+ @@access_control = {}
9
+ config_files = Bizside.config.acl.config_files? ? Bizside.config.acl.config_files : ['config/acl.yml']
10
+ config_files.each do |config|
11
+ merge(config)
12
+ end
13
+ end
14
+ end
15
+
16
+ def self.merge(filename)
17
+ yml = YAML.load_file(filename)
18
+
19
+ yml.each do |roll_key, values|
20
+ @@access_control[roll_key] ||= {}
21
+ @@access_control[roll_key].merge!(values)
22
+ end
23
+ end
24
+
25
+ def self.role_keys
26
+ # Railsを使用 かつ 開発環境の場合はリロードする
27
+ init(Bizside.rails_env&.development?)
28
+
29
+ @@access_control.keys.sort
30
+ end
31
+
32
+ def self.get_access_control(roll_key)
33
+ @@access_control[roll_key]
34
+ end
35
+
36
+ end
@@ -0,0 +1,65 @@
1
+ require_relative 'access_control_utils'
2
+
3
+ module Bizside::Acl::AvailableHelper
4
+
5
+ def available_for(controller_name, action_name = nil, params = {})
6
+ controller_name = controller_name[1..-1] if controller_name.start_with?('/')
7
+ action_name ||= 'index'
8
+ message = "ACL: #{controller_name}##{action_name} => "
9
+
10
+ Bizside::Acl::AccessControlUtils::role_keys.each do |role_key|
11
+ access_control = Bizside::Acl::AccessControlUtils::get_access_control(role_key)
12
+
13
+ # コントローラの定義を取得
14
+ controller_value = access_control[controller_name]
15
+ next unless controller_value.present?
16
+
17
+ # アクションの定義を取得
18
+ if controller_value.is_a?(String)
19
+ action_value = controller_value
20
+ elsif controller_value.is_a?(Array)
21
+ action_value = controller_value
22
+ elsif controller_value.is_a?(TrueClass)
23
+ action_value = true
24
+ elsif controller_value.is_a?(FalseClass)
25
+ action_value = false
26
+ else
27
+ action_value = controller_value[action_name]
28
+ action_value = controller_value['index'] if action_value.nil?
29
+ if action_value.is_a?(Hash)
30
+ action_value = controller_value[action_value['same_as']] if action_value['same_as'].present?
31
+ end
32
+ end
33
+
34
+ next if action_value.nil?
35
+
36
+ # アクセス定義を確認
37
+ role = eval(role_key)
38
+ if role
39
+ if action_value.is_a?(String)
40
+ ret = role.instance_eval(action_value)
41
+ elsif action_value.is_a?(Array)
42
+ action_value.each do |judge|
43
+ ret = role.instance_eval(judge)
44
+ break unless ret
45
+ end
46
+ elsif action_value.is_a?(FalseClass)
47
+ ret = false
48
+ else
49
+ ret = true
50
+ end
51
+ else
52
+ ret = false
53
+ end
54
+
55
+ unless ret
56
+ Bizside.logger.debug message + 'false'
57
+ return false
58
+ end
59
+
60
+ end
61
+
62
+ Bizside.logger.debug message + 'true'
63
+ true
64
+ end
65
+ end
@@ -0,0 +1,15 @@
1
+ module Bizside
2
+ module Acl
3
+ module ControllerHelper
4
+ include Bizside::Acl::AvailableHelper
5
+
6
+ def authorize_user!
7
+ unless available_for(params[:controller], params[:action], params)
8
+ redirect_to root_path
9
+ return
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ module Bizside
2
+ module Acl
3
+ require_relative 'acl/available_helper'
4
+ require_relative 'acl/controller_helper'
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ if Rails.env.development?
2
+ ActiveRecord::Base.logger = nil
3
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'logger'
2
+
3
+ module Bizside
4
+ module Audit
5
+ class JobLogger < self::Logger
6
+
7
+ # override
8
+ # @see Bizside::Audit::Logger#file_path
9
+ def file_path
10
+ File.join('log', 'job_audit.log')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,35 @@
1
+ require 'singleton'
2
+ require 'logger'
3
+ require 'ltsv'
4
+
5
+ module Bizside
6
+ module Audit
7
+ class Logger
8
+ include Singleton
9
+
10
+ def self.logger
11
+ self.instance
12
+ end
13
+
14
+ def initialize
15
+ path = file_path
16
+ FileUtils.mkdir_p( File.dirname(path) )
17
+ file = File.open(path, 'a')
18
+ file.sync = true
19
+
20
+ @logger = ::Logger.new(file)
21
+ @logger.formatter = proc do |severity, datetime, progname, msg|
22
+ "#{msg}\n"
23
+ end
24
+ end
25
+
26
+ def record(info = {})
27
+ @logger.info LTSV.dump(info)
28
+ end
29
+
30
+ def file_path
31
+ File.join('log', 'audit.log')
32
+ end
33
+ end
34
+ end
35
+ end