aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfriendica <info@friendica.com>2013-08-19 21:19:39 -0700
committerfriendica <info@friendica.com>2013-08-19 21:19:39 -0700
commitcd5fdbcb48a2e05198bb9daaf0753e8218ea4285 (patch)
tree8a2f57e1b6e99e9fe6b1f961b4d53b077603d046
parentb9314935e6f85bb0098c651d021ce9bdc2753ecb (diff)
downloadvolse-hubzilla-cd5fdbcb48a2e05198bb9daaf0753e8218ea4285.tar.gz
volse-hubzilla-cd5fdbcb48a2e05198bb9daaf0753e8218ea4285.tar.bz2
volse-hubzilla-cd5fdbcb48a2e05198bb9daaf0753e8218ea4285.zip
email attachments (and fix email photos)
-rwxr-xr-xboot.php2
-rwxr-xr-xinclude/items.php10
-rw-r--r--include/message.php49
-rw-r--r--install/database.sql1
-rw-r--r--install/update.php9
-rw-r--r--mod/message.php43
-rw-r--r--view/theme/redbasic/css/style.css1
-rwxr-xr-xview/tpl/msg-header.tpl29
-rwxr-xr-xview/tpl/prv_message.tpl6
9 files changed, 137 insertions, 13 deletions
diff --git a/boot.php b/boot.php
index 7b2d72f3c..10f951b6a 100755
--- a/boot.php
+++ b/boot.php
@@ -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/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/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/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>