diff options
-rwxr-xr-x | boot.php | 2 | ||||
-rw-r--r-- | include/conversation.php | 2 | ||||
-rwxr-xr-x | include/items.php | 10 | ||||
-rw-r--r-- | include/message.php | 49 | ||||
-rw-r--r-- | install/database.sql | 1 | ||||
-rw-r--r-- | install/update.php | 9 | ||||
-rw-r--r-- | mod/import.php | 25 | ||||
-rwxr-xr-x | mod/like.php | 1 | ||||
-rw-r--r-- | mod/message.php | 43 | ||||
-rw-r--r-- | version.inc | 2 | ||||
-rw-r--r-- | view/en/htconfig.tpl | 2 | ||||
-rw-r--r-- | view/theme/redbasic/css/style.css | 1 | ||||
-rwxr-xr-x | view/tpl/msg-header.tpl | 29 | ||||
-rwxr-xr-x | view/tpl/prv_message.tpl | 6 |
14 files changed, 166 insertions, 16 deletions
@@ -43,7 +43,7 @@ require_once('include/taxonomy.php'); define ( 'RED_PLATFORM', 'Red Matrix' ); define ( 'RED_VERSION', trim(file_get_contents('version.inc')) . 'R'); define ( 'ZOT_REVISION', 1 ); -define ( 'DB_UPDATE_VERSION', 1059 ); +define ( 'DB_UPDATE_VERSION', 1060 ); define ( 'EOL', '<br />' . "\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/include/conversation.php b/include/conversation.php index 6d551a5c9..aade06b8a 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -137,7 +137,7 @@ function localize_item(&$item){ case ACTIVITY_OBJ_NOTE: default: $post_type = t('status'); - if($obj['id'] != $item['mid']) + if($obj['mid'] != $obj['parent_mid']) $post_type = t('comment'); break; } diff --git a/include/items.php b/include/items.php index ba0867562..10bdcb38f 100755 --- a/include/items.php +++ b/include/items.php @@ -840,6 +840,9 @@ function encode_mail($item) { $x['from'] = encode_item_xchan($item['from']); $x['to'] = encode_item_xchan($item['to']); + if($item['attach']) + $x['attach'] = json_decode_plus($item['attach']); + $x['flags'] = array(); if($item['mail_flags'] & MAIL_RECALLED) { @@ -885,6 +888,9 @@ function get_mail_elements($x) { $arr['mid'] = (($x['message_id']) ? htmlentities($x['message_id'], ENT_COMPAT,'UTF-8',false) : ''); $arr['parent_mid'] = (($x['message_parent']) ? htmlentities($x['message_parent'], ENT_COMPAT,'UTF-8',false) : ''); + if($x['attach']) + $arr['attach'] = activity_sanitise($x['attach']); + if(import_author_xchan($x['from'])) $arr['from_xchan'] = base64url_encode(hash('whirlpool',$x['from']['guid'] . $x['from']['guid_sig'], true)); @@ -2202,6 +2208,9 @@ function mail_store($arr) { if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false)) $arr['body'] = escape_tags($arr['body']); + if(array_key_exists('attach',$arr) && is_array($arr['attach'])) + $arr['attach'] = json_encode($arr['attach']); + $arr['account_id'] = ((x($arr,'account_id')) ? intval($arr['account_id']) : 0); $arr['mid'] = ((x($arr,'mid')) ? notags(trim($arr['mid'])) : random_string()); $arr['from_xchan'] = ((x($arr,'from_xchan')) ? notags(trim($arr['from_xchan'])) : ''); @@ -2210,6 +2219,7 @@ function mail_store($arr) { $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : ''); $arr['parent_mid'] = ((x($arr,'parent_mid')) ? notags(trim($arr['parent_mid'])) : ''); $arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : ''); + $arr['mail_flags'] = ((x($arr,'mail_flags')) ? intval($arr['mail_flags']) : 0 ); diff --git a/include/message.php b/include/message.php index fc0d5f2b3..e54a6cd83 100644 --- a/include/message.php +++ b/include/message.php @@ -3,6 +3,7 @@ /* Private Message backend API */ require_once('include/crypto.php'); +require_once('include/attach.php'); // send a private message @@ -74,14 +75,44 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' if(preg_match_all("/\[img\](.*?)\[\/img\]/",$body,$match)) $images = $match[1]; + $match = false; + + if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",$body,$match)) + $attaches = $match[1]; + + $attachments = ''; + + if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) { + $attachments = array(); + foreach($match[2] as $mtch) { + $hash = substr($mtch,0,strpos($mtch,',')); + $rev = intval(substr($mtch,strpos($mtch,','))); + $r = attach_by_hash_nodata($hash,$rev); + if($r['success']) { + $attachments[] = array( + 'href' => $a->get_baseurl() . '/attach/' . $r['data']['hash'], + 'length' => $r['data']['filesize'], + 'type' => $r['data']['filetype'], + 'title' => urlencode($r['data']['filename']), + 'revision' => $r['data']['revision'] + ); + } + $body = str_replace($match[1],'',$body); + } + } + + $jattach = (($attachments) ? json_encode($attachments) : ''); + $key = get_config('system','pubkey'); if($subject) $subject = json_encode(aes_encapsulate($subject,$key)); if($body) $body = json_encode(aes_encapsulate($body,$key)); - $r = q("INSERT INTO mail ( account_id, mail_flags, channel_id, from_xchan, to_xchan, title, body, mid, parent_mid, created ) - VALUES ( %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", + + + $r = q("INSERT INTO mail ( account_id, mail_flags, channel_id, from_xchan, to_xchan, title, body, attach, mid, parent_mid, created ) + VALUES ( %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", intval($channel['channel_account_id']), intval(MAIL_OBSCURED), intval($channel['channel_id']), @@ -89,6 +120,7 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' dbesc($recipient), dbesc($subject), dbesc($body), + dbesc($jattach), dbesc($mid), dbesc($replyto), dbesc(datetime_convert()) @@ -122,6 +154,19 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' } } + if($attaches) { + foreach($attaches as $attach) { + $hash = substr($attach,0,strpos($attach,',')); + $rev = intval(substr($attach,strpos($attach,','))); + attach_store($channel,$observer_hash,$options = 'update', array( + 'hash' => $hash, + 'revision' => $rev, + 'allow_cid' => '<' . $recipient . '>', + + )); + } + } + proc_run('php','include/notifier.php','mail',$post_id); $ret['success'] = true; diff --git a/install/database.sql b/install/database.sql index 0a86b8321..4a519adbb 100644 --- a/install/database.sql +++ b/install/database.sql @@ -504,6 +504,7 @@ CREATE TABLE IF NOT EXISTS `mail` ( `channel_id` int(10) unsigned NOT NULL, `title` text NOT NULL, `body` mediumtext NOT NULL, + `attach` mediumtext NOT NULL DEFAULT '', `mid` char(255) NOT NULL, `parent_mid` char(255) NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', diff --git a/install/update.php b/install/update.php index c97b5619f..682ee2aea 100644 --- a/install/update.php +++ b/install/update.php @@ -1,6 +1,6 @@ <?php -define( 'UPDATE_VERSION' , 1059 ); +define( 'UPDATE_VERSION' , 1060 ); /** * @@ -682,3 +682,10 @@ ADD INDEX ( `mitem_flags` ) "); return UPDATE_SUCCESS; return UPDATE_FAILED; } + +function update_r1059() { + $r = q("ALTER TABLE `mail` ADD `attach` MEDIUMTEXT NOT NULL DEFAULT '' AFTER `body` "); + if($r) + return UPDATE_SUCCESS; + return UPDATE_FAILED; +} diff --git a/mod/import.php b/mod/import.php index c98f4d2eb..08311013a 100644 --- a/mod/import.php +++ b/mod/import.php @@ -206,10 +206,35 @@ function import_post(&$a) { // import xchans and contact photos + if($seize) { + + // replace our existing xchan if we're seizing control + + $r = q("delete from xchan where xchan_hash = '%s' limit 1", + dbesc($channel['channel_hash']) + ); + + $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_name, xchan_network, xchan_photo_date, xchan_name_date ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", + dbesc($channel['channel_hash']), + dbesc($channel['channel_guid']), + dbesc($channel['channel_guid_sig']), + dbesc($channel['channel_pubkey']), + dbesc($a->get_baseurl() . "/photo/profile/l/" . $channel['channel_id']), + dbesc($a->get_baseurl() . "/photo/profile/m/" . $channel['channel_id']), + dbesc($a->get_baseurl() . "/photo/profile/s/" . $channel['channel_id']), + dbesc($channel['channel_address'] . '@' . get_app()->get_hostname()), + dbesc(z_root() . '/channel/' . $channel['channel_address']), + dbesc($channel['channel_name']), + dbesc('zot'), + dbesc(datetime_convert()), + dbesc(datetime_convert()) + ); + } $xchans = $data['xchan']; if($xchans) { foreach($xchans as $xchan) { + $r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1", dbesc($xchan['xchan_hash']) ); diff --git a/mod/like.php b/mod/like.php index f617391a1..90005eca3 100755 --- a/mod/like.php +++ b/mod/like.php @@ -110,6 +110,7 @@ function like_content(&$a) { $obj = json_encode(array( 'type' => $objtype, 'id' => $item['mid'], + 'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']), 'link' => $links, 'title' => $item['title'], 'content' => $item['body'], diff --git a/mod/message.php b/mod/message.php index 9c6cf75a6..f5a60b73b 100644 --- a/mod/message.php +++ b/mod/message.php @@ -249,7 +249,7 @@ function message_content(&$a) { $a->page['htmlhead'] .= replace_macros($tpl, array( '$baseurl' => $a->get_baseurl(true), '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), - '$nickname' => $channel['channel_addr'], + '$nickname' => $channel['channel_address'], '$linkurl' => t('Please enter a link URL:') )); @@ -293,6 +293,7 @@ function message_content(&$a) { '$select' => $select, '$parent' => '', '$upload' => t('Upload photo'), + '$attach' => t('Attach file'), '$insert' => t('Insert web link'), '$wait' => t('Please wait'), '$submit' => t('Submit') @@ -371,10 +372,39 @@ function message_content(&$a) { foreach($messages as $message) { -// FIXME -// $extracted = item_extract_images($message['body']); -// if($extracted['images']) -// $message['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $message['contact-id']); + $s = $arr = ''; + + if($message['attach']) + $arr = json_decode_plus($message['attach']); + if($arr) { + $s .= '<div class="body-attach">'; + foreach($arr as $r) { + $matches = false; + $icon = ''; + $icontype = substr($r['type'],0,strpos($r['type'],'/')); + + switch($icontype) { + case 'video': + case 'audio': + case 'image': + case 'text': + $icon = '<div class="attachtype icon s22 type-' . $icontype . '"></div>'; + break; + default: + $icon = '<div class="attachtype icon s22 type-unkn"></div>'; + break; + } + + $title = htmlentities($r['title'], ENT_COMPAT,'UTF-8'); + if(! $title) + $title = t('unknown.???'); + $title .= ' ' . $r['length'] . ' ' . t('bytes'); + + $url = $a->get_baseurl() . '/magic?f=&hash=' . $message['from_xchan'] . '&dest=' . $r['href'] . '/' . $r['revision']; + $s .= '<a href="' . $url . '" title="' . $title . '" class="attachlink" >' . $icon . '</a>'; + } + $s .= '<div class="clear"></div></div>'; + } $mails[] = array( 'id' => $message['id'], @@ -385,7 +415,7 @@ function message_content(&$a) { 'to_url' => chanlink_hash($message['to_xchan']), 'to_photo' => $message['to']['xchan_photo_m'], 'subject' => $message['title'], - 'body' => smilies(bbcode($message['body'])), + 'body' => smilies(bbcode($message['body']) . $s), 'delete' => t('Delete message'), 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'), ); @@ -425,6 +455,7 @@ function message_content(&$a) { '$select' => $select, '$parent' => $parent, '$upload' => t('Upload photo'), + '$attach' => t('Attach file'), '$insert' => t('Insert web link'), '$submit' => t('Submit'), '$wait' => t('Please wait') diff --git a/version.inc b/version.inc index 7f9c7a59b..717abe607 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -2013-08-18.409 +2013-08-19.410 diff --git a/view/en/htconfig.tpl b/view/en/htconfig.tpl index 0417e9af2..3e1269441 100644 --- a/view/en/htconfig.tpl +++ b/view/en/htconfig.tpl @@ -64,7 +64,7 @@ $a->config['system']['max_import_size'] = 200000; // maximum size of uploaded photos -$a->config['system']['maximagesize'] = 800000; +$a->config['system']['maximagesize'] = 3000000; // Location of PHP command line processor diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index abfeb44bc..f4c399735 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -1882,6 +1882,7 @@ tr.mceLast { margin-right: 30px; } #prvmail-upload-wrapper, +#prvmail-attach-wrapper, #prvmail-link-wrapper, #prvmail-rotator-wrapper { float: left; diff --git a/view/tpl/msg-header.tpl b/view/tpl/msg-header.tpl index 0be288709..5e2597605 100755 --- a/view/tpl/msg-header.tpl +++ b/view/tpl/msg-header.tpl @@ -54,7 +54,19 @@ else name: 'userfile', onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); }, onComplete: function(file,response) { - tinyMCE.execCommand('mceInsertRawHTML',false,response); + addeditortext(response); + $('#profile-rotator').spin(false); + } + } + ); + + var file_uploader = new window.AjaxUpload( + 'prvmail-attach', + { action: 'wall_attach/{{$nickname}}', + name: 'userfile', + onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); }, + onComplete: function(file,response) { + addeditortext(response); $('#profile-rotator').spin(false); } } @@ -67,7 +79,7 @@ else if(reply && reply.length) { $('#profile-rotator').spin('tiny'); $.get('parse_url?url=' + reply, function(data) { - tinyMCE.execCommand('mceInsertRawHTML',false,data); + addeditortext(response); $('#profile-rotator').spin(false); }); } @@ -86,11 +98,22 @@ else if(reply && reply.length) { $('#profile-rotator').spin('tiny'); $.get('parse_url?url=' + reply, function(data) { - tinyMCE.execCommand('mceInsertRawHTML',false,data); + addeditortext(response); $('#profile-rotator').spin(false); }); } } + function addeditortext(data) { + if(plaintext == 'none') { + var currentText = $("#prvmail-text").val(); + $("#prvmail-text").val(currentText + data); + } + else + tinyMCE.execCommand('mceInsertRawHTML',false,data); + } + + + </script> diff --git a/view/tpl/prv_message.tpl b/view/tpl/prv_message.tpl index 2ddf75544..164ba0c6d 100755 --- a/view/tpl/prv_message.tpl +++ b/view/tpl/prv_message.tpl @@ -26,6 +26,12 @@ <div id="prvmail-upload-wrapper" > <div id="prvmail-upload" class="icon border camera" title="{{$upload}}" ></div> </div> + + <div id="prvmail-attach-wrapper" > + <div id="prvmail-attach" class="icon attach" title="{{$attach}}" ></div> + </div> + + <div id="prvmail-link-wrapper" > <div id="prvmail-link" class="icon border link" title="{{$insert}}" onclick="jotGetLink();" ></div> </div> |