Browse Source

Merge pull request #116 from fabrixxm/admin

Admin pages
pull/1/head
Friendika 11 years ago
parent
commit
b61a7158da
  1. 7
      addon/calc/calc.php
  2. 7
      addon/convert/convert.php
  3. 33
      addon/facebook/README
  4. 5
      addon/facebook/facebook.php
  5. 9
      addon/fortunate/fortunate.php
  6. 9
      addon/java_upload/java_upload.php
  7. 7
      addon/js_upload/js_upload.php
  8. 17
      addon/ldapauth/README
  9. 8
      addon/ldapauth/ldapauth.php
  10. 9
      addon/oembed/oembed.php
  11. 7
      addon/piwik/piwik.php
  12. 8
      addon/poormancron/poormancron.php
  13. 17
      addon/randplace/randplace.php
  14. 8
      addon/sniper/sniper.php
  15. 7
      addon/statusnet/statusnet.php
  16. 6
      addon/tictac/tictac.php
  17. 6
      addon/twitter/twitter.php
  18. 13
      addon/widgets/widgets.php
  19. 108
      boot.php
  20. BIN
      images/icons.png
  21. 56
      include/main.js
  22. 9
      include/nav.php
  23. 50
      include/template_processor.php
  24. 15
      index.php
  25. 590
      mod/admin.php
  26. 168
      mod/regmod.php
  27. 33
      view/admin_aside.tpl
  28. 17
      view/admin_logs.tpl
  29. 13
      view/admin_plugins.tpl
  30. 21
      view/admin_plugins_details.tpl
  31. 48
      view/admin_site.tpl
  32. 36
      view/admin_summary.tpl
  33. 88
      view/admin_users.tpl
  34. 4
      view/field.tpl
  35. 6
      view/field_checkbox.tpl
  36. 6
      view/field_input.tpl
  37. 8
      view/field_select.tpl
  38. 6
      view/field_textarea.tpl
  39. 2
      view/it/strings.php
  40. 2
      view/nav.tpl
  41. 85
      view/theme/duepuntozero/style.css
  42. 78
      view/theme/loozah/style.css

7
addon/calc/calc.php

@ -1,4 +1,11 @@
<?php
/**
* Name: Calculator App
* Description: Simple Calculator Application
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
function calc_install() {
register_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');

7
addon/convert/convert.php

@ -1,5 +1,10 @@
<?php
/**
* Name: Converter App
* Description: Unit converter application
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
function convert_install() {
register_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');

33
addon/facebook/README

@ -0,0 +1,33 @@
Installing the Friendika/Facebook connector
1. register an API key for your site from developer.facebook.com
a. We'd be very happy if you include "Friendika" in the application name
to increase name recognition. The Friendika icons are also present
in the images directory and may be uploaded as a Facebook app icon.
Use images/friendika-16.jpg for the Icon and images/friendika-128.jpg for the Logo.
b. The url should be your site URL with a trailing slash.
You may use http://portal.friendika.com/privacy as the privacy policy
URL unless your site has different requirements, and
http://portal.friendika.com as the Terms of Service URL unless
you have different requirements. (Friendika is a software application
and does not require Terms of Service, though your installation of it might).
c. Set the following values in your .htconfig.php file
$a->config['facebook']['appid'] = 'xxxxxxxxxxx';
$a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
Replace with the settings Facebook gives you.
2. Enable the facebook plugin by including it in .htconfig.php - e.g.
$a->config['system']['addon'] = 'plugin1,plugin2,facebook';
3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
and click 'Install Facebook Connector'.
4. This will ask you to login to Facebook and grant permission to the
plugin to do its stuff. Allow it to do so.
5. You're done. To turn it off visit the Plugin Settings page again and
'Remove Facebook posting'.
Vidoes and embeds will not be posted if there is no other content. Links
and images will be converted to a format suitable for the Facebook API and
long posts truncated - with a link to view the full post.
Facebook contacts will not be able to view private photos, as they are not able to
authenticate to your site to establish identity. We will address this
in a future release.

5
addon/facebook/facebook.php

@ -1,4 +1,9 @@
<?php
/**
* Name: Facebook Connector
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
/**
* Installing the Friendika/Facebook connector

9
addon/fortunate/fortunate.php

@ -1,7 +1,10 @@
<?php
/**
* Name: Fortunate
* Description: Add a random fortune cookie at the bottom of every pages.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
function fortunate_install() {

9
addon/java_upload/java_upload.php

@ -1,5 +1,12 @@
<?php
/**
* Name: Java photo uploader
* Description: WARNING: This module currently has privacy issues. The java package does not pass the permissions array intact and could lead to photos being seen by people that were excluded from seeing them.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
/**
*
* Java photo uploader, uses Jumploader
@ -93,4 +100,4 @@ function java_upload_photo_post_end(&$a,&$b) {
if(x($a->data,'java_upload') && $a->data['java_upload'])
killme();
}
}

7
addon/js_upload/js_upload.php

@ -1,5 +1,12 @@
<?php
/**
* Name: JS Uploader
* Description: JavaScript photo/image uploader. Uses Valum 'qq' Uploader.
* Version: 1.0
* Author: Chris Case <http://friendika.openmindspace.org/profile/chris_case>
*/
/**
*
* JavaScript Photo/Image Uploader

17
addon/ldapauth/README

@ -0,0 +1,17 @@
Authenticate a user against an LDAP directory
Useful for Windows Active Directory and other LDAP-based organisations
to maintain a single password across the organisation.
Optionally authenticates only if a member of a given group in the directory.
The person must have registered with Friendika using the normal registration
procedures in order to have a Friendika user record, contact, and profile.
Note when using with Windows Active Directory: you may need to set TLS_CACERT in your site
ldap.conf file to the signing cert for your LDAP server.
The required configuration options for this module may be set in the .htconfig.php file
e.g.:
$a->config['ldapauth']['ldap_server'] = 'host.example.com';
...etc.

8
addon/ldapauth/ldapauth.php

@ -1,5 +1,11 @@
<?php
/**
* Name: LDAP Authenticate
* Description: Authenticate a user against an LDAP directory
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
/**
* Friendika addon
*

9
addon/oembed/oembed.php

@ -1,10 +1,9 @@
<?php
/**
* oembed plugin
*
* oEmbed is a format for allowing an embedded representation of a URL on third party sites
* http://www.oembed.com/
*
* Name: OEmbed
* Description: OEmbed is a format for allowing an embedded representation of a URL on third party sites http://www.oembed.com/
* Version: 1.2
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrix>
*/
require_once('include/oembed.php');

7
addon/piwik/piwik.php

@ -1,4 +1,11 @@
<?php
/**
* Name: Piwik Analytics
* Description: Piwik Analytics Plugin for Friendika
* Version: 1.0
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
*/
/* Piwik Analytics Plugin for Friendika
*

8
addon/poormancron/poormancron.php

@ -1,9 +1,9 @@
<?php
/**
* Poor Man Cron. Execute updates on pageviews
*
* Addon Name: poormancron
*
* Name: Poor Man Cron
* Description: Execute updates on pageviews, without the need of commandline php
* Version: 1.2
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrix>
*/
function poormancron_install() {

17
addon/randplace/randplace.php

@ -1,13 +1,12 @@
<?php
/**
* Sample Friendika plugin/addon
*
* Addon Name: randplace
*
*/
/**
* Name: Random place
* Description: Sample Friendika plugin/addon. Set a random place when posting.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*
*
*
*
* Addons are registered with the system in the
* .htconfig.php file.
@ -178,4 +177,4 @@ function randplace_settings(&$a,&$s) {
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
}
}

8
addon/sniper/sniper.php

@ -1,4 +1,10 @@
<?php
/**
* Name: Sniper App
* Description: Example of flash game application
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
/**
* Demo plugin for adding various types of Flash games to Friendika.
@ -34,4 +40,4 @@ $o .= <<< EOT
EOT;
return $o;
}
}

7
addon/statusnet/statusnet.php

@ -1,5 +1,10 @@
<?php
/**
* Name: StatusNet Connector
* Version: 1.0
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
*/
/* StatusNet Plugin for Friendika
*
* Author: Tobias Diekershoff

6
addon/tictac/tictac.php

@ -1,4 +1,10 @@
<?php
/**
* Name: TicTac App
* Description: The TicTacToe game application
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
function tictac_install() {

6
addon/twitter/twitter.php

@ -1,4 +1,10 @@
<?php
/**
* Name: Twitter Connector
* Version: 1.0
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
*/
/* Twitter Plugin for Friendika
*

13
addon/widgets/widgets.php

@ -1,10 +1,11 @@
<?php
/**
* widgets from friendika
*
* allow to embed info from friendika into another site
*/
/**
* Name: Widgets
* Description: Allow to embed info from friendika into another site
* Version: 1.0
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrix/>
*/
function widgets_install() {
register_hook('plugin_settings', 'addon/widgets/widgets.php', 'widgets_settings');

108
boot.php

@ -453,6 +453,37 @@ function system_unavailable() {
killme();
}}
// install and uninstall plugin
if (! function_exists('uninstall_plugin')){
function uninstall_plugin($plugin){
logger("Addons: uninstalling " . $plugin);
q("DELETE FROM `addon` WHERE `name` = '%s' LIMIT 1",
dbesc($plugin)
);
@include_once('addon/' . $plugin . '/' . $plugin . '.php');
if(function_exists($plugin . '_uninstall')) {
$func = $plugin . '_uninstall';
$func();
}
}}
if (! function_exists('install_plugin')){
function install_plugin($plugin){
logger("Addons: installing " . $plugin);
$t = filemtime('addon/' . $plugin . '/' . $plugin . '.php');
@include_once('addon/' . $plugin . '/' . $plugin . '.php');
if(function_exists($plugin . '_install')) {
$func = $plugin . '_install';
$func();
$r = q("INSERT INTO `addon` (`name`, `installed`, `timestamp`) VALUES ( '%s', 1, %d ) ",
dbesc($plugin),
intval($t)
);
}
}}
// Primarily involved with database upgrade, but also sets the
// base url for use in cmdline programs which don't have
// $_SERVER variables, and synchronising the state of installed plugins.
@ -538,16 +569,7 @@ function check_config(&$a) {
if(count($installed)) {
foreach($installed as $i) {
if(! in_array($i['name'],$plugins_arr)) {
logger("Addons: uninstalling " . $i['name']);
q("DELETE FROM `addon` WHERE `id` = %d LIMIT 1",
intval($i['id'])
);
@include_once('addon/' . $i['name'] . '/' . $i['name'] . '.php');
if(function_exists($i['name'] . '_uninstall')) {
$func = $i['name'] . '_uninstall';
$func();
}
uninstall_plugin($i['name']);
}
else
$installed_arr[] = $i['name'];
@ -557,17 +579,7 @@ function check_config(&$a) {
if(count($plugins_arr)) {
foreach($plugins_arr as $p) {
if(! in_array($p,$installed_arr)) {
logger("Addons: installing " . $p);
$t = filemtime('addon/' . $p . '/' . $p . '.php');
@include_once('addon/' . $p . '/' . $p . '.php');
if(function_exists($p . '_install')) {
$func = $p . '_install';
$func();
$r = q("INSERT INTO `addon` (`name`, `installed`, `timestamp`) VALUES ( '%s', 1, %d ) ",
dbesc($p),
intval($t)
);
}
install_plugin($p);
}
}
}
@ -2767,7 +2779,7 @@ function unamp($s) {
if(! function_exists('lang_selector')) {
function lang_selector() {
global $lang;
$o .= '<div id="lang-select-icon" class="icon language" title="' . t('Select an alternate language') . '" onclick="openClose(\'language-selector\');" ></div>';
$o = '<div id="lang-select-icon" class="icon language" title="' . t('Select an alternate language') . '" onclick="openClose(\'language-selector\');" ></div>';
$o .= '<div id="language-selector" style="display: none;" >';
$o .= '<form action="" method="post" ><select name="system_language" onchange="this.form.submit();" >';
$langs = glob('view/*/strings.php');
@ -2816,3 +2828,55 @@ function is_site_admin() {
return false;
}}
/*
* parse plugin comment in search of plugin infos.
* like
*
* * Name: Plugin
* * Description: A plugin which plugs in
* * Version: 1.2.3
* * Author: John <profile url>
* * Author: Jane <email>
* *
*/
if (! function_exists('get_plugin_info')){
function get_plugin_info($plugin){
if (!is_file("addon/$plugin/$plugin.php")) return false;
$f = file_get_contents("addon/$plugin/$plugin.php");
$r = preg_match("|/\*.*\*/|msU", $f, $m);
$info=Array(
'name' => $plugin,
'description' => "",
'author' => array(),
'version' => ""
);
if ($r){
$ll = explode("\n", $m[0]);
foreach( $ll as $l ) {
$l = trim($l,"\t\n\r */");
if ($l!=""){
list($k,$v) = array_map("trim", explode(":",$l,2));
$k= strtolower($k);
if ($k=="author"){
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['author'][] = array('name'=>$m[1], 'link'=>$m[2]);
} else {
$info['author'][] = array('name'=>$v);
}
} else {
if (array_key_exists($k,$info)){
$info[$k]=$v;
}
}
}
}
}
return $info;
}}

BIN
images/icons.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 10 KiB

56
include/main.js

@ -29,10 +29,33 @@
var langSelect = false;
var commentBusy = false;
$(document).ready(function() {
$(function() {
$.ajaxSetup({cache: false});
msie = $.browser.msie ;
/* nav update event */
$('nav').bind('nav-update', function(e,data){;
var net = $(data).find('net').text();
if(net == 0) { net = ''; $('#net-update').hide() } else { $('#net-update').show() }
$('#net-update').html(net);
var home = $(data).find('home').text();
if(home == 0) { home = ''; $('#home-update').hide() } else { $('#home-update').show() }
$('#home-update').html(home);
var mail = $(data).find('mail').text();
if(mail == 0) { mail = ''; $('#mail-update').hide() } else { $('#mail-update').show() }
$('#mail-update').html(mail);
var intro = $(data).find('intro').text();
var register = $(data).find('register').text();
if(intro == 0) { intro = ''; }
if(register != 0 && intro != '') { intro = intro+'/'+register; }
if(register != 0 && intro == '') { intro = '0/'+register; }
if (intro == '') { $('#notify-update').hide() } else { $('#notify-update').show() }
$('#notify-update').html(intro);
});
NavUpdate();
// Allow folks to stop the ajax page updates with the pause/break key
$(document).keypress(function(event) {
@ -70,23 +93,8 @@
if(! stopped) {
$.get("ping",function(data) {
$(data).find('result').each(function() {
var net = $(this).find('net').text();
if(net == 0) { net = ''; $('#net-update').hide() } else { $('#net-update').show() }
$('#net-update').html(net);
var home = $(this).find('home').text();
if(home == 0) { home = ''; $('#home-update').hide() } else { $('#home-update').show() }
$('#home-update').html(home);
var mail = $(this).find('mail').text();
if(mail == 0) { mail = ''; $('#mail-update').hide() } else { $('#mail-update').show() }
$('#mail-update').html(mail);
var intro = $(this).find('intro').text();
var register = $(this).find('register').text();
if(intro == 0) { intro = ''; }
if(register != 0 && intro != '') { intro = intro+'/'+register; }
if(register != 0 && intro == '') { intro = '0/'+register; }
if (intro == '') { $('#notify-update').hide() } else { $('#notify-update').show() }
$('#notify-update').html(intro);
// send nav-update event
$('nav').trigger('nav-update', this);
});
}) ;
}
@ -279,3 +287,15 @@
});
}
/**
* sprintf in javascript
* "{0} and {1}".format('zero','uno');
**/
String.prototype.format = function() {
var formatted = this;
for (var i = 0; i < arguments.length; i++) {
var regexp = new RegExp('\\{'+i+'\\}', 'gi');
formatted = formatted.replace(regexp, arguments[i]);
}
return formatted;
};

9
include/nav.php

@ -107,10 +107,15 @@ function nav(&$a) {
$nav['settings'] = array('settings', t('Settings'),"");
$nav['profiles'] = array('profiles', t('Profiles'),"");
$nav['contacts'] = array('contacts', t('Contacts'),"");
}
/**
* Admin page
*/
if (is_site_admin()){
$nav['admin'] = array('admin/', t('Admin'), "");
}
/**
*

50
include/template_processor.php

@ -8,6 +8,18 @@
var $nodes = array();
var $done = false;
private function _preg_error(){
switch(preg_last_error()){
case PREG_INTERNAL_ERROR: die('PREG_INTERNAL_ERROR'); break;
case PREG_BACKTRACK_LIMIT_ERROR: die('PREG_BACKTRACK_LIMIT_ERROR'); break;
case PREG_RECURSION_LIMIT_ERROR: die('PREG_RECURSION_LIMIT_ERROR'); break;
case PREG_BAD_UTF8_ERROR: die('PREG_BAD_UTF8_ERROR'); break;
case PREG_BAD_UTF8_OFFSET_ERROR: die('PREG_BAD_UTF8_OFFSET_ERROR'); break;
default:
die("Unknown preg error.");
}
}
private function _build_replace($r, $prefix){
if(is_array($r) && count($r)) {
@ -40,11 +52,28 @@
/**
* IF node
*
* {{ if <$var> }}...{{ endif }}
* {{ if <$var> }}...[{{ else }} ...] {{ endif }}
* {{ if <$var>==<val|$var> }}...[{{ else }} ...]{{ endif }}
* {{ if <$var>!=<val|$var> }}...[{{ else }} ...]{{ endif }}
*/
private function _replcb_if($args){
$val = $this->_get_var($args[2]);
return ($val?$args[3]:"");
if (strpos($args[2],"==")>0){
list($a,$b) = array_map("trim",explode("==",$args[2]));
$a = $this->_get_var($a);
if ($b[0]=="$") $b = $this->_get_var($b);
$val = ($a == $b);
} else if (strpos($args[2],"!=")>0){
list($a,$b) = explode("!=",$args[2]);
$a = $this->_get_var($a);
if ($b[0]=="$") $b = $this->_get_var($b);
$val = ($a != $b);
} else {
$val = $this->_get_var($args[2]);
}
list($strue, $sfalse)= preg_split("|{{ *else *}}|", $args[3]);
return ($val?$strue:$sfalse);
}
/**
@ -58,7 +87,8 @@
list($keyname, $varname) = explode("=>",$m[1]);
if (is_null($varname)) { $varname=$keyname; $keyname=""; }
if ($m[0]=="" || $varname=="" || is_null($varname)) die("template error: 'for ".$m[0]." as ".$varname."'") ;
$vals = $this->r[$m[0]];
//$vals = $this->r[$m[0]];
$vals = $this->_get_var($m[0]);
$ret="";
if (!is_array($vals)) return $ret;
foreach ($vals as $k=>$v){
@ -96,13 +126,16 @@
private function _replcb_node($m) {
$node = $this->nodes[$m[1]];
if (method_exists($this, "_replcb_".$node[1])){
return call_user_func(array($this, "_replcb_".$node[1]), $node);
$s = call_user_func(array($this, "_replcb_".$node[1]), $node);
} else {
return "";
$s = "";
}
$s = preg_replace_callback('/\|\|([0-9]+)\|\|/', array($this, "_replcb_node"), $s);
return $s;
}
private function _replcb($m){
//var_dump(array_map('htmlspecialchars', $m));
$this->done = false;
$this->nodes[] = (array) $m;
return "||". (count($this->nodes)-1) ."||";
@ -112,8 +145,10 @@
$this->done = false;
while (!$this->done){
$this->done=true;
$s = preg_replace_callback('|{{ *([a-z]*) *([^}]*)}}([^{]*){{ *end\1 *}}|', array($this, "_replcb"), $s);
$s = preg_replace_callback('|{{ *([a-z]*) *([^}]*)}}([^{]*({{ *else *}}[^{]*)?){{ *end\1 *}}|', array($this, "_replcb"), $s);
if ($s==Null) $this->_preg_error();
}
//({{ *else *}}[^{]*)?
krsort($this->nodes);
return $s;
}
@ -128,6 +163,7 @@
#$s = str_replace(array("\n","\r"),array("§n§","§r§"),$s);
$s = $this->_build_nodes($s);
$s = preg_replace_callback('/\|\|([0-9]+)\|\|/', array($this, "_replcb_node"), $s);
if ($s==Null) $this->_preg_error();
$s = str_replace($this->search,$this->replace, $s);
return $s;

15
index.php

@ -29,7 +29,6 @@ $install = ((file_exists('.htconfig.php') && filesize('.htconfig.php')) ? false
@include(".htconfig.php");
$lang = get_language();
load_translation_table($lang);
@ -45,6 +44,20 @@ $db = new dba($db_host, $db_user, $db_pass, $db_data, $install);
unset($db_host, $db_user, $db_pass, $db_data);
/**
* Load configs from db. Overwrite configs from .htconfig.php
*/
$r = q("SELECT * FROM `config` WHERE `cat` IN ('system', 'config')");
foreach ($r as $c) {
if ($c['cat']=='config') {
$a->config[$c['k']] = $c['v'];
} else {
$a->config[$c['cat']][$c['k']] = $c['v'];
}
}
unset($r);
/**
*
* Important stuff we always need to do.

590
mod/admin.php

@ -0,0 +1,590 @@
<?php
/**
* Friendika admin
*/
function admin_init(&$a) {
if(!is_site_admin()) {
notice( t('Permission denied.') . EOL);
return;
}
}
function admin_post(&$a){
if(!is_site_admin()) {
return login(false);
}
// urls
if ($a->argc > 1){
switch ($a->argv[1]){
case 'site':
admin_page_site_post($a);
break;
case 'users':
admin_page_users_post($a);
break;
case 'logs':
admin_page_logs_post($a);
break;
}
}
goaway($a->get_baseurl() . '/admin' );
return; // NOTREACHED
}
function admin_content(&$a) {
if(!is_site_admin()) {
return login(false);
}
/**
* Side bar links
*/
// array( url, name, extra css classes )
$aside = Array(
'site' => Array($a->get_baseurl()."/admin/site/", t("Site") , "site"),
'users' => Array($a->get_baseurl()."/admin/users/", t("Users") , "users"),
'plugins'=> Array($a->get_baseurl()."/admin/plugins/", t("Plugins") , "plugins")
);
/* get plugins admin page */
$r = q("SELECT * FROM `hook` WHERE `hook`='plugin_admin'");
$aside['plugins_admin']=Array();
foreach ($r as $h){
$plugin = explode("/",$h['file']); $plugin = $plugin[1];
$aside['plugins_admin'][] = Array($a->get_baseurl()."/admin/plugins/".$plugin, $plugin, "plugin");
}
$aside['logs'] = Array($a->get_baseurl()."/admin/logs/", t("Logs"), "logs");
$t = get_markup_template("admin_aside.tpl");
$a->page['aside'] = replace_macros( $t, array(
'$admin' => $aside,
'$h_pending' => t('User registrations waiting for confirm'),
'$admurl'=> $a->get_baseurl()."/admin/"
));
/**
* Page content
*/
$o = '';
// urls
if ($a->argc > 1){
switch ($a->argv[1]){
case 'site':
$o = admin_page_site($a);
break;
case 'users':
$o = admin_page_users($a);
break;
case 'plugins':
$o = admin_page_plugins($a);
break;
case 'logs':
$o = admin_page_logs($a);
break;
default:
notice( t("Item not found.") );
}
} else {
$o = admin_page_summary($a);
}
return $o;
}
/**
* Admin Summary Page
*/
function admin_page_summary(&$a) {
$r = q("SELECT `page-flags`, COUNT(uid) as `count` FROM `user` GROUP BY `page-flags`");
$accounts = Array(
Array( t('Normal Account'), 0),
Array( t('Soapbox Account'), 0),
Array( t('Community/Celebrity Account'), 0),
Array( t('Automatic Friend Account'), 0)
);
$users=0;
foreach ($r as $u){ $accounts[$u['page-flags']][1] = $u['count']; $users+=$u['count']; }
$r = q("SELECT COUNT(id) as `count` FROM `register`");
$pending = $r[0]['count'];
$t = get_markup_template("admin_summary.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Summary'),
'$users' => Array( t('Registered users'), $users),
'$accounts' => $accounts,
'$pending' => Array( t('Pending registrations'), $pending),
'$version' => Array( t('Version'), FRIENDIKA_VERSION),
'$build' => get_config('system','build'),
'$plugins' => Array( t('Active plugins'), $a->plugins )
));
}
/**
* Admin Site Page
*/
function admin_page_site_post(&$a){
if (!x($_POST,"page_site")){
return;
}
$sitename = ((x($_POST,'sitename')) ? notags(trim($_POST['sitename'])) : '');
$banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
$language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : '');
$theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : '');
$maximagesize = ((x($_POST,'maximagesize')) ? intval(trim($_POST['maximagesize'])) : 0);
$register_policy = ((x($_POST,'register_policy')) ? intval(trim($_POST['register_policy'])) : 0);
$register_text = ((x($_POST,'register_text')) ? notags(trim($_POST['register_text'])) : '');
$allowed_sites = ((x($_POST,'allowed_sites')) ? notags(trim($_POST['allowed_sites'])) : '');
$allowed_email = ((x($_POST,'allowed_email')) ? notags(trim($_POST['allowed_email'])) : '');
$block_public = ((x($_POST,'block_public')) ? True : False);
$force_publish = ((x($_POST,'publish_all')) ? True : False);
$global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
$global_search_url = ((x($_POST,'directory_search_url'))? notags(trim($_POST['directory_search_url'])) : '');
$no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False);
$no_openid = ((x($_POST,'no_openid')) ? True : False);
$no_gravatar = ((x($_POST,'no_gravatar')) ? True : False);
$no_regfullname = ((x($_POST,'no_regfullname')) ? True : False);
$no_utf = ((x($_POST,'no_utf')) ? True : False);
$rino_enc = ((x($_POST,'rino_enc')) ? True : False);
$verifyssl = ((x($_POST,'verifyssl')) ? True : False);
$proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['global_search_url'])) : '');
$proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['global_search_url'])) : '');
$timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
set_config('config','sitename',$sitename);
if ($banner==""){
// don't know why, but del_config doesn't work...
q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
dbesc("system"),
dbesc("banner")
);
} else {
set_config('system','banner', $banner);
}
set_config('system','language', $language);
set_config('system','theme', $theme);
set_config('system','maximagesize', $maximagesize);
set_config('config','register_policy', $register_policy);
set_config('config','register_text', $register_text);
set_config('system','allowed_sites', $allowed_sites);
set_config('system','allowed_email', $allowed_email);
set_config('system','block_public', $block_public);
set_config('system','publish_all', $force_publish);
if ($global_directory==""){
// don't know why, but del_config doesn't work...
q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
dbesc("system"),
dbesc("directory_submit_url")
);
} else {
set_config('system','directory_submit_url', $global_directory);
}
set_config('system','directory_search_url', $global_search_url);
set_config('system','block_extended_register', $no_multi_reg);
set_config('system','no_openid', $no_openid);
set_config('system','no_gravatar', $no_gravatar);
set_config('system','no_regfullname', $no_regfullname);
set_config('system','proxy', $no_utf);
set_config('system','rino_encrypt', $rino_enc);
set_config('system','verifyssl', $verifyssl);
set_config('system','proxyuser', $proxyuser);
set_config('system','proxy', $proxy);
set_config('system','curl_timeout', $timeout);
goaway($a->get_baseurl() . '/admin/site' );
return; // NOTREACHED
}
function admin_page_site(&$a) {
/* Installed langs */
$lang_choices = array();
$langs = glob('view/*/strings.php');
if(is_array($langs) && count($langs)) {
if(! in_array('view/en/strings.php',$langs))
$langs[] = 'view/en/';
asort($langs);
foreach($langs as $l) {
$t = explode("/",$l);
$lang_choices[$t[1]] = $t[1];
}
}
/* Installed themes */
$theme_choices = array();
$files = glob('view/theme/*');
if($files) {
foreach($files as $file) {
$f = basename($file);
$theme_name = ((file_exists($file . '/experimental')) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
$theme_choices[$f] = $theme_name;
}
}
/* Banner */
$banner = get_config('system','banner');
if($banner == false)
$banner = htmlspecialchars('<a href="http://project.friendika.com"><img id="logo-img" src="images/friendika-32.png" alt="logo" /></a><span id="logo-text"><a href="http://project.friendika.com">Friendika</a></span>');
//echo "<pre>"; var_dump($lang_choices); die("</pre>");
/* Register policy */
$register_choices = Array(
REGISTER_CLOSED => t("Closed"),
REGISTER_APPROVE => t("Need approvation"),
REGISTER_OPEN => t("Open")
);
$t = get_markup_template("admin_site.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Site'),
'$submit' => t('Submit'),
'$baseurl' => $a->get_baseurl(),
// name, label, value, help string, extra data...
'$sitename' => array('sitename', t("Site name"), $a->config['sitename'], ""),
'$banner' => array('banner', t("Banner/Logo"), $banner, ""),
'$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
'$theme' => array('theme', t("System theme"), get_config('system','theme'), "Default system theme (which may be over-ridden by user profiles)", $theme_choices),
'$maximagesize' => array('maximagesize', t("Maximum image size"), get_config('system','maximagesize'), "Maximum size in bytes of uploaded images. Default is 0, which means no limits."),
'$register_policy' => array('register_policy', t("Register policy"), $a->config['register_policy'], "", $register_choices),
'$register_text' => array('register_text', t("Register text"), $a->config['register_text'], "Will be displayed prominently on the registration page."),
'$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), "Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"),
'$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), "Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"),
'$block_public' => array('block_public', t("Block public"), get_config('system','block_public'), "Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."),
'$force_publish' => array('publish_all', t("Force publish"), get_config('system','publish_all'), "Check to force all profiles on this site to be listed in the site directory."),
'$global_directory' => array('directory_submit_url', t("Global directory update URL"), get_config('system','directory_submit_url'), "URL to update the global directory. If this is not set, the global directory is completely unavailable to the application."),
'$global_search_url'=> array('directory_search_url', t("Global directory search URL"), get_config('system','directory_search_url'), ""),
'$no_multi_reg' => array('no_multi_reg', t("Block multiple registrations"), get_config('system','block_extended_register'), "Disallow users to register additional accounts for use as pages."),
'$no_openid' => array('no_openid', t("No OpenID support"), get_config('system','no_openid'), "Disable OpenID support for registration and logins."),
'$no_gravatar' => array('no_gravatar', t("No Gravatar support"), get_config('system','no_gravatar'), ""),
'$no_regfullname' => array('no_regfullname', t("No fullname check"), get_config('system','no_regfullname'), "If unchecked, force users to registrate with a space between his firsname and lastname in Full name, as an antispam measure"),
'$no_utf' => array('no_utf', t("No UTF-8 Regular expressions"), get_config('system','proxy'), "Default is false (meaning UTF8 regular expressions are supported and working)"),
'$rino_enc' => array('rino_enc', t("Enable Rino encrypt"), get_config('system','rino_encrypt'),""),
'$verifyssl' => array('verifyssl', t("Verify SSL"), get_config('system','verifyssl'), "If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."),
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
'$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
'$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), "Value is in seconds. Set to 0 for unlimited (not recommended)."),
));
}
/**
* Users admin page
*/
function admin_page_users_post(&$a){
$users=array(); $pending=array();
foreach($_POST as $k=>$v){
if (substr($k,0,5)=="user_") $users[] = substr($k,5,strlen($k)-5);
if (substr($k,0,8)=="pending_") $users[] = substr($k,8,strlen($k)-8);
}
if (x($_POST,'page_users_block')){
foreach($users as $uid){
q("UPDATE `user` SET `blocked`=1-`blocked` WHERE `uid`=%s",
intval( $uid )
);
}
notice( sprintf( tt("%s user blocked", "%s users blocked", count($users)), count($users)) );
}
if (x($_POST,'page_users_delete')){
require_once("include/Contact.php");
foreach($users as $uid){
user_remove($uid);
}
notice( sprintf( tt("%s user deleted", "%s users deleted", count($users)), count($users)) );
}
if (x($_POST,'page_users_approve')){
require_once("include/regmod.php");
foreach($pending as $hash){
user_allow($hash);
}
}
if (x($_POST,'page_users_deny')){
require_once("include/regmod.php");
foreach($pending as $hash){
user_deny($hash);
}
}
goaway($a->get_baseurl() . '/admin/users' );
return; // NOTREACHED
}
function admin_page_users(&$a){
if ($a->argc>2) {
$uid = $a->argv[3];
$user = q("SELECT * FROM `user` WHERE `uid`=%d", intval($uid));
if (count($user)==0){
notice( 'User not found' . EOL);
goaway($a->get_baseurl() . '/admin/users' );
return; // NOTREACHED
}
switch($a->argv[2]){
case "delete":{
// delete user
require_once("include/Contact.php");
user_remove($uid);
notice( sprintf(t("User '%s' deleted"), $user[0]['username']) . EOL);
}; break;
case "block":{
q("UPDATE `user` SET `blocked`=%d WHERE `uid`=%s",
intval( 1-$user[0]['blocked'] ),
intval( $uid )
);
}; break;
}
goaway($a->get_baseurl() . '/admin/users' );
return; // NOTREACHED
}
/* get pending */
$pending = q("SELECT `register`.*, `contact`.`name`, `user`.`email`
FROM `register`
LEFT JOIN `contact` ON `register`.`uid` = `contact`.`uid`
LEFT JOIN `user` ON `register`.`uid` = `user`.`uid`;");
/* get users */
$users = q("SELECT `user` . * , `contact`.`name` , `contact`.`url` , `contact`.`micro` , `lastitem`.`changed` AS `lastitem_date`
FROM (
SELECT `item`.`changed` , `item`.`uid`
FROM `item`
GROUP BY `uid`
ORDER BY `item`.`changed`
) AS `lastitem` , `user`
LEFT JOIN `contact` ON `user`.`uid` = `contact`.`uid`
WHERE `user`.`verified` =1
AND `contact`.`self` =1
AND `lastitem`.`uid` = `user`.`uid`
ORDER BY `contact`.`name`
");
function _setup_users($e){
$accounts = Array(
t('Normal Account'),
t('Soapbox Account'),
t('Community/Celebrity Account'),
t('Automatic Friend Account')
);
$e['page-flags'] = $accounts[$e['page-flags']];
$e['register_date'] = relative_date($e['register_date']);
$e['login_date'] = relative_date($e['login_date']);
$e['lastitem_date'] = relative_date($e['lastitem_date']);
return $e;
}
$users = array_map("_setup_users", $users);
$t = get_markup_template("admin_users.tpl");
return replace_macros($t, array(
// strings //
'$title' => t('Administration'),
'$page' => t('Users'),
'$submit' => t('Submit'),
'$select_all' => t('select all'),
'$h_pending' => t('User registrations waiting for confirm'),
'$th_pending' => array( t('Request date'), t('Name'), t('Email') ),
'$no_pending' => t('No registrations.'),
'$approve' => t('Approve'),
'$deny' => t('Deny'),
'$delete' => t('Delete'),
'$block' => t('Block'),
'$unblock' => t('Unblock'),
'$h_users' => t('Users'),
'$th_users' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'), t('Account') ),
'$confirm_delete_multi' => t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'),
'$confirm_delete' => t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'),
// values //
'$baseurl' => $a->get_baseurl(),
'$pending' => $pending,
'$users' => $users,
));
}
/*
* Plugins admin page
*/
function admin_page_plugins(&$a){
/**
* Single plugin
*/
if ($a->argc == 3){
$plugin = $a->argv[2];
if (!is_file("addon/$plugin/$plugin.php")){
notice( t("Item not found.") );
return;
}
if (x($_GET,"a") && $_GET['a']=="t"){
// Toggle plugin status
$idx = array_search($plugin, $a->plugins);
if ($idx){
unset($a->plugins[$idx]);
uninstall_plugin($plugin);
} else {
$a->plugins[] = $plugin;
install_plugin($plugin);
}
set_config("system","addon", implode(", ",$a->plugins));
goaway($a->get_baseurl() . '/admin/plugins' );
return; // NOTREACHED
}
// display plugin details
require_once('library/markdown.php');
if (in_array($plugin, $a->plugins)){
$status="on"; $action= t("Disable");
} else {
$status="off"; $action= t("Enable");
}
$readme=Null;
if (is_file("addon/$plugin/README.md")){
$readme = file_get_contents("addon/$plugin/README.md");
$readme = Markdown($readme);
} else if (is_file("addon/$plugin/README")){
$readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
}
$t = get_markup_template("admin_plugins_details.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Plugins'),
'$toggle' => t('Toggle'),
'$baseurl' => $a->get_baseurl(),
'$plugin' => $plugin,
'$status' => $status,
'$action' => $action,
'$info' => get_plugin_info($plugin),
'$readme' => $readme
));
}
/**
* List plugins
*/
$plugins = array();
$files = glob("addon/*/");
if($files) {
foreach($files as $file) {
if (is_dir($file)){
list($tmp, $id)=array_map("trim", explode("/",$file));
$info = get_plugin_info($id);
$plugins[] = array( $id, (in_array($id, $a->plugins)?"on":"off") , $info);
}
}
}
$t = get_markup_template("admin_plugins.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Plugins'),
'$submit' => t('Submit'),
'$baseurl' => $a->get_baseurl(),
'$plugins' => $plugins
));
}
/**
* Logs admin page
*/
function admin_page_logs_post(&$a) {
if (x($_POST,"page_logs")) {
$logfile = ((x($_POST,'logfile')) ? notags(trim($_POST['logfile'])) : '');
$debugging = ((x($_POST,'debugging')) ? true : false);
$loglevel = ((x($_POST,'loglevel')) ? intval(trim($_POST['loglevel'])) : 0);
set_config('system','logfile', $logfile);
set_config('system','debugging', $debugging);
set_config('system','loglevel', $loglevel);
}
goaway($a->get_baseurl() . '/admin/logs' );
return; // NOTREACHED
}
function admin_page_logs(&$a){
$log_choices = Array(
LOGGER_NORMAL => 'Normal',
LOGGER_TRACE => 'Trace',
LOGGER_DEBUG => 'Debug',
LOGGER_DATA => 'Data',
LOGGER_ALL => 'All'
);
$t = get_markup_template("admin_logs.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Logs'),
'$submit' => t('Submit'),
'$clear' => t('Clear'),
'$baseurl' => $a->get_baseurl(),
'$logname' => get_config('system','logfile'),
// name, label, value, help string, extra data...
'$debugging' => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
'$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), "Must be writable by web server. Relative to your Friendika index.php."),
'$loglevel' => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
));
}

168
mod/regmod.php

@ -1,6 +1,96 @@
<?php
function user_allow($hash) {
$register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1",
dbesc($hash)
);
if(! count($register))
return false;
$user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
if(! count($user))
killme();
$r = q("DELETE FROM `register` WHERE `hash` = '%s' LIMIT 1",
dbesc($register[0]['hash'])
);
$r = q("UPDATE `user` SET `blocked` = 0, `verified` = 1 WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is-default` = 1",
intval($user[0]['uid'])
);
if(count($r) && $r[0]['net-publish']) {
$url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
if($url && strlen(get_config('system','directory_submit_url')))
proc_run('php',"include/directory.php","$url");
}
push_lang($register[0]['language']);
$email_tpl = get_intltext_template("register_open_eml.tpl");
$email_tpl = replace_macros($email_tpl, array(
'$sitename' => $a->config['sitename'],
'$siteurl' => $a->get_baseurl(),
'$username' => $user[0]['username'],
'$email' => $user[0]['email'],
'$password' => $register[0]['password'],
'$uid' => $user[0]['uid']
));
$res = mail($user[0]['email'], sprintf(t('Registration details for %s'), $a->config['sitename']),
$email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
pop_lang();
if($res) {
info( t('Account approved.') . EOL );
return true;
}
}
function user_deny($hash) {
$register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1",
dbesc($hash)
);
if(! count($register))
return false;
$user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("DELETE FROM `user` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("DELETE FROM `contact` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("DELETE FROM `profile` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("DELETE FROM `register` WHERE `hash` = '%s' LIMIT 1",
dbesc($register[0]['hash'])
);
notice( sprintf(t('Registration revoked for %s'), $user[0]['username']) . EOL);
return true;
}
function regmod_content(&$a) {
@ -14,7 +104,7 @@ function regmod_content(&$a) {
return $o;
}
if((! (x($a->config,'admin_email'))) || ($a->config['admin_email'] !== $a->user['email'])) {
if(!is_site_admin()) {
notice( t('Permission denied.') . EOL);
return '';
}
@ -26,84 +116,12 @@ function regmod_content(&$a) {
$hash = $a->argv[2];
$register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1",
dbesc($hash)
);
if(! count($register))
killme();
$user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
if($cmd === 'deny') {
$r = q("DELETE FROM `user` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("DELETE FROM `contact` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("DELETE FROM `profile` WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("DELETE FROM `register` WHERE `hash` = '%s' LIMIT 1",
dbesc($register[0]['hash'])
);
notice( sprintf(t('Registration revoked for %s'), $user[0]['username']) . EOL);
return;
if (!user_deny($hash)) killme();
}
if($cmd === 'allow') {
if(! count($user))
killme();
$r = q("DELETE FROM `register` WHERE `hash` = '%s' LIMIT 1",
dbesc($register[0]['hash'])
);
$r = q("UPDATE `user` SET `blocked` = 0, `verified` = 1 WHERE `uid` = %d LIMIT 1",
intval($register[0]['uid'])
);
$r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is-default` = 1",
intval($user[0]['uid'])
);
if(count($r) && $r[0]['net-publish']) {
$url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
if($url && strlen(get_config('system','directory_submit_url')))
proc_run('php',"include/directory.php","$url");
}
push_lang($register[0]['language']);
$email_tpl = get_intltext_template("register_open_eml.tpl");
$email_tpl = replace_macros($email_tpl, array(
'$sitename' => $a->config['sitename'],
'$siteurl' => $a->get_baseurl(),
'$username' => $user[0]['username'],
'$email' => $user[0]['email'],
'$password' => $register[0]['password'],
'$uid' => $user[0]['uid']
));
$res = mail($user[0]['email'], sprintf(t('Registration details for %s'), $a->config['sitename']),
$email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
pop_lang();
if($res) {
info( t('Account approved.') . EOL );
return;
}
if (!user_allow($hash)) killme();
}
}

33
view/admin_aside.tpl

@ -0,0 +1,33 @@
<script>
// update pending count //
$(function(){
$("nav").bind('nav-update', function(e,data){
var elm = $('#pending-update');
var register = $(data).find('register').text();
if (register=="0") { reigster=""; elm.hide();} else { elm.show(); }
elm.html(register);
console.log(elm, data, register);
});
});
</script>
<h4><a href="$admurl">Admin</a></h4>
<ul>
<li class='admin link $admin.site.2'><a href='$admin.site.0'>$admin.site.1</a></li>
<li class='admin link $admin.users.2'><a href='$admin.users.0'>$admin.users.1</a><span id='pending-update' title='$h_pending'></span></li>
<li class='admin link $admin.plugins.2'><a href='$admin.plugins.0'>$admin.plugins.1</a></li>
</ul>
{{ if $admin.plugins_admin }}<h4>Plugins</h4>{{ endif }}
<ul>
{{ for $admin.plugins_admin as $l }}
<li class='admin link $l.2'><a href='$l.0'>$l.1</a></li>
{{ endfor }}
</ul>
<h4>Logs</h4>
<ul>
<li class='admin link $admin.logs.2'><a href='$admin.logs.0'>$admin.logs.1</a></li>
</ul>

17
view/admin_logs.tpl

@ -0,0 +1,17 @@
<div id='adminpage'>
<h1>$title - $page</h1>
<form action="$baseurl/admin/logs" method="post">
{{ inc field_checkbox.tpl with $field=$debugging }}{{ endinc }}
{{ inc field_input.tpl with $field=$logfile }}{{ endinc }}
{{ inc field_select.tpl with $field=$loglevel }}{{ endinc }}
<div class="submit"><input type="submit" name="page_logs" value="$submit" /></div>
</form>
<h3>$logname</h3>
<iframe src='$baseurl/$logname' style="width:100%; height:400px"></iframe>
<!-- <div class="submit"><input type="submit" name="page_logs_clear_log" value="$clear" /></div> -->
</div>

13
view/admin_plugins.tpl

@ -0,0 +1,13 @@
<div id='adminpage'>
<h1>$title - $page</h1>
<ul id='pluginslist'>
{{ for $plugins as $p }}
<li class='plugin $p.1'>
<a class='toggleplugin' href='$baseurl/admin/plugins/$p.0?a=t'><span class='icon $p.1'></span></a>
<a href='$baseurl/admin/plugins/$p.0'><span class='name'>$p.2.name</span></a> - <span class="version">$p.2.version</span>
<div class='desc'>$p.2.description</div>
</li>
{{ endfor }}
</ul>
</div>

21
view/admin_plugins_details.tpl

@ -0,0 +1,21 @@
<div id='adminpage'>
<h1>$title - $page</h1>
<p><span class='toggleplugin icon $status'></span> $info.name - $info.version : <a href="$baseurl/admin/plugins/$plugin/?a=t">$action</a></p>
<p>$info.description</p>
<p class="author">
{{ for $info.author as $a }}
{{ if $a.link }}<a href="$a.link">$a.name</a>{{ else }}$a.name{{ endif }},
{{ endfor }}
</p>
{{ if $readme }}
<h3>Readme</h3>
<div id="plugin_readme">
$readme
</div>
{{ endif }}
</div>

48
view/admin_site.tpl

@ -0,0 +1,48 @@
<div id='adminpage'>
<h1>$title - $page</h1>
<form action="$baseurl/admin/site" method="post">
{{ inc field_input.tpl with $field=$sitename }}{{ endinc }}
{{ inc field_textarea.tpl with $field=$banner }}{{ endinc }}
{{ inc field_select.tpl with $field=$language }}{{ endinc }}
{{ inc field_select.tpl with $field=$theme }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
<h3>Registration</h3>
{{ inc field_input.tpl with $field=$register_text }}{{ endinc }}
{{ inc field_select.tpl with $field=$register_policy }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$no_multi_reg }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$no_openid }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$no_gravatar }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$no_regfullname }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$no_utf }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
<h3>Upload</h3>
{{ inc field_input.tpl with $field=$maximagesize }}{{ endinc }}
<h3>Corporate/Edu</h3>
{{ inc field_input.tpl with $field=$allowed_sites }}{{ endinc }}
{{ inc field_input.tpl with $field=$allowed_email }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$block_public }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$force_publish }}{{ endinc }}
{{ inc field_input.tpl with $field=$global_directory }}{{ endinc }}
{{ inc field_input.tpl with $field=$global_search_url }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
<h3>Advanced</h3>
{{ inc field_checkbox.tpl with $field=$rino_enc }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$verifyssl }}{{ endinc }}
{{ inc field_input.tpl with $field=$proxy }}{{ endinc }}
{{ inc field_input.tpl with $field=$proxyuser }}{{ endinc }}
{{ inc field_input.tpl with $field=$timeout }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
</form>
</div>

36
view/admin_summary.tpl

@ -0,0 +1,36 @@
<div id='adminpage'>
<h1>$title - $page</h1>
<dl>
<dt>$pending.0</dt>
<dd>$pending.1</dt>
</dl>
<dl>
<dt>$users.0</dt>
<dd>$users.1</dd>
</dl>
{{ for $accounts as $p }}
<dl>
<dt>$p.0</dt>
<dd>$p.1</dd>
</dl>
{{ endfor }}
<dl>
<dt>$plugins.0</dt>
{{ for $plugins.1 as $p }}
<dd>$p</dd>
{{ endfor }}
</dl>
<dl>
<dt>$version.0</dt>
<dd>$version.1 - $build</dt>
</dl>
</div>

88
view/admin_users.tpl

@ -0,0 +1,88 @@
<script>
function confirm_delete(uname){
return confirm( "$confirm_delete".format(uname));
}
function confirm_delete_multi(){
return confirm("$confirm_delete_multi");
}
function selectall(cls){
$("."+cls).attr('checked','checked');
return false;
}
</script>
<div id='adminpage'>
<h1>$title - $page</h1>
<form action="$baseurl/admin/users" method="post">
<h3>$h_pending</h3>
{{ if $pending }}
<table id='pending'>
<thead>
<tr>
{{ for $th_pending as $th }}<th>$th</th>{{ endfor }}
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{ for $pending as $u }}
<tr>
<td class="created">$u.created</td>
<td class="name">$u.name</td>
<td class="email">$u.email</td>
<td class="checkbox"><input type="checkbox" class="pending_ckbx" id="id_pending_$u.hash" name="pending_$u.hash"/></td>