aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md16
-rw-r--r--cache/.gitignore1
-rw-r--r--cache/.htaccess3
-rw-r--r--data/config.default.php12
-rw-r--r--data/config.php.dist6
-rw-r--r--data/tables.sql7
-rw-r--r--data/templates/default/dynamictags.inc.php2
-rw-r--r--data/templates/default/sidebar.block.popular.php2
-rw-r--r--data/templates/default/sidebar.block.recent.php2
-rw-r--r--data/templates/default/tags.tpl.php2
-rw-r--r--doc/INSTALL.txt2
-rw-r--r--res/docs/header.tpl.html8
-rw-r--r--res/docs/style.css28
-rwxr-xr-xscripts/bookmark-bot.php125
-rw-r--r--src/SemanticScuttle/Service/Bookmark.php6
-rw-r--r--src/SemanticScuttle/Service/Bookmark2Tag.php10
-rw-r--r--src/SemanticScuttle/UrlHelper.php65
-rw-r--r--src/SemanticScuttle/header.php1
-rw-r--r--www/.htaccess2
-rw-r--r--www/ajaxGetTitle.php50
20 files changed, 247 insertions, 103 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8d5f588
--- /dev/null
+++ b/README.md
@@ -0,0 +1,16 @@
+# SemanticScuttle
+
+SemanticScuttle is a social bookmarking tool experimenting with new features like structured tags and collaborative descriptions of tags. Originally a fork of Scuttle, it has overtaken its ancestor in stability, features and usability.
+
+## Features
+ * LDAP/Active Directory authentication
+ * RSS feed support: global feed, user feeds, per-tag feeds, private feeds
+ * Public and private bookmarks
+ * Delicious and Browser bookmark import
+ * Theming support
+ * Firefox plugin
+
+## Origin
+
+ * https://sourceforge.net/projects/semanticscuttle/
+ * https://github.com/cweiske/SemanticScuttle
diff --git a/cache/.gitignore b/cache/.gitignore
new file mode 100644
index 0000000..f05fcdc
--- /dev/null
+++ b/cache/.gitignore
@@ -0,0 +1 @@
+*.cache \ No newline at end of file
diff --git a/cache/.htaccess b/cache/.htaccess
index baa56e5..b66e808 100644
--- a/cache/.htaccess
+++ b/cache/.htaccess
@@ -1,2 +1 @@
-order allow,deny
-deny from all \ No newline at end of file
+Require all denied
diff --git a/data/config.default.php b/data/config.default.php
index 95df176..73b098b 100644
--- a/data/config.default.php
+++ b/data/config.default.php
@@ -115,7 +115,7 @@ $usecache = false;
*
* @var string
*/
-$dir_cache = dirname(__FILE__) . '/cache/';
+$dir_cache = dirname(__DIR__, 1) . '/cache';
/**
* Use clean urls without .php filenames.
@@ -149,14 +149,14 @@ $debugMode = false;
*
* @var string
*/
-$dbtype = 'mysql4';
+$dbtype = 'mysqli';
/**
* Database hostname/IP
*
* @var string
*/
-$dbhost = '127.0.0.1';
+$dbhost = 'localhost';
/**
* Database port.
@@ -796,4 +796,10 @@ $allowUnittestMode = false;
*/
$cacheUrl = null;
+/**
+ * bookmark-bot email address mapping
+ * Input address as key, user email as target
+ */
+$botMailMap = array();
+
?>
diff --git a/data/config.php.dist b/data/config.php.dist
index 5f49857..61eb7af 100644
--- a/data/config.php.dist
+++ b/data/config.php.dist
@@ -46,7 +46,7 @@ $cleanurls = false;
*
* @var boolean
*/
-$debugMode = true;
+$debugMode = false;
/***************************************************
@@ -62,7 +62,7 @@ $debugMode = true;
*
* @var string
*/
-$dbtype = 'mysql4';
+$dbtype = 'mysqli';
/**
* Database username
*
@@ -89,7 +89,7 @@ $dbname = 'scuttle';
*
* @var string
*/
-$dbhost = '127.0.0.1';
+$dbhost = 'localhost';
/***************************************************
diff --git a/data/tables.sql b/data/tables.sql
index 68d5ba9..de1bb8d 100644
--- a/data/tables.sql
+++ b/data/tables.sql
@@ -5,6 +5,9 @@
-- Table structure for table `sc_bookmarks`
--
+# to avoid STRICT_TRANS_TABLES mode
+SET sql_mode = '';
+
CREATE TABLE `sc_bookmarks` (
`bId` int(11) NOT NULL auto_increment,
`uId` int(11) NOT NULL default '0',
@@ -17,8 +20,8 @@ CREATE TABLE `sc_bookmarks` (
`bDescription` text default NULL,
`bPrivateNote` text default NULL,
`bHash` varchar(32) NOT NULL default '',
- `bVotes` int(11) NOT NULL,
- `bVoting` int(11) NOT NULL,
+ `bVotes` int(11) NOT NULL default '0',
+ `bVoting` int(11) NOT NULL default '0',
`bShort` varchar(16) default NULL,
PRIMARY KEY (`bId`),
KEY `sc_bookmarks_usd` (`uId`,`bStatus`,`bDatetime`),
diff --git a/data/templates/default/dynamictags.inc.php b/data/templates/default/dynamictags.inc.php
index c2ab6d4..f731048 100644
--- a/data/templates/default/dynamictags.inc.php
+++ b/data/templates/default/dynamictags.inc.php
@@ -53,7 +53,7 @@ JS;
$taglist = '';
foreach (array_keys($tagsCloud) as $key) {
$row = $tagsCloud[$key];
- $entries = T_ngettext('bookmark', 'bookmarks', $row['bCount']);
+ $entries = T_ngettext('bookmark', 'bookmarks', (int)$row['bCount']);
$taglist .= '<span'
. ' title="'. $row['bCount'] . ' ' . $entries . '"'
. ' style="font-size:' . $row['size'] . '"'
diff --git a/data/templates/default/sidebar.block.popular.php b/data/templates/default/sidebar.block.popular.php
index 842aa60..83ad2fb 100644
--- a/data/templates/default/sidebar.block.popular.php
+++ b/data/templates/default/sidebar.block.popular.php
@@ -31,7 +31,7 @@ if ($popularTags && count($popularTags) > 0) {
}
foreach ($popularTags as $row) {
- $entries = T_ngettext('bookmark', 'bookmarks', $row['bCount']);
+ $entries = T_ngettext('bookmark', 'bookmarks', (int)$row['bCount']);
$contents .= '<a href="'. sprintf($cat_url, $user, filter($row['tag'], 'url')) .'" title="'. $row['bCount'] .' '. $entries .'" rel="tag" style="font-size:'. $row['size'] .'">'. filter($row['tag']) .'</a> ';
}
echo $contents ."\n";
diff --git a/data/templates/default/sidebar.block.recent.php b/data/templates/default/sidebar.block.recent.php
index 80ae71c..1deae27 100644
--- a/data/templates/default/sidebar.block.recent.php
+++ b/data/templates/default/sidebar.block.recent.php
@@ -26,7 +26,7 @@ if ($recentTags && count($recentTags) > 0) {
}
foreach ($recentTags as $row) {
- $entries = T_ngettext('bookmark', 'bookmarks', $row['bCount']);
+ $entries = T_ngettext('bookmark', 'bookmarks', (int)$row['bCount']);
$contents .= '<a href="'. sprintf($cat_url, $user, filter($row['tag'], 'url')) .'" title="'. $row['bCount'] .' '. $entries .'" rel="tag" style="font-size:'. $row['size'] .'">'. filter($row['tag']) .'</a> ';
}
echo $contents ."</p>\n";
diff --git a/data/templates/default/tags.tpl.php b/data/templates/default/tags.tpl.php
index d6259cc..dce5e1c 100644
--- a/data/templates/default/tags.tpl.php
+++ b/data/templates/default/tags.tpl.php
@@ -16,7 +16,7 @@ if ($tags && count($tags) > 0) {
<?php
$contents = '';
foreach ($tags as $row) {
- $entries = T_ngettext('bookmark', 'bookmarks', $row['bCount']);
+ $entries = T_ngettext('bookmark', 'bookmarks', (int)$row['bCount']);
$contents .= '<a href="'. sprintf($cat_url, $user, filter($row['tag'], 'url')) .'" title="'. $row['bCount'] .' '. $entries .'" rel="tag" style="font-size:'. $row['size'] .'">'. filter($row['tag']) .'</a> ';
}
echo $contents ."\n";
diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt
index c911740..4aadd16 100644
--- a/doc/INSTALL.txt
+++ b/doc/INSTALL.txt
@@ -29,6 +29,8 @@ then this instructions are for you.
$ psql mydatabasename myusername < data/tables-postgresql.sql
+ You can also use a web interface like phpMyAdmin to import the file.
+
3. Copy ``data/config.php.dist`` to ``data/config.php`` and modify it as
necessary. See configuration_ for more information.
4. Make the cache directory writable by your web server.
diff --git a/res/docs/header.tpl.html b/res/docs/header.tpl.html
deleted file mode 100644
index ee0650f..0000000
--- a/res/docs/header.tpl.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<ul class="menu">
- <li><a href="index.html">Index</a></li>
- <li><a href="INSTALL.html">Installation</a></li>
- <li><a href="UPGRADE.html">Upgrade</a></li>
- <li><a href="ChangeLog.html">ChangeLog</a></li>
- <li><a href="http://semanticscuttle.sourceforget.net/">Homepage</a></li>
- <li><a href="https://sourceforget.net/projects/semanticscuttle">Project page</a></li>
-</ul>
diff --git a/res/docs/style.css b/res/docs/style.css
deleted file mode 100644
index 90a3fbc..0000000
--- a/res/docs/style.css
+++ /dev/null
@@ -1,28 +0,0 @@
-/* SemanticScuttle improvements */
-.document {
- max-width: 100ex;
-}
-h1.title {
- background-image: url("data:image/png;base64,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");
- background-repeat: no-repeat;
- padding-left: 64px;
- padding-top: 0.2em;
- margin-bottom: 00px;
- height: 60px;
- border-bottom: 3px solid #666;
-}
-h2 {
- margin-top: 1.5em;
-
-}
-pre {
- padding: 1em;
- background-color: #EEE;
- border: 1px solid #BBB;
- width: auto;
-}
-
-tt, code {
- background-color: #DDD;
- padding: 0.2ex;
-}
diff --git a/scripts/bookmark-bot.php b/scripts/bookmark-bot.php
new file mode 100755
index 0000000..126f39c
--- /dev/null
+++ b/scripts/bookmark-bot.php
@@ -0,0 +1,125 @@
+#!/usr/bin/env php
+<?php
+/**
+ * CLI tool to add bookmarks to SemanticScuttle.
+ * Intended as end point for a chat bot, e.g. "errbot-exec".
+ *
+ * Parameters:
+ * 1. Message with bookmark url and tags
+ * 2. E-Mail address of user
+ *
+ * You may map chat users to semanticscuttle email addresses
+ * with the $botMailMap config variable
+ *
+ * @author Christian Weiske <cweiske@cweiske.de>
+ * @link https://github.com/cweiske/errbot-exec
+ */
+require_once dirname(__FILE__) . '/../src/SemanticScuttle/header-standalone.php';
+
+if ($argc < 3) {
+ err('No message and user', 1);
+}
+$msg = $argv[1];
+$email = $argv[2];
+
+if (preg_match('#(.+@.+)/.*#', $email, $matches)) {
+ //xmpp user name with resource: user@example.org/client
+ $email = $matches[1];
+}
+if (isset($botMailMap[$email])) {
+ $email = $botMailMap[$email];
+}
+
+function err($msg, $code)
+{
+ echo $msg . "\n";
+ exit($code);
+}
+
+function getUserId($email)
+{
+ $users = SemanticScuttle_Service_Factory::get('User');
+ if (!$users->isValidEmail($email)) {
+ err('Invalid e-mail address: ' . $email, 2);
+ }
+ $db = SemanticScuttle_Service_Factory::getDb();
+ $res = $db->sql_query(
+ 'SELECT uId FROM '. $users->getTableName()
+ . ' WHERE email = "' . $db->sql_escape($email) . '"'
+ );
+ $row = $db->sql_fetchrow($res);
+ if (!is_array($row)) {
+ err('User not found: ' . $email, 3);
+ }
+ return intval($row['uId']);
+}
+
+function splitMsg($msg)
+{
+ $bmUrl = $msg;
+ $rest = '';
+ if (strpos($msg, ' ') !== false) {
+ list($bmUrl, $rest) = explode(' ', $msg, 2);
+ }
+ $parts = parse_url($bmUrl);
+ if (!isset($parts['scheme'])) {
+ err('Scheme missing in URL', 2);
+ }
+ if (!SemanticScuttle_Model_Bookmark::isValidUrl($bmUrl)) {
+ err('Invalid bookmark URL', 2);
+ }
+
+ $bmTags = array();
+ $bmDesc = '';
+ $rest = trim($rest);
+ if (strlen($rest) && $rest{0} == '#') {
+ //tags begin with '#'
+ preg_match_all('/#([a-zA-Z0-9]+)/', $rest, $matches);
+ $bmTags = $matches[1];
+ foreach ($matches[0] as $tag) {
+ if (substr($rest, 0, strlen($tag)) == $tag) {
+ $rest = trim(substr($rest, strlen($tag)));
+ }
+ }
+ $bmDesc = $rest;
+ } else {
+ //use rest as tags
+ $bmTags = explode(' ', $rest);
+ $bmTags = array_map('trim', $bmTags);
+ }
+
+ return array($bmUrl, $bmTags, $bmDesc);
+}
+
+$userId = getUserId($email);
+list($bmUrl, $bmTags, $bmDesc) = splitMsg($msg);
+
+$bookmarks = SemanticScuttle_Service_Factory::get('Bookmark');
+if ($bookmarks->bookmarkExists($bmUrl)) {
+ echo "URL already bookmarked.\n";
+ exit(0);
+}
+
+$urlhelper = new SemanticScuttle_UrlHelper();
+$bmTitle = $urlhelper->getTitle($bmUrl);
+
+$id = $bookmarks->addBookmark(
+ $bmUrl,
+ $bmTitle,
+ $bmDesc,
+ null,
+ SemanticScuttle_Model_Bookmark::SPUBLIC,
+ $bmTags,
+ null,
+ null,
+ true,
+ false,
+ $userId
+);
+if ($id === false) {
+ err('Error adding bookmark', 10);
+} else {
+ echo "Bookmark created.\n";
+ exit(0);
+}
+?>
diff --git a/src/SemanticScuttle/Service/Bookmark.php b/src/SemanticScuttle/Service/Bookmark.php
index 1315350..39ec4f0 100644
--- a/src/SemanticScuttle/Service/Bookmark.php
+++ b/src/SemanticScuttle/Service/Bookmark.php
@@ -734,7 +734,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
$tags = explode('+', trim($tags));
}
- $tagcount = count($tags);
+ $tagcount = empty($tags) ? 0 : count($tags);
for ($i = 0; $i < $tagcount; $i ++) {
$tags[$i] = trim($tags[$i]);
}
@@ -853,7 +853,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
$aTerms = array_map('trim', $aTerms);
// Search terms in tags as well when none given
- if (!count($tags)) {
+ if (!empty($tags)) {
$query_2 .= ' LEFT JOIN '. $b2tservice->getTableName() .' AS T'
. ' ON B.bId = T.bId';
$dotags = true;
@@ -1136,7 +1136,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
// Delete final /
if (substr($address, -1) == '/') {
- $address = substr($address, 0, count($address)-2);
+ $address = substr($address, 0, strlen($address)-2);
}
return $address;
diff --git a/src/SemanticScuttle/Service/Bookmark2Tag.php b/src/SemanticScuttle/Service/Bookmark2Tag.php
index a01b5d7..2579022 100644
--- a/src/SemanticScuttle/Service/Bookmark2Tag.php
+++ b/src/SemanticScuttle/Service/Bookmark2Tag.php
@@ -691,14 +691,12 @@ class SemanticScuttle_Service_Bookmark2Tag extends SemanticScuttle_DbService
}
if ($sortOrder == 'alphabet_asc') {
- usort($output, create_function('$a,$b','return strcasecmp(utf8_deaccent($a["tag"]), utf8_deaccent($b["tag"]));'));
+ usort($output, "cmp");
}
return $output;
}
-
-
/**
* Deletes all tags in bookmarks2tags
*
@@ -711,4 +709,10 @@ class SemanticScuttle_Service_Bookmark2Tag extends SemanticScuttle_DbService
}
}
+
+function cmp($a,$b)
+{
+ return strcasecmp(utf8_deaccent($a["tag"]), utf8_deaccent($b["tag"]));
+}
+
?>
diff --git a/src/SemanticScuttle/UrlHelper.php b/src/SemanticScuttle/UrlHelper.php
new file mode 100644
index 0000000..5417b9b
--- /dev/null
+++ b/src/SemanticScuttle/UrlHelper.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * SemanticScuttle - your social bookmark manager.
+ *
+ * PHP version 5.
+ *
+ * @category Bookmarking
+ * @package SemanticScuttle
+ * @author Christian Weiske <cweiske@cweiske.de>
+ * @license GPL http://www.gnu.org/licenses/gpl.html
+ * @link http://sourceforge.net/projects/semanticscuttle
+ */
+
+/**
+ * Work with URLs
+ *
+ * @category Bookmarking
+ * @package SemanticScuttle
+ * @author Christian Weiske <cweiske@cweiske.de>
+ * @license GPL http://www.gnu.org/licenses/gpl.html
+ * @link http://sourceforge.net/projects/semanticscuttle
+ */
+class SemanticScuttle_UrlHelper
+{
+ function getTitle($url)
+ {
+ $fd = @fopen($url, 'r');
+ $title = '';
+ if ($fd) {
+ $html = fread($fd, 1750);
+ fclose($fd);
+
+ // Get title from title tag
+ preg_match_all('/<title[^>]*>(.*)<\/title>/si', $html, $matches);
+ $title = $matches[1][0];
+
+ $encoding = 'utf-8';
+ // Get encoding from charset attribute
+ preg_match_all('/<meta.*charset=([^;"]*)">/i', $html, $matches);
+ if (isset($matches[1][0])) {
+ $encoding = strtoupper($matches[1][0]);
+ }
+
+ // Convert to UTF-8 from the original encoding
+ if (function_exists("mb_convert_encoding")) {
+ $title = @mb_convert_encoding($title, 'UTF-8', $encoding);
+ }
+
+ $title = trim($title);
+ }
+
+ if (utf8_strlen($title) > 0) {
+ $title = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
+ return $title;
+ } else {
+ // No title, so return filename
+ $uriparts = explode('/', $url);
+ $filename = end($uriparts);
+ unset($uriparts);
+
+ return $filename;
+ }
+ }
+}
+?>
diff --git a/src/SemanticScuttle/header.php b/src/SemanticScuttle/header.php
index 1f2f12c..562ae43 100644
--- a/src/SemanticScuttle/header.php
+++ b/src/SemanticScuttle/header.php
@@ -105,6 +105,7 @@ require_once 'SemanticScuttle/functions.php';
require_once 'SemanticScuttle/Model/Bookmark.php';
require_once 'SemanticScuttle/Model/UserArray.php';
require_once 'SemanticScuttle/Model/User/SslClientCert.php';
+require_once 'SemanticScuttle/UrlHelper.php';
if (count($GLOBALS['serviceoverrides']) > 0
&& !defined('UNIT_TEST_MODE')
diff --git a/www/.htaccess b/www/.htaccess
index 5799444..381c0fe 100644
--- a/www/.htaccess
+++ b/www/.htaccess
@@ -10,7 +10,7 @@ Options -MultiViews +FollowSymLinks
# Rewrite clean URLs onto real files
<IfModule mod_rewrite.c>
-Options +FollowSymlinks
+Options -MultiViews +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^/.]+)/?(.*)$ /$1.php/$2 [QSA,L]
diff --git a/www/ajaxGetTitle.php b/www/ajaxGetTitle.php
index e1fbe30..b95e29b 100644
--- a/www/ajaxGetTitle.php
+++ b/www/ajaxGetTitle.php
@@ -27,53 +27,11 @@ require_once 'www-header.php';
/* Managing all possible inputs */
isset($_GET['url']) ? define('GET_URL', $_GET['url']): define('GET_URL', '');
+$urlhelper = new SemanticScuttle_UrlHelper();
-function getTitle($url) {
- $fd = @fopen($url, 'r');
- if ($fd) {
- $html = fread($fd, 1750);
- fclose($fd);
-
- // Get title from title tag
- preg_match_all('/<title>(.*)<\/title>/si', $html, $matches);
- $title = $matches[1][0];
-
- $encoding = 'utf-8';
- // Get encoding from charset attribute
- preg_match_all('/<meta.*charset=([^;"]*)">/i', $html, $matches);
- if (isset($matches[1][0])) {
- $encoding = strtoupper($matches[1][0]);
- }
-
- // Convert to UTF-8 from the original encoding
- if (function_exists("mb_convert_encoding")) {
- $title = @mb_convert_encoding($title, 'UTF-8', $encoding);
- }
-
- $title = trim($title);
-
- if (utf8_strlen($title) > 0) {
- $title = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
- return $title;
- } else {
- // No title, so return filename
- $uriparts = explode('/', $url);
- $filename = end($uriparts);
- unset($uriparts);
-
- return $filename;
- }
- } else {
- return false;
- }
-}
-echo '<?xml version="1.0" encoding="utf-8"?>';
+echo '<?xml version="1.0" encoding="utf-8"?>' . "\n";
?>
<response>
-<method>
-getTitle
-</method>
-<result>
-<?php echo getTitle(GET_URL); ?>
-</result>
+ <method>getTitle</method>
+ <result><?php echo htmlspecialchars($urlhelper->getTitle(GET_URL)); ?></result>
</response>