summaryrefslogtreecommitdiffstats
path: root/common/admin
diff options
context:
space:
mode:
Diffstat (limited to 'common/admin')
-rwxr-xr-xcommon/admin/administration.php42
-rw-r--r--common/admin/changepassword.php10
-rwxr-xr-xcommon/admin/default.css232
-rw-r--r--common/admin/img/button-add.pngbin0 -> 244 bytes
-rw-r--r--common/admin/img/button-delete.pngbin0 -> 201 bytes
-rw-r--r--common/admin/img/button-h.pngbin0 -> 212 bytes
-rw-r--r--common/admin/img/button.pngbin0 -> 212 bytes
-rw-r--r--common/admin/img/h3.pngbin0 -> 212 bytes
-rw-r--r--common/admin/img/moonmoon.pngbin0 -> 564 bytes
-rw-r--r--common/admin/img/nav-admin.pngbin0 -> 1519 bytes
-rw-r--r--common/admin/img/nav-feed.pngbin0 -> 1090 bytes
-rw-r--r--common/admin/inc/auth.inc.php11
-rw-r--r--common/admin/inc/pwd.inc.php1
-rwxr-xr-xcommon/admin/index.php136
-rwxr-xr-xcommon/admin/login.php34
-rw-r--r--common/admin/logout.php5
-rw-r--r--common/admin/purgecache.php21
-rwxr-xr-xcommon/admin/subscriptions.php64
-rwxr-xr-xcommon/admin/template.php53
19 files changed, 609 insertions, 0 deletions
diff --git a/common/admin/administration.php b/common/admin/administration.php
new file mode 100755
index 0000000..1202e91
--- /dev/null
+++ b/common/admin/administration.php
@@ -0,0 +1,42 @@
+<?php
+
+require_once dirname(__FILE__) . '/inc/auth.inc.php';
+require_once dirname(__FILE__) . '/../app/app.php';
+
+$opml = OpmlManager::load(dirname(__FILE__) . '/../custom/people.opml');
+$opml_people = $opml->getPeople();
+$page_id = 'admin-admin';
+$header_extra = <<<"HTML"
+ <script>
+ window.onload = function(){
+ var formManage = document.getElementById('frmPurge');
+ formManage.onsubmit = function(){
+ return confirm("{$l10n->getString('Are you sure you want to purge the cache?')}");
+ }
+ }
+ </script>
+
+HTML;
+
+$page_content = <<<"FRAGMENT"
+
+ <div class="widget">
+ <h3>{$l10n->getString('Clear cache')}</h3>
+ <form action="purgecache.php" method="post" id="frmPurge">
+ <p><label>{$l10n->getString('Clear cache:')}</label><input type="submit" class="submit delete" name="purge" id="purge" value="{$l10n->getString('Clear')}" /></p>
+ <p class="help">{$l10n->getString('Clearing the cache will make moonmoon reload all feeds.')}</p>
+ </form>
+ </div>
+
+ <div class="widget">
+ <h3>{$l10n->getString('Change administrator password')}</h3>
+ <form action="changepassword.php" method="post" id="frmPassword">
+ <p><label for="password">{$l10n->getString('New password:')}</label> <input type="password" class="text" value="" name="password" id="password" size="20" /> <input type="submit" class="submit delete" name="changepwd" id="changepwd" value="{$l10n->getString('Change password')}" /></p>
+ </form>
+ </div>
+
+FRAGMENT;
+
+$footer_extra = '';
+$admin_access = 1;
+require_once dirname(__FILE__) . '/template.php';
diff --git a/common/admin/changepassword.php b/common/admin/changepassword.php
new file mode 100644
index 0000000..1fa505e
--- /dev/null
+++ b/common/admin/changepassword.php
@@ -0,0 +1,10 @@
+<?php
+require_once dirname(__FILE__).'/inc/auth.inc.php';
+
+if (isset($_POST['password']) && ('' != $_POST['password'])){
+ $out = '<?php $login="admin"; $password="'.md5($_POST['password']).'"; ?>';
+ file_put_contents(dirname(__FILE__).'/inc/pwd.inc.php', $out);
+ die("Password changed. <a href='administration.php'>Login</a>");
+} else {
+ die('Can not change password');
+}
diff --git a/common/admin/default.css b/common/admin/default.css
new file mode 100755
index 0000000..fcba3f4
--- /dev/null
+++ b/common/admin/default.css
@@ -0,0 +1,232 @@
+html, body{
+ margin: 0;
+ padding: 0;
+}
+html{
+ font-size: 62.5%;
+}
+body{
+ background: #FFF;
+ color: #333;
+ font: 1.1em/1.6em "Lucida Grande", Tahoma, Arial, sans-serif;
+}
+
+
+fieldset{
+ border: 0;
+ padding: 0;
+ margin: 1em 0;
+}
+input.text{
+ border: 1px solid #BBB;
+ padding: 4px;
+}
+input.submit{
+ font-size: 1em;
+ padding: 4px;
+ background: #D1D1D1 url(img/button.png) repeat-x left center;
+ border: 1px solid #FFF;
+ border-bottom: 1px solid #CECECE;
+ border-right: 1px solid #CECECE;
+ cursor: pointer;
+}
+input.submit:hover{
+ background: #D1D1D1 url(img/button-h.png) repeat-x left center;
+ color: #000;
+ border: 1px solid #FFF;
+ border-bottom: 1px solid #C6C6C6;
+ border-right: 1px solid #C6C6C6;
+}
+input.delete{
+ margin-left: 1em;
+}
+input.delete:hover{
+ background: #ffabab url(img/button-delete.png) repeat-x left center;
+ color: #C00;
+ border: 1px solid #FCC;
+ border-bottom: 1px solid #F99;
+ border-right: 1px solid #F99;
+}
+input.add{
+ font-weight: bold;
+}
+input.add:hover{
+ background: #65a5e1 url(img/button-add.png) repeat-x left center;
+ color: #20466a;
+ border: 1px solid #a6c7e5;
+ border-bottom: 1px solid #4f90cd;
+ border-right: 1px solid #4f90cd;
+}
+p.help{
+ font-size: 0.8em;
+ color: #999;
+ margin: 0;
+}
+
+#page{
+}
+
+ header{
+ background: #E0E0E0 url(img/moonmoon.png) no-repeat right center;
+ border-top: 5px solid #D0D0D0;
+ margin: 0;
+ padding: 10px;
+ }
+ header h1{
+ display: none;
+ margin: 0 0 0 20px;
+ padding: 0;
+ height: 14px;
+ width: 95px;
+ background: transparent url(img/moonmoon.png) no-repeat left center;
+
+ overflow: hidden;
+ text-indent: -1000em;
+ }
+ header p{
+ margin: 0 0 0 20px;
+ padding: 0;
+ }
+ header p a{
+ color: #AAA;
+ }
+ header p a:hover{
+ color: #111;
+ }
+
+
+ nav ul{
+ margin: 20px 30px;
+ padding: 0;
+ list-style: none;
+ }
+ nav ul:after {content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ nav ul {display: inline-table;}
+ /* Hides from IE-mac \*/
+ * html nav ul {height: 1%;}
+ nav ul {display: block;}
+ /* End hide from IE-mac */
+
+ nav ul li{
+ display: block;
+ float: left;
+ }
+ nav ul li a{
+ display: block;
+ border: 1px solid #DDD;
+ padding: 8px 8px 8px 36px;
+ margin-right: 8px;
+ text-decoration: none;
+ color: #666;
+ background-repeat: no-repeat;
+ background-position: 6px center;
+ }
+ nav ul li a:hover,
+ body#admin-feed #nav-feed a,
+ body#admin-admin #nav-admin a {
+ background-color: #f0f2f6;
+ border-color: #AAA;
+ color: #111;
+ }
+ #nav-feed a{
+ background-image: url(img/nav-feed.png);
+ }
+ #nav-admin a{
+ background-image: url(img/nav-admin.png);
+ }
+
+ #content{
+ margin: 20px 30px;
+ }
+
+ .widget{
+ margin: 20px 0;
+ }
+ .widget h3{
+ background: #3e4350 url(img/h3.png) repeat-x left center;
+ color: #FFF;
+ text-transform: uppercase;
+ margin: 0;
+ padding: 10px;
+ }
+ .widget form{
+ padding: 10px;
+ border: 1px solid #EEE;
+ border-top: 0;
+ }
+
+ #feedmanage p.select{
+ margin: 3px 0;
+ }
+ #feedmanage p.action span.count{
+ float: right;
+ padding-right: 10px;
+ font-size: 1.3em;
+ }
+ #feedmanage table{
+ width: 99%;
+ border-collapse: collapse;
+ border: 1px solid #f0f2f6;
+ }
+ #feedmanage thead th{
+ background: #f0f2f6;
+ text-align: left;
+ padding: 6px;
+ }
+ #feedmanage thead span{
+ display: none;
+ }
+ #feedmanage tr{
+ border-bottom: 1px solid #e8ebf1;
+ }
+ #feedmanage tr.even td{
+ background: #f0f2f6;
+ width: auto;
+ }
+ #feedmanage .text{
+ background: transparent;
+ border: 1px solid #FFF;
+ width: 90%;
+ }
+ #feedmanage tr.even td .text{
+ border: 1px solid #f0f2f6;
+ }
+ #feedmanage tr td input.text:focus{
+ background: #FFF;
+ border: 1px solid #4392b7;
+ }
+
+ #feedmanage tr.selected td{
+ background: #ffabab;
+ background: #4392b7;
+ color: #FFF;
+ }
+ #feedmanage tr.selected td .text{
+ color: #FFF;
+ border: 1px solid #4392b7;
+ }
+ #feedmanage tr td input.text:focus{
+ background: #FFF;
+ color: #000;
+ border: 1px solid #4392b7;
+ }
+
+/* Login form
+*******************************************************************************/
+form.login {
+ width: 400px;
+ margin: 0 auto;
+}
+form.login fieldset {
+ border: 1px solid #CCC;
+ text-align: center;
+}
+
+p.logout {
+ float: right;
+ margin: 20px 30px 0 0;
+}
+ p.logout a {
+ padding: 8px;
+ display: block;
+ }
diff --git a/common/admin/img/button-add.png b/common/admin/img/button-add.png
new file mode 100644
index 0000000..859364a
--- /dev/null
+++ b/common/admin/img/button-add.png
Binary files differ
diff --git a/common/admin/img/button-delete.png b/common/admin/img/button-delete.png
new file mode 100644
index 0000000..7bfebc2
--- /dev/null
+++ b/common/admin/img/button-delete.png
Binary files differ
diff --git a/common/admin/img/button-h.png b/common/admin/img/button-h.png
new file mode 100644
index 0000000..0a43a6a
--- /dev/null
+++ b/common/admin/img/button-h.png
Binary files differ
diff --git a/common/admin/img/button.png b/common/admin/img/button.png
new file mode 100644
index 0000000..fad6ccc
--- /dev/null
+++ b/common/admin/img/button.png
Binary files differ
diff --git a/common/admin/img/h3.png b/common/admin/img/h3.png
new file mode 100644
index 0000000..0c86748
--- /dev/null
+++ b/common/admin/img/h3.png
Binary files differ
diff --git a/common/admin/img/moonmoon.png b/common/admin/img/moonmoon.png
new file mode 100644
index 0000000..26cc8f4
--- /dev/null
+++ b/common/admin/img/moonmoon.png
Binary files differ
diff --git a/common/admin/img/nav-admin.png b/common/admin/img/nav-admin.png
new file mode 100644
index 0000000..3077a54
--- /dev/null
+++ b/common/admin/img/nav-admin.png
Binary files differ
diff --git a/common/admin/img/nav-feed.png b/common/admin/img/nav-feed.png
new file mode 100644
index 0000000..00c896b
--- /dev/null
+++ b/common/admin/img/nav-feed.png
Binary files differ
diff --git a/common/admin/inc/auth.inc.php b/common/admin/inc/auth.inc.php
new file mode 100644
index 0000000..d21467b
--- /dev/null
+++ b/common/admin/inc/auth.inc.php
@@ -0,0 +1,11 @@
+<?php
+include (dirname(__FILE__).'/pwd.inc.php');
+
+if ( isset($_COOKIE['auth']) && $_COOKIE['auth'] == $password ) {
+ //ok, cool
+} else {
+ setcookie('auth','', time()-3600);
+ header('Location: login.php');
+ die;
+}
+?> \ No newline at end of file
diff --git a/common/admin/inc/pwd.inc.php b/common/admin/inc/pwd.inc.php
new file mode 100644
index 0000000..10d9225
--- /dev/null
+++ b/common/admin/inc/pwd.inc.php
@@ -0,0 +1 @@
+<?php $login="admin"; $password=md5("admin"); ?> \ No newline at end of file
diff --git a/common/admin/index.php b/common/admin/index.php
new file mode 100755
index 0000000..28f7198
--- /dev/null
+++ b/common/admin/index.php
@@ -0,0 +1,136 @@
+<?php
+
+require_once dirname(__FILE__) . '/inc/auth.inc.php';
+require_once dirname(__FILE__) . '/../app/app.php';
+
+//Load configuration
+$config_file = dirname(__FILE__) . '/../custom/config.yml';
+
+if (is_file($config_file)){
+ $conf = Spyc::YAMLLoad($config_file);
+ $PlanetConfig = new PlanetConfig($conf);
+} else {
+ die('Config file (custom/config.yml) is missing.');
+}
+
+//Instantiate app
+$Planet = new Planet($PlanetConfig);
+
+//Load
+if (0 < $Planet->loadOpml(dirname(__FILE__) . '/../custom/people.opml')) {
+ $Planet->loadFeeds();
+ $items = $Planet->getItems();
+}
+
+$everyone = $Planet->getPeople();
+$count_feeds = count($everyone);
+$page_id = 'admin-feed';
+$footer_extra = <<<FRAGMENT
+ <script>
+ var allCheckboxes = function(status){
+ var form = document.getElementById('feedmanage');
+ var selectboxes = form.getElementsByTagName('input');
+ for (var i=0; i<selectboxes.length; i++){
+ if ('checkbox' == selectboxes[i].type){
+ selectboxes[i].checked = status;
+ }
+ }
+ }
+
+ window.onload = function(){
+ //Select/unselect rows
+ var form = document.getElementById('feedmanage');
+ var selectboxes = form.getElementsByTagName('input');
+ for (var i=0; i<selectboxes.length; i++){
+ if ('checkbox' == selectboxes[i].type) {
+ selectboxes[i].onchange = function() {
+ var tr = this.parentNode.parentNode;
+ if (this.checked) {
+ tr.className += ' selected';
+ } else {
+ tr.className = tr.className.replace('selected','');
+ }
+ }
+ }
+ }
+
+ var btSelectall = document.getElementById('selectall');
+ btSelectall.onclick = function(){
+ allCheckboxes('checked');
+ }
+
+ var btSelectnone = document.getElementById('selectnone');
+ btSelectnone.onclick = function(){
+ allCheckboxes('');
+ }
+ }
+ </script>
+FRAGMENT;
+
+ob_start();
+?>
+
+ <div class="widget">
+ <h3><?=_g('Add Feed')?></h3>
+ <form action="subscriptions.php" method="post" id="feedimport">
+ <fieldset>
+ <label for="url"><?=_g('Link:')?></label>
+ <input type="text" class="text" name="url" id="url" placeholder="http://" class="text" size="50" />
+ <input type="submit" class="submit add" name="add" value="<?=_g('Add Feed')?>" />
+ </fieldset>
+ <p class="help"><?=_g('Accepted formats are RSS and ATOM. If the link is not a feed, moonmoon will try to autodiscover the feed.')?></p>
+ </form>
+ </div>
+
+ <div class="widget">
+ <h3><?=_g('Manage existing feeds')?></h3>
+ <form action="subscriptions.php" method="post" id="feedmanage">
+ <p class="action">
+ <span class="count"><?php echo sprintf(_g('Number of feeds: %s'), $count_feeds)?></span>
+ <input type="submit" class="submit save" name="save" id="save" value="<?=_g('Save changes')?>" />
+ <input type="submit" class="submit delete" name="delete" id="delete" value="<?=_g('Delete selected Feeds')?>" />
+ </p>
+ <p class="select"><?=_g('Select :')?> <a href="javascript:void(0);" id="selectall"><?=_g('All')?></a>, <a href="javascript:void(0);" id="selectnone"><?=_g('None')?></a></p>
+ <table>
+ <thead>
+ <tr>
+ <th><span><?=_g('Selection')?></span></th>
+ <th><?=_g('Name')?></th>
+ <th><?=_g('Last entry')?></th>
+ <th><?=_g('Website link')?></th>
+ <th><?=_g('Feed link')?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ $i = 0;
+ foreach ($everyone as $opml_person){
+ $i++;
+ ?>
+ <tr class="<?=($i%2)?'odd':'even'; ?>">
+ <td><input type="checkbox" class="checkbox" name="opml[<?=$i; ?>][delete]" /></td>
+ <td><input type="text" size="10" class="text" name="opml[<?=$i; ?>][name]" value="<?=$opml_person->getName(); ?>" /></td>
+ <td>
+ <?php
+ $items = $opml_person->get_items();
+ if (count($items) > 0) {
+ echo $items[0]->get_date();
+ } else {
+ echo _g('Not in cache');
+ }
+ ?>
+ </td>
+ <td><input type="text" size="30" class="text" name="opml[<?=$i; ?>][website]" value="<?=$opml_person->getWebsite(); ?>" /></td>
+ <td><input type="text" size="30" class="text" name="opml[<?=$i; ?>][feed]" value="<?=$opml_person->getFeed(); ?>" /></td>
+ </tr>
+ <?php } ?>
+ </tbody>
+ </table>
+ </form>
+ </div>
+<?php
+$page_content = ob_get_contents();
+ob_end_clean();
+
+$admin_access = 1;
+require_once dirname(__FILE__) . '/template.php';
diff --git a/common/admin/login.php b/common/admin/login.php
new file mode 100755
index 0000000..796011f
--- /dev/null
+++ b/common/admin/login.php
@@ -0,0 +1,34 @@
+<?php
+if (isset($_POST['password'])) {
+ setcookie('auth',md5($_POST['password']));
+ header('Location: index.php');
+}
+
+require_once dirname(__FILE__) . '/../app/app.php';
+$page_content = <<<FRAGMENT
+ <form action="" method="post" class="login">
+ <fieldset>
+ <p class="field">
+ <label for="password">{$l10n->getString('Password:')}</label>
+ <input type="password" name="password" id="password"/>
+ <input type="submit" class="submit" value="{$l10n->getString('OK')}"/>
+ </p>
+ </fieldset>
+ </form>
+FRAGMENT;
+
+$footer_extra = <<<FRAGMENT
+ <script type="text/javascript">
+ <!--
+ window.onload = function() {
+ document.getElementById('password').focus();
+ }
+ -->
+ </script>
+
+FRAGMENT;
+
+$page_id = 'admin-login';
+$admin_access = 0;
+
+require_once dirname(__FILE__) . '/template.php';
diff --git a/common/admin/logout.php b/common/admin/logout.php
new file mode 100644
index 0000000..6dd32aa
--- /dev/null
+++ b/common/admin/logout.php
@@ -0,0 +1,5 @@
+<?php
+setcookie('auth','', time()-3600);
+header('Location: login.php');
+die;
+?> \ No newline at end of file
diff --git a/common/admin/purgecache.php b/common/admin/purgecache.php
new file mode 100644
index 0000000..a5af5cf
--- /dev/null
+++ b/common/admin/purgecache.php
@@ -0,0 +1,21 @@
+<?php
+require_once dirname(__FILE__).'/inc/auth.inc.php';
+
+if (isset($_POST['purge'])){
+ $dir = dirname(__FILE__).'/../cache/';
+
+ $dh = opendir($dir);
+
+ while ($filename = readdir($dh)) {
+ if ($filename == '.' OR $filename == '..') {
+ continue;
+ }
+
+ if (filemtime($dir . DIRECTORY_SEPARATOR . $filename) < time()) {
+ @unlink($dir . DIRECTORY_SEPARATOR . $filename);
+ }
+ }
+}
+
+header('Location: administration.php');
+die(); \ No newline at end of file
diff --git a/common/admin/subscriptions.php b/common/admin/subscriptions.php
new file mode 100755
index 0000000..ea2f113
--- /dev/null
+++ b/common/admin/subscriptions.php
@@ -0,0 +1,64 @@
+<?php
+require_once dirname(__FILE__) . '/inc/auth.inc.php';
+require_once dirname(__FILE__) . '/../app/app.php';
+
+function removeSlashes(&$item, $key){
+ $item = stripslashes($item);
+}
+
+if (isset($_POST['opml']) || isset($_POST['add'])) {
+
+ // Load config and old OPML
+ $conf = Spyc::YAMLLoad(dirname(__FILE__).'/../custom/config.yml');
+ $PlanetConfig = new PlanetConfig($conf);
+ if ($PlanetConfig->getName() === '') {
+ $PlanetConfig->setName($oldOpml->getTitle());
+ }
+ $oldOpml = OpmlManager::load(dirname(__FILE__).'/../custom/people.opml');
+ $newOpml = new opml();
+ $newOpml->title = $PlanetConfig->getName();
+
+ // Remove slashes if needed
+ if (get_magic_quotes_gpc() && isset($_POST['opml'])) {
+ array_walk_recursive($_POST['opml'], 'removeSlashes');
+ }
+ // Delete/Save feeds
+ if (isset($_POST['delete']) || isset($_POST['save'])){
+ foreach ($_POST['opml'] as $person){
+ if (isset($_POST['delete'])) {
+ //delete mode, check if to be deleted
+ if (!isset($person['delete'])){
+ $newOpml->entries[] = $person;
+ }
+ } else {
+ $newOpml->entries[] = $person;
+ }
+ }
+ }
+
+ // Add feed
+ if (isset($_POST['add'])){
+ if ('http://' != $_POST['url']) {
+ //autodiscover feed
+ $feed = new SimplePie();
+ $feed->enable_cache(false);
+ $feed->set_feed_url($_POST['url']);
+ $feed->init();
+ $feed->handle_content_type();
+ $person['name'] = $feed->get_title();
+ $person['website'] = $feed->get_permalink();
+ $person['feed'] = $feed->feed_url;
+
+ $oldOpml->entries[] = $person;
+ }
+ $newOpml->entries = $oldOpml->entries;
+ }
+
+ // Backup old OPML
+ OpmlManager::backup(dirname(__FILE__).'/../custom/people.opml');
+
+ // Save new OPML
+ OpmlManager::save($newOpml, dirname(__FILE__).'/../custom/people.opml');
+}
+header("Location: index.php");
+die();
diff --git a/common/admin/template.php b/common/admin/template.php
new file mode 100755
index 0000000..7818bef
--- /dev/null
+++ b/common/admin/template.php
@@ -0,0 +1,53 @@
+<?php if(!isset($admin_access)) return; ?>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>
+
+<?php
+ echo _g('Administration') . ' — ';
+ printf(_g('moonmoon %s', '%s is the version number for moonmoon, this string appears as the tab title in the admin panel'), $moon_version);
+?>
+ </title>
+ <link rel="stylesheet" media="screen" type="text/css" href="default.css">
+<!--[if lte IE 9]>
+<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
+<![endif]-->
+
+ <?=@$header_extra ?: ''; ?>
+
+</head>
+
+<body id="<?=@$page_id ?: ''; ?>">
+ <div id="page">
+ <header>
+ <h1>moonmoon</h1>
+ <p><a href="../"><?=_g('Back to main page')?></a></p>
+ </header>
+
+ <?php if($admin_access == 1) : ?>
+
+ <p class="logout"><a href="logout.php"><?=_g('Logout')?></a></p>
+ <nav>
+ <ul>
+ <li id="nav-feed"><a href="index.php"><?=_g('Feeds')?></a></li>
+ <li id="nav-admin"><a href="administration.php"><?=_g('Administration')?></a></li>
+ </ul>
+ </nav>
+
+ <?php endif; ?>
+
+
+
+ <div id="content">
+
+ <?=@$page_content ?: ''; ?>
+
+ </div>
+ </div>
+
+<?=@$footer_extra ?: ''; ?>
+
+</body>
+</html>