[pLog-svn] r5656 - in plugins/branches/lifetype-1.2: . httpbl httpbl/class httpbl/class/action httpbl/class/security httpbl/class/view httpbl/locale httpbl/templates
pwestbro at devel.lifetype.net
pwestbro at devel.lifetype.net
Sun Jul 15 06:01:26 EDT 2007
Author: pwestbro
Date: 2007-07-15 06:01:25 -0400 (Sun, 15 Jul 2007)
New Revision: 5656
Added:
plugins/branches/lifetype-1.2/httpbl/
plugins/branches/lifetype-1.2/httpbl/class/
plugins/branches/lifetype-1.2/httpbl/class/action/
plugins/branches/lifetype-1.2/httpbl/class/action/pluginhttpblconfigaction.class.php
plugins/branches/lifetype-1.2/httpbl/class/action/pluginhttpblupdateconfigaction.class.php
plugins/branches/lifetype-1.2/httpbl/class/security/
plugins/branches/lifetype-1.2/httpbl/class/security/httpblfilter.class.php
plugins/branches/lifetype-1.2/httpbl/class/view/
plugins/branches/lifetype-1.2/httpbl/class/view/pluginhttpblconfigview.class.php
plugins/branches/lifetype-1.2/httpbl/locale/
plugins/branches/lifetype-1.2/httpbl/locale/locale_en_UK.php
plugins/branches/lifetype-1.2/httpbl/pluginhttpbl.class.php
plugins/branches/lifetype-1.2/httpbl/readme.txt
plugins/branches/lifetype-1.2/httpbl/templates/
plugins/branches/lifetype-1.2/httpbl/templates/httpbl.template
Log:
Add the http:BL plugin. This plugin checks Project Honeypot's http black
list for comment spammers, and blocks those clients
Added: plugins/branches/lifetype-1.2/httpbl/class/action/pluginhttpblconfigaction.class.php
===================================================================
--- plugins/branches/lifetype-1.2/httpbl/class/action/pluginhttpblconfigaction.class.php (rev 0)
+++ plugins/branches/lifetype-1.2/httpbl/class/action/pluginhttpblconfigaction.class.php 2007-07-15 10:01:25 UTC (rev 5656)
@@ -0,0 +1,49 @@
+<?php
+
+ /*
+ Copyright 2006 Paul Westbrook (paul at westbrooks.org)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+ lt_include( PLOG_CLASS_PATH."class/action/admin/adminaction.class.php" );
+ lt_include( PLOG_CLASS_PATH."plugins/httpbl/class/view/pluginhttpblconfigview.class.php" );
+
+ class PluginHttpBLConfigAction extends AdminAction
+ {
+
+ /**
+ * Constructor. If nothing else, it also has to call the constructor of the parent
+ * class, BlogAction with the same parameters
+ */
+ function PluginHttpBLConfigAction( $actionInfo, $request )
+ {
+ $this->AdminAction( $actionInfo, $request );
+ }
+
+ /**
+ * Carries out the specified action
+ */
+ function perform()
+ {
+ $this->_view = new PluginHttpBLConfigView( $this->_blogInfo );
+
+ $this->setCommonData();
+
+ // better to return true if everything fine
+ return true;
+ }
+ }
+?>
Added: plugins/branches/lifetype-1.2/httpbl/class/action/pluginhttpblupdateconfigaction.class.php
===================================================================
--- plugins/branches/lifetype-1.2/httpbl/class/action/pluginhttpblupdateconfigaction.class.php (rev 0)
+++ plugins/branches/lifetype-1.2/httpbl/class/action/pluginhttpblupdateconfigaction.class.php 2007-07-15 10:01:25 UTC (rev 5656)
@@ -0,0 +1,123 @@
+<?php
+
+ /*
+ Copyright 2006 Paul Westbrook (paul at westbrooks.org)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+ lt_include( PLOG_CLASS_PATH."class/action/admin/adminaction.class.php" );
+ lt_include( PLOG_CLASS_PATH."plugins/httpbl/class/view/pluginhttpblconfigview.class.php" );
+
+ $apiKeyValid = true;
+
+ class PluginHttpBLUpdateConfigAction extends AdminAction
+ {
+
+ var $_pluginEnabled;
+ var $_apiKey;
+ var $_maxReportAge;
+
+
+ /**
+ * Constructor. If nothing else, it also has to call the constructor of the parent
+ * class, BlogAction with the same parameters
+ */
+ function PluginHttpBLUpdateConfigAction( $actionInfo, $request )
+ {
+ $this->AdminAction( $actionInfo, $request );
+ }
+
+ function validate()
+ {
+ global $apiKeyValid;
+
+ $apiKeyValid = true;
+
+ $this->_pluginEnabled = $this->_request->getValue( "pluginEnabled" );
+ $this->_pluginEnabled = ($this->_pluginEnabled != "" );
+
+ $this->_apiKey = $this->_request->getValue( "apiKey" );
+ $this->_maxReportAge = $this->_request->getValue( "maxReportAge" );
+
+ lt_include( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
+
+ $val = new StringValidator();
+ if( $this->_pluginEnabled == true && !$val->validate($this->_apiKey) ) {
+ $this->_view = new PluginHttpBLConfigView( $this->_blogInfo );
+ $this->_view->setErrorMessage( $this->_locale->tr("httpbl_missing_api_key"));
+ $this->setCommonData();
+
+ return false;
+ }
+
+ lt_include( PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
+ $intVal = new IntegerValidator();
+ if( $this->_pluginEnabled == true && ( !$intVal->validate($this->_maxReportAge) || $this->_maxReportAge < 0 || $this->_maxReportAge > 255 ) ) {
+ $this->_view = new PluginHttpBLConfigView( $this->_blogInfo );
+ $this->_view->setErrorMessage( $this->_locale->tr("httpbl_invalid_report_age"));
+ $this->setCommonData();
+
+ return false;
+ }
+
+
+
+ return true;
+ }
+
+ /**
+ * Carries out the specified action
+ */
+ function perform()
+ {
+ // update the plugin configurations to blog setting
+ $blogSettings = $this->_blogInfo->getSettings();
+ $blogSettings->setValue( "plugin_httpbl_enabled", $this->_pluginEnabled );
+
+ $blogSettings->setValue( "plugin_httpbl_api_key", $this->_apiKey );
+
+ $blogSettings->setValue( "plugin_httpbl_max_stale", $this->_maxReportAge );
+
+ $this->_blogInfo->setSettings( $blogSettings );
+
+ // save the blogs settings
+ $blogs = new Blogs();
+ if( !$blogs->updateBlog( $this->_blogInfo )) {
+ $this->_view = new PluginHttpBLConfigView( $this->_blogInfo );
+ $this->_view->setErrorMessage( $this->_locale->tr("error_updating_settings"));
+ $this->setCommonData();
+
+ return false;
+ }
+
+ // if everything went ok...
+ $this->_blogInfo->setSettings( $blogSettings );
+ $this->_session->setValue( "blogInfo", $this->_blogInfo );
+ $this->saveSession();
+
+ $this->_view = new PluginHttpBLConfigView( $this->_blogInfo );
+ $this->_view->setSuccessMessage( $this->_locale->tr("httpbl_settings_saved_ok"));
+ $this->setCommonData();
+
+ // clear the cache
+ CacheControl::resetBlogCache( $this->_blogInfo->getId());
+
+ return true;
+ }
+ }
+
+
+?>
Added: plugins/branches/lifetype-1.2/httpbl/class/security/httpblfilter.class.php
===================================================================
--- plugins/branches/lifetype-1.2/httpbl/class/security/httpblfilter.class.php (rev 0)
+++ plugins/branches/lifetype-1.2/httpbl/class/security/httpblfilter.class.php 2007-07-15 10:01:25 UTC (rev 5656)
@@ -0,0 +1,163 @@
+<?php
+
+ /*
+ Copyright 2006 Paul Westbrook (paul at westbrooks.org)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+ lt_include( PLOG_CLASS_PATH."class/security/pipelinefilter.class.php" );
+
+
+ $HttpBLError = false;
+
+ // custom error code that will be returned to the pipeline whenever an
+ // error is found... Be careful so as to not to have two different modules
+ // use the same code!!
+ define( "HTTPBL_SPAM", 820 );
+
+ class HttpBLFilter extends PipelineFilter
+ {
+
+ function HttpBLFilter( $pipelineRequest )
+ {
+ $this->PipelineFilter( $pipelineRequest );
+ }
+
+ function filter()
+ {
+ global $HttpBLError;
+
+ $HttpBLError = false;
+
+ // get some info
+ $blogInfo = $this->_pipelineRequest->getBlogInfo();
+ $request = $this->_pipelineRequest->getHttpRequest();
+
+ // check if this section has been enabled or disabled
+ $blogSettings = $blogInfo->getSettings();
+ $pluginEnabled = $blogSettings->getValue( "plugin_httpbl_enabled" );
+ if( !$pluginEnabled) {
+ // if not, nothing to do here...
+ //_debug("ip address filter not enabled! quitting...<br/>");
+ return new PipelineResult();
+ }
+
+ // we only have to filter the contents if the user is posting a comment
+ // so there's no point in doing anything else if that's not the case
+ if(( $request->getValue( "op" ) != "AddComment" ) && ( $request->getValue( "op" ) != "AddTrackback" )) {
+ $result = new PipelineResult();
+ return $result;
+ }
+
+ // if this is already rejected, there is no reason to do anything here
+ if ( $this->_pipelineRequest->getRejectedState() )
+ return new PipelineResult();
+
+
+ lt_include( PLOG_CLASS_PATH."class/net/client.class.php" );
+ $clientIp = Client::getIp();
+
+ $apiKey = $blogSettings->getValue( "plugin_httpbl_api_key" );
+
+ $maxReportAge = $blogSettings->getValue( "plugin_httpbl_max_stale" );
+
+
+
+ // perform the dns query
+ if(!$this->checkHttpBLForIP($apiKey, $maxReportAge, $clientIp)) {
+ $locale = $blogInfo->getLocale();
+ $result = new PipelineResult( false, HTTPBL_SPAM, $locale->tr("error_comment_spam_throw_away") );
+ return $result;
+ }
+
+
+ // if everything went fine, we can say so by returning
+ // a positive PipelineResult object
+ $result = new PipelineResult( true );
+
+ return $result;
+ }
+
+
+ function checkHttpBLForIP( $apiKey, $maxReportAge, $clientIP )
+ {
+ $rev = array_reverse(explode('.', $clientIP));
+
+ $lookup = $apiKey . '.' . implode('.', $rev) . '.' . 'dnsbl.httpbl.org.';
+
+ $resultIp = $this->fixed_gethostbyname($lookup);
+
+ if ($resultIp == false)
+ {
+ // This host is not in the http:bl, so let it through
+ return true;
+ }
+
+ // Split the response
+ $splitResponse = explode('.', $resultIp);
+
+ // first make sure that the first octet is 127, if it is not
+ // the query wasn't formatted correctly. Give the client the benefit of
+ // the doubt
+ if ($splitResponse[0] != 127)
+ {
+ return true;
+ }
+
+ // The second octet has information about how stale their information is
+ // the range is 0 - 255 days
+ // XXX this should be a setting that the user can configure how stale the data
+ // can be when they consider a client to be spam
+
+ // The thrid octet is the "threat score" for the ip address. The range is
+ // 0 - 255 where 255 is extremely threatening and 0 is where no score has been
+ // assigned
+ // XXX the user should be able to specify the minimum threat score that should be used
+
+ // The forth octet is the type of visitor, in a bit set.
+ // 0 Search Engine
+ // 1 Suspicious
+ // 2 Harvester
+ // 4 Comment Spammer
+ // XXX There should be check boxes which types of clients they want to block
+ // but for now, assume that if anything marked as a comment spammer is to be blocked
+
+ if (($splitResponse[3] & 4) == 4)
+ {
+ // Make sure that the last report is with in the age range
+ // that the user has specified
+ if ($splitResponse[1] <= $maxReportAge)
+ {
+ return false;
+ }
+ }
+
+
+ return true ;
+ }
+
+
+ function fixed_gethostbyname ($host) {
+ // Try the lookup as normal...
+ $ip = gethostbyname($host);
+ // ...but if it fails, FALSE is returned instead of the unresolved host
+ if ($ip != $host) { return $ip; } else return false;
+ }
+
+
+ }
+
+?>
Added: plugins/branches/lifetype-1.2/httpbl/class/view/pluginhttpblconfigview.class.php
===================================================================
--- plugins/branches/lifetype-1.2/httpbl/class/view/pluginhttpblconfigview.class.php (rev 0)
+++ plugins/branches/lifetype-1.2/httpbl/class/view/pluginhttpblconfigview.class.php 2007-07-15 10:01:25 UTC (rev 5656)
@@ -0,0 +1,53 @@
+<?php
+
+ /*
+ Copyright 2006 Paul Westbrook (paul at westbrooks.org)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+ lt_include( PLOG_CLASS_PATH."class/view/admin/adminplugintemplatedview.class.php" );
+
+ /**
+ * implements the main view of the validate trackback plugin
+ */
+ class PluginHttpBLConfigView extends AdminPluginTemplatedView
+ {
+
+ function PluginHttpBLConfigView( $blogInfo )
+ {
+ $this->AdminPluginTemplatedView( $blogInfo, "httpbl", "httpbl" );
+ }
+
+ function render()
+ {
+ // load some configuration settings
+ $blogSettings = $this->_blogInfo->getSettings();
+ $pluginEnabled = $blogSettings->getValue( "plugin_httpbl_enabled" );
+
+ $apiKey = $blogSettings->getValue( "plugin_httpbl_api_key" );
+
+ $maxReportAge = $blogSettings->getValue( "plugin_httpbl_max_stale" );
+ if ($maxReportAge == "") $maxReportAge = 30;
+
+ // create a view and export the settings to the template
+ $this->setValue( "pluginEnabled", $pluginEnabled );
+ $this->setValue( "apiKey", $apiKey );
+ $this->setValue( "maxReportAge", $maxReportAge );
+
+ parent::render();
+ }
+ }
+?>
\ No newline at end of file
Added: plugins/branches/lifetype-1.2/httpbl/locale/locale_en_UK.php
===================================================================
--- plugins/branches/lifetype-1.2/httpbl/locale/locale_en_UK.php (rev 0)
+++ plugins/branches/lifetype-1.2/httpbl/locale/locale_en_UK.php 2007-07-15 10:01:25 UTC (rev 5656)
@@ -0,0 +1,21 @@
+<?php
+$messages["manageAntiSpamPlugins"] = "Anti Spam Management";
+$messages["httpblPluginSettings"] = "http:BL";
+$messages["httpbl"] = "http:BL";
+
+$messages["httpbl_plugin_enabled"] = "Enable this plugin";
+$messages["httpbl_api_key"] = "http:BL API key to be used for spam checking. To obtain key go to <a href='http://www.projecthoneypot.org/httpbl_configure.php'>http://www.projecthoneypot.org/httpbl_configure.php</a>";
+$messages["httpbl_max_age"] = "The maximum age of http:bl report that should be used for blocking comments.";
+$messages["httpbl_plugin"] = "http:BL Plugin";
+
+$messages["httpbl_settings_saved_ok"] = "http:BL settings saved successfully!";
+$messages["httpbl_missing_api_key"] = "http:BL API key needs to be specified!";
+$messages["httpbl_invalid_report_age"] = "Specify a maximum report age (0 - 255).";
+
+$messages["label_configuration"] = "Configuration";
+$messages["label_enable"] = "Enable";
+$messages["label_httpbl_api_key"] = "http:BL API key";
+$messages["label_httpbl_max_age"] = "Maximum age";
+
+
+?>
\ No newline at end of file
Added: plugins/branches/lifetype-1.2/httpbl/pluginhttpbl.class.php
===================================================================
--- plugins/branches/lifetype-1.2/httpbl/pluginhttpbl.class.php (rev 0)
+++ plugins/branches/lifetype-1.2/httpbl/pluginhttpbl.class.php 2007-07-15 10:01:25 UTC (rev 5656)
@@ -0,0 +1,87 @@
+<?php
+
+ /*
+ Copyright 2006 Paul Westbrook (paul at westbrooks.org)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+ lt_include( PLOG_CLASS_PATH."class/plugin/pluginbase.class.php" );
+
+ class PluginHttpBL extends PluginBase
+ {
+ var $pluginEnabled;
+
+ function PluginHttpBL( $source = "" )
+ {
+ $this->PluginBase( $source );
+
+ $this->id = "httpbl";
+ $this->desc = "http:BL checks your comments against the Project Honeypot's http:BL.";
+ $this->author = "Paul Westbrook ";
+ $this->locales = Array( "en_UK" );
+ $this->version = "200707014";
+
+ if( $source == "admin" )
+ $this->initAdmin();
+ else
+ $this->init();
+ }
+
+ function init()
+ {
+ lt_include( PLOG_CLASS_PATH."plugins/httpbl/class/security/httpblfilter.class.php" );
+ //register the filter
+ $this->registerFilter( "HttpBLFilter" );
+ }
+
+ function initAdmin()
+ {
+ $this->init();
+
+ $this->registerAdminAction( "httpbl", "PluginHttpBLConfigAction" );
+ $this->registerAdminAction( "updateHttpBLConfig", "PluginHttpBLUpdateConfigAction" );
+
+ $menu =& Menu::getMenu();
+ if( !$menu->entryExists( "/menu/controlCenter/manageAntiSpamPlugins" ))
+ $this->addMenuEntry( "/menu/controlCenter", "manageAntiSpamPlugins", "", "", true, false );
+ $this->addMenuEntry( "/menu/controlCenter/manageAntiSpamPlugins", "httpbl", "?op=httpbl", "" );
+ }
+
+ function register()
+ {
+ $blogSettings = $this->blogInfo->getSettings();
+ $this->pluginEnabled = $blogSettings->getValue( "plugin_httpbl_enabled" );
+ }
+
+ function isEnabled()
+ {
+ return $this->pluginEnabled;
+ }
+
+ function getPluginConfigurationKeys()
+ {
+ lt_include( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
+ lt_include( PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
+
+ return( Array(
+ Array( "name" => "plugin_httpbl_enabled", "type" => "boolean" ),
+ Array( "name" => "plugin_httpbl_api_key", "validator" => new StringValidator(), "type" => "string", "allowEmpty" => true ),
+ Array( "name" => "plugin_httpbl_max_stale", "validator" => new IntegerValidator(), "type" => "string", "allowEmpty" => true ),
+ ));
+ }
+
+ }
+?>
\ No newline at end of file
Added: plugins/branches/lifetype-1.2/httpbl/readme.txt
===================================================================
--- plugins/branches/lifetype-1.2/httpbl/readme.txt (rev 0)
+++ plugins/branches/lifetype-1.2/httpbl/readme.txt 2007-07-15 10:01:25 UTC (rev 5656)
@@ -0,0 +1,11 @@
+Plugin: http:BL
+Author: Paul Westbrook
+Release Date: 07/13/2007
+Version: 1.0
+
+http:BL checks your comments against the Project Honeypot's http:BL.
+
+This plugin requires a Project Honeypot http:BL API key. To obtain go to: http://www.projecthoneypot.org/httpbl_configure.php
+
+Install:
+1. Configurate your http:BL plugin in your LifeType control center
\ No newline at end of file
Added: plugins/branches/lifetype-1.2/httpbl/templates/httpbl.template
===================================================================
--- plugins/branches/lifetype-1.2/httpbl/templates/httpbl.template (rev 0)
+++ plugins/branches/lifetype-1.2/httpbl/templates/httpbl.template 2007-07-15 10:01:25 UTC (rev 5656)
@@ -0,0 +1,41 @@
+{include file="$admintemplatepath/header.template"}
+{include file="$admintemplatepath/navigation.template" showOpt=httpbl title=$locale->tr("httpbl_plugin")}
+<form name="httpblPluginSettings" method="post">
+ <fieldset class="inputField">
+ <legend>{$locale->tr("label_configuration")}</legend>
+ {include file="$admintemplatepath/successmessage.template"}
+ {include file="$admintemplatepath/errormessage.template"}
+ <div class="field">
+ <label for="pluginEnabled">{$locale->tr("label_enable")}</label>
+ <div class="formHelp">
+ <input class="checkbox" type="checkbox" name="pluginEnabled" id="pluginEnabled" {if $pluginEnabled} checked="checked" {/if} value="1" />{$locale->tr("httpbl_plugin_enabled")}
+ </div>
+ </div>
+
+ <div class="field">
+ <label for="apiKey">{$locale->tr("label_httpbl_api_key")}</label>
+ <span class="required">*</span>
+ <div class="formHelp">{$locale->tr("httpbl_api_key")}
+ <input class="text" type="text" name="apiKey" id="apiKey" value="{$apiKey}" width="10" />
+ </div>
+ </div>
+
+ <div class="field">
+ <label for="maxReportAge">{$locale->tr("label_httpbl_max_age")}</label>
+ <span class="required">*</span>
+ <div class="formHelp">{$locale->tr("httpbl_max_age")}
+ <input class="text" type="text" name="maxReportAge" id="maxReportAge" value="{$maxReportAge}" width="10" />
+ </div>
+ </div>
+
+
+ </fieldset>
+
+ <div class="buttons">
+ <input type="hidden" name="op" value="updateHttpBLConfig" />
+ <input type="reset" name="{$locale->tr("reset")}" />
+ <input type="submit" name="{$locale->tr("update_settings")}" value="{$locale->tr("update")}" />
+ </div>
+</form>
+{include file="$admintemplatepath/footernavigation.template"}
+{include file="$admintemplatepath/footer.template"}
\ No newline at end of file
More information about the pLog-svn
mailing list