]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #116 from fabrixxm/admin
authorFriendika <info@friendika.com>
Thu, 16 Jun 2011 22:27:12 +0000 (15:27 -0700)
committerFriendika <info@friendika.com>
Thu, 16 Jun 2011 22:27:12 +0000 (15:27 -0700)
Admin pages

42 files changed:
addon/calc/calc.php
addon/convert/convert.php
addon/facebook/README [new file with mode: 0644]
addon/facebook/facebook.php
addon/fortunate/fortunate.php
addon/java_upload/java_upload.php
addon/js_upload/js_upload.php
addon/ldapauth/README [new file with mode: 0644]
addon/ldapauth/ldapauth.php
addon/oembed/oembed.php
addon/piwik/piwik.php
addon/poormancron/poormancron.php
addon/randplace/randplace.php
addon/sniper/sniper.php
addon/statusnet/statusnet.php
addon/tictac/tictac.php
addon/twitter/twitter.php
addon/widgets/widgets.php
boot.php
images/icons.png
include/main.js
include/nav.php
include/template_processor.php
index.php
mod/admin.php [new file with mode: 0644]
mod/regmod.php
view/admin_aside.tpl [new file with mode: 0644]
view/admin_logs.tpl [new file with mode: 0644]
view/admin_plugins.tpl [new file with mode: 0644]
view/admin_plugins_details.tpl [new file with mode: 0644]
view/admin_site.tpl [new file with mode: 0644]
view/admin_summary.tpl [new file with mode: 0644]
view/admin_users.tpl [new file with mode: 0644]
view/field.tpl [new file with mode: 0644]
view/field_checkbox.tpl [new file with mode: 0644]
view/field_input.tpl [new file with mode: 0644]
view/field_select.tpl [new file with mode: 0644]
view/field_textarea.tpl [new file with mode: 0644]
view/it/strings.php
view/nav.tpl
view/theme/duepuntozero/style.css
view/theme/loozah/style.css

index a095e3960d1f8567dc29c1d9371ed5700c128895..8c079dc7a561d9a572d47cdeab78877161be2f23 100644 (file)
@@ -1,4 +1,11 @@
 <?php\r
+/**\r
+ * Name: Calculator App\r
+ * Description: Simple Calculator Application\r
+ * Version: 1.0\r
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>\r
+ */\r
+\r
 \r
 function calc_install() {\r
        register_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
index a3448ce01e5c0cc0efc93954391816c14da8b9a8..7a4c90a530fe097ae55536db6cd9403eceba791f 100644 (file)
@@ -1,5 +1,10 @@
 <?php\r
-\r
+/**\r
+ * Name: Converter App\r
+ * Description: Unit converter application\r
+ * Version: 1.0\r
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>\r
+ */\r
 \r
 function convert_install() {\r
        register_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
diff --git a/addon/facebook/README b/addon/facebook/README
new file mode 100644 (file)
index 0000000..42ec013
--- /dev/null
@@ -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.
index 545779cd5fc2f513bf540a8acc14b63ece13a499..5d86c66c2ce96435167e54bd304026030f826674 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+/**
+ * Name: Facebook Connector
+ * Version: 1.0
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ */
 
 /**
  * Installing the Friendika/Facebook connector
index b91080f516a5536280bb236a02d5e657c5ea7fdc..5a6302e58d8509c38e7c119161436a83b95443e5 100644 (file)
@@ -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() {
index 8b8a57604cfabcc2032709f2af95eb880d3d87b8..09e321f0a8c9738dff33e4d9bcd4e3e2db0f30d4 100644 (file)
@@ -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();
 
-}
\ No newline at end of file
+}
index 9f3fa960096ee04ba2204dcad5077b118998478c..042e9a988a9b7874f951b1b36db53fd5ce68de3e 100644 (file)
@@ -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
diff --git a/addon/ldapauth/README b/addon/ldapauth/README
new file mode 100644 (file)
index 0000000..cf28ef1
--- /dev/null
@@ -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.
index 2ec30caad79592b1567bccd4ec22b4986de18fdc..7230302e9dc1c2d7de125a5a8932c6e536cb019f 100644 (file)
@@ -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
  * 
index a0a0239aaf992fc8b04a763bf0b841704356e6f6..f5be44194c139bb7924602b783ff255f40862ca2 100644 (file)
@@ -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');
index 52bdaeb0d1bad3340a6c7e54d8fb5ba50863420e..032f84f4bb29f8533419e7ea9eb6d4b1f36b7be7 100644 (file)
@@ -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
  *
index 830c10ddfebaa96cca2cfa1f8a0158cc3f26a2b4..9a8dc1e33f8e3e1ad92d973e3f7880961745de84 100644 (file)
@@ -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() {
index fa38de377647e515a557547a216d11d91b62a5fe..bae8e7c690dc059ada01b8f0e49f461cbe2e2fb3 100644 (file)
@@ -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>';
 
-}
\ No newline at end of file
+}
index 8d31e9cd1fe7ca9fbe3b5f53a876655cbdb9c584..d431a246663c999046a5483014134d56241567d3 100644 (file)
@@ -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;
-}
\ No newline at end of file
+}
index 39df7d9620b52d6e35a203ac3309424f10f04f61..e24ebc1ee03df17752ad484c45eb25e71013e287 100644 (file)
@@ -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
index a69cda132b8bcc59436bfd8aa10167f100fcc8a3..d6cec08a0635359f39a686122e862db132110023 100644 (file)
@@ -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() {
index c59d1b9e5ce8d9e76b30cc7ab6ac1783ffec9b8a..fef6583f6b05c59089a6fd6a890d53c5f7847c7f 100644 (file)
@@ -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
  *
index af17d9e9aff8910c9c927eb44b874b9268017dd4..f5f8682223b91a6226f32eaf4bdf7667ad99e7b6 100644 (file)
@@ -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'); 
index 49247eb23fff4634679cd22fc7b17858d7941172..1c4fc6300069aef5aa3cc18ca1810e91af1b8109 100644 (file)
--- a/boot.php
+++ b/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;
+}}
index 4c4c00b8a5e2065d3c88408157b526bcdff06402..fee7781c84240db21d26cd62837a82fb0b99a1ea 100644 (file)
Binary files a/images/icons.png and b/images/icons.png differ
index 18cb553286dfd7238e9d9ac3179d9679edf3f19f..3cc6079778812cc69564a6dc9f9e29b00390ebfe 100644 (file)
        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) {
                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);
                                });
                        }) ;
                }
                });
        }
 
+/** 
+ * 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;
+};
index b37863aa1eb5bc606b70ceabceb976e59673a329..238d87035dd72e490097d3ad7025d0ec89f82d46 100644 (file)
@@ -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'), "");
+        }
+
 
        /**
         *
index d8dfbaedb109dd0746a00e918ec7e47a75af1556..3f79ed5933925e731e724fdd1468fb5813107226 100644 (file)
@@ -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)) {
                /**
                 * 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){
                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) ."||";
                        $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;
                }
                        #$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;
index 534cb93f7cf4ee38148030f55fefac6aa42878cc..9bca1527bfc99f1926d89fdc1280475e0ad2b465 100644 (file)
--- a/index.php
+++ b/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.
diff --git a/mod/admin.php b/mod/admin.php
new file mode 100644 (file)
index 0000000..6f411bd
--- /dev/null
@@ -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),
+       ));
+}
+
index 9873f1094c743b0399098b26d7199b32b40bbca2..8e6a577d43234fdd621036d35fd7ce2e88e7165e 100644 (file)
@@ -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();
        }
 }
diff --git a/view/admin_aside.tpl b/view/admin_aside.tpl
new file mode 100644 (file)
index 0000000..ade0c47
--- /dev/null
@@ -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>
diff --git a/view/admin_logs.tpl b/view/admin_logs.tpl
new file mode 100644 (file)
index 0000000..f2939a7
--- /dev/null
@@ -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>
diff --git a/view/admin_plugins.tpl b/view/admin_plugins.tpl
new file mode 100644 (file)
index 0000000..ee0fa67
--- /dev/null
@@ -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>
diff --git a/view/admin_plugins_details.tpl b/view/admin_plugins_details.tpl
new file mode 100644 (file)
index 0000000..e2c611b
--- /dev/null
@@ -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>
diff --git a/view/admin_site.tpl b/view/admin_site.tpl
new file mode 100644 (file)
index 0000000..dba29f1
--- /dev/null
@@ -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>
diff --git a/view/admin_summary.tpl b/view/admin_summary.tpl
new file mode 100644 (file)
index 0000000..5942898
--- /dev/null
@@ -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>
diff --git a/view/admin_users.tpl b/view/admin_users.tpl
new file mode 100644 (file)
index 0000000..952a899
--- /dev/null
@@ -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>
+                                       <td class="tools">
+                                               <a href="$baseurl/regmod/allow/$u.hash" title='$approve'><span class='icon like'></span></a>
+                                               <a href="$baseurl/regmod/deny/$u.hash" title='$deny'><span class='icon dislike'></span></a>
+                                       </td>
+                               </tr>
+                       {{ endfor }}
+                               </tbody>
+                       </table>
+                       <div class='selectall'><a href='#' onclick="return selectall('pending_ckbx');">$select_all</a></div>
+                       <div class="submit"><input type="submit" name="page_users_deny" value="$deny"/> <input type="submit" name="page_users_approve" value="$approve" /></div>                        
+               {{ else }}
+                       <p>$no_pending</p>
+               {{ endif }}
+       
+       
+               
+       
+               <h3>$h_users</h3>
+               {{ if $users }}
+                       <table id='users'>
+                               <thead>
+                               <tr>
+                                       <th></th>
+                                       {{ for $th_users as $th }}<th>$th</th>{{ endfor }}
+                                       <th></th>
+                                       <th></th>
+                               </tr>
+                               </thead>
+                               <tbody>
+                               {{ for $users as $u }}
+                                       <tr>
+                                               <td><img src="$u.micro" alt="$u.nickname" title="$u.nickname"></td>
+                                               <td class='name'><a href="$u.url" title="$u.nickname" >$u.name</a></td>
+                                               <td class='email'>$u.email</td>
+                                               <td class='register_date'>$u.register_date</td>
+                                               <td class='login_date'>$u.login_date</td>
+                                               <td class='lastitem_date'>$u.lastitem_date</td>
+                                               <td class='login_date'>$u.page-flags</td>
+                                               <td class="checkbox"><input type="checkbox" class="users_ckbx" id="id_user_$u.uid" name="user_$u.uid"/></td>
+                                               <td class="tools">
+                                                       <a href="$baseurl/admin/users/block/$u.uid" title='{{ if $u.blocked }}$unblock{{ else }}$block{{ endif }}'><span class='icon block {{ if $u.blocked==0 }}dim{{ endif }}'></span></a>
+                                                       <a href="$baseurl/admin/users/delete/$u.uid" title='$discard' onclick="return confirm_delete('$u.name')"><span class='icon drop'></span></a>
+                                               </td>
+                                       </tr>
+                               {{ endfor }}
+                               </tbody>
+                       </table>
+                       <div class='selectall'><a href='#' onclick="return selectall('users_ckbx');">$select_all</a></div>
+                       <div class="submit"><input type="submit" name="page_users_block" value="$block/$unblock" /> <input type="submit" name="page_users_delete" value="$delete" onclick="return confirm_delete_multi()" /></div>                                              
+               {{ else }}
+                       NO USERS?!?
+               {{ endif }}
+       </form>
+</div>
diff --git a/view/field.tpl b/view/field.tpl
new file mode 100644 (file)
index 0000000..35f5afd
--- /dev/null
@@ -0,0 +1,4 @@
+
+ {{ if $field.0==select }}
+ {{ inc field_select.tpl }}{{ endinc }}
+ {{ endif }}
diff --git a/view/field_checkbox.tpl b/view/field_checkbox.tpl
new file mode 100644 (file)
index 0000000..4a86da7
--- /dev/null
@@ -0,0 +1,6 @@
+       
+       <div class='field checkbox'>
+               <label for='id_$field.0'>$field.1</label>
+               <input type="checkbox" name='$field.0' id='id_$field.0' {{ if $field.2 }}checked="true"{{ endif }}>
+               <span class='field_help'>$field.3</span>
+       </div>
diff --git a/view/field_input.tpl b/view/field_input.tpl
new file mode 100644 (file)
index 0000000..748d93f
--- /dev/null
@@ -0,0 +1,6 @@
+       
+       <div class='field input'>
+               <label for='id_$field.0'>$field.1</label>
+               <input name='$field.0' id='id_$field.0' value="$field.2">
+               <span class='field_help'>$field.3</span>
+       </div>
diff --git a/view/field_select.tpl b/view/field_select.tpl
new file mode 100644 (file)
index 0000000..d79eb48
--- /dev/null
@@ -0,0 +1,8 @@
+       
+       <div class='field select'>
+               <label for='id_$field.0'>$field.1</label>
+               <select name='$field.0' id='id_$field.0'>
+                       {{ for $field.4 as $opt=>$val }}<option value="$opt" {{ if $opt==$field.2 }}selected="selected"{{ endif }}>$val</option>{{ endfor }}
+               </select>
+               <span class='field_help'>$field.3</span>
+       </div>
diff --git a/view/field_textarea.tpl b/view/field_textarea.tpl
new file mode 100644 (file)
index 0000000..2425cdd
--- /dev/null
@@ -0,0 +1,6 @@
+       
+       <div class='field textarea'>
+               <label for='id_$field.0'>$field.1</label>
+               <textarea name='$field.0' id='id_$field.0'>$field.2</textarea>
+               <span class='field_help'>$field.3</span>
+       </div>
index 75459e23a0c145babbe6e115eebfc04599dc6e23..32092a3f19e61d1171d8023d2af69992a807ac61 100644 (file)
@@ -123,7 +123,7 @@ $a->strings["Administrator"] = "Amministratore";
 $a->strings["Friend/Connection Request"] = "Richieste di Amicizia/Connessione";
 $a->strings["Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"] = "Esempi: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca";
 $a->strings["Please answer the following:"] = "Rispondi al seguente:";
-$a->strings["Does \$name know you?"] = "$name ti conosce?";
+$a->strings["Does \$name know you?"] = "\$name ti conosce?";
 $a->strings["Yes"] = "Si";
 $a->strings["No"] = "No";
 $a->strings["Add a personal note:"] = "Aggiungi una nota personale:";
index 7e76811d9e0b96cafcb3e9671b74baa1d6b86e1e..79114749ad578bd9a7fa38e29bb8c7812face38a 100644 (file)
@@ -16,6 +16,8 @@ $langselector
 <a id="nav-search-link" class="nav-link $nav.search.2" href="$nav.search.0">$nav.search.1</a>
 <a id="nav-directory-link" class="nav-link $nav.directory.2" href="$nav.directory.0">$nav.directory.1</a>
 
+{{ if $nav.admin }}<a id="nav-admin-link" class="nav-link $nav.admin.2" href="$nav.admin.0">$nav.admin.1</a>{{ endif }}
+
 {{ if $nav.network }}
 <a id="nav-network-link" class="nav-commlink $nav.network.2" href="$nav.network.0">$nav.network.1</a>
 <span id="net-update" class="nav-ajax-left"></span>
index 3bf78346f1d30454acee138873116d6d97b2bd8c..2c3700c4364eb67f3d388cad564b2882ffe96c1b 100644 (file)
@@ -2530,7 +2530,88 @@ a.mail-list-link {
        filter:alpha(opacity=100);
 }
 
+/**
+ * ADMIN
+ */
+#pending-update {
+       float:right;
+       color: #ffffff;
+       font-weight: bold;
+       background-color: #FF0000;
+       padding: 0em 0.3em;
+       
+}
+#adminpage dl {
+       clear: left;
+       margin-bottom: 2px;
+       padding-bottom: 2px;
+       border-bottom: 1px solid black;
+}
+#adminpage dt {
+       width: 200px;
+       float: left;
+       font-weight: bold;
+}
+#adminpage dd {
+       margin-left: 200px;
+}
+
+#adminpage .field {
+       clear: left;
+       margin-bottom: 5px;
+       padding-bottom: 5px;
+}
+
+#adminpage .field label {
+       float: left;
+       width: 200px;
+       font-weight: bold;
+}
+
+#adminpage .field input,
+#adminpage .field textarea {
+       width: 400px;
+}
+#adminpage .field textarea { height: 100px; }
+#adminpage .field_help {
+       display: block;
+       margin-left: 200px;
+       color: #666666;
+       
+}
 
+#adminpage h3 {
+       border-bottom: 1px solid #cccccc;
+}
+
+#adminpage .submit {
+       clear:left;
+       text-align: right;
+}
+
+#adminpage #pluginslist {
+       margin: 0px; padding: 0px;
+}
+#adminpage .plugin {
+       list-style: none;
+       display: block;
+       border: 1px solid #888888;
+       padding: 1em;
+       margin-bottom: 5px;
+       clear: left;
+}
+#adminpage .plugin .desc { margin-left: 2.5em;}
+#adminpage .toggleplugin {
+       float:left;
+       margin-right: 1em;
+}
+
+#adminpage table {width:100%; border-bottom: 1p solid #000000; margin: 5px 0px;}
+#adminpage table th { text-align: left;}
+#adminpage td .icon { float: left;}
+#adminpage table#users img { width: 16px; height: 16px; }
+#adminpage table tr:hover { background-color: #bbc7d7; }
+#adminpage .selectall { text-align: right; }
 /**
  * ICONS
  */
@@ -2569,7 +2650,11 @@ a.mail-list-link {
 .language { background-position: -96px -32px; }
 .prev { background-position: -112px -32px; }
 .next { background-position: -128px -32px; }
+.on { background-position: -144px -32px; }
+
+.off { background-position: 0px -48px; }
 
+.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
 
 .attachtype {
        display: block; width: 20px; height: 23px;
index c07ef045a43b60a08d7ed4d1ba24035329eff271..9ab3bb6bccb914e1b626ce1ef84139e8b7825ba8 100644 (file)
@@ -2552,6 +2552,79 @@ a.mail-list-link {
        top: 0px;
 }
 
+/**
+ * ADMIN
+ */
+
+#adminpage dl {
+       clear: left;
+       margin-bottom: 2px;
+       padding-bottom: 2px;
+       border-bottom: 1px solid black;
+}
+#adminpage dt {
+       width: 200px;
+       float: left;
+       font-weight: bold;
+}
+#adminpage dd {
+       margin-left: 200px;
+}
+
+#adminpage .field {
+       clear: left;
+       margin-bottom: 5px;
+       padding-bottom: 5px;
+}
+
+#adminpage .field label {
+       float: left;
+       width: 200px;
+       font-weight: bold;
+}
+
+#adminpage .field input,
+#adminpage .field textarea {
+       width: 400px;
+}
+#adminpage .field textarea { height: 100px; }
+#adminpage .field_help {
+       display: block;
+       margin-left: 200px;
+       color: #666666;
+       
+}
+
+#adminpage h3 {
+       border-bottom: 1px solid #cccccc;
+}
+
+#adminpage .submit {
+       clear:left;
+}
+
+#adminpage #pluginslist {
+       margin: 0px; padding: 0px;
+}
+#adminpage .plugin {
+       list-style: none;
+       display: block;
+       border: 1px solid #888888;
+       padding: 1em;
+       margin-bottom: 5px;
+       clear: left;
+}
+#adminpage .plugin .toggle {
+       float:left;
+       margin-right: 1em;
+}
+
+#adminpage table {width:100%; border-bottom: 1p solid #000000; margin: 5px 0px;}
+#adminpage table th { text-align: left;}
+#adminpage td .icon { float: left;}
+#adminpage table#users img { width: 16px; height: 16px; }
+#adminpage table tr:hover { background-color: #bbc7d7; }
+#adminpage .selectall { text-align: right; }
 /**
  * ICONS
  */
@@ -2590,6 +2663,11 @@ a.mail-list-link {
 .language { background-position: -96px -32px; }
 .prev { background-position: -112px -32px; }
 .next { background-position: -128px -32px; }
+.on { background-position: -144px -32px; }
+
+.off { background-position: 0px -48px; }
+
+.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
 
 .attachtype {
        display: block; width: 20px; height: 23px;