root/branches/release-34/lib/MT/Core.pm @ 1882

Revision 1882, 33.1 kB (checked in by fumiakiy, 20 months ago)

Implemented alarm based search throttling. The throttling methods can be added from plugins. BugId:69031

  • Property svn:keywords set to Id Revision
Line 
1# Movable Type (r) Open Source (C) 2001-2008 Six Apart, Ltd.
2# This program is distributed under the terms of the
3# GNU General Public License, version 2.
4#
5# $Id$
6
7package MT::Core;
8
9use strict;
10use MT;
11use base 'MT::Component';
12
13# This is just to make our localization scanner happy
14sub trans {
15    return shift;
16}
17
18sub name {
19    return "Core";
20}
21
22my $core_registry;
23
24BEGIN {
25    $core_registry = {
26        version        => MT->VERSION,
27        schema_version => MT->schema_version,
28        object_drivers => {
29            'mysql' => {
30                label => 'MySQL Database',
31                dbd_package => 'DBD::mysql',
32                config_package => 'DBI::mysql',
33            },
34            'postgres' => {
35                label => 'PostgreSQL Database',
36                dbd_package => 'DBD::Pg',
37                dbd_version => '1.32',
38                config_package => 'DBI::postgres',
39            },
40            'sqlite' => {
41                label => 'SQLite Database',
42                dbd_package => 'DBD::SQLite',
43                config_package => 'DBI::sqlite',
44            },
45            'sqlite2' => {
46                label => 'SQLite Database (v2)',
47                dbd_package => 'DBD::SQLite2',
48                config_package => 'DBI::sqlite',
49            },
50        },
51        object_types   => {
52            'entry'           => 'MT::Entry',
53            'author'          => 'MT::Author',
54            'asset'           => 'MT::Asset',
55            'file'            => 'MT::Asset',
56            'asset.image'     => 'MT::Asset::Image',
57            'image'           => 'MT::Asset::Image',
58            'asset.audio'     => 'MT::Asset::Audio',
59            'audio'           => 'MT::Asset::Audio',
60            'asset.video'     => 'MT::Asset::Video',
61            'video'           => 'MT::Asset::Video',
62            'entry.page'      => 'MT::Page',
63            'page'            => 'MT::Page',
64            'category.folder' => 'MT::Folder',
65            'folder'          => 'MT::Folder',
66            'category'        => 'MT::Category',
67            'user'            => 'MT::Author',
68            'commenter'       => 'MT::Author',
69            'blog'            => 'MT::Blog',
70            'template'        => 'MT::Template',
71            'comment'         => 'MT::Comment',
72            'notification'    => 'MT::Notification',
73            'templatemap'     => 'MT::TemplateMap',
74            'banlist'         => 'MT::IPBanList',
75            'tbping'          => 'MT::TBPing',
76            'ping'            => 'MT::TBPing',
77            'ping_cat'        => 'MT::TBPing',
78            'log'             => 'MT::Log',
79            'log.ping'        => 'MT::Log::TBPing',
80            'log.entry'       => 'MT::Log::Entry',
81            'log.comment'     => 'MT::Log::Comment',
82            'log.system'      => 'MT::Log',
83            'tag'             => 'MT::Tag',
84            'role'            => 'MT::Role',
85            'association'     => 'MT::Association',
86            'permission'      => 'MT::Permission',
87            'fileinfo'        => 'MT::FileInfo',
88            'placement'       => 'MT::Placement',
89            'plugindata'      => 'MT::PluginData',
90            'session'         => 'MT::Session',
91            'trackback'       => 'MT::Trackback',
92            'config'          => 'MT::Config',
93            'objecttag'       => 'MT::ObjectTag',
94            'objectscore'     => 'MT::ObjectScore',
95            'objectasset'     => 'MT::ObjectAsset',
96            'touch'           => 'MT::Touch',
97
98            # TheSchwartz tables
99            'ts_job'        => 'MT::TheSchwartz::Job',
100            'ts_error'      => 'MT::TheSchwartz::Error',
101            'ts_exitstatus' => 'MT::TheSchwartz::ExitStatus',
102            'ts_funcmap'    => 'MT::TheSchwartz::FuncMap',
103        },
104        permissions => {
105            'system.administer' => {
106                label => trans("System Administrator"),
107                group => 'sys_admin',
108                order => 0,
109            },
110            'system.create_blog' => {
111                label => trans("Create Blogs"),
112                group => 'sys_admin',
113                order => 100,
114            },
115            'system.manage_plugins' => {
116                label => trans('Manage Plugins'),
117                group => 'sys_admin',
118                order => 200,
119            },
120            'system.edit_templates' => {
121                label => trans('Manage Templates'),
122                group => 'sys_admin',
123                order => 250,
124            },
125            'system.view_log' => {
126                label => trans("View System Activity Log"),
127                group => 'sys_admin',
128                order => 300,
129            },
130
131            'blog.administer_blog' => {
132                label => trans("Blog Administrator"),
133                group => 'blog_admin',
134                order => 0,
135            },
136            'blog.edit_config' => {
137                label => trans("Configure Blog"),
138                group => 'blog_admin',
139                order => 100,
140            },
141            'blog.set_publish_paths' => {
142                label => trans('Set Publishing Paths'),
143                group => 'blog_admin',
144                order => 200,
145            },
146            'blog.edit_categories' => {
147                label => trans('Manage Categories'),
148                group => 'blog_admin',
149                order => 300,
150            },
151            'blog.edit_tags' => {
152                label => trans('Manage Tags'),
153                group => 'blog_admin',
154                order => 400,
155            },
156            'blog.edit_notifications' => {
157                label => trans('Manage Address Book'),
158                group => 'blog_admin',
159                order => 500,
160            },
161            'blog.view_blog_log' => {
162                label => trans('View Activity Log'),
163                group => 'blog_admin',
164                order => 600,
165            },
166
167            'blog.create_post' => {
168                label => trans('Create Entries'),
169                group => 'auth_pub',
170                order => 100,
171            },
172            'blog.publish_post' => {
173                label => trans('Publish Entries'),
174                group => 'auth_pub',
175                order => 200,
176            },
177            'blog.send_notifications' => {
178                label => trans('Send Notifications'),
179                group => 'auth_pub',
180                order => 300,
181            },
182            'blog.edit_all_posts' => {
183                label => trans('Edit All Entries'),
184                group => 'auth_pub',
185                order => 400,
186            },
187            'blog.manage_pages' => {
188                label => trans('Manage Pages'),
189                group => 'auth_pub',
190                order => 500,
191            },
192            'blog.rebuild' => {
193                label => trans('Publish Blog'),
194                group => 'auth_pub',
195                order => 600,
196            },
197
198            'blog.edit_templates' => {
199                label => trans('Manage Templates'),
200                group => 'blog_design',
201                order => 100,
202            },
203
204            'blog.upload' => {
205                label => trans("Upload File"),
206                group => 'blog_upload',
207                order => 100,
208            },
209            'blog.save_image_defaults' => {
210                label => trans('Save Image Defaults'),
211                group => 'blog_upload',
212                order => 200,
213            },
214            'blog.edit_assets' => {
215                label => trans('Manage Assets'),
216                group => 'blog_upload',
217                order => 300,
218            },
219
220            'blog.comment' => {
221                label => trans("Post Comments"),
222                group => 'blog_comment',
223                order => 100,
224            },
225            'blog.manage_feedback' => {
226                label => trans('Manage Feedback'),
227                group => 'blog_comment',
228                order => 200,
229            },
230        },
231        config_settings => {
232            'AtomApp' => {
233                type    => 'HASH',
234                default => {
235                    weblog => 'MT::AtomServer::Weblog::Legacy',
236                    '1.0'  => 'MT::AtomServer::Weblog',
237                },
238            },
239            'SchemaVersion'   => undef,
240            'MTVersion'       => undef,
241            'NotifyUpgrade'   => { default => 1 },
242            'Database'        => undef,
243            'DBHost'          => undef,
244            'DBSocket'        => undef,
245            'DBPort'          => undef,
246            'DBUser'          => undef,
247            'DBPassword'      => undef,
248            'DefaultLanguage' => {
249                default => 'en_US',
250            },
251            'LocalPreviews'   => { default => 0 },
252            'DefaultSiteRoot' => { default => '', },
253            'DefaultSiteURL'  => { default => '', },
254            'DefaultCommenterAuth' => { default => 'MovableType,LiveJournal,Vox' },
255            'TemplatePath'    => {
256                default => 'tmpl',
257                path    => 1,
258            },
259            'WeblogTemplatesPath' => {
260                default => 'default_templates',
261                path    => 1,
262            },
263            'AltTemplatePath' => {
264                default => 'alt-tmpl',
265                path    => 1,
266            },
267            'CSSPath'    => { default => 'css', },
268            'ImportPath' => {
269                default => 'import',
270                path    => 1,
271            },
272            'PluginPath' => {
273                default => 'plugins',
274                path    => 1,
275                type    => 'ARRAY',
276            },
277            'EnableArchivePaths' => { default => 0, },
278            'SearchTemplatePath' => {
279                default => 'search_templates',
280                path    => 1,
281            },
282            'ObjectDriver'  => undef,
283            'AllowedTextFilters' => undef,
284            'Serializer'    => { default => 'MT', },
285            'SendMailPath'  => { default => '/usr/lib/sendmail', },
286            'RsyncPath'     => undef,
287            'TimeOffset'    => { default => 0, },
288            'WSSETimeout'   => { default => 120, },
289            'StaticWebPath' => { default => '', },
290            'StaticFilePath' => undef,
291            'CGIPath'       => { default => '/cgi-bin/', },
292            'AdminCGIPath'  => undef,
293            'CookieDomain'  => undef,
294            'CookiePath'    => undef,
295            'MailEncoding'  => {
296                default => 'ISO-8859-1',
297            },
298            'MailTransfer'      => { default => 'sendmail' },
299            'SMTPServer'        => { default => 'localhost', },
300            'DebugEmailAddress' => undef,
301            'WeblogsPingURL' => { default => 'http://rpc.weblogs.com/RPC2', },
302            'BlogsPingURL'   => { default => 'http://ping.blo.gs/', },
303            'MTPingURL' => { default => 'http://www.movabletype.org/update/', },
304            'TechnoratiPingURL' =>
305              { default => 'http://rpc.technorati.com/rpc/ping', },
306            'GooglePingURL' =>
307              { default => 'http://blogsearch.google.com/ping/RPC2', },
308            'CGIMaxUpload'          => { default => 20_480_000 },
309            'DBUmask'               => { default => '0111', },
310            'HTMLUmask'             => { default => '0111', },
311            'UploadUmask'           => { default => '0111', },
312            'DirUmask'              => { default => '0000', },
313            'HTMLPerms'             => { default => '0666', },
314            'UploadPerms'           => { default => '0666', },
315            'NoTempFiles'           => { default => 0, },
316            'TempDir'               => { default => '/tmp', },
317            'RichTextEditor'        => { default => 'archetype', },
318            'EntriesPerRebuild'     => { default => 40, },
319            'UseNFSSafeLocking'     => { default => 0, },
320            'NoLocking'             => { default => 0, },
321            'NoHTMLEntities'        => { default => 1, },
322            'NoCDATA'               => { default => 0, },
323            'NoPlacementCache'      => { default => 0, },
324            'NoPublishMeansDraft'   => { default => 0, },
325            'IgnoreISOTimezones'    => { default => 0, },
326            'PingTimeout'           => { default => 60, },
327            'HTTPTimeout'           => { default => 60 },
328            'PingInterface'         => undef,
329            'HTTPInterface'         => undef,
330            'PingProxy'             => undef,
331            'HTTPProxy'             => undef,
332            'PingNoProxy'           => { default => 'localhost', },
333            'HTTPNoProxy'           => { default => 'localhost', },
334            'ImageDriver'           => { default => 'ImageMagick', },
335            'NetPBMPath'            => undef,
336            'AdminScript'           => { default => 'mt.cgi', },
337            'ActivityFeedScript'    => { default => 'mt-feed.cgi', },
338            'ActivityFeedItemLimit' => { default => 50, },
339            'CommentScript'         => { default => 'mt-comments.cgi', },
340            'TrackbackScript'       => { default => 'mt-tb.cgi', },
341            'SearchScript'          => { default => 'mt-search.cgi', },
342            'XMLRPCScript'          => { default => 'mt-xmlrpc.cgi', },
343            'ViewScript'            => { default => 'mt-view.cgi', },
344            'AtomScript'            => { default => 'mt-atom.cgi', },
345            'UpgradeScript'         => { default => 'mt-upgrade.cgi', },
346            'CheckScript'           => { default => 'mt-check.cgi', },
347            'NotifyScript'          => { default => 'mt-add-notify.cgi', },
348            'PublishCharset'        => {
349                default => 'utf-8',
350            },
351            'SafeMode'           => { default => 1, },
352            'GlobalSanitizeSpec' => {
353                default => 'a href,b,i,br/,p,strong,em,ul,ol,li,blockquote,pre',
354            },
355            'GenerateTrackBackRSS' => { default => 0, },
356
357            ## Search settings, copied from Jay's mt-search and integrated
358            ## into default config.
359            'NoOverride'          => { default => '', },
360            'RegexSearch'         => { default => 0, },
361            'CaseSearch'          => { default => 0, },
362            'ResultDisplay'       => { default => 'descend', },
363            'ExcerptWords'        => { default => 40, },
364            'SearchElement'       => { default => 'entries', },
365            'ExcludeBlogs'        => undef,
366            'IncludeBlogs'        => undef,
367            'DefaultTemplate'     => { default => 'default.tmpl', },
368            'Type'                => { default => 'straight', },
369            'MaxResults'          => { default => '20', },
370            'SearchCutoff'        => { default => '9999999', },
371            'CommentSearchCutoff' => { default => '30', },
372            'AltTemplate'         => {
373                type    => 'ARRAY',
374                default => 'feed results_feed.tmpl',
375            },
376            'SearchSortBy'    => undef,
377            'SearchSortOrder' => { default => 'ascend', },
378            'SearchNoOverride'      => { default => 'SearchMaxResults', },
379            'SearchResultDisplay'   => { alias => 'ResultDisplay', },
380            'SearchExcerptWords'    => { alias => 'ExcerptWords', },
381            'SearchDefaultTemplate' => { alias => 'DefaultTemplate', },
382            'SearchMaxResults'      => { alias => 'MaxResults', },
383            'SearchAltTemplate'     => { alias => 'AltTemplate' },
384            'SearchPrivateTags'     => { default => 0 },
385            'RegKeyURL' =>
386              { default => 'http://www.typekey.com/extras/regkeys.txt', },
387            'IdentitySystem' =>
388              { default => 'http://www.typekey.com/t/typekey', },
389            'SignOnURL' =>
390              { default => 'https://www.typekey.com/t/typekey/login?', },
391            'SignOffURL' =>
392              { default => 'https://www.typekey.com/t/typekey/logout?', },
393            'IdentityURL'     => { default => "http://profile.typekey.com/", },
394            'DynamicComments' => { default => 0, },
395            'SignOnPublicKey' => { default => '', },
396            'ThrottleSeconds' => { default => 20, },
397            'SearchThrottleSeconds' => { default => 5 },
398            'SearchThrottleIPWhitelist' => undef,
399            'OneHourMaxPings'           => { default => 10, },
400            'OneDayMaxPings'            => { default => 50, },
401            'SupportURL'                => {
402                default => 'http://www.sixapart.com/movabletype/support/',
403            },
404            'NewsURL' => {
405                default => 'http://www.sixapart.com/movabletype/news/',
406            },
407            'NewsboxURL' => {
408                default => 'http://www.sixapart.com/movabletype/news/mt4_news_widget.html',
409            },
410            # 'MTNewsURL' => {
411            #     default => 'http://www.sixapart.com/movabletype/news/mt4_news_widget.html',
412            # },
413            'LearningNewsURL' => {
414                default => 'http://learning.movabletype.org/newsbox.html',
415            },
416            # 'HackingNewsURL' => {
417            #     default => 'http://hacking.movabletype.org/newsbox.html',
418            # },
419            'EmailAddressMain'      => undef,
420            'EmailReplyTo'          => undef,
421            'EmailNotificationBcc'  => { default => 1, },
422            'CommentSessionTimeout' => { default => 60 * 60 * 24 * 3, },
423            'UserSessionTimeout'    => { default => 60 * 60 * 4, },
424            'LaunchBackgroundTasks' => { default => 0 },
425            'TypeKeyVersion'        => { default => '1.1' },
426            'TransparentProxyIPs'   => { default => 0, },
427            'DebugMode'             => { default => 0, },
428            'ShowIPInformation'     => { default => 0, },
429            'AllowComments'         => { default => 1, },
430            'AllowPings'            => { default => 1, },
431            'HelpURL'               => undef,
432            #'HelpURL'               => {
433            #    default => 'http://www.sixapart.com/movabletype/docs/4.0/',
434            #},
435            'UsePlugins'               => { default => 1, },
436            'PluginSwitch'             => { type    => 'HASH', },
437            'PluginSchemaVersion'      => { type    => 'HASH', },
438            'OutboundTrackbackLimit'   => { default => 'any', },
439            'OutboundTrackbackDomains' => { type    => 'ARRAY', },
440            'IndexBasename'            => { default => 'index', },
441            'LogExportEncoding'        => {
442                default => 'utf-8',
443            },
444            'ActivityFeedsRunTasks' => { default => 1, },
445            'ExportEncoding'        => {
446                default => 'utf-8',
447            },
448            'SQLSetNames'     => undef,
449            'UseSQLite2'      => { default => 0, },
450            'UseJcodeModule'  => { default => 0, },
451            'DefaultTimezone' => {
452                default => '0',
453            },
454            'CategoryNameNodash' => {
455                default => '0',
456            },
457            'DefaultListPrefs' => {
458                type    => 'HASH',
459            },
460            'DefaultEntryPrefs' => {
461                type    => 'HASH',
462                default => {
463                    type   => 'Default',         # Default|All|Custom
464                    button => 'Below',           # Above|Below|Both
465                    height => 162,               # textarea height
466                },
467            },
468            'DeleteFilesAtRebuild'      => { default => 1, },
469            'RebuildAtDelete'           => { default => 1, },
470            'MaxTagAutoCompletionItems' => { default => 10000, },
471            'NewUserAutoProvisioning' =>
472              { handler => \&NewUserAutoProvisioning, },
473            'NewUserTemplateBlogId'   => undef,
474            'DefaultUserLanguage'     => undef,
475            'DefaultUserTagDelimiter' => {
476                handler => \&DefaultUserTagDelimiter,
477                default => 'comma',
478            },
479            'AuthenticationModule' => { default => 'MT', },
480            'AuthLoginURL'         => undef,
481            'AuthLogoutURL'        => undef,
482            'DefaultAssignments'   => undef,
483            'AutoSaveFrequency'         => { default => 5 },
484            'FuturePostFrequency'       => { default => 1 },
485            'AssetCacheDir'             => { default => 'assets_c', },
486            'IncludesDir'               => { default => 'includes_c', },
487            'MemcachedServers'          => { type    => 'ARRAY', },
488            'MemcachedNamespace'        => undef,
489            'MemcachedDriver'           => { default => 'Cache::Memcached' },
490            'CommenterRegistration'     => {
491                type    => 'HASH',
492                default => {
493                    Allow  => '1',
494                    Notify => q(),
495                },
496            },
497            'CaptchaSourceImageBase'     => undef,
498            'SecretToken'                => { handler => \&SecretToken, },
499            ## NaughtyWordChars settings
500            'NwcSmartReplace' => { default => 0, },
501            'NwcReplaceField' =>
502              { default => 'title,text,text_more,keywords,excerpt,tags', },
503            'DisableNotificationPings'   => { default => 0 },
504            'SyncTarget' => { type => 'ARRAY' },
505            'RsyncOptions' => undef,
506            'UserpicAllowRect' => { default => 0 },
507            'UserpicMaxUpload' => { default => 0 },
508            'UserpicThumbnailSize' => { default => 100 },
509
510            # Basename settings
511            'AuthorBasenameLimit' => { default => 30 },
512            'PerformanceLogging' => { default => 0 },
513            'PerformanceLoggingThreshold' => { default => 0.1 },
514            'ProcessMemoryCommand' => { handler => \&ProcessMemoryCommand },
515            'EnableAddressBook' => { default => 0 },
516        },
517        upgrade_functions => \&load_upgrade_fns,
518        applications      => {
519            'xmlrpc'   => { handler => 'MT::XMLRPCServer', },
520            'atom'     => { handler => 'MT::AtomServer', },
521            'feeds'    => { handler => 'MT::App::ActivityFeeds', },
522            'view'     => { handler => 'MT::App::Viewer', },
523            'notify'   => { handler => 'MT::App::NotifyList', },
524            'tb'       => { handler => 'MT::App::Trackback', },
525            'upgrade'  => { handler => 'MT::App::Upgrade', },
526            'wizard'   => { handler => 'MT::App::Wizard', },
527            'comments' => { handler => 'MT::App::Comments', },
528            'search'   => {
529                handler => 'MT::App::Search::Legacy', 
530                tags => sub { MT->app->load_core_tags },
531            },
532            'new_search'   => {
533                handler => 'MT::App::Search', 
534                tags    => sub { 
535                    require MT::Template::Context::Search;
536                    return MT::Template::Context::Search->load_core_tags();
537                },
538                methods => sub { MT->app->core_methods() },
539                default => sub { MT->app->core_parameters() },
540            },
541            'cms'      => {
542                handler         => 'MT::App::CMS',
543                cgi_base        => 'mt',
544                page_actions    => sub { MT->app->core_page_actions(@_) },
545                list_actions    => sub { MT->app->core_list_actions(@_) },
546                list_filters    => sub { MT->app->core_list_filters(@_) },
547                search_apis     => sub {
548                    require MT::CMS::Search;
549                    return MT::CMS::Search::core_search_apis(MT->app, @_);
550                },
551                menus           => sub { MT->app->core_menus() },
552                methods         => sub { MT->app->core_methods() },
553                widgets         => sub { MT->app->core_widgets() },
554                blog_stats_tabs => sub { MT->app->core_blog_stats_tabs() },
555                import_formats  => sub {
556                    require MT::Import;
557                    return MT::Import->core_import_formats();
558                },
559            },
560        },
561        archive_types => \&load_archive_types,
562        tags          => \&load_core_tags,
563        text_filters  => {
564            '__default__' => {
565                label   => 'Convert Line Breaks',
566                handler => 'MT::Util::html_text_transform',
567            },
568            'richtext' => {
569                label   => 'Rich Text',
570                handler => 'MT::Util::rich_text_transform',
571                condition => sub {
572                    my ($type) = @_;
573                    return 1 if $type && ($type ne 'comment');
574                },
575            },
576        },
577        richtext_editors => {
578            'archetype' => {
579                label => 'Movable Type Default',
580                template => 'archetype_editor.tmpl',
581            },
582        },
583        ping_servers  => {
584            'weblogs' => {
585                label => 'weblogs.com',
586                url   => 'http://rpc.weblogs.com/RPC2',
587            },
588            'technorati' => {
589                label => 'technorati.com',
590                url   => 'http://rpc.technorati.com/rpc/ping',
591            },
592            'google' => {
593                label => 'google.com',
594                url   => 'http://blogsearch.google.com/ping/RPC2',
595            },
596        },
597        commenter_authenticators => \&load_core_commenter_auth,
598        captcha_providers        => \&load_captcha_providers,
599        tasks                    => \&load_core_tasks,
600        default_templates        => \&load_default_templates,
601        template_sets => {
602            mt_blog => {
603                label => "Classic Blog",
604                order => 100,
605                # means, load from 'default_templates' registry
606                # which we've established for core templates with
607                # the MT 4.0 registry
608                templates => '*',
609            },
610        },
611        junk_filters             => \&load_junk_filters,
612        task_workers             => {
613            'mt_rebuild' => {
614                label => "Publishes content.",
615                class => 'MT::Worker::Publish',
616            },
617            'mt_sync' => {
618                label => "Synchronizes content to other server(s).",
619                class => 'MT::Worker::Sync',
620            },
621        },
622        archivers => {
623            'zip' => {
624                class => 'MT::Util::Archive::Zip',
625                label => 'zip',
626            },
627            'tgz' => {
628                class => 'MT::Util::Archive::Tgz',
629                label => 'tar.gz',
630            },
631        },
632        template_snippets        => {
633            'insert_entries' => {
634                trigger => 'entries',
635                label   => 'Entries List',
636                content => qq{<mt:Entries lastn="10">\n    \$0\n</mt:Entries>\n},
637            },
638            'blog_url' => {
639                trigger => 'blogurl',
640                label => 'Blog URL',
641                content => '<$mt:BlogURL$>$0',
642            },
643            'blog_id' => {
644                trigger => 'blogid',
645                label => 'Blog ID',
646                content => '<$mt:BlogID$>$0',
647            },
648            'blog_name' => {
649                trigger => 'blogname',
650                label => 'Blog Name',
651                content => '<$mt:BlogName$>$0',
652            },
653            'entry_body' => {
654                trigger => 'entrybody',
655                label => 'Entry Body',
656                content => '<$mt:EntryBody$>$0',
657            },
658            'entry_excerpt' => {
659                trigger => 'entryexcerpt',
660                label => 'Entry Excerpt',
661                content => '<$mt:EntryExcerpt$>$0',
662            },
663            'entry_link' => {
664                trigger => 'entrylink',
665                label => 'Entry Link',
666                content => '<$mt:EntryLink$>$0',
667            },
668            'entry_more' => {
669                trigger => 'entrymore',
670                label => 'Entry Extended Text',
671                content => '<$mt:EntryMore$>$0',
672            },
673            'entry_title' => {
674                trigger => 'entrytitle',
675                label => 'Entry Title',
676                content => '<$mt:EntryTitle$>$0',
677            },
678            'if' => {
679                trigger => 'mtif',
680                label => 'If Block',
681                content => qq{<mt:if name="variable">\n    \$0\n</mt:if>\n},
682            },
683            'if_else' => {
684                trigger => 'mtife',
685                label => 'If/Else Block',
686                content => qq{<mt:if name="variable">\n    \$0\n<mt:else>\n\n</mt:if>\n},
687            },
688            'include_module' => {
689                trigger => 'module',
690                label => 'Include Template Module',
691                content => '<$mt:Include module="$0"$>',
692            },
693            'include_file' => {
694                trigger => 'file',
695                label => 'Include Template File',
696                content => '<$mt:Include file="$0"$>',
697            },
698            'getvar' => {
699                trigger => 'get',
700                label => 'Get Variable',
701                content => '<$mt:var name="$0"$>',
702            },
703            'setvar' => {
704                trigger => 'set',
705                label => 'Set Variable',
706                content => '<$mt:var name="$0" value="value"$>',
707            },
708            'setvarblock' => {
709                trigger => 'setb',
710                label => 'Set Variable Block',
711                content => qq{<mt:SetVarBlock name="variable">\n    \$0\n</mt:SetVarBlock>\n},
712            },
713        },
714    };
715}
716
717sub id {
718    return 'core';
719}
720
721sub load_junk_filters {
722    require MT::JunkFilter;
723    return MT::JunkFilter->core_filters;
724}
725
726sub load_core_tasks {
727    my $cfg = MT->config;
728    return {
729        'FuturePost' => {
730            label     => 'Publish Scheduled Entries',
731            frequency => $cfg->FuturePostFrequency * 60,    # once per minute
732            code      => sub {
733                MT->instance->publisher->publish_future_posts;
734              }
735        },
736        'JunkExpiration' => {
737            label     => 'Junk Folder Expiration',
738            frequency => 12 * 60 * 60,             # no more than every 12 hours
739            code      => sub {
740                require MT::JunkFilter;
741                MT::JunkFilter->task_expire_junk;
742            },
743        },
744        'CleanTemporaryFiles' => {
745            label => 'Remove Temporary Files',
746            frequency => 60 * 60,   # once per hour
747            code => sub {
748                MT::Core->remove_temporary_files;
749            },
750        },
751        'RemoveExpiredUserSessions' => {
752            label => 'Remove Expired User Sessions',
753            frequency => 60 * 60 * 24,   # once a day
754            code => sub {
755                MT::Core->remove_expired_sessions;
756            },
757        },
758    };
759}
760
761sub remove_temporary_files {
762    require MT::Session;
763
764    my @files = MT::Session->load(
765        { kind => 'TF', start => [ undef, time - 60 * 60 ] },
766        { range => { start => 1 } } );
767    my $fmgr = MT::FileMgr->new('Local');
768    foreach my $f (@files) {
769        if ($fmgr->delete($f->name)) {
770            $f->remove;
771        }
772    }
773    # This is a silent task; no need to log removal of temporary files
774    return '';
775}
776
777sub remove_expired_sessions {
778    require MT::Session;
779
780    my $expired = MT->config->UserSessionTimeout;
781    my @sesss = MT::Session->load(
782        { kind => 'US', start => [ undef, time - $expired ] },
783        { range => { start => 1 } } );
784    foreach my $s (@sesss) {
785        $s->remove if !$s->get('remember');
786    }
787    return '';
788}
789
790sub load_default_templates {
791    require MT::DefaultTemplates;
792    return MT::DefaultTemplates->core_default_templates;
793}
794
795sub load_captcha_providers {
796    return MT->core_captcha_providers;
797}
798
799sub load_core_commenter_auth {
800    return MT->core_commenter_authenticators;
801}
802
803sub load_core_tags {
804    require MT::Template::ContextHandlers;
805    return MT::Template::Context::core_tags();
806}
807
808sub load_upgrade_fns {
809    require MT::Upgrade;
810    return MT::Upgrade->core_upgrade_functions;
811}
812
813sub l10n_class { 'MT::L10N' }
814
815sub init_registry {
816    my $c = shift;
817    return $c->{registry} = $core_registry;
818}
819
820# Config handlers for these settings...
821
822sub load_archive_types {
823    require MT::WeblogPublisher;
824    return MT::WeblogPublisher->core_archive_types;
825}
826
827sub ProcessMemoryCommand {
828    my $cfg = shift;
829    $cfg->set_internal( 'ProcessMemoryCommand', @_ ) if @_;
830    my $cmd = $cfg->get_internal('ProcessMemoryCommand');
831    unless ($cmd) {
832        my $os = $^O;
833        if ($os eq 'darwin') {
834            $cmd = 'ps $$ -o rss=';
835        }
836        elsif ($os eq 'linux') {
837            $cmd = 'ps -p $$ -o rss=';
838        }
839        elsif ($os eq 'MSWin32') {
840            $cmd = { command => q{tasklist /FI "PID eq $$" /FO TABLE /NH},
841                regex => qr/([\d,]+) K/ };
842        }
843    }
844    return $cmd;
845}
846
847sub SecretToken {
848    my $cfg = shift;
849    $cfg->set_internal( 'SecretToken', @_ ) if @_;
850    my $secret = $cfg->get_internal('SecretToken');
851    unless ($secret) {
852        my @alpha = ( 'a' .. 'z', 'A' .. 'Z', 0 .. 9 );
853        $secret = join '', map $alpha[ rand @alpha ], 1 .. 40;
854        $secret = $cfg->set_internal( 'SecretToken', $secret, 1 );
855        $cfg->save_config();
856    }
857    return $secret;
858}
859
860sub DefaultUserTagDelimiter {
861    my $mgr = shift;
862    return $mgr->set_internal( 'DefaultUserTagDelimiter', @_ ) if @_;
863    my $delim = $mgr->get_internal('DefaultUserTagDelimiter');
864    if ( lc $delim eq 'comma' ) {
865        return ord(',');
866    }
867    elsif ( lc $delim eq 'space' ) {
868        return ord(' ');
869    }
870    else {
871        return ord(',');
872    }
873}
874
875sub NewUserAutoProvisioning {
876    my $mgr = shift;
877    return $mgr->set_internal( 'NewUserAutoProvisioning', @_ ) if @_;
878    return 0 unless $mgr->DefaultSiteRoot && $mgr->DefaultSiteURL;
879    $mgr->get_internal('NewUserAutoProvisioning');
880}
881
8821;
Note: See TracBrowser for help on using the browser.