Merge https://github.com/friendica/friendica into pull
|  | @ -346,7 +346,7 @@ function bb2diaspora($Text,$preserve_nl = false) { | ||||||
| 
 | 
 | ||||||
| 	// If we found an event earlier, strip out all the event code and replace with a reformatted version.
 | 	// If we found an event earlier, strip out all the event code and replace with a reformatted version.
 | ||||||
| 
 | 
 | ||||||
| 	if(x($ev,'desc') && x($ev,'start')) { | 	if(x($ev,'start')) { | ||||||
| 
 | 
 | ||||||
| 		$sub = format_event_diaspora($ev); | 		$sub = format_event_diaspora($ev); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -47,6 +47,67 @@ function bb_unspacefy_and_trim($st) { | ||||||
|   return $unspacefied; |   return $unspacefied; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | if(! function_exists('bb_extract_images')) { | ||||||
|  | function bb_extract_images($body) { | ||||||
|  | 
 | ||||||
|  | 	$saved_image = array(); | ||||||
|  | 	$orig_body = $body; | ||||||
|  | 	$new_body = ''; | ||||||
|  | 
 | ||||||
|  | 	$cnt = 0; | ||||||
|  | 	$img_start = strpos($orig_body, '[img'); | ||||||
|  | 	$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 	$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); | ||||||
|  | 	while(($img_st_close !== false) && ($img_end !== false)) { | ||||||
|  | 
 | ||||||
|  | 		$img_st_close++; // make it point to AFTER the closing bracket
 | ||||||
|  | 		$img_end += $img_start; | ||||||
|  | 
 | ||||||
|  | 		if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) { | ||||||
|  | 			// This is an embedded image
 | ||||||
|  | 
 | ||||||
|  | 			$saved_image[$cnt] = substr($orig_body, $img_start + $img_st_close, $img_end - ($img_start + $img_st_close)); | ||||||
|  | 			$new_body = $new_body . substr($orig_body, 0, $img_start) . '[$#saved_image' . $cnt . '#$]'; | ||||||
|  | 
 | ||||||
|  | 			$cnt++; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			$new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]')); | ||||||
|  | 
 | ||||||
|  | 		$orig_body = substr($orig_body, $img_end + strlen('[/img]')); | ||||||
|  | 
 | ||||||
|  | 		if($orig_body === false) // in case the body ends on a closing image tag
 | ||||||
|  | 			$orig_body = ''; | ||||||
|  | 
 | ||||||
|  | 		$img_start = strpos($orig_body, '[img'); | ||||||
|  | 		$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 		$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	$new_body = $new_body . $orig_body; | ||||||
|  | 
 | ||||||
|  | 	return array('body' => $new_body, 'images' => $saved_image); | ||||||
|  | }} | ||||||
|  | 
 | ||||||
|  | if(! function_exists('bb_replace_images')) { | ||||||
|  | function bb_replace_images($body, $images) { | ||||||
|  | 
 | ||||||
|  | 	$newbody = $body; | ||||||
|  | 
 | ||||||
|  | 	$cnt = 0; | ||||||
|  | 	foreach($images as $image) { | ||||||
|  | 		// We're depending on the property of 'foreach' (specified on the PHP website) that
 | ||||||
|  | 		// it loops over the array starting from the first element and going sequentially
 | ||||||
|  | 		// to the last element
 | ||||||
|  | 		$newbody = str_replace('[$#saved_image' . $cnt . '#$]', '<img src="' . $image .'" alt="' . t('Image/photo') . '" />', $newbody); | ||||||
|  | 		$cnt++; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return $newbody; | ||||||
|  | }} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 	// BBcode 2 HTML was written by WAY2WEB.net
 | 	// BBcode 2 HTML was written by WAY2WEB.net
 | ||||||
| 	// extended to work with Mistpark/Friendica - Mike Macgirvin
 | 	// extended to work with Mistpark/Friendica - Mike Macgirvin
 | ||||||
| 
 | 
 | ||||||
|  | @ -54,29 +115,21 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) { | ||||||
| 
 | 
 | ||||||
| 	$a = get_app(); | 	$a = get_app(); | ||||||
| 
 | 
 | ||||||
| 	// Hide all [noparse] contained bbtags spacefying them
 | 	// Hide all [noparse] contained bbtags by spacefying them
 | ||||||
|  | 	// POSSIBLE BUG --> Will the 'preg' functions crash if there's an embedded image?
 | ||||||
| 
 | 
 | ||||||
| 	$Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text); | 	$Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text); | ||||||
| 	$Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_spacefy',$Text); | 	$Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_spacefy',$Text); | ||||||
| 	$Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text); | 	$Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	// Extract a single private image which uses data url's since preg has issues with
 | 	// Extract the private images which use data url's since preg has issues with
 | ||||||
| 	// large data sizes. Stash it away while we do bbcode conversion, and then put it back
 | 	// large data sizes. Stash them away while we do bbcode conversion, and then put them back
 | ||||||
| 	// in after we've done all the regex matching. We cannot use any preg functions to do this.
 | 	// in after we've done all the regex matching. We cannot use any preg functions to do this.
 | ||||||
| 
 | 
 | ||||||
| 	$saved_image = ''; | 	$extracted = bb_extract_images($Text); | ||||||
| 	$img_start = strpos($Text,'[img]data:'); | 	$Text = $extracted['body']; | ||||||
| 	$img_end = strpos($Text,'[/img]'); | 	$saved_image = $extracted['images']; | ||||||
| 
 |  | ||||||
| 	if($img_start !== false && $img_end !== false && $img_end > $img_start) { |  | ||||||
| 		$start_fragment = substr($Text,0,$img_start); |  | ||||||
| 		$img_start += strlen('[img]'); |  | ||||||
| 		$saved_image = substr($Text,$img_start,$img_end - $img_start); |  | ||||||
| 		$end_fragment = substr($Text,$img_end + strlen('[/img]')); |  | ||||||
| //		logger('saved_image: ' . $saved_image,LOGGER_DEBUG);
 |  | ||||||
| 		$Text = $start_fragment . '[$#saved_image#$]' . $end_fragment; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	// If we find any event code, turn it into an event.
 | 	// If we find any event code, turn it into an event.
 | ||||||
| 	// After we're finished processing the bbcode we'll
 | 	// After we're finished processing the bbcode we'll
 | ||||||
|  | @ -333,8 +386,9 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) { | ||||||
| 
 | 
 | ||||||
| 	// fix any escaped ampersands that may have been converted into links
 | 	// fix any escaped ampersands that may have been converted into links
 | ||||||
| 	$Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text); | 	$Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text); | ||||||
| 	if(strlen($saved_image)) | 
 | ||||||
| 		$Text = str_replace('[$#saved_image#$]','<img src="' . $saved_image .'" alt="' . t('Image/photo') . '" />',$Text); | 	if($saved_image) | ||||||
|  | 		$Text = bb_replace_images($Text, $saved_image); | ||||||
| 
 | 
 | ||||||
| 	call_hooks('bbcode',$Text); | 	call_hooks('bbcode',$Text); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,30 +1,92 @@ | ||||||
| <?php | <?php | ||||||
| 
 | 
 | ||||||
|  | // Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
 | ||||||
|  | // is identical to the code in mod/message.php for 'item_extract_images' and
 | ||||||
|  | // 'item_redir_and_replace_images'
 | ||||||
|  | if(! function_exists('item_extract_images')) { | ||||||
|  | function item_extract_images($body) { | ||||||
|  | 
 | ||||||
|  | 	$saved_image = array(); | ||||||
|  | 	$orig_body = $body; | ||||||
|  | 	$new_body = ''; | ||||||
|  | 
 | ||||||
|  | 	$cnt = 0; | ||||||
|  | 	$img_start = strpos($orig_body, '[img'); | ||||||
|  | 	$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 	$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); | ||||||
|  | 	while(($img_st_close !== false) && ($img_end !== false)) { | ||||||
|  | 
 | ||||||
|  | 		$img_st_close++; // make it point to AFTER the closing bracket
 | ||||||
|  | 		$img_end += $img_start; | ||||||
|  | 
 | ||||||
|  | 		if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) { | ||||||
|  | 			// This is an embedded image
 | ||||||
|  | 
 | ||||||
|  | 			$saved_image[$cnt] = substr($orig_body, $img_start + $img_st_close, $img_end - ($img_start + $img_st_close)); | ||||||
|  | 			$new_body = $new_body . substr($orig_body, 0, $img_start) . '[!#saved_image' . $cnt . '#!]'; | ||||||
|  | 
 | ||||||
|  | 			$cnt++; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			$new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]')); | ||||||
|  | 
 | ||||||
|  | 		$orig_body = substr($orig_body, $img_end + strlen('[/img]')); | ||||||
|  | 
 | ||||||
|  | 		if($orig_body === false) // in case the body ends on a closing image tag
 | ||||||
|  | 			$orig_body = ''; | ||||||
|  | 
 | ||||||
|  | 		$img_start = strpos($orig_body, '[img'); | ||||||
|  | 		$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 		$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	$new_body = $new_body . $orig_body; | ||||||
|  | 
 | ||||||
|  | 	return array('body' => $new_body, 'images' => $saved_image); | ||||||
|  | }} | ||||||
|  | 
 | ||||||
|  | if(! function_exists('item_redir_and_replace_images')) { | ||||||
|  | function item_redir_and_replace_images($body, $images, $cid) { | ||||||
|  | 
 | ||||||
|  | 	$origbody = $body; | ||||||
|  | 	$newbody = ''; | ||||||
|  | 
 | ||||||
|  | 	for($i = 0; $i < count($images); $i++) { | ||||||
|  | 		$search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is'; | ||||||
|  | 		$replace = '[url=' . z_path() . '/redir/' . $cid  | ||||||
|  | 		           . '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ; | ||||||
|  | 
 | ||||||
|  | 		$img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]'); | ||||||
|  | 		$process_part = substr($origbody, 0, $img_end); | ||||||
|  | 		$origbody = substr($origbody, $img_end); | ||||||
|  | 
 | ||||||
|  | 		$process_part = preg_replace($search, $replace, $process_part); | ||||||
|  | 		$newbody = $newbody . $process_part; | ||||||
|  | 	} | ||||||
|  | 	$newbody = $newbody . $origbody; | ||||||
|  | 
 | ||||||
|  | 	$cnt = 0; | ||||||
|  | 	foreach($images as $image) { | ||||||
|  | 		// We're depending on the property of 'foreach' (specified on the PHP website) that
 | ||||||
|  | 		// it loops over the array starting from the first element and going sequentially
 | ||||||
|  | 		// to the last element
 | ||||||
|  | 		$newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody); | ||||||
|  | 		$cnt++; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return $newbody; | ||||||
|  | }} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Render actions localized |  * Render actions localized | ||||||
|  */ |  */ | ||||||
| function localize_item(&$item){ | function localize_item(&$item){ | ||||||
| 
 | 
 | ||||||
| 	$Text = $item['body']; | 	$extracted = item_extract_images($item['body']); | ||||||
| 	$saved_image = ''; | 	if($extracted['images']) | ||||||
| 	$img_start = strpos($Text,'[img]data:'); | 		$item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']); | ||||||
| 	$img_end = strpos($Text,'[/img]'); |  | ||||||
| 
 |  | ||||||
| 	if($img_start !== false && $img_end !== false && $img_end > $img_start) { |  | ||||||
| 		$start_fragment = substr($Text,0,$img_start); |  | ||||||
| 		$img_start += strlen('[img]'); |  | ||||||
| 		$saved_image = substr($Text,$img_start,$img_end - $img_start); |  | ||||||
| 		$end_fragment = substr($Text,$img_end + strlen('[/img]'));		 |  | ||||||
| 		$Text = $start_fragment . '[!#saved_image#!]' . $end_fragment; |  | ||||||
| 		$search = '/\[url\=(.*?)\]\[!#saved_image#!\]\[\/url\]' . '/is'; |  | ||||||
| 		$replace = '[url=' . z_path() . '/redir/' . $item['contact-id']  |  | ||||||
| 			. '?f=1&url=' . '$1' . '][!#saved_image#!][/url]' ; |  | ||||||
| 
 |  | ||||||
| 		$Text = preg_replace($search,$replace,$Text); |  | ||||||
| 
 |  | ||||||
| 		if(strlen($saved_image)) |  | ||||||
| 			$item['body'] = str_replace('[!#saved_image#!]', '[img]' . $saved_image . '[/img]',$Text); |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">"; | 	$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">"; | ||||||
| 	if ($item['verb']=== ACTIVITY_LIKE || $item['verb']=== ACTIVITY_DISLIKE){ | 	if ($item['verb']=== ACTIVITY_LIKE || $item['verb']=== ACTIVITY_DISLIKE){ | ||||||
|  |  | ||||||
|  | @ -4,6 +4,8 @@ require_once('include/bbcode.php'); | ||||||
| require_once('include/oembed.php'); | require_once('include/oembed.php'); | ||||||
| require_once('include/salmon.php'); | require_once('include/salmon.php'); | ||||||
| require_once('include/crypto.php'); | require_once('include/crypto.php'); | ||||||
|  | require_once('include/Photo.php'); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) { | function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) { | ||||||
| 
 | 
 | ||||||
|  | @ -278,7 +280,99 @@ function construct_activity_target($item) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return ''; | 	return ''; | ||||||
| }  | } | ||||||
|  | 
 | ||||||
|  | /* limit_body_size() | ||||||
|  |  * | ||||||
|  |  *		The purpose of this function is to apply system message length limits to | ||||||
|  |  *		imported messages without including any embedded photos in the length | ||||||
|  |  */ | ||||||
|  | if(! function_exists('limit_body_size')) { | ||||||
|  | function limit_body_size($body) { | ||||||
|  | 
 | ||||||
|  | 	logger('limit_body_size: start', LOGGER_DEBUG); | ||||||
|  | 
 | ||||||
|  | 	$maxlen = get_max_import_size(); | ||||||
|  | 
 | ||||||
|  | 	// If the length of the body, including the embedded images, is smaller
 | ||||||
|  | 	// than the maximum, then don't waste time looking for the images
 | ||||||
|  | 	if($maxlen && (strlen($body) > $maxlen)) { | ||||||
|  | 
 | ||||||
|  | 		logger('limit_body_size: the total body length exceeds the limit', LOGGER_DEBUG); | ||||||
|  | 
 | ||||||
|  | 		$orig_body = $body; | ||||||
|  | 		$new_body = ''; | ||||||
|  | 		$textlen = 0; | ||||||
|  | 		$max_found = false; | ||||||
|  | 
 | ||||||
|  | 		$img_start = strpos($orig_body, '[img'); | ||||||
|  | 		$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 		$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); | ||||||
|  | 		while(($img_st_close !== false) && ($img_end !== false)) { | ||||||
|  | 
 | ||||||
|  | 			$img_st_close++; // make it point to AFTER the closing bracket
 | ||||||
|  | 			$img_end += $img_start; | ||||||
|  | 			$img_end += strlen('[/img]'); | ||||||
|  | 
 | ||||||
|  | 			if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) { | ||||||
|  | 				// This is an embedded image
 | ||||||
|  | 
 | ||||||
|  | 				if( ($textlen + $img_start) > $maxlen ) { | ||||||
|  | 					if($textlen < $maxlen) { | ||||||
|  | 						logger('limit_body_size: the limit happens before an embedded image', LOGGER_DEBUG); | ||||||
|  | 						$new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); | ||||||
|  | 						$textlen = $maxlen; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				else { | ||||||
|  | 					$new_body = $new_body . substr($orig_body, 0, $img_start); | ||||||
|  | 					$textlen += $img_start; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				$new_body = $new_body . substr($orig_body, $img_start, $img_end - $img_start); | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 
 | ||||||
|  | 				if( ($textlen + $img_end) > $maxlen ) { | ||||||
|  | 					if($textlen < $maxlen) { | ||||||
|  | 						logger('limit_body_size: the limit happens before the end of a non-embedded image', LOGGER_DEBUG); | ||||||
|  | 						$new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); | ||||||
|  | 						$textlen = $maxlen; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				else { | ||||||
|  | 					$new_body = $new_body . substr($orig_body, 0, $img_end); | ||||||
|  | 					$textlen += $img_end; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			$orig_body = substr($orig_body, $img_end); | ||||||
|  | 
 | ||||||
|  | 			if($orig_body === false) // in case the body ends on a closing image tag
 | ||||||
|  | 				$orig_body = ''; | ||||||
|  | 
 | ||||||
|  | 			$img_start = strpos($orig_body, '[img'); | ||||||
|  | 			$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 			$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if( ($textlen + strlen($orig_body)) > $maxlen) { | ||||||
|  | 			if($textlen < $maxlen) { | ||||||
|  | 				logger('limit_body_size: the limit happens after the end of the last image', LOGGER_DEBUG); | ||||||
|  | 				$new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); | ||||||
|  | 				$textlen = $maxlen; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			logger('limit_body_size: the text size with embedded images extracted did not violate the limit', LOGGER_DEBUG); | ||||||
|  | 			$new_body = $new_body . $orig_body; | ||||||
|  | 			$textlen += strlen($orig_body); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return $new_body; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 		return $body; | ||||||
|  | }} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -414,9 +508,8 @@ function get_atom_elements($feed,$item) { | ||||||
| 		$res['body'] = notags(base64url_decode($res['body'])); | 		$res['body'] = notags(base64url_decode($res['body'])); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	$maxlen = get_max_import_size(); | 	 | ||||||
| 	if($maxlen && (strlen($res['body']) > $maxlen)) | 	$res['body'] = limit_body_size($res['body']); | ||||||
| 		$res['body'] = substr($res['body'],0, $maxlen); |  | ||||||
| 
 | 
 | ||||||
| 	// It isn't certain at this point whether our content is plaintext or html and we'd be foolish to trust 
 | 	// It isn't certain at this point whether our content is plaintext or html and we'd be foolish to trust 
 | ||||||
| 	// the content type. Our own network only emits text normally, though it might have been converted to 
 | 	// the content type. Our own network only emits text normally, though it might have been converted to 
 | ||||||
|  | @ -3088,20 +3181,33 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) { | ||||||
| 	return $o; | 	return $o; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function fix_private_photos($s,$uid, $item = null, $cid = 0) { | function fix_private_photos($s, $uid, $item = null, $cid = 0) { | ||||||
| 	$a = get_app(); | 	$a = get_app(); | ||||||
| 
 | 
 | ||||||
| 	logger('fix_private_photos', LOGGER_DEBUG); | 	logger('fix_private_photos', LOGGER_DEBUG); | ||||||
| 	$site = substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')); | 	$site = substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')); | ||||||
| 
 | 
 | ||||||
| 	if(preg_match("/\[img(.*?)\](.*?)\[\/img\]/is",$s,$matches)) { | 	$orig_body = $s; | ||||||
| 		$image = $matches[2]; | 	$new_body = ''; | ||||||
|  | 
 | ||||||
|  | 	$img_start = strpos($orig_body, '[img'); | ||||||
|  | 	$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 	$img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/img]') : false); | ||||||
|  | 	while( ($img_st_close !== false) && ($img_len !== false) ) { | ||||||
|  | 
 | ||||||
|  | 		$img_st_close++; // make it point to AFTER the closing bracket
 | ||||||
|  | 		$image = substr($orig_body, $img_start + $img_st_close, $img_len); | ||||||
|  | 
 | ||||||
| 		logger('fix_private_photos: found photo ' . $image, LOGGER_DEBUG); | 		logger('fix_private_photos: found photo ' . $image, LOGGER_DEBUG); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 		if(stristr($image , $site . '/photo/')) { | 		if(stristr($image , $site . '/photo/')) { | ||||||
|  | 			// Only embed locally hosted photos
 | ||||||
| 			$replace = false; | 			$replace = false; | ||||||
| 			$i = basename($image); | 			$i = basename($image); | ||||||
| 			$i = str_replace(array('.jpg','.png'),array('',''),$i); | 			$i = str_replace(array('.jpg','.png'),array('',''),$i); | ||||||
| 			$x = strpos($i,'-'); | 			$x = strpos($i,'-'); | ||||||
|  | 
 | ||||||
| 			if($x) { | 			if($x) { | ||||||
| 				$res = substr($i,$x+1); | 				$res = substr($i,$x+1); | ||||||
| 				$i = substr($i,0,$x); | 				$i = substr($i,0,$x); | ||||||
|  | @ -3119,14 +3225,6 @@ function fix_private_photos($s,$uid, $item = null, $cid = 0) { | ||||||
| 					// 3. Otherwise, if we have an item, see if the item permissions match the photo
 | 					// 3. Otherwise, if we have an item, see if the item permissions match the photo
 | ||||||
| 					//    permissions, regardless of order but first check to see if they're an exact
 | 					//    permissions, regardless of order but first check to see if they're an exact
 | ||||||
| 					//    match to save some processing overhead.
 | 					//    match to save some processing overhead.
 | ||||||
| 				 |  | ||||||
| 					// Currently we only embed one private photo per message so as not to hit import 
 |  | ||||||
| 					// size limits at the receiving end.
 |  | ||||||
| 
 |  | ||||||
| 					// To embed multiples, we would need to parse out the embedded photos on message
 |  | ||||||
| 					// receipt and limit size based only on the text component. Would also need to
 |  | ||||||
| 					// ignore all photos during bbcode translation and item localisation, as these
 |  | ||||||
| 					// will hit internal regex backtrace limits.  
 |  | ||||||
| 
 | 
 | ||||||
| 					if(has_permissions($r[0])) { | 					if(has_permissions($r[0])) { | ||||||
| 						if($cid) { | 						if($cid) { | ||||||
|  | @ -3141,15 +3239,45 @@ function fix_private_photos($s,$uid, $item = null, $cid = 0) { | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 					if($replace) { | 					if($replace) { | ||||||
|  | 						$data = $r[0]['data']; | ||||||
|  | 						$type = $r[0]['type']; | ||||||
|  | 
 | ||||||
|  | 						// If a custom width and height were specified, apply before embedding
 | ||||||
|  | 						if(preg_match("/\[img\=([0-9]*)x([0-9]*)\]/is", substr($orig_body, $img_start, $img_st_close), $match)) { | ||||||
|  | 							logger('fix_private_photos: scaling photo', LOGGER_DEBUG); | ||||||
|  | 
 | ||||||
|  | 							$width = intval($match[1]); | ||||||
|  | 							$height = intval($match[2]); | ||||||
|  | 
 | ||||||
|  | 							$ph = new Photo($data, $type); | ||||||
|  | 							if($ph->is_valid()) { | ||||||
|  | 								$ph->scaleImage(max($width, $height)); | ||||||
|  | 								$data = $ph->imageString(); | ||||||
|  | 								$type = $ph->getType(); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 
 | ||||||
| 						logger('fix_private_photos: replacing photo', LOGGER_DEBUG); | 						logger('fix_private_photos: replacing photo', LOGGER_DEBUG); | ||||||
| 						$s = str_replace($image, 'data:' . $r[0]['type'] . ';base64,' . base64_encode($r[0]['data']), $s); | 						$image = 'data:' . $type . ';base64,' . base64_encode($data); | ||||||
| 						logger('fix_private_photos: replaced: ' . $s, LOGGER_DATA); | 						logger('fix_private_photos: replaced: ' . $image, LOGGER_DATA); | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		}	 | 		}	 | ||||||
|  | 
 | ||||||
|  | 		$new_body = $new_body . substr($orig_body, 0, $img_start + $img_st_close) . $image . '[/img]'; | ||||||
|  | 		$orig_body = substr($orig_body, $img_start + $img_st_close + $img_len + strlen('[/img]')); | ||||||
|  | 		if($orig_body === false) | ||||||
|  | 			$orig_body = ''; | ||||||
|  | 
 | ||||||
|  | 		$img_start = strpos($orig_body, '[img'); | ||||||
|  | 		$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 		$img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/img]') : false); | ||||||
| 	} | 	} | ||||||
| 	return($s); | 
 | ||||||
|  | 	$new_body = $new_body . $orig_body; | ||||||
|  | 
 | ||||||
|  | 	return($new_body); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										0
									
								
								include/security.php
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
							
								
								
									
										101
									
								
								mod/message.php
									
										
									
									
									
								
							
							
						
						|  | @ -88,6 +88,84 @@ function message_post(&$a) { | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
 | ||||||
|  | // is identical to the code in include/conversation.php
 | ||||||
|  | if(! function_exists('item_extract_images')) { | ||||||
|  | function item_extract_images($body) { | ||||||
|  | 
 | ||||||
|  | 	$saved_image = array(); | ||||||
|  | 	$orig_body = $body; | ||||||
|  | 	$new_body = ''; | ||||||
|  | 
 | ||||||
|  | 	$cnt = 0; | ||||||
|  | 	$img_start = strpos($orig_body, '[img'); | ||||||
|  | 	$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 	$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); | ||||||
|  | 	while(($img_st_close !== false) && ($img_end !== false)) { | ||||||
|  | 
 | ||||||
|  | 		$img_st_close++; // make it point to AFTER the closing bracket
 | ||||||
|  | 		$img_end += $img_start; | ||||||
|  | 
 | ||||||
|  | 		if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) { | ||||||
|  | 			// This is an embedded image
 | ||||||
|  | 
 | ||||||
|  | 			$saved_image[$cnt] = substr($orig_body, $img_start + $img_st_close, $img_end - ($img_start + $img_st_close)); | ||||||
|  | 			$new_body = $new_body . substr($orig_body, 0, $img_start) . '[!#saved_image' . $cnt . '#!]'; | ||||||
|  | 
 | ||||||
|  | 			$cnt++; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			$new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]')); | ||||||
|  | 
 | ||||||
|  | 		$orig_body = substr($orig_body, $img_end + strlen('[/img]')); | ||||||
|  | 
 | ||||||
|  | 		if($orig_body === false) // in case the body ends on a closing image tag
 | ||||||
|  | 			$orig_body = ''; | ||||||
|  | 
 | ||||||
|  | 		$img_start = strpos($orig_body, '[img'); | ||||||
|  | 		$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false); | ||||||
|  | 		$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	$new_body = $new_body . $orig_body; | ||||||
|  | 
 | ||||||
|  | 	return array('body' => $new_body, 'images' => $saved_image); | ||||||
|  | }} | ||||||
|  | 
 | ||||||
|  | if(! function_exists('item_redir_and_replace_images')) { | ||||||
|  | function item_redir_and_replace_images($body, $images, $cid) { | ||||||
|  | 
 | ||||||
|  | 	$origbody = $body; | ||||||
|  | 	$newbody = ''; | ||||||
|  | 
 | ||||||
|  | 	for($i = 0; $i < count($images); $i++) { | ||||||
|  | 		$search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is'; | ||||||
|  | 		$replace = '[url=' . z_path() . '/redir/' . $cid  | ||||||
|  | 		           . '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ; | ||||||
|  | 
 | ||||||
|  | 		$img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]'); | ||||||
|  | 		$process_part = substr($origbody, 0, $img_end); | ||||||
|  | 		$origbody = substr($origbody, $img_end); | ||||||
|  | 
 | ||||||
|  | 		$process_part = preg_replace($search, $replace, $process_part); | ||||||
|  | 		$newbody = $newbody . $process_part; | ||||||
|  | 	} | ||||||
|  | 	$newbody = $newbody . $origbody; | ||||||
|  | 
 | ||||||
|  | 	$cnt = 0; | ||||||
|  | 	foreach($images as $image) { | ||||||
|  | 		// We're depending on the property of 'foreach' (specified on the PHP website) that
 | ||||||
|  | 		// it loops over the array starting from the first element and going sequentially
 | ||||||
|  | 		// to the last element
 | ||||||
|  | 		$newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody); | ||||||
|  | 		$cnt++; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return $newbody; | ||||||
|  | }} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| function message_content(&$a) { | function message_content(&$a) { | ||||||
| 
 | 
 | ||||||
| 	$o = ''; | 	$o = ''; | ||||||
|  | @ -345,26 +423,9 @@ function message_content(&$a) { | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 			$Text = $message['body']; | 			$extracted = item_extract_images($message['body']); | ||||||
| 			$saved_image = ''; | 			if($extracted['images']) | ||||||
| 			$img_start = strpos($Text,'[img]data:'); | 				$message['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $message['contact-id']); | ||||||
| 			$img_end = strpos($Text,'[/img]'); |  | ||||||
| 
 |  | ||||||
| 			if($img_start !== false && $img_end !== false && $img_end > $img_start) { |  | ||||||
| 				$start_fragment = substr($Text,0,$img_start); |  | ||||||
| 				$img_start += strlen('[img]'); |  | ||||||
| 				$saved_image = substr($Text,$img_start,$img_end - $img_start); |  | ||||||
| 				$end_fragment = substr($Text,$img_end + strlen('[/img]'));		 |  | ||||||
| 				$Text = $start_fragment . '[!#saved_image#!]' . $end_fragment; |  | ||||||
| 				$search = '/\[url\=(.*?)\]\[!#saved_image#!\]\[\/url\]' . '/is'; |  | ||||||
| 				$replace = '[url=' . z_path() . '/redir/' . $message['contact-id']  |  | ||||||
| 					. '?f=1&url=' . '$1' . '][!#saved_image#!][/url]' ; |  | ||||||
| 
 |  | ||||||
| 				$Text = preg_replace($search,$replace,$Text); |  | ||||||
| 
 |  | ||||||
| 			if(strlen($saved_image)) |  | ||||||
| 				$message['body'] = str_replace('[!#saved_image#!]', '[img]' . $saved_image . '[/img]',$Text); |  | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			$mails[] = array( | 			$mails[] = array( | ||||||
| 				'id' => $message['id'], | 				'id' => $message['id'], | ||||||
|  |  | ||||||
|  | @ -740,7 +740,8 @@ function photos_post(&$a) { | ||||||
| 		killme(); | 		killme(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	$ph->orient($src); |         if($ph->getType() != 'image/png') | ||||||
|  |             $ph->orient($src); | ||||||
| 	@unlink($src); | 	@unlink($src); | ||||||
| 
 | 
 | ||||||
| 	$max_length = get_config('system','max_image_length'); | 	$max_length = get_config('system','max_image_length'); | ||||||
|  |  | ||||||
							
								
								
									
										0
									
								
								util/run_xgettext.sh
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								view/theme/diabook/ch_directory_item.tpl
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								view/theme/diabook/communityhome.tpl
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								view/theme/diabook/contact_template.tpl
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-aerith/icons/block.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-blue/icons/block.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-dark/icons/block.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-green/icons/block.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-green/icons/notifications3.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 714 B After Width: | Height: | Size: 714 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-green/icons/notify3.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 534 B After Width: | Height: | Size: 534 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-pink/icons/block.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-pink/icons/notifications3.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 714 B After Width: | Height: | Size: 714 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-pink/icons/notify3.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 534 B After Width: | Height: | Size: 534 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/diabook-red/icons/block.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/directory_item.tpl
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								view/theme/diabook/group_side.tpl
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								view/theme/diabook/icons/attach.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 1 KiB | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/audio.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 762 B After Width: | Height: | Size: 762 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/block.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/camera.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 685 B After Width: | Height: | Size: 685 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/close_box.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 206 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/contacts2.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 549 B After Width: | Height: | Size: 549 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/drop.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 292 B After Width: | Height: | Size: 292 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/expand.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 263 B After Width: | Height: | Size: 263 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/file_as.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 352 B After Width: | Height: | Size: 352 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/link.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 365 B After Width: | Height: | Size: 365 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/lock.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 366 B After Width: | Height: | Size: 366 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/lupe.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 697 B After Width: | Height: | Size: 697 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/next.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 300 B After Width: | Height: | Size: 300 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/notifications.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 926 B After Width: | Height: | Size: 926 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/notifications3.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 714 B After Width: | Height: | Size: 714 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/notify.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 1,001 B After Width: | Height: | Size: 1,001 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/notify3.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 534 B After Width: | Height: | Size: 534 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/pencil.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 286 B After Width: | Height: | Size: 286 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/prev.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 336 B After Width: | Height: | Size: 336 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/recycle.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 296 B After Width: | Height: | Size: 296 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/remote.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 427 B After Width: | Height: | Size: 427 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/scroll_top.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 296 B After Width: | Height: | Size: 296 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/star.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 388 B After Width: | Height: | Size: 388 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/starred.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 501 B After Width: | Height: | Size: 501 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/tagged.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 353 B After Width: | Height: | Size: 353 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/unlock.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 362 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/unstarred.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 468 B After Width: | Height: | Size: 468 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/video.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 472 B After Width: | Height: | Size: 472 B | 
							
								
								
									
										0
									
								
								view/theme/diabook/icons/weblink.png
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 505 B After Width: | Height: | Size: 505 B |