Merge branch 'master' into tres
Conflicts: include/socgraph.php
This commit is contained in:
		
							
								
								
									
										2
									
								
								boot.php
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								boot.php
									
									
									
									
									
								
							| @@ -49,7 +49,7 @@ define ( 'RED_PLATFORM',            'redmatrix' ); | |||||||
| define ( 'RED_VERSION',             trim(file_get_contents('version.inc')) . 'R'); | define ( 'RED_VERSION',             trim(file_get_contents('version.inc')) . 'R'); | ||||||
| define ( 'ZOT_REVISION',            1     ); | define ( 'ZOT_REVISION',            1     ); | ||||||
|  |  | ||||||
| define ( 'DB_UPDATE_VERSION',       1134  ); | define ( 'DB_UPDATE_VERSION',       1135  ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Constant with a HTML line break. |  * Constant with a HTML line break. | ||||||
|   | |||||||
| @@ -82,7 +82,7 @@ class RedBrowser extends DAV\Browser\Plugin { | |||||||
| 			date_default_timezone_set($this->auth->getTimezone()); | 			date_default_timezone_set($this->auth->getTimezone()); | ||||||
|  |  | ||||||
| 		require_once('include/conversation.php'); | 		require_once('include/conversation.php'); | ||||||
|  | 		require_once('include/text.php'); | ||||||
| 		if ($this->auth->owner_nick) { | 		if ($this->auth->owner_nick) { | ||||||
| 			$html = profile_tabs(get_app(), (($is_owner) ? true : false), $this->auth->owner_nick); | 			$html = profile_tabs(get_app(), (($is_owner) ? true : false), $this->auth->owner_nick); | ||||||
| 		} | 		} | ||||||
| @@ -208,9 +208,9 @@ class RedBrowser extends DAV\Browser\Plugin { | |||||||
| 			$ft['displayName'] = $displayName; | 			$ft['displayName'] = $displayName; | ||||||
| 			$ft['type'] = $type; | 			$ft['type'] = $type; | ||||||
| 			$ft['size'] = $size; | 			$ft['size'] = $size; | ||||||
| 			$ft['sizeFormatted'] = $this->userReadableSize($size); | 			$ft['sizeFormatted'] = userReadableSize($size); | ||||||
| 			$ft['lastmodified'] = (($lastmodified) ? datetime_convert('UTC', date_default_timezone_get(), $lastmodified) : ''); | 			$ft['lastmodified'] = (($lastmodified) ? datetime_convert('UTC', date_default_timezone_get(), $lastmodified) : ''); | ||||||
| 			$ft['iconFromType'] = $this->getIconFromType($type); | 			$ft['iconFromType'] = getIconFromType($type); | ||||||
|  |  | ||||||
| 			$f[] = $ft; | 			$f[] = $ft; | ||||||
| 		} | 		} | ||||||
| @@ -224,13 +224,13 @@ class RedBrowser extends DAV\Browser\Plugin { | |||||||
| 		if ($used) { | 		if ($used) { | ||||||
| 			$quotaDesc = t('%1$s used'); | 			$quotaDesc = t('%1$s used'); | ||||||
| 			$quotaDesc = sprintf($quotaDesc, | 			$quotaDesc = sprintf($quotaDesc, | ||||||
| 				$this->userReadableSize($used)); | 				userReadableSize($used)); | ||||||
| 		} | 		} | ||||||
| 		if ($limit && $used) { | 		if ($limit && $used) { | ||||||
| 			$quotaDesc = t('%1$s used of %2$s (%3$s%)'); | 			$quotaDesc = t('%1$s used of %2$s (%3$s%)'); | ||||||
| 			$quotaDesc = sprintf($quotaDesc, | 			$quotaDesc = sprintf($quotaDesc, | ||||||
| 				$this->userReadableSize($used), | 				userReadableSize($used), | ||||||
| 				$this->userReadableSize($limit), | 				userReadableSize($limit), | ||||||
| 				round($used / $limit, 1)); | 				round($used / $limit, 1)); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -282,29 +282,6 @@ class RedBrowser extends DAV\Browser\Plugin { | |||||||
| 		construct_page(get_app()); | 		construct_page(get_app()); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * @brief Returns a human readable formatted string for filesizes. |  | ||||||
| 	 * |  | ||||||
| 	 * Don't we need such a functionality in other places, too? |  | ||||||
| 	 * |  | ||||||
| 	 * @param int $size filesize in bytes |  | ||||||
| 	 * @return string |  | ||||||
| 	 */ |  | ||||||
| 	function userReadableSize($size) { |  | ||||||
| 		$ret = ""; |  | ||||||
| 		if (is_numeric($size)) { |  | ||||||
| 			$incr = 0; |  | ||||||
| 			$k = 1024; |  | ||||||
| 			$unit = array('bytes', 'KB', 'MB', 'GB', 'TB', 'PB'); |  | ||||||
| 			while (($size / $k) >= 1){ |  | ||||||
| 				$incr++; |  | ||||||
| 				$size = round($size / $k, 2); |  | ||||||
| 			} |  | ||||||
| 			$ret = $size . " " . $unit[$incr]; |  | ||||||
| 		} |  | ||||||
| 		return $ret; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * @brief Creates a form to add new folders and upload files. | 	 * @brief Creates a form to add new folders and upload files. | ||||||
| 	 * | 	 * | ||||||
| @@ -339,65 +316,6 @@ class RedBrowser extends DAV\Browser\Plugin { | |||||||
| 		return z_root() . '/cloud/?sabreAction=asset&assetName=' . urlencode($assetName); | 		return z_root() . '/cloud/?sabreAction=asset&assetName=' . urlencode($assetName); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * @brief returns icon name for use with e.g. font-awesome based on mime-type |  | ||||||
| 	 * |  | ||||||
| 	 * @param string $type |  | ||||||
| 	 * @return string |  | ||||||
| 	 */ |  | ||||||
| 	protected function getIconFromType($type) { |  | ||||||
| 		$iconMap = array( |  | ||||||
| 					//Folder |  | ||||||
| 					t('Collection') => 'icon-folder-close', |  | ||||||
|  |  | ||||||
| 					//Common file |  | ||||||
| 					'application/octet-stream' => 'icon-file-alt', |  | ||||||
|  |  | ||||||
| 					//Text |  | ||||||
| 					'text/plain' => 'icon-file-text-alt', |  | ||||||
| 					'application/msword' => 'icon-file-text-alt', |  | ||||||
| 					'application/pdf' => 'icon-file-text-alt', |  | ||||||
| 					'application/vnd.oasis.opendocument.text' => 'icon-file-text-alt', |  | ||||||
| 					'application/epub+zip' => 'icon-book', |  | ||||||
|  |  | ||||||
| 					//Spreadsheet |  | ||||||
| 					'application/vnd.oasis.opendocument.spreadsheet' => 'icon-table', |  | ||||||
| 					'application/vnd.ms-excel' => 'icon-table', |  | ||||||
|  |  | ||||||
| 					//Image |  | ||||||
| 					'image/jpeg' => 'icon-picture', |  | ||||||
| 					'image/png' => 'icon-picture', |  | ||||||
| 					'image/gif' => 'icon-picture', |  | ||||||
| 					'image/svg+xml' => 'icon-picture', |  | ||||||
|  |  | ||||||
| 					//Archive |  | ||||||
| 					'application/zip' => 'icon-archive', |  | ||||||
| 					'application/x-rar-compressed' => 'icon-archive', |  | ||||||
|  |  | ||||||
| 					//Audio |  | ||||||
| 					'audio/mpeg' => 'icon-music', |  | ||||||
| 					'audio/wav' => 'icon-music', |  | ||||||
| 					'application/ogg' => 'icon-music', |  | ||||||
| 					'audio/ogg' => 'icon-music', |  | ||||||
| 					'audio/webm' => 'icon-music', |  | ||||||
| 					'audio/mp4' => 'icon-music', |  | ||||||
|  |  | ||||||
| 					//Video |  | ||||||
| 					'video/quicktime' => 'icon-film', |  | ||||||
| 					'video/webm' => 'icon-film', |  | ||||||
| 					'video/mp4' => 'icon-film' |  | ||||||
| 				); |  | ||||||
|  |  | ||||||
| 		$iconFromType = 'icon-file-alt'; |  | ||||||
|  |  | ||||||
| 		if (array_key_exists($type, $iconMap)) |  | ||||||
| 			{ |  | ||||||
| 			    $iconFromType = $iconMap[$type]; |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 		return $iconFromType; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * @brief Return the hash of an attachment. | 	 * @brief Return the hash of an attachment. | ||||||
| 	 * | 	 * | ||||||
| @@ -412,6 +330,7 @@ class RedBrowser extends DAV\Browser\Plugin { | |||||||
| 	 *  The name of the attachment | 	 *  The name of the attachment | ||||||
| 	 * @return string | 	 * @return string | ||||||
| 	 */ | 	 */ | ||||||
|  |  | ||||||
| 	protected function findAttachHash($owner, $parentHash, $attachName) { | 	protected function findAttachHash($owner, $parentHash, $attachName) { | ||||||
| 		$r = q("SELECT hash FROM attach WHERE uid = %d AND folder = '%s' AND filename = '%s' ORDER BY edited DESC LIMIT 1", | 		$r = q("SELECT hash FROM attach WHERE uid = %d AND folder = '%s' AND filename = '%s' ORDER BY edited DESC LIMIT 1", | ||||||
| 			intval($owner), | 			intval($owner), | ||||||
|   | |||||||
| @@ -333,6 +333,7 @@ function notification($params) { | |||||||
|  |  | ||||||
| 	$datarray = array(); | 	$datarray = array(); | ||||||
| 	$datarray['hash']   = $hash; | 	$datarray['hash']   = $hash; | ||||||
|  | 	$datarray['sender_hash'] = $sender['xchan_hash']; | ||||||
| 	$datarray['name']   = $sender['xchan_name']; | 	$datarray['name']   = $sender['xchan_name']; | ||||||
| 	$datarray['url']    = $sender['xchan_url']; | 	$datarray['url']    = $sender['xchan_url']; | ||||||
| 	$datarray['photo']  = $sender['xchan_photo_s']; | 	$datarray['photo']  = $sender['xchan_photo_s']; | ||||||
|   | |||||||
| @@ -2181,6 +2181,20 @@ function item_store($arr,$allow_exec = false) { | |||||||
| 		unset($arr['term']); | 		unset($arr['term']); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  	if(strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid) || strlen($public_policy)) | ||||||
|  | 		$private = 1; | ||||||
|  | 	else | ||||||
|  | 		$private = $arr['item_private'];  | ||||||
|  |  | ||||||
|  | 	$arr['parent']          = $parent_id; | ||||||
|  | 	$arr['allow_cid']       = $allow_cid; | ||||||
|  | 	$arr['allow_gid']       = $allow_gid; | ||||||
|  | 	$arr['deny_cid']        = $deny_cid; | ||||||
|  | 	$arr['deny_gid']        = $deny_gid; | ||||||
|  | 	$arr['public_policy']   = $public_policy; | ||||||
|  | 	$arr['item_private']    = $private; | ||||||
|  | 	$arr['comments_closed'] = $comments_closed; | ||||||
|  |  | ||||||
| 	logger('item_store: ' . print_r($arr,true), LOGGER_DATA); | 	logger('item_store: ' . print_r($arr,true), LOGGER_DATA); | ||||||
|  |  | ||||||
| 	dbesc_array($arr); | 	dbesc_array($arr); | ||||||
| @@ -2198,7 +2212,6 @@ function item_store($arr,$allow_exec = false) { | |||||||
| 		intval($arr['uid']) | 		intval($arr['uid']) | ||||||
| 	); | 	); | ||||||
|  |  | ||||||
|  |  | ||||||
| 	if($r && count($r)) { | 	if($r && count($r)) { | ||||||
| 		$current_post = $r[0]['id']; | 		$current_post = $r[0]['id']; | ||||||
| 		$arr = $r[0];  // This will gives us a fresh copy of what's now in the DB and undo the db escaping, which really messes up the notifications | 		$arr = $r[0];  // This will gives us a fresh copy of what's now in the DB and undo the db escaping, which really messes up the notifications | ||||||
| @@ -2218,40 +2231,14 @@ function item_store($arr,$allow_exec = false) { | |||||||
| 		); | 		); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if((! $parent_id) || ($arr['parent_mid'] === $arr['mid']))	 | 	$arr['id'] = $current_post; | ||||||
| 		$parent_id = $current_post; |  | ||||||
|  |  | ||||||
|  	if(strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid) || strlen($public_policy)) | 	if(! intval($r[0]['parent'])) { | ||||||
| 		$private = 1; | 		$x = q("update item set parent = id where id = %d", | ||||||
| 	else | 			intval($r[0]['id']) | ||||||
| 		$private = $arr['item_private'];  | 		); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// Set parent id - and also make sure to inherit the parent's ACL's. |  | ||||||
|  |  | ||||||
| 	$r = q("UPDATE item SET parent = %d, allow_cid = '%s', allow_gid = '%s', |  | ||||||
| 		deny_cid = '%s', deny_gid = '%s', public_policy = '%s', item_private = %d, comments_closed = '%s'  |  | ||||||
| 		WHERE id = %d", |  | ||||||
| 		intval($parent_id), |  | ||||||
| 		dbesc($allow_cid), |  | ||||||
| 		dbesc($allow_gid), |  | ||||||
| 		dbesc($deny_cid), |  | ||||||
| 		dbesc($deny_gid), |  | ||||||
| 		dbesc($public_policy), |  | ||||||
| 		intval($private), |  | ||||||
| 		dbesc($comments_closed), |  | ||||||
| 		intval($current_post) |  | ||||||
| 	); |  | ||||||
|  |  | ||||||
| 	// These are probably redundant now that we've queried the just stored post |  | ||||||
| 	$arr['id']        = $current_post; |  | ||||||
| 	$arr['parent']    = $parent_id; |  | ||||||
| 	$arr['allow_cid'] = $allow_cid; |  | ||||||
| 	$arr['allow_gid'] = $allow_gid; |  | ||||||
| 	$arr['deny_cid']  = $deny_cid; |  | ||||||
| 	$arr['deny_gid']  = $deny_gid; |  | ||||||
| 	$arr['public_policy']  = $public_policy; |  | ||||||
| 	$arr['item_private']   = $private; |  | ||||||
| 	$arr['comments_closed'] = $comments_closed; |  | ||||||
|  |  | ||||||
| 	// Store taxonomy | 	// Store taxonomy | ||||||
|  |  | ||||||
|   | |||||||
| @@ -145,7 +145,7 @@ function onepoll_run($argv, $argc){ | |||||||
|  |  | ||||||
| 	if($contact['xchan_connurl']) {	 | 	if($contact['xchan_connurl']) {	 | ||||||
| 		$r = q("SELECT xlink_id from xlink  | 		$r = q("SELECT xlink_id from xlink  | ||||||
| 			where xlink_xchan = '%s' and xlink_updated > %s - INTERVAL %s limit 1", | 			where xlink_xchan = '%s' and xlink_updated > %s - INTERVAL %s and xlink_static = 0 limit 1", | ||||||
| 			intval($contact['xchan_hash']), | 			intval($contact['xchan_hash']), | ||||||
| 			db_utcnow(), db_quoteinterval('1 DAY') | 			db_utcnow(), db_quoteinterval('1 DAY') | ||||||
| 		); | 		); | ||||||
|   | |||||||
| @@ -159,7 +159,7 @@ function poller_run($argv, $argc){ | |||||||
|  |  | ||||||
| 			// get rid of really old poco records | 			// get rid of really old poco records | ||||||
|  |  | ||||||
| 			q("delete from xlink where xlink_updated < %s - INTERVAL %s", | 			q("delete from xlink where xlink_updated < %s - INTERVAL %s and xlink_static = 0 ", | ||||||
| 				db_utcnow(), db_quoteinterval('14 DAY') | 				db_utcnow(), db_quoteinterval('14 DAY') | ||||||
| 			); | 			); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -186,13 +186,13 @@ function poco_load($xchan = '',$url = null) { | |||||||
| 		$total ++; | 		$total ++; | ||||||
|  |  | ||||||
|  |  | ||||||
| 		$r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' limit 1", | 		$r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 0 limit 1", | ||||||
| 			dbesc($xchan), | 			dbesc($xchan), | ||||||
| 			dbesc($hash) | 			dbesc($hash) | ||||||
| 		); | 		); | ||||||
|  |  | ||||||
| 		if(! $r) { | 		if(! $r) { | ||||||
| 			q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_updated ) values ( '%s', '%s', %d, '%s', '%s' ) ", | 			q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', 0 ) ", | ||||||
| 				dbesc($xchan), | 				dbesc($xchan), | ||||||
| 				dbesc($hash), | 				dbesc($hash), | ||||||
| 				intval($rating), | 				intval($rating), | ||||||
| @@ -211,7 +211,7 @@ function poco_load($xchan = '',$url = null) { | |||||||
| 	} | 	} | ||||||
| 	logger("poco_load: loaded $total entries",LOGGER_DEBUG); | 	logger("poco_load: loaded $total entries",LOGGER_DEBUG); | ||||||
|  |  | ||||||
| 	q("delete from xlink where xlink_xchan = '%s' and xlink_updated < %s - INTERVAL %s", | 	q("delete from xlink where xlink_xchan = '%s' and xlink_updated < %s - INTERVAL %s and xlink_static = 0", | ||||||
| 		dbesc($xchan), | 		dbesc($xchan), | ||||||
| 		db_utcnow(), db_quoteinterval('2 DAY') | 		db_utcnow(), db_quoteinterval('2 DAY') | ||||||
| 	); | 	); | ||||||
| @@ -222,7 +222,7 @@ function poco_load($xchan = '',$url = null) { | |||||||
|  |  | ||||||
| function count_common_friends($uid,$xchan) { | function count_common_friends($uid,$xchan) { | ||||||
|  |  | ||||||
| 	$r = q("SELECT count(xlink_id) as total from xlink where xlink_xchan = '%s' and xlink_link in | 	$r = q("SELECT count(xlink_id) as total from xlink where xlink_xchan = '%s' and xlink_static = 0 and xlink_link in | ||||||
| 		(select abook_xchan from abook where abook_xchan != '%s' and abook_channel = %d and abook_flags = 0 )", | 		(select abook_xchan from abook where abook_xchan != '%s' and abook_channel = %d and abook_flags = 0 )", | ||||||
| 		dbesc($xchan), | 		dbesc($xchan), | ||||||
| 		dbesc($xchan), | 		dbesc($xchan), | ||||||
| @@ -243,7 +243,7 @@ function common_friends($uid,$xchan,$start = 0,$limit=100000000,$shuffle = false | |||||||
| 	else | 	else | ||||||
| 		$sql_extra = " order by xchan_name asc ";  | 		$sql_extra = " order by xchan_name asc ";  | ||||||
|  |  | ||||||
| 	$r = q("SELECT * from xchan left join xlink on xlink_link = xchan_hash where xlink_xchan = '%s' and xlink_link in | 	$r = q("SELECT * from xchan left join xlink on xlink_link = xchan_hash where xlink_xchan = '%s' and xlink_static = 0 and xlink_link in | ||||||
| 		(select abook_xchan from abook where abook_xchan != '%s' and abook_channel = %d and abook_flags = 0 ) $sql_extra limit %d offset %d", | 		(select abook_xchan from abook where abook_xchan != '%s' and abook_channel = %d and abook_flags = 0 ) $sql_extra limit %d offset %d", | ||||||
| 		dbesc($xchan), | 		dbesc($xchan), | ||||||
| 		dbesc($xchan), | 		dbesc($xchan), | ||||||
| @@ -342,6 +342,7 @@ function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) { | |||||||
| 		and xlink_xchan != '' | 		and xlink_xchan != '' | ||||||
| 		and xchan_hidden = 0 | 		and xchan_hidden = 0 | ||||||
| 		and xchan_deleted = 0 | 		and xchan_deleted = 0 | ||||||
|  | 		and xlink_static = 0 | ||||||
| 		group by xchan_hash order by total desc limit %d offset %d ", | 		group by xchan_hash order by total desc limit %d offset %d ", | ||||||
| 		intval($uid), | 		intval($uid), | ||||||
| 		intval($uid), | 		intval($uid), | ||||||
| @@ -360,6 +361,7 @@ function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) { | |||||||
| 		and not xlink_link in ( select xchan from xign where uid = %d ) | 		and not xlink_link in ( select xchan from xign where uid = %d ) | ||||||
| 		and xchan_hidden = 0 | 		and xchan_hidden = 0 | ||||||
| 		and xchan_deleted = 0 | 		and xchan_deleted = 0 | ||||||
|  | 		and xlink_static = 0 | ||||||
| 		group by xchan_hash order by total desc limit %d offset %d ", | 		group by xchan_hash order by total desc limit %d offset %d ", | ||||||
| 		intval($uid), | 		intval($uid), | ||||||
| 		intval($uid), | 		intval($uid), | ||||||
| @@ -401,7 +403,7 @@ function update_suggestions() { | |||||||
| 		// the targets may have changed their preferences and don't want to be suggested - and they  | 		// the targets may have changed their preferences and don't want to be suggested - and they  | ||||||
| 		// may have simply gone away.  | 		// may have simply gone away.  | ||||||
|  |  | ||||||
| 		$r = q("delete from xlink where xlink_xchan = '' and xlink_updated < %s - INTERVAL %s", | 		$r = q("delete from xlink where xlink_xchan = '' and xlink_updated < %s - INTERVAL %s and xlink_static = 0", | ||||||
| 			db_utcnow(), db_quoteinterval('7 DAY') | 			db_utcnow(), db_quoteinterval('7 DAY') | ||||||
| 		); | 		); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2377,3 +2377,74 @@ function linkify_tags($a, &$body, $uid) { | |||||||
| 	return $results; | 	return $results; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @brief returns icon name for use with e.g. font-awesome based on mime-type | ||||||
|  |  * | ||||||
|  |  * @param string $type | ||||||
|  |  * @return string | ||||||
|  |  */ | ||||||
|  | function getIconFromType($type) { | ||||||
|  | 	$iconMap = array( | ||||||
|  | 		//Folder | ||||||
|  | 		t('Collection') => 'icon-folder-close', | ||||||
|  | 		//Common file | ||||||
|  | 		'application/octet-stream' => 'icon-file-alt', | ||||||
|  | 		//Text | ||||||
|  | 		'text/plain' => 'icon-file-text-alt', | ||||||
|  | 		'application/msword' => 'icon-file-text-alt', | ||||||
|  | 		'application/pdf' => 'icon-file-text-alt', | ||||||
|  | 		'application/vnd.oasis.opendocument.text' => 'icon-file-text-alt', | ||||||
|  | 		'application/epub+zip' => 'icon-book', | ||||||
|  | 		//Spreadsheet | ||||||
|  | 		'application/vnd.oasis.opendocument.spreadsheet' => 'icon-table', | ||||||
|  | 		'application/vnd.ms-excel' => 'icon-table', | ||||||
|  | 		//Image | ||||||
|  | 		'image/jpeg' => 'icon-picture', | ||||||
|  | 		'image/png' => 'icon-picture', | ||||||
|  | 		'image/gif' => 'icon-picture', | ||||||
|  | 		'image/svg+xml' => 'icon-picture', | ||||||
|  | 		//Archive | ||||||
|  | 		'application/zip' => 'icon-archive', | ||||||
|  | 		'application/x-rar-compressed' => 'icon-archive', | ||||||
|  | 		//Audio | ||||||
|  | 		'audio/mpeg' => 'icon-music', | ||||||
|  | 		'audio/wav' => 'icon-music', | ||||||
|  | 		'application/ogg' => 'icon-music', | ||||||
|  | 		'audio/ogg' => 'icon-music', | ||||||
|  | 		'audio/webm' => 'icon-music', | ||||||
|  | 		'audio/mp4' => 'icon-music', | ||||||
|  | 		//Video | ||||||
|  | 		'video/quicktime' => 'icon-film', | ||||||
|  | 		'video/webm' => 'icon-film', | ||||||
|  | 		'video/mp4' => 'icon-film' | ||||||
|  | 	); | ||||||
|  |  | ||||||
|  | 	$iconFromType = 'icon-file-alt'; | ||||||
|  |  | ||||||
|  | 	if (array_key_exists($type, $iconMap)) { | ||||||
|  | 		$iconFromType = $iconMap[$type]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return $iconFromType; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @brief Returns a human readable formatted string for filesizes. | ||||||
|  |  * | ||||||
|  |  * @param int $size filesize in bytes | ||||||
|  |  * @return string | ||||||
|  |  */ | ||||||
|  | function userReadableSize($size) { | ||||||
|  | 	$ret = ""; | ||||||
|  | 	if (is_numeric($size)) { | ||||||
|  | 		$incr = 0; | ||||||
|  | 		$k = 1024; | ||||||
|  | 		$unit = array('bytes', 'KB', 'MB', 'GB', 'TB', 'PB'); | ||||||
|  | 		while (($size / $k) >= 1){ | ||||||
|  | 			$incr++; | ||||||
|  | 			$size = round($size / $k, 2); | ||||||
|  | 		} | ||||||
|  | 		$ret = $size . " " . $unit[$incr]; | ||||||
|  | 	} | ||||||
|  | 	return $ret; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1078,6 +1078,12 @@ function zot_import($arr, $sender_url) { | |||||||
| 			$i['notify']['sender']['hash'] = make_xchan_hash($i['notify']['sender']['guid'],$i['notify']['sender']['guid_sig']); | 			$i['notify']['sender']['hash'] = make_xchan_hash($i['notify']['sender']['guid'],$i['notify']['sender']['guid_sig']); | ||||||
| 			$deliveries = null; | 			$deliveries = null; | ||||||
|  |  | ||||||
|  | 			if(array_key_exists('message',$i) && array_key_exists('type',$i['message']) && $i['message']['type'] === 'rating') { | ||||||
|  | 				// rating messages are processed only by directory servers | ||||||
|  | 				logger('Rating received: ' . print_r($arr,true), LOGGER_DATA); | ||||||
|  | 				$result = process_rating_delivery($i['notify']['sender'],$arr); | ||||||
|  | 			} | ||||||
|  |  | ||||||
| 			if(array_key_exists('recipients',$i['notify']) && count($i['notify']['recipients'])) { | 			if(array_key_exists('recipients',$i['notify']) && count($i['notify']['recipients'])) { | ||||||
| 				logger('specific recipients'); | 				logger('specific recipients'); | ||||||
| 				$recip_arr = array(); | 				$recip_arr = array(); | ||||||
| @@ -1097,7 +1103,8 @@ function zot_import($arr, $sender_url) { | |||||||
| 				// It's a specifically targetted post. If we were sent a public_scope hint (likely),  | 				// It's a specifically targetted post. If we were sent a public_scope hint (likely),  | ||||||
| 				// get rid of it so that it doesn't get stored and cause trouble.  | 				// get rid of it so that it doesn't get stored and cause trouble.  | ||||||
|  |  | ||||||
| 				if(($i) && is_array($i) && array_key_exists('message',$i) && is_array($i['message']) && array_key_exists('public_scope',$i['message'])) | 				if(($i) && is_array($i) && array_key_exists('message',$i) && is_array($i['message'])  | ||||||
|  | 					&& $i['message']['type'] === 'activity' && array_key_exists('public_scope',$i['message'])) | ||||||
| 					unset($i['message']['public_scope']); | 					unset($i['message']['public_scope']); | ||||||
|  |  | ||||||
| 				$deliveries = $r; | 				$deliveries = $r; | ||||||
| @@ -1106,7 +1113,7 @@ function zot_import($arr, $sender_url) { | |||||||
|  |  | ||||||
| 			} | 			} | ||||||
| 			else { | 			else { | ||||||
| 				if(($i['message']) && (array_key_exists('flags',$i['message'])) && (in_array('private',$i['message']['flags']))) { | 				if(($i['message']) && (array_key_exists('flags',$i['message'])) && (in_array('private',$i['message']['flags'])) && $i['message']['type'] === 'activity') { | ||||||
| 					if(array_key_exists('public_scope',$i['message']) && $i['message']['public_scope'] === 'public') { | 					if(array_key_exists('public_scope',$i['message']) && $i['message']['public_scope'] === 'public') { | ||||||
| 						// This should not happen but until we can stop it... | 						// This should not happen but until we can stop it... | ||||||
| 						logger('private message was delivered with no recipients.'); | 						logger('private message was delivered with no recipients.'); | ||||||
| @@ -1197,6 +1204,7 @@ function zot_import($arr, $sender_url) { | |||||||
| 					$result = process_profile_delivery($i['notify']['sender'],$arr,$deliveries); | 					$result = process_profile_delivery($i['notify']['sender'],$arr,$deliveries); | ||||||
|  |  | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				elseif($i['message']['type'] === 'channel_sync') { | 				elseif($i['message']['type'] === 'channel_sync') { | ||||||
| 					// $arr = get_channelsync_elements($i['message']); | 					// $arr = get_channelsync_elements($i['message']); | ||||||
|  |  | ||||||
| @@ -1456,7 +1464,7 @@ function process_delivery($sender,$arr,$deliveries,$relay,$public = false,$reque | |||||||
| 			// As a side effect we will also do a preliminary check that we have the top-level-post, otherwise | 			// As a side effect we will also do a preliminary check that we have the top-level-post, otherwise | ||||||
| 			// processing it is pointless.  | 			// processing it is pointless.  | ||||||
|  |  | ||||||
| 			$r = q("select route from item where mid = '%s' and uid = %d limit 1", | 			$r = q("select route, id from item where mid = '%s' and uid = %d limit 1", | ||||||
| 				dbesc($arr['parent_mid']), | 				dbesc($arr['parent_mid']), | ||||||
| 				intval($channel['channel_id']) | 				intval($channel['channel_id']) | ||||||
| 			); | 			); | ||||||
| @@ -1493,14 +1501,34 @@ function process_delivery($sender,$arr,$deliveries,$relay,$public = false,$reque | |||||||
|  |  | ||||||
| 				// going downstream check that we have the same upstream provider that | 				// going downstream check that we have the same upstream provider that | ||||||
| 				// sent it to us originally. Ignore it if it came from another source | 				// sent it to us originally. Ignore it if it came from another source | ||||||
| 				// (with potentially different permissions) | 				// (with potentially different permissions). | ||||||
|  | 				// only compare the last hop since it could have arrived at the last location any number of ways. | ||||||
|  | 				// Always accept empty routes.  | ||||||
|  |  | ||||||
|  | 				$existing_route = explode(',', $r[0]['route']); | ||||||
|  | 				$routes = count($existing_route); | ||||||
|  | 				if($routes) { | ||||||
|  | 					$last_hop = array_pop($existing_route); | ||||||
|  | 					$last_prior_route = implode(',',$existing_route); | ||||||
|  | 				} | ||||||
|  | 				else { | ||||||
|  | 					$last_hop = ''; | ||||||
|  | 					$last_prior_route = ''; | ||||||
|  | 				} | ||||||
|  |  | ||||||
| 				$current_route = (($arr['route']) ? $arr['route'] . ',' : '') . $sender['hash']; | 				$current_route = (($arr['route']) ? $arr['route'] . ',' : '') . $sender['hash']; | ||||||
|  |  | ||||||
| 				if($r[0]['route'] != $current_route) { | 				if($last_hop && $last_hop != $sender['hash'] && $sender['hash'] != 'undefined') { | ||||||
|  | 					logger('comment route mismatch: parent route = ' . $r[0]['route'] . ' expected = ' . $current_route, LOGGER_DEBUG); | ||||||
|  | 					logger('comment route mismatch: parent msg = ' . $r[0]['id'],LOGGER_DEBUG); | ||||||
| 					$result[] = array($d['hash'],'comment route mismatch',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); | 					$result[] = array($d['hash'],'comment route mismatch',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); | ||||||
| 					continue; | 					continue; | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|  | 				// we'll add sender['hash'] onto this when we deliver it. $last_prior_route now has the previously stored route  | ||||||
|  | 				// *except* for the sender['hash'] which would've been the last hop before it got to us. | ||||||
|  |  | ||||||
|  | 				$arr['route'] = $last_prior_route; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -1750,6 +1778,41 @@ function process_mail_delivery($sender,$arr,$deliveries) { | |||||||
| 	return $result; | 	return $result; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function process_rating_delivery($sender,$arr) { | ||||||
|  |  | ||||||
|  | 	$dirmode = intval(get_config('system','directory_mode')); | ||||||
|  | 	if($dirmode == DIRECTORY_MODE_NORMAL) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if(! $arr['target']) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	$r = q("select * from xlink where xlink_xchan = '%s' and xlink_target = '%s' limit 1", | ||||||
|  | 		dbesc($sender['hash']), | ||||||
|  | 		dbesc($arr['target']) | ||||||
|  | 	);		 | ||||||
|  | 	if($r) { | ||||||
|  | 		$x = q("update xlink set xlink_rating = %d, xlink_rating_text = '%s', xlink_updated = '%s' where xlink_id = %d", | ||||||
|  | 			intval($arr['rating']), | ||||||
|  | 			intval($arr['rating_text']), | ||||||
|  | 			dbesc(datetime_convert()), | ||||||
|  | 			intval($r[0]['xlink_id']) | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		$x = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_updated, xlink_static ) | ||||||
|  | 			values( '%s', '%s', %d, '%s', '%s', 1 ) ", | ||||||
|  | 			dbesc($sender['hash']), | ||||||
|  | 			dbesc($arr['target']), | ||||||
|  | 			intval($arr['rating']), | ||||||
|  | 			intval($arr['rating_text']), | ||||||
|  | 			dbesc(datetime_convert()) | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 	return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| function process_profile_delivery($sender,$arr,$deliveries) { | function process_profile_delivery($sender,$arr,$deliveries) { | ||||||
|  |  | ||||||
| 	logger('process_profile_delivery', LOGGER_DEBUG); | 	logger('process_profile_delivery', LOGGER_DEBUG); | ||||||
|   | |||||||
| @@ -1532,11 +1532,13 @@ CREATE TABLE IF NOT EXISTS `xlink` ( | |||||||
|   `xlink_rating` int(11) NOT NULL DEFAULT '0', |   `xlink_rating` int(11) NOT NULL DEFAULT '0', | ||||||
|   `xlink_rating_text` TEXT NOT NULL DEFAULT '', |   `xlink_rating_text` TEXT NOT NULL DEFAULT '', | ||||||
|   `xlink_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', |   `xlink_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', | ||||||
|  |   `xlink_static` tinyint(1) NOT NULL DEFAULT '0', | ||||||
|   PRIMARY KEY (`xlink_id`), |   PRIMARY KEY (`xlink_id`), | ||||||
|   KEY `xlink_xchan` (`xlink_xchan`), |   KEY `xlink_xchan` (`xlink_xchan`), | ||||||
|   KEY `xlink_link` (`xlink_link`), |   KEY `xlink_link` (`xlink_link`), | ||||||
|   KEY `xlink_updated` (`xlink_updated`), |   KEY `xlink_updated` (`xlink_updated`), | ||||||
|   KEY `xlink_rating` (`xlink_rating`) |   KEY `xlink_rating` (`xlink_rating`), | ||||||
|  |   KEY `xlink_static` (`xlink_static`) | ||||||
| ) ENGINE=MyISAM  DEFAULT CHARSET=utf8; | ) ENGINE=MyISAM  DEFAULT CHARSET=utf8; | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- | -- -------------------------------------------------------- | ||||||
|   | |||||||
| @@ -1145,12 +1145,14 @@ CREATE TABLE "xlink" ( | |||||||
|   "xlink_rating" bigint NOT NULL DEFAULT '0', |   "xlink_rating" bigint NOT NULL DEFAULT '0', | ||||||
|   "xlink_rating_text" TEXT NOT NULL DEFAULT '', |   "xlink_rating_text" TEXT NOT NULL DEFAULT '', | ||||||
|   "xlink_updated" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', |   "xlink_updated" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', | ||||||
|  |   "xlink_static" numeric(1) NOT NULL DEFAULT '0', | ||||||
|   PRIMARY KEY ("xlink_id") |   PRIMARY KEY ("xlink_id") | ||||||
| ); | ); | ||||||
| create index "xlink_xchan" on xlink ("xlink_xchan"); | create index "xlink_xchan" on xlink ("xlink_xchan"); | ||||||
| create index "xlink_link" on xlink ("xlink_link"); | create index "xlink_link" on xlink ("xlink_link"); | ||||||
| create index "xlink_updated" on xlink ("xlink_updated"); | create index "xlink_updated" on xlink ("xlink_updated"); | ||||||
| create index "xlink_rating" on xlink ("xlink_rating"); | create index "xlink_rating" on xlink ("xlink_rating"); | ||||||
|  | create index "xlink_static" on xlink ("xlink_static"); | ||||||
| CREATE TABLE "xperm" ( | CREATE TABLE "xperm" ( | ||||||
|   "xp_id" serial NOT NULL, |   "xp_id" serial NOT NULL, | ||||||
|   "xp_client" varchar( 20 ) NOT NULL DEFAULT '', |   "xp_client" varchar( 20 ) NOT NULL DEFAULT '', | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| <?php | <?php | ||||||
|  |  | ||||||
| define( 'UPDATE_VERSION' , 1134 ); | define( 'UPDATE_VERSION' , 1135 ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * |  * | ||||||
| @@ -1537,3 +1537,14 @@ function update_r1133() { | |||||||
| 	return UPDATE_FAILED; | 	return UPDATE_FAILED; | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function update_r1134() { | ||||||
|  | 	if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {  | ||||||
|  | 		$r = q("ALTER TABLE xlink ADD xlink_static numeric(1) NOT NULL DEFAULT '0', create index xlink_static on xlink ( \"xlink_static\" ) "); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 		$r = q("ALTER TABLE xlink ADD xlink_static TINYINT( 1 ) NOT NULL DEFAULT '0', ADD INDEX ( xlink_static ) "); | ||||||
|  | 	if($r) | ||||||
|  | 		return UPDATE_SUCCESS; | ||||||
|  | 	return UPDATE_FAILED; | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								mod/acl.php
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								mod/acl.php
									
									
									
									
									
								
							| @@ -33,7 +33,7 @@ function acl_init(&$a){ | |||||||
| 		$sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc($search) . ((strpos($search,'@') === false) ? "%@%'"  : "%'")) . ") "; | 		$sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc($search) . ((strpos($search,'@') === false) ? "%@%'"  : "%'")) . ") "; | ||||||
|  |  | ||||||
| 		// This horrible mess is needed because position also returns 0 if nothing is found. W/ould be MUCH easier if it instead returned a very large value | 		// This horrible mess is needed because position also returns 0 if nothing is found. W/ould be MUCH easier if it instead returned a very large value | ||||||
| 		// Otherwise we could just order by LEAST(POSTION($search IN xchan_name),POSITION($search IN xchan_addr)). | 		// Otherwise we could just order by LEAST(POSITION($search IN xchan_name),POSITION($search IN xchan_addr)). | ||||||
| 		$order_extra2 = "CASE WHEN xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) ." then POSITION('".dbesc($search)."' IN xchan_name) else position('".dbesc($search)."' IN xchan_addr) end, "; | 		$order_extra2 = "CASE WHEN xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) ." then POSITION('".dbesc($search)."' IN xchan_name) else position('".dbesc($search)."' IN xchan_addr) end, "; | ||||||
| 		$col = ((strpos($search,'@') !== false) ? 'xchan_addr' : 'xchan_name' ); | 		$col = ((strpos($search,'@') !== false) ? 'xchan_addr' : 'xchan_name' ); | ||||||
| 		$sql_extra3 = "AND $col like " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " "; | 		$sql_extra3 = "AND $col like " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " "; | ||||||
| @@ -167,6 +167,7 @@ function acl_init(&$a){ | |||||||
| 		); | 		); | ||||||
| 	} | 	} | ||||||
| 	elseif(($type == 'a') || ($type == 'p')) { | 	elseif(($type == 'a') || ($type == 'p')) { | ||||||
|  |  | ||||||
| 		$r = q("SELECT abook_id as id, xchan_name as name, xchan_hash as hash, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag , abook_their_perms FROM abook left join xchan on abook_xchan = xchan_hash | 		$r = q("SELECT abook_id as id, xchan_name as name, xchan_hash as hash, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag , abook_their_perms FROM abook left join xchan on abook_xchan = xchan_hash | ||||||
| 			WHERE abook_channel = %d | 			WHERE abook_channel = %d | ||||||
| 			and xchan_deleted = 0 | 			and xchan_deleted = 0 | ||||||
| @@ -174,6 +175,7 @@ function acl_init(&$a){ | |||||||
| 			ORDER BY xchan_name ASC ", | 			ORDER BY xchan_name ASC ", | ||||||
| 			intval(local_user()) | 			intval(local_user()) | ||||||
| 		); | 		); | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
| 	elseif($type == 'x') { | 	elseif($type == 'x') { | ||||||
| 		$r = navbar_complete($a); | 		$r = navbar_complete($a); | ||||||
| @@ -203,7 +205,7 @@ function acl_init(&$a){ | |||||||
| 		foreach($r as $g){ | 		foreach($r as $g){ | ||||||
|  |  | ||||||
| 			// remove RSS feeds from ACLs - they are inaccessible | 			// remove RSS feeds from ACLs - they are inaccessible | ||||||
| 			if(strpos($g['hash'],'/')) | 			if(strpos($g['hash'],'/') && $type != 'a') | ||||||
| 				continue; | 				continue; | ||||||
|  |  | ||||||
| 			if(($g['abook_their_perms'] & PERMS_W_TAGWALL) && $type == 'c' && (! $noforums)) { | 			if(($g['abook_their_perms'] & PERMS_W_TAGWALL) && $type == 'c' && (! $noforums)) { | ||||||
| @@ -227,7 +229,7 @@ function acl_init(&$a){ | |||||||
| 				"id"	   => $g['id'], | 				"id"	   => $g['id'], | ||||||
| 				"xid"      => $g['hash'], | 				"xid"      => $g['hash'], | ||||||
| 				"link"     => $g['nick'], | 				"link"     => $g['nick'], | ||||||
| 				"nick"     => substr($g['nick'],0,strpos($g['nick'],'@')), | 				"nick"     => (($g['nick']) ? substr($g['nick'],0,strpos($g['nick'],'@')) : t('RSS')), | ||||||
| 				"self"     => (($g['abook_flags'] & ABOOK_FLAG_SELF) ? 'abook-self' : ''), | 				"self"     => (($g['abook_flags'] & ABOOK_FLAG_SELF) ? 'abook-self' : ''), | ||||||
| 				"taggable" => '', | 				"taggable" => '', | ||||||
| 				"label"    => '', | 				"label"    => '', | ||||||
| @@ -243,6 +245,8 @@ function acl_init(&$a){ | |||||||
| 		'items'	=> $items, | 		'items'	=> $items, | ||||||
| 	); | 	); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	 | ||||||
| 	echo json_encode($o); | 	echo json_encode($o); | ||||||
|  |  | ||||||
| 	killme(); | 	killme(); | ||||||
|   | |||||||
| @@ -275,16 +275,20 @@ function directory_content(&$a) { | |||||||
|  |  | ||||||
| 						call_hooks('directory_item', $arr); | 						call_hooks('directory_item', $arr); | ||||||
|  |  | ||||||
| 						if($sort_order == '' && $suggest) { |  | ||||||
| 							$entries[$addresses[$rr['address']]] = $arr['entry']; // Use the same indexes as originally to get the best suggestion first |  | ||||||
| 						} |  | ||||||
| 						else { |  | ||||||
| 							$entries[] = $arr['entry']; |  | ||||||
| 						} |  | ||||||
| 						unset($profile); | 						unset($profile); | ||||||
| 						unset($location); | 						unset($location); | ||||||
|  |  | ||||||
|  | 						if(! $arr['entry']) { | ||||||
|  | 							continue; | ||||||
|  | 						}			 | ||||||
| 						 | 						 | ||||||
|  | 						if($sort_order == '' && $suggest) { | ||||||
|  | 							$entries[$addresses[$rr['address']]] = $arr['entry']; // Use the same indexes as originally to get the best suggestion first | ||||||
|  | 						} | ||||||
|  |  | ||||||
|  | 						else { | ||||||
|  | 							$entries[] = $arr['entry']; | ||||||
|  | 						} | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
| 					ksort($entries); // Sort array by key so that foreach-constructs work as expected | 					ksort($entries); // Sort array by key so that foreach-constructs work as expected | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								mod/help.php
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								mod/help.php
									
									
									
									
									
								
							| @@ -37,20 +37,28 @@ function help_content(&$a) { | |||||||
| 	$text = ''; | 	$text = ''; | ||||||
|  |  | ||||||
| 	if(argc() > 1) { | 	if(argc() > 1) { | ||||||
| 		$text = load_doc_file('doc/' . $a->argv[1] . '.md'); | 		$path = ''; | ||||||
| 		$a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags(argv(1)))); | 		for($x = 1; $x < argc(); $x ++) { | ||||||
|  | 			if(strlen($path)) | ||||||
|  | 				$path .= '/'; | ||||||
|  | 			$path .= argv($x); | ||||||
|  | 		} | ||||||
|  | 		$title = basename($path); | ||||||
|  |  | ||||||
|  | 		$text = load_doc_file('doc/' . $path . '.md'); | ||||||
|  | 		$a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title))); | ||||||
|  |  | ||||||
| 		if(! $text) { | 		if(! $text) { | ||||||
| 			$text = load_doc_file('doc/' . $a->argv[1] . '.bb'); | 			$text = load_doc_file('doc/' . $path . '.bb'); | ||||||
| 			if($text) | 			if($text) | ||||||
| 				$doctype = 'bbcode'; | 				$doctype = 'bbcode'; | ||||||
| 			$a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('_',' ',notags(argv(1)))); | 			$a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('_',' ',notags($title))); | ||||||
| 		} | 		} | ||||||
| 		if(! $text) { | 		if(! $text) { | ||||||
| 			$text = load_doc_file('doc/' . $a->argv[1] . '.html'); | 			$text = load_doc_file('doc/' . $path . '.html'); | ||||||
| 			if($text) | 			if($text) | ||||||
| 				$doctype = 'html'; | 				$doctype = 'html'; | ||||||
| 			$a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags(argv(1)))); | 			$a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title))); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -73,27 +73,37 @@ function sharedwithme_content(&$a) { | |||||||
| 		dbesc($channel['channel_hash']) | 		dbesc($channel['channel_hash']) | ||||||
| 	); | 	); | ||||||
|  |  | ||||||
| 	$o = profile_tabs($a, $is_owner, $channel['channel_address']); | 	$items =array(); | ||||||
|  |  | ||||||
| 	$o .= '<div class="section-title-wrapper">'; |  | ||||||
|  |  | ||||||
| 	$o .= '<a href="/sharedwithme/dropall" onclick="return confirmDelete();" class="btn btn-xs btn-default pull-right"><i class="icon-trash"></i> ' . t('Remove all entries') . '</a>'; |  | ||||||
| 	 |  | ||||||
| 	$o .= '<h2>' . t('Files shared with me') . '</h2>'; |  | ||||||
|  |  | ||||||
| 	$o .= '</div>'; |  | ||||||
|  |  | ||||||
| 	$o .= '<div class="section-content-wrapper">'; |  | ||||||
|  |  | ||||||
| 	if($r) { | 	if($r) { | ||||||
| 		foreach($r as $rr) { | 		foreach($r as $rr) { | ||||||
| 			$object = json_decode($rr['object'],true); | 			$object = json_decode($rr['object'],true); | ||||||
| 			$url = rawurldecode(get_rel_link($object['link'],'alternate')); |  | ||||||
| 			$o .= '<a href="' . $url . '?f=&zid=' . $channel['xchan_addr'] . '">' . $url . '</a> <a href="/sharedwithme/' . $rr['id'] . '/drop" onclick="return confirmDelete();"><i class="icon-trash drop-icons"></i></a><br><br>'; | 			$item = array(); | ||||||
|  | 			$item['id'] = $rr['id']; | ||||||
|  | 			$item['objfiletype'] = $object['filetype']; | ||||||
|  | 			$item['objfiletypeclass'] = getIconFromType($object['filetype']); | ||||||
|  | 			$item['objurl'] = rawurldecode(get_rel_link($object['link'],'alternate')) . '?f=&zid=' . $channel['xchan_addr']; | ||||||
|  | 			$item['objfilename'] = $object['filename']; | ||||||
|  | 			$item['objfilesize'] = userReadableSize($object['filesize']); | ||||||
|  | 			$item['objedited'] = $object['edited']; | ||||||
|  |  | ||||||
|  | 			$items[] = $item; | ||||||
|  |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	$o .= '</div>'; | 	$o = profile_tabs($a, $is_owner, $channel['channel_address']); | ||||||
|  |  | ||||||
|  | 	$o .= replace_macros(get_markup_template('sharedwithme.tpl'), array( | ||||||
|  | 		'$header' => t('Files: shared with me'), | ||||||
|  | 		'$name' => t('Name'), | ||||||
|  | 		'$size' => t('Size'), | ||||||
|  | 		'$lastmod' => t('Last Modified'), | ||||||
|  | 		'$dropall' => t('Remove all files'), | ||||||
|  | 		'$drop' => t('Remove this file'), | ||||||
|  | 		'$items' => $items | ||||||
|  | 	)); | ||||||
|  |  | ||||||
| 	return $o; | 	return $o; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| 2015-01-26.928 | 2015-01-27.929 | ||||||
|   | |||||||
| @@ -195,6 +195,10 @@ a.wall-item-name-link { | |||||||
| 	clear: both; | 	clear: both; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .shared_header { | ||||||
|  | 	margin-bottom: 20px; | ||||||
|  | } | ||||||
|  |  | ||||||
| /* comment_item */ | /* comment_item */ | ||||||
|  |  | ||||||
| .comment-edit-text-empty, .comment-edit-text-full { | .comment-edit-text-empty, .comment-edit-text-full { | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								view/css/mod_sharedwithme.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								view/css/mod_sharedwithme.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | #cloud-index { | ||||||
|  | 	width: 100%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #cloud-index td:nth-child(1){ | ||||||
|  | 	padding: 7px 3px 7px 10px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #cloud-index th:nth-child(4), | ||||||
|  | #cloud-index td:nth-child(4){ | ||||||
|  | 	padding: 7px 3px; | ||||||
|  | 	white-space: nowrap; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #cloud-index th:nth-child(5), | ||||||
|  | #cloud-index td:nth-child(5){ | ||||||
|  | 	padding: 7px 10px 7px 7px; | ||||||
|  | 	white-space: nowrap; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .cloud-index-tool { | ||||||
|  | 	padding: 7px 10px; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								view/tpl/sharedwithme.tpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								view/tpl/sharedwithme.tpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | <div class="section-title-wrapper"> | ||||||
|  | 	<a href="/sharedwithme/dropall" onclick="return confirmDelete();" class="btn btn-xs btn-default pull-right"><i class="icon-trash"></i> {{$dropall}}</a> | ||||||
|  | 	<h2>{{$header}}</h2> | ||||||
|  | </div> | ||||||
|  | <div class="generic-content-wrapper section-content-wrapper-np"> | ||||||
|  | 	<table id="cloud-index"> | ||||||
|  | 		<tr> | ||||||
|  | 			<th width="1%"></th> | ||||||
|  | 			<th width="92%">{{$name}}</th> | ||||||
|  | 			<th width="1%"></th> | ||||||
|  | 			<th width="1%" class="hidden-xs">{{$size}}</th> | ||||||
|  | 			<th width="1%" class="hidden-xs">{{$lastmod}}</th> | ||||||
|  | 		</tr> | ||||||
|  | 	{{foreach $items as $item}} | ||||||
|  | 		<tr id="cloud-index-{{$item.id}}"> | ||||||
|  | 			<td><i class="{{$item.objfiletypeclass}}" title="{{$item.objfiletype}}"></i></td> | ||||||
|  | 			<td><a href="{{$item.objurl}}">{{$item.objfilename}}</a></td> | ||||||
|  | 			<td class="cloud-index-tool"><a href="/sharedwithme/{{$item.id}}/drop" title="{{$drop}}" onclick="return confirmDelete();"><i class="icon-trash drop-icons"></i></a></td> | ||||||
|  | 			<td class="hidden-xs">{{$item.objfilesize}}</td> | ||||||
|  | 			<td class="hidden-xs">{{$item.objedited}}</td> | ||||||
|  | 		</tr> | ||||||
|  | 	{{/foreach}} | ||||||
|  | 	</table> | ||||||
|  | </div> | ||||||
		Reference in New Issue
	
	Block a user