📄 cms.pm
字号:
# Copyright 2001-2005 Six Apart.# SCRiPTMAFiA 2005 - THE DiRTY HANDS ON YOUR SCRiPTS## $Id: CMS.pm 12328 2005-05-23 21:28:30Z ezra $package MT::App::CMS;use strict;use Symbol;use File::Spec;use MT::Util qw( encode_html format_ts offset_time_list offset_time remove_html get_entry mark_odd_rows perl_sha1_digest_hex is_valid_email perl_sha1_digest encode_url dirify encode_js);use MT::App;use MT::Author qw(:constants);@MT::App::CMS::ISA = qw( MT::App );sub init { my $app = shift; $app->SUPER::init(@_) or return; $app->add_methods( 'menu' => \&show_menu, 'save' => \&save_object, 'view' => \&edit_object, 'list' => \&list_objects, 'list_pings' => \&list_pings, 'list_entries' => \&list_entries, 'list_comments' => \&list_comments, 'list_commenters' => \&list_commenters, 'save_commenter_perm' => \&save_commenter_perm, 'approve_comment' => \&approve_comment, 'save_entries' => \&save_entries, 'save_entry' => \&save_entry, 'cfg_archives' => \&cfg_archives, 'cfg_prefs' => \&cfg_prefs, 'cfg_archives_save' => \&cfg_archives_save, 'cfg_archives_add' => \&cfg_archives_add, 'cfg_archives_do_add' => \&cfg_archives_do_add, 'list_blogs' => \&list_blogs, 'list_cat' => \&list_categories, 'save_cat' => \&save_category, 'edit_placements' => \&edit_placements, 'save_placements' => \&save_placements, 'delete_confirm' => \&delete_confirm, 'delete' => \&delete, 'edit_permissions' => \&edit_permissions, 'save_permissions' => \&save_permissions, 'ping' => \&send_pings, 'rebuild' => \&rebuild_pages, 'start_rebuild' => \&start_rebuild_pages, 'rebuild_confirm' => \&rebuild_confirm, 'send_notify' => \&send_notify, 'start_upload' => \&start_upload, 'upload_file' => \&upload_file, 'start_upload_entry' => \&start_upload_entry, 'show_upload_html' => \&show_upload_html, 'logout' => \&logout, 'start_recover' => \&start_recover, 'recover' => \&recover_password, 'bookmarklets' => \&bookmarklets, 'make_bm_link' => \&make_bm_link, 'view_log' => \&view_log, 'reset_log' => \&reset_log, 'start_import' => \&start_import, 'search_replace' => \&search_replace, 'start_search_replace' => \&start_search_replace, 'export' => \&export, 'import' => \&do_import, 'pinged_urls' => \&pinged_urls, 'tb_cat_pings' => \&tb_cat_pings, 'show_entry_prefs' => \&show_entry_prefs, 'save_entry_prefs' => \&save_entry_prefs, 'reg_file' => \®_file, 'reg_bm_js' => \®_bm_js, 'category_add' => \&category_add, 'category_do_add' => \&category_do_add, 'cc_return' => \&cc_return, 'reset_blog_templates' => \&reset_blog_templates, 'set_dynamicity' => \&set_dynamicity, 'spam_confirm' => \&spam_confirm, ); $app->{default_mode} = 'list_blogs'; $app->{template_dir} = 'cms'; $app->{plugin_template_path} = ''; my $mode = $app->{query}->param('__mode'); $app->{requires_login} = $mode && ($mode eq 'start_recover' || $mode eq 'recover' || $mode eq 'reg_bm_js') ? 0 : 1; $app->{is_admin} = 1; $app;}sub pre_run { my $app = shift; my $auth = $app->{author}; $app->set_language($auth->preferred_language) if $auth && $auth->preferred_language; $app->{breadcrumbs} = [ { bc_name => $app->translate('Main Menu'), bc_uri => $app->mt_uri } ]; ## Localize the label of the default text filter. $MT::Text_filters{__default__}{label} = $app->translate('Convert Line Breaks'); $app->SUPER::pre_run();}sub logout { my $app = shift; $app->log("User '" . $app->{author}->name . "' logged out"); delete $app->{author}; $app->bake_cookie(-name => 'mt_user', -value => '', -expires => '-1y'); $app->build_page('login.tmpl', { logged_out => 1, no_breadcrumbs => 1});}sub start_recover { my $app = shift; $app->add_breadcrumb($app->translate('Password Recovery')); $app->build_page('recover.tmpl');}sub recover_password { my $app = shift; my $q = $app->{query}; my $name = $q->param('name'); my $author = MT::Author->load({ name => $name, type => AUTHOR}); $app->log("Invalid author name '$name' in password recovery attempt"), return $app->error($app->translate( "No such author with name '[_1]'", $name)) unless $author; return $app->error($app->translate( "Author has not set birthplace; cannot recover password")) unless $author->hint; my $hint = $q->param('hint'); $app->log("Invalid attempt to recover password (used birthplace '$hint')"), return $app->error($app->translate( "Birthplace '[_1]' does not match stored birthplace " . "for this author", $hint)) unless $author->hint eq $hint; return $app->error($app->translate("Author does not have email address")) unless $author->email; my @pool = ('a'..'z', 0..9); my $pass; for (1..8) { $pass .= $pool[ rand @pool ] } $author->set_password($pass); $author->save; my %head = ( To => $author->email, From => $app->{cfg}->EmailAddressMain || $author->email, Subject => "Password Recovery" ); my $body = $app->translate('_USAGE_FORGOT_PASSWORD_1') . "\n\n $pass\n\n" . $app->translate('_USAGE_FORGOT_PASSWORD_2') . "\n"; require Text::Wrap; $Text::Wrap::columns = 72; $body = Text::Wrap::wrap('', '', $body); require MT::Mail; MT::Mail->send(\%head, $body) or return $app->error($app->translate( "Error sending mail ([_1]); please fix the problem, then " . "try again to recover your password.", MT::Mail->errstr)); $app->add_breadcrumb($app->translate('Password Recovery')); $app->build_page('recover.tmpl', { recovered => 1, email => $author->email });}sub is_authorized { my $app = shift; require MT::Permission; my $blog_id = $app->{query}->param('blog_id'); return 1 unless $blog_id; return unless my $author = $app->{author}; my $perms = $app->{perms} = MT::Permission->load({ author_id => $author->id, blog_id => $blog_id }); $perms ? 1 : $app->error($app->translate( "You are not authorized to log in to this blog."));}sub build_page { my $app = shift; my($page, $param) = @_; $param->{mt_version} = $MT::VERSION; if (my $perms = $app->{perms}) { $param->{can_post} = $perms->can_post; $param->{can_upload} = $perms->can_upload; $param->{can_edit_entries} = $perms->can_post || $perms->can_edit_all_posts; $param->{can_search_replace} = $perms->can_edit_all_posts; $param->{can_edit_templates} = $perms->can_edit_templates; $param->{can_edit_authors} = $perms->can_edit_authors; $param->{can_edit_config} = $perms->can_edit_config; $param->{can_rebuild} = $perms->can_rebuild; $param->{can_edit_categories} = $perms->can_edit_categories; $param->{can_edit_notifications} = $perms->can_edit_notifications; $param->{has_manage_label} = $perms->can_edit_templates || $perms->can_edit_authors || $perms->can_edit_categories || $perms->can_edit_config; } my $blog_id = $app->{query}->param('blog_id'); if (my $auth = $app->{author}) { $param->{author_id} = $auth->id; $param->{author_name} = $auth->name; my @perms = MT::Permission->load({ author_id => $auth->id }); my @data; for my $perms (@perms) { next unless $perms->role_mask; my $blog = MT::Blog->load($perms->blog_id) || die "Couldn't load blog; perhaps you have not upgraded your MT database?"; push @data, { top_blog_id => $blog->id, top_blog_name => $blog->name }; $data[-1]{top_blog_selected} = 1 if $blog_id && $blog->id == $blog_id; } @data = sort { $a->{top_blog_name} cmp $b->{top_blog_name} } @data; $param->{top_blog_loop} = \@data; } if ($blog_id && $page ne 'login.tmpl') { my $blog = MT::Blog->load($blog_id); if ($blog) { $param->{blog_name} = encode_html($blog->name); $param->{blog_id} = $blog->id; $param->{blog_url} = $blog->site_url; } else { $app->error($app->translate("No such blog [_1]", $blog_id)); } } if ($app->{query}->param('is_bm')) { $param->{is_bookmarklet} = 1; } if ($page eq 'login.tmpl') { ## If it's a login screen, direct the user to where they were going ## (query params including __mode and all) unless they were logging in, ## logging out, or deleting something. my $q = $app->{query}; if($q->param('__mode') && $q->param('__mode') ne 'logout' && $q->param('__mode') ne 'delete') { my @query = map { {name => $_, value => $q->param($_)}; } grep { $_ ne 'username' && $_ ne 'password' } $q->param; $param->{query_params} = \@query; } } $param->{agent_mozilla} = ($ENV{HTTP_USER_AGENT} || '') =~ /gecko/i; $param->{have_tangent} = eval { require MT::Tangent; 1 } ? 1 : 0; $app->SUPER::build_page($page, $param);}sub get_newsbox_content { my $app = shift; my $newsbox_url = $app->{cfg}->NewsboxURL; if ($newsbox_url && $newsbox_url ne 'disable') { my $NEWSCACHE_TIMEOUT = 60 * 60 * 24; require MT::Session; my ($news_object) = (""); my $retries = 0; $news_object = MT::Session->load({ id => 'NW' }); if ($news_object && ($news_object->start() < (time - $NEWSCACHE_TIMEOUT))) { $news_object->remove; $news_object = undef; } return $news_object->data() if ($news_object); eval { require LWP::UserAgent; require HTTP::Request; } or return; my $ua = new LWP::UserAgent(agent => 'Movable Type'); my $req = new HTTP::Request(GET => $newsbox_url); my $resp = $ua->request($req); return unless $resp->is_success(); my $result = $resp->content(); if ($result) { $news_object = MT::Session->new(); $news_object->set_values({id => 'NW', kind => 'NW', start => time(), data => $result}); $news_object->save(); } return $result; }}## Application methodssub list_blogs { my $app = shift; my $q = $app->{query}; require MT::Blog; require MT::Permission; require MT::Entry; require MT::Comment;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -