File Coverage

lib/PEF/Front/Config.pm
Criterion Covered Total %
statement 54 140 38.5
branch 7 30 23.3
condition 2 11 18.1
subroutine 9 64 14.0
pod 0 56 0.0
total 72 301 23.9


line stmt bran cond sub pod time code
1             package PEF::Front::Config;
2 1     1   6 use warnings;
  1         2  
  1         25  
3 1     1   5 use strict;
  1         2  
  1         14  
4 1     1   4 use FindBin;
  1         2  
  1         34  
5 1     1   5 use File::Basename;
  1         1  
  1         46  
6 1     1   5 use feature 'state';
  1         13  
  1         347  
7             our $project_dir;
8             our $app_conf_dir;
9             our $app_namespace;
10              
11             sub normalize_path {
12 1     1 0 2 my $path = $_[0];
13 1 50       6 if (not $path) {
    50          
14 0         0 return '.';
15             } elsif (substr($path, -1, 1) ne '/') {
16 0         0 return $path;
17             } else {
18 1         3 return substr($path, 0, -1);
19             }
20             }
21              
22             my @std_const_params = qw{
23             cfg_upload_dir
24             cfg_captcha_db
25             cfg_captcha_font
26             cfg_captcha_image_init
27             cfg_captcha_image_class
28             cfg_captcha_secret
29             cfg_captcha_symbols
30             cfg_captcha_expire_sec
31             cfg_model_dir
32             cfg_cache_file
33             cfg_cache_size
34             cfg_cache_method_expire
35             cfg_cache_module
36             cfg_cookie_unset_negative_expire
37             cfg_www_static_dir
38             cfg_www_static_captchas_dir
39             cfg_www_static_captchas_path
40             cfg_in_filter_dir
41             cfg_out_filter_dir
42             cfg_db_user
43             cfg_db_password
44             cfg_db_name
45             cfg_db_reconnect_trys
46             cfg_model_local_dir
47             cfg_project_dir
48             cfg_app_namespace
49             cfg_default_lang
50             cfg_url_contains_lang
51             cfg_url_only_camel_case
52             cfg_template_dir_contains_lang
53             cfg_no_multilang_support
54             cfg_location_error
55             cfg_template_cache
56             cfg_no_nls
57             cfg_handle_static
58             cfg_log_level_info
59             cfg_log_level_error
60             cfg_log_level_debug
61             cfg_session_db_file
62             cfg_session_ttl
63             cfg_session_request_field
64             cfg_session_module
65             cfg_oauth_connect_timeout
66             cfg_unknown_msgid_db
67             cfg_collect_unknown_msgid
68             cfg_model_rules_reload
69             };
70              
71             my @std_var_params = qw{
72             cfg_context_post_hook
73             cfg_template_dir
74             cfg_model_rpc
75             cfg_oauth_client_id
76             cfg_oauth_client_secret
77             cfg_oauth_scopes
78             cfg_logger
79             cfg_parse_extra_params
80             };
81              
82             our %config_export;
83              
84             sub import {
85 1     1   30 my ($modname) = grep {/AppFrontConfig\.pm$/} keys %INC;
  72         109  
86 1         3 die "no config" if 0 && !$modname;
87 1 50       5 $modname = 'fakemodule::' if !$modname;
88 1   50     36 (undef, $app_conf_dir, undef) = fileparse($INC{$modname} || '', ".pm");
89 1         4 $app_conf_dir = normalize_path($app_conf_dir);
90 1         2 $modname =~ s|\.pm||;
91 1         1 $modname =~ s|/|::|g;
92 1         6 ($app_namespace = $modname) =~ s/::[^:]*$/::/;
93 1         2 my $mp = __PACKAGE__;
94 1         2 my $cp = caller;
95 1     1   10 no strict 'refs';
  1         2  
  1         1447  
96 1         3 my @pa = (\@std_const_params, \@std_var_params);
97              
98 1         5 for (my $i = 0; $i < @pa; ++$i) {
99 2         4 for my $method (@{$pa[$i]}) {
  2         4  
100 54         157 (my $bmn = $method) =~ s/^cfg_//;
101 54   33     282 my $cref = "$modname"->can($method) || *{$mp . "::std_$bmn"};
102 54         77 *{$mp . "::$method"} = $cref;
  54         159  
103 54         78 *{$cp . "::$method"} = *{$mp . "::$method"};
  54         176  
  54         121  
104 54 50       176 *{$modname . "::$method"} = $cref if not "$modname"->can($method);
  54         129  
105 54 100       172 $config_export{$method} = $cref if $i == 0;
106             }
107             }
108 1         1 my $exports = \@{$modname . "::EXPORT"};
  1         4  
109 1         3 for my $e (@$exports) {
110 0 0       0 if ((my $cref = "$modname"->can($e))) {
111 0         0 *{$cp . "::$e"} = $cref;
  0         0  
112 0         0 $config_export{$e} = $cref;
113             }
114             }
115 1 50       5 if ("$modname"->can("project_dir")) {
116 0         0 $project_dir = normalize_path("$modname"->project_dir);
117             } else {
118 1         2 my $lpath = $FindBin::Bin;
119 1         4 $lpath =~ s'(/app$|/conf$|/bin$)'';
120 1         27 $project_dir = $lpath;
121             }
122             }
123              
124 0     0 0 0 sub std_project_dir {$project_dir}
125 0     0 0 0 sub std_no_nls {0}
126 0     0 0 0 sub std_unknown_msgid_db {cfg_project_dir() . "/var/cache/unknown-msgid.db"}
127 0     0 0 0 sub std_collect_unknown_msgid {0}
128 0     0 0 0 sub std_template_cache {cfg_project_dir() . "/var/tt_cache"}
129 0     0 0 0 sub std_location_error {"/appError?msgid=Internal\%20Error"}
130 0     0 0 0 sub std_db_reconnect_trys {30}
131 0     0 0 0 sub std_no_multilang_support {1}
132 0     0 0 0 sub std_default_lang {'en'}
133 0     0 0 0 sub std_url_contains_lang {0}
134 0     0 0 0 sub std_url_only_camel_case {1}
135 0     0 0 0 sub std_template_dir_contains_lang {0}
136 0     0 0 0 sub std_handle_static {0}
137 4     4 0 12 sub std_app_namespace {$app_namespace}
138 0     0 0   sub std_in_filter_dir {"$app_conf_dir/InFilter"}
139 0     0 0   sub std_model_local_dir {"$app_conf_dir/Local"}
140 0     0 0   sub std_out_filter_dir {"$app_conf_dir/OutFilter"}
141 0     0 0   sub std_upload_dir {cfg_project_dir() . "/var/upload"}
142 0     0 0   sub std_captcha_db {cfg_project_dir() . "/var/captcha-db"}
143 0     0 0   sub std_captcha_font {"giant"}
144 0     0 0   sub std_captcha_image_init {{}}
145 0     0 0   sub std_captcha_image_class {"PEF::Front::SecureCaptcha"}
146 0     0 0   sub std_captcha_secret {$app_namespace}
147 0     0 0   sub std_captcha_expire_sec {300}
148 0     0 0   sub std_cache_file {cfg_project_dir() . "/var/cache/shared.cache"}
149 0     0 0   sub std_cache_size {"8m"}
150 0     0 0   sub std_cache_method_expire {60}
151 0     0 0   sub std_cache_module {'Null'}
152 0     0 0   sub std_model_rules_reload {0}
153 0     0 0   sub std_model_dir {cfg_project_dir() . "/model"}
154 0     0 0   sub std_www_static_dir {cfg_project_dir() . "/www-static"}
155 0     0 0   sub std_www_static_captchas_dir {cfg_project_dir() . "/www-static/captchas"}
156 0     0 0   sub std_db_user {"pef"}
157 0     0 0   sub std_db_password {"pef-pass"}
158 0     0 0   sub std_db_name {"pef"}
159 0     0 0   sub std_log_level_info {1}
160 0     0 0   sub std_log_level_error {1}
161 0     0 0   sub std_log_level_debug {0}
162 0     0 0   sub std_session_db_file {cfg_project_dir() . "/var/cache/session.db"}
163 0     0 0   sub std_session_ttl {86400 * 30}
164 0     0 0   sub std_session_request_field {'auth'}
165 0     0 0   sub std_session_module {'MLDBM'}
166 0     0 0   sub std_cookie_unset_negative_expire {-3600}
167 0     0 0   sub std_oauth_connect_timeout {15}
168              
169             sub std_captcha_symbols {
170 0     0 0   state $symbols = ["0" .. "9", split //, "abCdEFgHiJKLMNOPqRSTUVWXyZ"];
171 0           $symbols;
172             }
173              
174             sub std_www_static_captchas_path {
175 0 0   0 0   if (substr(cfg_www_static_captchas_dir(), 0, length(cfg_www_static_dir())) eq cfg_www_static_dir()) {
176             # removes cfg_www_static_dir() from cfg_www_static_captchas_dir() and adds '/'
177 0           substr(cfg_www_static_captchas_dir(), length(cfg_www_static_dir())) . '/';
178             } else {
179             #must be overriden by user
180 0           '/captchas/';
181             }
182             }
183              
184       0 0   sub std_context_post_hook { }
185              
186             sub std_template_dir {
187 0 0   0 0   cfg_template_dir_contains_lang()
188             ? cfg_project_dir() . "/templates/$_[1]"
189             : cfg_project_dir() . "/templates";
190             }
191              
192             sub std_model_rpc {
193 0     0 0   PEF::Front::Model::chain_links($_[0]);
194             }
195              
196             sub std_oauth_client_id {
197 0     0 0   state $ids = {
198             yandex => 'anonymous',
199             google => 'anonymous',
200             facebook => 'anonymous',
201             v_kontakte => 'anonymous',
202             git_hub => 'anonymous',
203             };
204 0           $ids->{$_[0]};
205             }
206              
207             sub std_oauth_client_secret {
208 0     0 0   state $secrets = {
209             yandex => 'anonymous_secret',
210             google => 'anonymous_secret',
211             facebook => 'anonymous_secret',
212             v_kontakte => 'anonymous_secret',
213             git_hub => 'anonymous_secret',
214             };
215 0           $secrets->{$_[0]};
216             }
217              
218             sub std_oauth_scopes {
219 0     0 0   state $scopes = {
220             yandex => {user_info => undef},
221             v_kontakte => {user_info => undef},
222             git_hub => {user_info => 'user'},
223             google => {
224             email => 'https://www.googleapis.com/auth/userinfo.email',
225             share => 'https://www.googleapis.com/auth/plus.stream.write',
226             user_info => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'
227             },
228             facebook => {
229             email => 'email',
230             share => 'publish_actions',
231             user_info => 'email',
232             offline => 'offline_access'
233             },
234             v_kontakte => {user_info => undef},
235             git_hub => {user_info => 'user'},
236             msn => {
237             email => 'wl.emails',
238             offline => 'wl.offline_access',
239             share => 'wl.share',
240             user_info => 'wl.basic wl.emails',
241             },
242             paypal => {
243             email => 'email',
244             user_info => 'email profile phone address',
245             all => 'email openid profile phone address'
246             . 'https://uri.paypal.com/services/paypalattributes'
247             . ' https://uri.paypal.com/services/expresscheckout',
248             },
249             linked_in => {
250             email => 'r_emailaddress',
251             share => 'rw_nus',
252             user_info => 'r_emailaddress r_fullprofile',
253             }
254              
255             };
256 0           $scopes->{$_[0]};
257             }
258              
259             sub std_logger {
260 0     0 0   my $request = $_[0];
261             $request->{env}{'psgix.logger'}
262 0     0     || sub {$request->{env}{'psgi.errors'}->print($_[0]->{message});}
263 0 0         }
264              
265             sub std_parse_extra_params {
266 0     0 0   my ($src, $params, $form) = @_;
267              
268 0 0 0       if (($src eq 'get' || $src eq 'app') && $params ne '') {
      0        
269 0           my @params = split /\//, $params;
270 0           my $i = 1;
271 0           for my $pv (@params) {
272 0           my ($p, $v) = split /-/, $pv, 2;
273 0 0         if (!defined($v)) {
274 0           $v = $p;
275 0           $p = 'cookie';
276 0 0         if (exists $form->{$p}) {
277 0           $p = "get_param_$i";
278 0           ++$i;
279             }
280             }
281 0           $form->{$p} = $v;
282             }
283             }
284             }
285              
286             sub cfg {
287 0     0 0   my $key = $_[0];
288 0           my $cfg_key = "cfg_" . $key;
289 0 0         if (exists $config_export{$cfg_key}) {
    0          
290 0           $config_export{$cfg_key}->();
291             } elsif (exists $config_export{$key}) {
292 0           $config_export{$key}->();
293             } else {
294 0           warn "Unknown config key: $key";
295 0           undef;
296             }
297             }
298              
299             1;
300              
301             __END__