This commit is contained in:
mensonge 2008-10-22 14:05:59 +00:00
parent c35ab1bf2b
commit a62b9742ee
5 changed files with 549 additions and 544 deletions

View file

@ -1,22 +1,22 @@
<?php <?php
/*************************************************************************** /***************************************************************************
Copyright (C) 2004, 2005 Scuttle project Copyright (C) 2004, 2005 Scuttle project
http://sourceforge.net/projects/scuttle/ http://sourceforge.net/projects/scuttle/
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/ ***************************************************************************/
require_once('header.inc.php'); require_once('header.inc.php');
$templateservice =& ServiceFactory::getServiceInstance('TemplateService'); $templateservice =& ServiceFactory::getServiceInstance('TemplateService');

View file

@ -1,23 +1,23 @@
<?php <?php
/*************************************************************************** /***************************************************************************
Copyright (C) 2005 - 2006 Scuttle project Copyright (C) 2005 - 2006 Scuttle project
http://sourceforge.net/projects/scuttle/ http://sourceforge.net/projects/scuttle/
http://scuttle.org/ http://scuttle.org/
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/ ***************************************************************************/
header('Content-Type: text/xml; charset=UTF-8'); header('Content-Type: text/xml; charset=UTF-8');
header("Last-Modified: ". gmdate("D, d M Y H:i:s") ." GMT"); header("Last-Modified: ". gmdate("D, d M Y H:i:s") ." GMT");
@ -26,41 +26,45 @@ header("Cache-Control: no-cache, must-revalidate");
require_once('header.inc.php'); require_once('header.inc.php');
function getTitle($url) { function getTitle($url) {
$fd = @fopen($url, 'r'); $fd = @fopen($url, 'r');
if ($fd) { if ($fd) {
$html = fread($fd, 1750); $html = fread($fd, 1750);
fclose($fd); fclose($fd);
// Get title from title tag // Get title from title tag
preg_match_all('/<title>(.*)<\/title>/si', $html, $matches); preg_match_all('/<title>(.*)<\/title>/si', $html, $matches);
$title = $matches[1][0]; $title = $matches[1][0];
// Get encoding from charset attribute // Get encoding from charset attribute
preg_match_all('/<meta.*charset=([^;"]*)">/i', $html, $matches); preg_match_all('/<meta.*charset=([^;"]*)">/i', $html, $matches);
$encoding = strtoupper($matches[1][0]); $encoding = strtoupper($matches[1][0]);
// Convert to UTF-8 from the original encoding // Convert to UTF-8 from the original encoding
if (function_exists('mb_convert_encoding') { if (function_exists("mb_convert_encoding") {
$title = @mb_convert_encoding($title, 'UTF-8', $encoding); $title = @mb_convert_encoding($title, 'UTF-8', $encoding);
} }
if (utf8_strlen($title) > 0) { if (utf8_strlen($title) > 0) {
return $title; return $title;
} else { } else {
// No title, so return filename // No title, so return filename
$uriparts = explode('/', $url); $uriparts = explode('/', $url);
$filename = end($uriparts); $filename = end($uriparts);
unset($uriparts); unset($uriparts);
return $filename; return $filename;
} }
} else { } else {
return false; return false;
} }
} }
echo '<?xml version="1.0" encoding="utf-8"?>'; echo '<?xml version="1.0" encoding="utf-8"?>';
?> ?>
<response> <response>
<method>getTitle</method> <method>
<result><?php echo getTitle($_GET['url']); ?></result> getTitle
</response> </method>
<result>
<?php echo getTitle($_GET['url']); ?>
</result>
</response>

View file

@ -1,23 +1,23 @@
<?php <?php
/*************************************************************************** /***************************************************************************
Copyright (C) 2004 - 2006 Scuttle project Copyright (C) 2004 - 2006 Scuttle project
http://sourceforge.net/projects/scuttle/ http://sourceforge.net/projects/scuttle/
http://scuttle.org/ http://scuttle.org/
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/ ***************************************************************************/
require_once('header.inc.php'); require_once('header.inc.php');
$bookmarkservice =& ServiceFactory::getServiceInstance('BookmarkService'); $bookmarkservice =& ServiceFactory::getServiceInstance('BookmarkService');
@ -27,38 +27,38 @@ $cacheservice =& ServiceFactory::getServiceInstance('CacheService');
$tplvars = array(); $tplvars = array();
if (isset($_GET['action'])){ if (isset($_GET['action'])){
if ($_GET['action'] == "logout") { if ($_GET['action'] == "logout") {
$userservice->logout(); $userservice->logout();
$tplvars['msg'] = T_('You have now logged out'); $tplvars['msg'] = T_('You have now logged out');
} }
} }
// Header variables // Header variables
$tplVars['loadjs'] = true; $tplVars['loadjs'] = true;
$tplVars['rsschannels'] = array( $tplVars['rsschannels'] = array(
array(sprintf(T_('%s: Recent bookmarks'), $sitename), createURL('rss').'?sort='.getSortOrder()) array(sprintf(T_('%s: Recent bookmarks'), $sitename), createURL('rss').'?sort='.getSortOrder())
); );
if ($usecache) { if ($usecache) {
// Generate hash for caching on // Generate hash for caching on
$hashtext = $_SERVER['REQUEST_URI']; $hashtext = $_SERVER['REQUEST_URI'];
if ($userservice->isLoggedOn()) { if ($userservice->isLoggedOn()) {
$hashtext .= $userservice->getCurrentUserID(); $hashtext .= $userservice->getCurrentUserID();
} }
$hash = md5($hashtext); $hash = md5($hashtext);
// Cache for 15 minutes // Cache for 15 minutes
$cacheservice->Start($hash, 900); $cacheservice->Start($hash, 900);
} }
// Pagination // Pagination
$perpage = getPerPageCount(); $perpage = getPerPageCount();
if (isset($_GET['page']) && intval($_GET['page']) > 1) { if (isset($_GET['page']) && intval($_GET['page']) > 1) {
$page = $_GET['page']; $page = $_GET['page'];
$start = ($page - 1) * $perpage; $start = ($page - 1) * $perpage;
} else { } else {
$page = 0; $page = 0;
$start = 0; $start = 0;
} }
$dtend = date('Y-m-d H:i:s', strtotime('tomorrow')); $dtend = date('Y-m-d H:i:s', strtotime('tomorrow'));
@ -84,7 +84,7 @@ $tplVars['pageName'] = PAGE_INDEX;
$templateservice->loadTemplate('bookmarks.tpl', $tplVars); $templateservice->loadTemplate('bookmarks.tpl', $tplVars);
if ($usecache) { if ($usecache) {
// Cache output if existing copy has expired // Cache output if existing copy has expired
$cacheservice->End($hash); $cacheservice->End($hash);
} }
?> ?>

View file

@ -1,468 +1,469 @@
<?php <?php
class BookmarkService { class BookmarkService {
var $db; var $db;
var $tablename; var $tablename;
function & getInstance(& $db) { function & getInstance(& $db) {
static $instance; static $instance;
if (!isset ($instance)) if (!isset ($instance))
$instance = & new BookmarkService($db); $instance = & new BookmarkService($db);
return $instance; return $instance;
}
function BookmarkService(& $db) {
$this->db = & $db;
$this->tablename = $GLOBALS['tableprefix'] .'bookmarks';
}
function _getbookmark($fieldname, $value, $all = false) {
if (!$all) {
$userservice = & ServiceFactory :: getServiceInstance('UserService');
$sId = $userservice->getCurrentUserId();
$range = ' AND uId = '. $sId;
}
$query = 'SELECT * FROM '. $this->getTableName() .' WHERE '. $fieldname .' = "'. $this->db->sql_escape($value) .'"'. $range;
if (!($dbresult = & $this->db->sql_query_limit($query, 1, 0))) {
message_die(GENERAL_ERROR, 'Could not get bookmark', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
if ($row =& $this->db->sql_fetchrow($dbresult)) {
return $row;
} else {
return false;
}
}
function & getBookmark($bid, $include_tags = false) {
if (!is_numeric($bid))
return;
$sql = 'SELECT * FROM '. $this->getTableName() .' WHERE bId = '. $this->db->sql_escape($bid);
if (!($dbresult = & $this->db->sql_query($sql)))
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
if ($row = & $this->db->sql_fetchrow($dbresult)) {
if ($include_tags) {
$b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
$row['tags'] = $b2tservice->getTagsForBookmark($bid);
}
return $row;
} else {
return false;
}
}
function getBookmarkByAddress($address) {
$hash = md5($address);
return $this->getBookmarkByHash($hash);
}
function getBookmarkByHash($hash) {
return $this->_getbookmark('bHash', $hash, true);
}
function editAllowed($bookmark) {
if (!is_numeric($bookmark) && (!is_array($bookmark) || !is_numeric($bookmark['bId'])))
return false;
if (!is_array($bookmark))
if (!($bookmark = $this->getBookmark($bookmark)))
return false;
$userservice = & ServiceFactory :: getServiceInstance('UserService');
$userid = $userservice->getCurrentUserId();
if ($userservice->isAdmin($userid))
return true;
else
return ($bookmark['uId'] == $userid);
}
function bookmarkExists($address = false, $uid = NULL) {
if (!$address) {
return;
}
// If address doesn't contain ":", add "http://" as the default protocol
if (strpos($address, ':') === false) {
$address = 'http://'. $address;
}
$crit = array ('bHash' => md5($address));
if (isset ($uid)) {
$crit['uId'] = $uid;
}
$sql = 'SELECT COUNT(*) FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE '. $this->db->sql_build_array('SELECT', $crit);
if (!($dbresult = & $this->db->sql_query($sql))) {
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
}
return ($this->db->sql_fetchfield(0, 0) > 0);
}
// Adds a bookmark to the database.
// Note that date is expected to be a string that's interpretable by strtotime().
function addBookmark($address, $title, $description, $status, $categories, $date = NULL, $fromApi = false, $fromImport = false, $sId = -1) {
if($sId == -1) {
$userservice = & ServiceFactory :: getServiceInstance('UserService');
$sId = $userservice->getCurrentUserId();
} }
// If bookmark address doesn't contain ":", add "http://" to the start as a default protocol function BookmarkService(& $db) {
if (strpos($address, ':') === false) { $this->db = & $db;
$address = 'http://'. $address; $this->tablename = $GLOBALS['tableprefix'] .'bookmarks';
}
if (substr($address, -1) == '/') {
$address = substr($address, 0, count($address)-2);
} }
// Get the client's IP address and the date; note that the date is in GMT. function _getbookmark($fieldname, $value, $all = false) {
if (getenv('HTTP_CLIENT_IP')) if (!$all) {
$ip = getenv('HTTP_CLIENT_IP'); $userservice = & ServiceFactory :: getServiceInstance('UserService');
else $sId = $userservice->getCurrentUserId();
if (getenv('REMOTE_ADDR')) $range = ' AND uId = '. $sId;
$ip = getenv('REMOTE_ADDR'); }
else
$ip = getenv('HTTP_X_FORWARDED_FOR');
// Note that if date is NULL, then it's added with a date and time of now, and if it's present, $query = 'SELECT * FROM '. $this->getTableName() .' WHERE '. $fieldname .' = "'. $this->db->sql_escape($value) .'"'. $range;
// it's expected to be a string that's interpretable by strtotime().
if (is_null($date))
$time = time();
else
$time = strtotime($date);
$datetime = gmdate('Y-m-d H:i:s', $time);
// Set up the SQL insert statement and execute it. if (!($dbresult = & $this->db->sql_query_limit($query, 1, 0))) {
$values = array('uId' => intval($sId), 'bIp' => $ip, 'bDatetime' => $datetime, 'bModified' => $datetime, 'bTitle' => $title, 'bAddress' => $address, 'bDescription' => $description, 'bStatus' => intval($status), 'bHash' => md5($address)); message_die(GENERAL_ERROR, 'Could not get bookmark', '', __LINE__, __FILE__, $query, $this->db);
$sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values); return false;
$this->db->sql_transaction('begin'); }
if (!($dbresult = & $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
// Get the resultant row ID for the bookmark.
$bId = $this->db->sql_nextid($dbresult);
if (!isset($bId) || !is_int($bId)) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
$uriparts = explode('.', $address); if ($row =& $this->db->sql_fetchrow($dbresult)) {
$extension = end($uriparts); return $row;
unset($uriparts); } else {
return false;
$b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService'); }
if (!$b2tservice->attachTags($bId, $categories, $fromApi, $extension, false, $fromImport)) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
$this->db->sql_transaction('commit');
// Everything worked out, so return the new bookmark's bId.
return $bId;
}
function updateBookmark($bId, $address, $title, $description, $status, $categories, $date = NULL, $fromApi = false) {
if (!is_numeric($bId))
return false;
// Get the client's IP address and the date; note that the date is in GMT.
if (getenv('HTTP_CLIENT_IP'))
$ip = getenv('HTTP_CLIENT_IP');
else
if (getenv('REMOTE_ADDR'))
$ip = getenv('REMOTE_ADDR');
else
$ip = getenv('HTTP_X_FORWARDED_FOR');
$moddatetime = gmdate('Y-m-d H:i:s', time());
// Set up the SQL update statement and execute it.
$updates = array('bModified' => $moddatetime, 'bTitle' => $title, 'bAddress' => $address, 'bDescription' => $description, 'bStatus' => $status, 'bHash' => md5($address));
if (!is_null($date)) {
$datetime = gmdate('Y-m-d H:i:s', strtotime($date));
$updates[] = array('bDateTime' => $datetime);
}
$sql = 'UPDATE '. $GLOBALS['tableprefix'] .'bookmarks SET '. $this->db->sql_build_array('UPDATE', $updates) .' WHERE bId = '. intval($bId);
$this->db->sql_transaction('begin');
if (!($dbresult = & $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not update bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
$uriparts = explode('.', $address);
$extension = end($uriparts);
unset($uriparts);
$b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
if (!$b2tservice->attachTags($bId, $categories, $fromApi, $extension)) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not update bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
$this->db->sql_transaction('commit');
// Everything worked out, so return true.
return true;
}
function & getBookmarks($start = 0, $perpage = NULL, $user = NULL, $tags = NULL, $terms = NULL, $sortOrder = NULL, $watched = NULL, $startdate = NULL, $enddate = NULL, $hash = NULL) {
// Only get the bookmarks that are visible to the current user. Our rules:
// - if the $user is NULL, that means get bookmarks from ALL users, so we need to make
// sure to check the logged-in user's watchlist and get the contacts-only bookmarks from
// those users. If the user isn't logged-in, just get the public bookmarks.
// - if the $user is set and isn't the logged-in user, then get that user's bookmarks, and
// if that user is on the logged-in user's watchlist, get the public AND contacts-only
// bookmarks; otherwise, just get the public bookmarks.
// - if the $user is set and IS the logged-in user, then get all bookmarks.
$userservice =& ServiceFactory::getServiceInstance('UserService');
$b2tservice =& ServiceFactory::getServiceInstance('Bookmark2TagService');
$tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService');
$sId = $userservice->getCurrentUserId();
if ($userservice->isLoggedOn()) {
// All public bookmarks, user's own bookmarks and any shared with user
$privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')';
$watchnames = $userservice->getWatchNames($sId, true);
foreach($watchnames as $watchuser) {
$privacy .= ' OR (U.username = "'. $watchuser .'" AND B.bStatus = 1)';
}
$privacy .= ')';
} else {
// Just public bookmarks
$privacy = ' AND B.bStatus = 0';
}
// Set up the tags, if need be.
if (!is_array($tags) && !is_null($tags)) {
$tags = explode('+', trim($tags));
}
$tagcount = count($tags);
for ($i = 0; $i < $tagcount; $i ++) {
$tags[$i] = trim($tags[$i]);
}
// Set up the SQL query.
$query_1 = 'SELECT DISTINCT ';
if (SQL_LAYER == 'mysql4') {
$query_1 .= 'SQL_CALC_FOUND_ROWS ';
}
$query_1 .= 'B.*, U.'. $userservice->getFieldName('username');
$query_2 = ' FROM '. $userservice->getTableName() .' AS U, '. $this->getTableName() .' AS B';
$query_3 = ' WHERE B.uId = U.'. $userservice->getFieldName('primary') . $privacy;
if (is_null($watched)) {
if (!is_null($user)) {
$query_3 .= ' AND B.uId = '. $user;
}
} else {
$arrWatch = $userservice->getWatchlist($user);
if (count($arrWatch) > 0) {
foreach($arrWatch as $row) {
$query_3_1 .= 'B.uId = '. intval($row) .' OR ';
}
$query_3_1 = substr($query_3_1, 0, -3);
} else {
$query_3_1 = 'B.uId = -1';
}
$query_3 .= ' AND ('. $query_3_1 .') AND B.bStatus IN (0, 1)';
}
$query_5 = '';
if($hash == null) {
$query_5.= ' GROUP BY B.bHash';
} }
switch($sortOrder) { function & getBookmark($bid, $include_tags = false) {
case 'date_asc': if (!is_numeric($bid))
$query_5.= ' ORDER BY B.bDatetime ASC '; return;
break;
case 'title_desc':
$query_5.= ' ORDER BY B.bTitle DESC ';
break;
case 'title_asc':
$query_5.= ' ORDER BY B.bTitle ASC ';
break;
case 'url_desc':
$query_5.= ' ORDER BY B.bAddress DESC ';
break;
case 'url_asc':
$query_5.= ' ORDER BY B.bAddress ASC ';
break;
default:
$query_5.= ' ORDER BY B.bDatetime DESC ';
}
// Handle the parts of the query that depend on any tags that are present. $sql = 'SELECT * FROM '. $this->getTableName() .' WHERE bId = '. $this->db->sql_escape($bid);
$query_4 = '';
for ($i = 0; $i < $tagcount; $i ++) {
$query_2 .= ', '. $b2tservice->getTableName() .' AS T'. $i;
$query_4 .= ' AND (';
$allLinkedTags = $tag2tagservice->getAllLinkedTags($this->db->sql_escape($tags[$i]), '>', $user); if (!($dbresult = & $this->db->sql_query($sql)))
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
while (is_array($allLinkedTags) && count($allLinkedTags)>0) { if ($row = & $this->db->sql_fetchrow($dbresult)) {
$query_4 .= ' T'. $i .'.tag = "'. array_pop($allLinkedTags) .'"'; if ($include_tags) {
$query_4 .= ' OR'; $b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
} $row['tags'] = $b2tservice->getTagsForBookmark($bid);
}
return $row;
} else {
return false;
}
}
$query_4 .= ' T'. $i .'.tag = "'. $this->db->sql_escape($tags[$i]) .'"'; function getBookmarkByAddress($address) {
$hash = md5($address);
$query_4 .= ') AND T'. $i .'.bId = B.bId'; return $this->getBookmarkByHash($hash);
//die($query_4); }
}
// Search terms function getBookmarkByHash($hash) {
if ($terms) { return $this->_getbookmark('bHash', $hash, true);
// Multiple search terms okay }
$aTerms = explode(' ', $terms);
$aTerms = array_map('trim', $aTerms);
// Search terms in tags as well when none given function editAllowed($bookmark) {
if (!count($tags)) { if (!is_numeric($bookmark) && (!is_array($bookmark) || !is_numeric($bookmark['bId'])))
$query_2 .= ' LEFT JOIN '. $b2tservice->getTableName() .' AS T ON B.bId = T.bId'; return false;
$dotags = true;
} else {
$dotags = false;
}
$query_4 = ''; if (!is_array($bookmark))
for ($i = 0; $i < count($aTerms); $i++) { if (!($bookmark = $this->getBookmark($bookmark)))
$query_4 .= ' AND (B.bTitle LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"'; return false;
$query_4 .= ' OR B.bDescription LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
if ($dotags) {
$query_4 .= ' OR T.tag = "'. $this->db->sql_escape($aTerms[$i]) .'"';
}
$query_4 .= ')';
}
}
// Start and end dates $userservice = & ServiceFactory :: getServiceInstance('UserService');
if ($startdate) { $userid = $userservice->getCurrentUserId();
$query_4 .= ' AND B.bDatetime > "'. $startdate .'"'; if ($userservice->isAdmin($userid))
} return true;
if ($enddate) { else
$query_4 .= ' AND B.bDatetime < "'. $enddate .'"'; return ($bookmark['uId'] == $userid);
} }
// Hash function bookmarkExists($address = false, $uid = NULL) {
if ($hash) { if (!$address) {
$query_4 .= ' AND B.bHash = "'. $hash .'"'; return;
} }
$query = $query_1 . $query_2 . $query_3 . $query_4 . $query_5;
//die($query);
if (!($dbresult = & $this->db->sql_query_limit($query, intval($perpage), intval($start)))) {
message_die(GENERAL_ERROR, 'Could not get bookmarks', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
if (SQL_LAYER == 'mysql4') { // If address doesn't contain ":", add "http://" as the default protocol
$totalquery = 'SELECT FOUND_ROWS() AS total'; if (strpos($address, ':') === false) {
} else { $address = 'http://'. $address;
if ($hash) { }
$totalquery = 'SELECT COUNT(*) AS total'. $query_2 . $query_3 . $query_4;
} else {
$totalquery = 'SELECT COUNT(DISTINCT bAddress) AS total'. $query_2 . $query_3 . $query_4;
}
}
if (!($totalresult = & $this->db->sql_query($totalquery)) || (!($row = & $this->db->sql_fetchrow($totalresult)))) { $crit = array ('bHash' => md5($address));
message_die(GENERAL_ERROR, 'Could not get total bookmarks', '', __LINE__, __FILE__, $totalquery, $this->db); if (isset ($uid)) {
return false; $crit['uId'] = $uid;
} }
$total = $row['total']; $sql = 'SELECT COUNT(*) FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE '. $this->db->sql_build_array('SELECT', $crit);
if (!($dbresult = & $this->db->sql_query($sql))) {
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
}
return ($this->db->sql_fetchfield(0, 0) > 0);
}
$bookmarks = array(); // Adds a bookmark to the database.
while ($row = & $this->db->sql_fetchrow($dbresult)) { // Note that date is expected to be a string that's interpretable by strtotime().
$row['tags'] = $b2tservice->getTagsForBookmark(intval($row['bId'])); function addBookmark($address, $title, $description, $status, $categories, $date = NULL, $fromApi = false, $fromImport = false, $sId = -1) {
$bookmarks[] = $row; if($sId == -1) {
} $userservice = & ServiceFactory :: getServiceInstance('UserService');
$sId = $userservice->getCurrentUserId();
}
$output = array ('bookmarks' => $bookmarks, 'total' => $total); // If bookmark address doesn't contain ":", add "http://" to the start as a default protocol
return $output; if (strpos($address, ':') === false) {
} $address = 'http://'. $address;
}
if (substr($address, -1) == '/') {
$address = substr($address, 0, count($address)-2);
}
function deleteBookmark($bookmarkid) { // Get the client's IP address and the date; note that the date is in GMT.
$query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE bId = '. intval($bookmarkid); if (getenv('HTTP_CLIENT_IP'))
$this->db->sql_transaction('begin'); $ip = getenv('HTTP_CLIENT_IP');
if (!($dbresult = & $this->db->sql_query($query))) { else
$this->db->sql_transaction('rollback'); if (getenv('REMOTE_ADDR'))
message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db); $ip = getenv('REMOTE_ADDR');
return false; else
} $ip = getenv('HTTP_X_FORWARDED_FOR');
$query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'tags WHERE bId = '. intval($bookmarkid); // Note that if date is NULL, then it's added with a date and time of now, and if it's present,
$this->db->sql_transaction('begin'); // it's expected to be a string that's interpretable by strtotime().
if (!($dbresult = & $this->db->sql_query($query))) { if (is_null($date))
$this->db->sql_transaction('rollback'); $time = time();
message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db); else
return false; $time = strtotime($date);
} $datetime = gmdate('Y-m-d H:i:s', $time);
$this->db->sql_transaction('commit'); // Set up the SQL insert statement and execute it.
return true; $values = array('uId' => intval($sId), 'bIp' => $ip, 'bDatetime' => $datetime, 'bModified' => $datetime, 'bTitle' => $title, 'bAddress' => $address, 'bDescription' => $description, 'bStatus' => intval($status), 'bHash' => md5($address));
} $sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
$this->db->sql_transaction('begin');
if (!($dbresult = & $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
// Get the resultant row ID for the bookmark.
$bId = $this->db->sql_nextid($dbresult);
if (!isset($bId) || !is_int($bId)) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
function deleteBookmarksForUser($uId) { $uriparts = explode('.', $address);
$query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE uId = '. intval($uId); $extension = end($uriparts);
unset($uriparts);
$b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
if (!$b2tservice->attachTags($bId, $categories, $fromApi, $extension, false, $fromImport)) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
$this->db->sql_transaction('commit');
// Everything worked out, so return the new bookmark's bId.
return $bId;
}
function updateBookmark($bId, $address, $title, $description, $status, $categories, $date = NULL, $fromApi = false) {
if (!is_numeric($bId))
return false;
// Get the client's IP address and the date; note that the date is in GMT.
if (getenv('HTTP_CLIENT_IP'))
$ip = getenv('HTTP_CLIENT_IP');
else
if (getenv('REMOTE_ADDR'))
$ip = getenv('REMOTE_ADDR');
else
$ip = getenv('HTTP_X_FORWARDED_FOR');
$moddatetime = gmdate('Y-m-d H:i:s', time());
// Set up the SQL update statement and execute it.
$updates = array('bModified' => $moddatetime, 'bTitle' => $title, 'bAddress' => $address, 'bDescription' => $description, 'bStatus' => $status, 'bHash' => md5($address));
if (!is_null($date)) {
$datetime = gmdate('Y-m-d H:i:s', strtotime($date));
$updates[] = array('bDateTime' => $datetime);
}
$sql = 'UPDATE '. $GLOBALS['tableprefix'] .'bookmarks SET '. $this->db->sql_build_array('UPDATE', $updates) .' WHERE bId = '. intval($bId);
$this->db->sql_transaction('begin');
if (!($dbresult = & $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not update bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
$uriparts = explode('.', $address);
$extension = end($uriparts);
unset($uriparts);
$b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
if (!$b2tservice->attachTags($bId, $categories, $fromApi, $extension)) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not update bookmark', '', __LINE__, __FILE__, $sql, $this->db);
return false;
}
$this->db->sql_transaction('commit');
// Everything worked out, so return true.
return true;
}
function & getBookmarks($start = 0, $perpage = NULL, $user = NULL, $tags = NULL, $terms = NULL, $sortOrder = NULL, $watched = NULL, $startdate = NULL, $enddate = NULL, $hash = NULL) {
// Only get the bookmarks that are visible to the current user. Our rules:
// - if the $user is NULL, that means get bookmarks from ALL users, so we need to make
// sure to check the logged-in user's watchlist and get the contacts-only bookmarks from
// those users. If the user isn't logged-in, just get the public bookmarks.
// - if the $user is set and isn't the logged-in user, then get that user's bookmarks, and
// if that user is on the logged-in user's watchlist, get the public AND contacts-only
// bookmarks; otherwise, just get the public bookmarks.
// - if the $user is set and IS the logged-in user, then get all bookmarks.
$userservice =& ServiceFactory::getServiceInstance('UserService');
$b2tservice =& ServiceFactory::getServiceInstance('Bookmark2TagService');
$tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService');
$sId = $userservice->getCurrentUserId();
if ($userservice->isLoggedOn()) {
// All public bookmarks, user's own bookmarks and any shared with user
$privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')';
$watchnames = $userservice->getWatchNames($sId, true);
foreach($watchnames as $watchuser) {
$privacy .= ' OR (U.username = "'. $watchuser .'" AND B.bStatus = 1)';
}
$privacy .= ')';
} else {
// Just public bookmarks
$privacy = ' AND B.bStatus = 0';
}
// Set up the tags, if need be.
if (!is_array($tags) && !is_null($tags)) {
$tags = explode('+', trim($tags));
}
$tagcount = count($tags);
for ($i = 0; $i < $tagcount; $i ++) {
$tags[$i] = trim($tags[$i]);
}
// Set up the SQL query.
$query_1 = 'SELECT DISTINCT ';
if (SQL_LAYER == 'mysql4') {
$query_1 .= 'SQL_CALC_FOUND_ROWS ';
}
$query_1 .= 'B.*, U.'. $userservice->getFieldName('username');
$query_2 = ' FROM '. $userservice->getTableName() .' AS U, '. $this->getTableName() .' AS B';
$query_3 = ' WHERE B.uId = U.'. $userservice->getFieldName('primary') . $privacy;
if (is_null($watched)) {
if (!is_null($user)) {
$query_3 .= ' AND B.uId = '. $user;
}
} else {
$arrWatch = $userservice->getWatchlist($user);
if (count($arrWatch) > 0) {
foreach($arrWatch as $row) {
$query_3_1 .= 'B.uId = '. intval($row) .' OR ';
}
$query_3_1 = substr($query_3_1, 0, -3);
} else {
$query_3_1 = 'B.uId = -1';
}
$query_3 .= ' AND ('. $query_3_1 .') AND B.bStatus IN (0, 1)';
}
$query_5 = '';
if($hash == null) {
$query_5.= ' GROUP BY B.bHash';
}
switch($sortOrder) {
case 'date_asc':
$query_5.= ' ORDER BY B.bDatetime ASC ';
break;
case 'title_desc':
$query_5.= ' ORDER BY B.bTitle DESC ';
break;
case 'title_asc':
$query_5.= ' ORDER BY B.bTitle ASC ';
break;
case 'url_desc':
$query_5.= ' ORDER BY B.bAddress DESC ';
break;
case 'url_asc':
$query_5.= ' ORDER BY B.bAddress ASC ';
break;
default:
$query_5.= ' ORDER BY B.bDatetime DESC ';
}
// Handle the parts of the query that depend on any tags that are present.
$query_4 = '';
for ($i = 0; $i < $tagcount; $i ++) {
$query_2 .= ', '. $b2tservice->getTableName() .' AS T'. $i;
$query_4 .= ' AND (';
$allLinkedTags = $tag2tagservice->getAllLinkedTags($this->db->sql_escape($tags[$i]), '>', $user);
while (is_array($allLinkedTags) && count($allLinkedTags)>0) {
$query_4 .= ' T'. $i .'.tag = "'. array_pop($allLinkedTags) .'"';
$query_4 .= ' OR';
}
$query_4 .= ' T'. $i .'.tag = "'. $this->db->sql_escape($tags[$i]) .'"';
$query_4 .= ') AND T'. $i .'.bId = B.bId';
//die($query_4);
}
// Search terms
if ($terms) {
// Multiple search terms okay
$aTerms = explode(' ', $terms);
$aTerms = array_map('trim', $aTerms);
// Search terms in tags as well when none given
if (!count($tags)) {
$query_2 .= ' LEFT JOIN '. $b2tservice->getTableName() .' AS T ON B.bId = T.bId';
$dotags = true;
} else {
$dotags = false;
}
$query_4 = '';
for ($i = 0; $i < count($aTerms); $i++) {
$query_4 .= ' AND (B.bTitle LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
$query_4 .= ' OR B.bDescription LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
if ($dotags) {
$query_4 .= ' OR T.tag = "'. $this->db->sql_escape($aTerms[$i]) .'"';
}
$query_4 .= ')';
}
}
// Start and end dates
if ($startdate) {
$query_4 .= ' AND B.bDatetime > "'. $startdate .'"';
}
if ($enddate) {
$query_4 .= ' AND B.bDatetime < "'. $enddate .'"';
}
// Hash
if ($hash) {
$query_4 .= ' AND B.bHash = "'. $hash .'"';
}
$query = $query_1 . $query_2 . $query_3 . $query_4 . $query_5;
//die($query);
if (!($dbresult = & $this->db->sql_query_limit($query, intval($perpage), intval($start)))) {
message_die(GENERAL_ERROR, 'Could not get bookmarks', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
if (SQL_LAYER == 'mysql4') {
$totalquery = 'SELECT FOUND_ROWS() AS total';
} else {
if ($hash) {
$totalquery = 'SELECT COUNT(*) AS total'. $query_2 . $query_3 . $query_4;
} else {
$totalquery = 'SELECT COUNT(DISTINCT bAddress) AS total'. $query_2 . $query_3 . $query_4;
}
}
if (!($totalresult = & $this->db->sql_query($totalquery)) || (!($row = & $this->db->sql_fetchrow($totalresult)))) {
message_die(GENERAL_ERROR, 'Could not get total bookmarks', '', __LINE__, __FILE__, $totalquery, $this->db);
return false;
}
$total = $row['total'];
$bookmarks = array();
while ($row = & $this->db->sql_fetchrow($dbresult)) {
$row['tags'] = $b2tservice->getTagsForBookmark(intval($row['bId']));
$bookmarks[] = $row;
}
$output = array ('bookmarks' => $bookmarks, 'total' => $total);
return $output;
}
function deleteBookmark($bookmarkid) {
$query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE bId = '. intval($bookmarkid);
$this->db->sql_transaction('begin');
if (!($dbresult = & $this->db->sql_query($query))) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'tags WHERE bId = '. intval($bookmarkid);
$this->db->sql_transaction('begin');
if (!($dbresult = & $this->db->sql_query($query))) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$this->db->sql_transaction('commit');
return true;
}
function deleteBookmarksForUser($uId) {
$query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE uId = '. intval($uId);
if (!($dbresult = & $this->db->sql_query($query))) { if (!($dbresult = & $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
return true; return true;
} }
function countOthers($address) { function countOthers($address) {
if (!$address) { if (!$address) {
return false; return false;
} }
$userservice = & ServiceFactory :: getServiceInstance('UserService'); $userservice = & ServiceFactory :: getServiceInstance('UserService');
$sId = $userservice->getCurrentUserId(); $sId = $userservice->getCurrentUserId();
if ($userservice->isLoggedOn()) { if ($userservice->isLoggedOn()) {
// All public bookmarks, user's own bookmarks and any shared with user // All public bookmarks, user's own bookmarks and any shared with user
$privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')'; $privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')';
$watchnames = $userservice->getWatchNames($sId, true); $watchnames = $userservice->getWatchNames($sId, true);
foreach($watchnames as $watchuser) { foreach($watchnames as $watchuser) {
$privacy .= ' OR (U.username = "'. $watchuser .'" AND B.bStatus = 1)'; $privacy .= ' OR (U.username = "'. $watchuser .'" AND B.bStatus = 1)';
} }
$privacy .= ')'; $privacy .= ')';
} else { } else {
// Just public bookmarks // Just public bookmarks
$privacy = ' AND B.bStatus = 0'; $privacy = ' AND B.bStatus = 0';
} }
$sql = 'SELECT COUNT(*) FROM '. $userservice->getTableName() .' AS U, '. $GLOBALS['tableprefix'] .'bookmarks AS B WHERE U.'. $userservice->getFieldName('primary') .' = B.uId AND B.bHash = "'. md5($address) .'"'. $privacy; $sql = 'SELECT COUNT(*) FROM '. $userservice->getTableName() .' AS U, '. $GLOBALS['tableprefix'] .'bookmarks AS B WHERE U.'. $userservice->getFieldName('primary') .' = B.uId AND B.bHash = "'. md5($address) .'"'. $privacy;
if (!($dbresult = & $this->db->sql_query($sql))) { if (!($dbresult = & $this->db->sql_query($sql))) {
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
} }
return $this->db->sql_fetchfield(0, 0) - 1; return $this->db->sql_fetchfield(0, 0) - 1;
} }
function deleteAll() { function deleteAll() {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`'; $query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query); $this->db->sql_query($query);
} }
// Properties // Properties
function getTableName() { return $this->tablename; } function getTableName() { return $this->tablename; }
function setTableName($value) { $this->tablename = $value; } function setTableName($value) { $this->tablename = $value; }
} }

View file

@ -1,23 +1,23 @@
<?php <?php
/*************************************************************************** /***************************************************************************
Copyright (C) 2004 - 2006 Scuttle project Copyright (C) 2004 - 2006 Scuttle project
http://sourceforge.net/projects/scuttle/ http://sourceforge.net/projects/scuttle/
http://scuttle.org/ http://scuttle.org/
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/ ***************************************************************************/
require_once('header.inc.php'); require_once('header.inc.php');
@ -33,15 +33,15 @@ list($url, $cat) = explode('/', $_SERVER['PATH_INFO']);
$pagetitle = T_('Users'); $pagetitle = T_('Users');
if ($usecache) { if ($usecache) {
// Generate hash for caching on // Generate hash for caching on
if ($userservice->isLoggedOn()) { if ($userservice->isLoggedOn()) {
$hash = md5($_SERVER['REQUEST_URI'] . $userservice->getCurrentUserID()); $hash = md5($_SERVER['REQUEST_URI'] . $userservice->getCurrentUserID());
} else { } else {
$hash = md5($_SERVER['REQUEST_URI']); $hash = md5($_SERVER['REQUEST_URI']);
} }
// Cache for 30 minutes // Cache for 30 minutes
$cacheservice->Start($hash, 1800); $cacheservice->Start($hash, 1800);
} }
// Header variables // Header variables
@ -58,7 +58,7 @@ $tplVars['users'] =& $userservice->getUsers();
$templateservice->loadTemplate('users.tpl', $tplVars); $templateservice->loadTemplate('users.tpl', $tplVars);
if ($usecache) { if ($usecache) {
// Cache output if existing copy has expired // Cache output if existing copy has expired
$cacheservice->End($hash); $cacheservice->End($hash);
} }
?> ?>