コード例 #1
0
ファイル: conversation.php プロジェクト: jzacman/friendica
 function item_redir_and_replace_images($body, $images, $cid)
 {
     $origbody = $body;
     $newbody = '';
     $cnt = 1;
     $pos = get_bb_tag_pos($origbody, 'url', 1);
     while ($pos !== false && $cnt < 1000) {
         $search = '/\\[url\\=(.*?)\\]\\[!#saved_image([0-9]*)#!\\]\\[\\/url\\]' . '/is';
         $replace = '[url=' . z_path() . '/redir/' . $cid . '?f=1&url=' . '$1' . '][!#saved_image' . '$2' . '#!][/url]';
         $newbody .= substr($origbody, 0, $pos['start']['open']);
         $subject = substr($origbody, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
         $origbody = substr($origbody, $pos['end']['close']);
         if ($origbody === false) {
             $origbody = '';
         }
         $subject = preg_replace($search, $replace, $subject);
         $newbody .= $subject;
         $cnt++;
         $pos = get_bb_tag_pos($origbody, 'url', 1);
     }
     $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;
 }
コード例 #2
0
ファイル: hostxrd.php プロジェクト: robhell/friendica
function hostxrd_init(&$a)
{
    header('Access-Control-Allow-Origin: *');
    header("Content-type: text/xml");
    $pubkey = get_config('system', 'site_pubkey');
    if (!$pubkey) {
        $res = new_keypair(1024);
        set_config('system', 'site_prvkey', $res['prvkey']);
        set_config('system', 'site_pubkey', $res['pubkey']);
    }
    $tpl = file_get_contents('view/xrd_host.tpl');
    echo str_replace(array('$zhost', '$zroot', '$domain', '$zot_post', '$bigkey'), array($a->get_hostname(), z_root(), z_path(), z_root() . '/post', salmon_key(get_config('system', 'site_pubkey'))), $tpl);
    session_write_close();
    exit;
}
コード例 #3
0
ファイル: hostxrd.php プロジェクト: nextgensh/friendica
function hostxrd_init(&$a)
{
    header('Access-Control-Allow-Origin: *');
    header("Content-type: text/xml");
    $pubkey = get_config('system', 'site_pubkey');
    if (!$pubkey) {
        // should only have to ever do this once.
        $res = openssl_pkey_new(array('digest_alg' => 'sha1', 'private_key_bits' => 4096, 'encrypt_key' => false));
        $prvkey = '';
        openssl_pkey_export($res, $prvkey);
        // Get public key
        $pkey = openssl_pkey_get_details($res);
        $pubkey = $pkey["key"];
        set_config('system', 'site_prvkey', $prvkey);
        set_config('system', 'site_pubkey', $pubkey);
    }
    $tpl = file_get_contents('view/xrd_host.tpl');
    echo str_replace(array('$zhost', '$zroot', '$domain', '$zot_post', '$bigkey'), array($a->get_hostname(), z_root(), z_path(), z_root() . '/post', salmon_key(get_config('system', 'site_pubkey'))), $tpl);
    session_write_close();
    exit;
}
コード例 #4
0
ファイル: conversation.php プロジェクト: robhell/friendica
/**
 * Render actions localized
 */
function localize_item(&$item)
{
    $Text = $item['body'];
    $saved_image = '';
    $img_start = strpos($Text, '[img]data:');
    $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' ?" . ">";
    if ($item['verb'] === ACTIVITY_LIKE || $item['verb'] === ACTIVITY_DISLIKE) {
        $r = q("SELECT * from `item`,`contact` WHERE \n\t\t\t\t`item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';", dbesc($item['parent-uri']));
        if (count($r) == 0) {
            return;
        }
        $obj = $r[0];
        $author = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
        $objauthor = '[url=' . $obj['author-link'] . ']' . $obj['author-name'] . '[/url]';
        switch ($obj['verb']) {
            case ACTIVITY_POST:
                switch ($obj['object-type']) {
                    case ACTIVITY_OBJ_EVENT:
                        $post_type = t('event');
                        break;
                    default:
                        $post_type = t('status');
                }
                break;
            default:
                if ($obj['resource-id']) {
                    $post_type = t('photo');
                    $m = array();
                    preg_match("/\\[url=([^]]*)\\]/", $obj['body'], $m);
                    $rr['plink'] = $m[1];
                } else {
                    $post_type = t('status');
                }
        }
        $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
        switch ($item['verb']) {
            case ACTIVITY_LIKE:
                $bodyverb = t('%1$s likes %2$s\'s %3$s');
                break;
            case ACTIVITY_DISLIKE:
                $bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
                break;
        }
        $item['body'] = sprintf($bodyverb, $author, $objauthor, $plink);
    }
    if ($item['verb'] === ACTIVITY_FRIEND) {
        if ($item['object-type'] == "" || $item['object-type'] !== ACTIVITY_OBJ_PERSON) {
            return;
        }
        $Aname = $item['author-name'];
        $Alink = $item['author-link'];
        $xmlhead = "<" . "?xml version='1.0' encoding='UTF-8' ?" . ">";
        $obj = parse_xml_string($xmlhead . $item['object']);
        $links = parse_xml_string($xmlhead . "<links>" . unxmlify($obj->link) . "</links>");
        $Bname = $obj->title;
        $Blink = "";
        $Bphoto = "";
        foreach ($links->link as $l) {
            $atts = $l->attributes();
            switch ($atts['rel']) {
                case "alternate":
                    $Blink = $atts['href'];
                case "photo":
                    $Bphoto = $atts['href'];
            }
        }
        $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
        $B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
        if ($Bphoto != "") {
            $Bphoto = '[url=' . zrl($Blink) . '][img]' . $Bphoto . '[/img][/url]';
        }
        $item['body'] = sprintf(t('%1$s is now friends with %2$s'), $A, $B) . "\n\n\n" . $Bphoto;
    }
    if ($item['verb'] === ACTIVITY_TAG) {
        $r = q("SELECT * from `item`,`contact` WHERE \n\t\t`item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';", dbesc($item['parent-uri']));
        if (count($r) == 0) {
            return;
        }
        $obj = $r[0];
        $author = '[url=' . zrl($item['author-link']) . ']' . $item['author-name'] . '[/url]';
        $objauthor = '[url=' . zrl($obj['author-link']) . ']' . $obj['author-name'] . '[/url]';
        switch ($obj['verb']) {
            case ACTIVITY_POST:
                switch ($obj['object-type']) {
                    case ACTIVITY_OBJ_EVENT:
                        $post_type = t('event');
                        break;
                    default:
                        $post_type = t('status');
                }
                break;
            default:
                if ($obj['resource-id']) {
                    $post_type = t('photo');
                    $m = array();
                    preg_match("/\\[url=([^]]*)\\]/", $obj['body'], $m);
                    $rr['plink'] = $m[1];
                } else {
                    $post_type = t('status');
                }
        }
        $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
        $parsedobj = parse_xml_string($xmlhead . $item['object']);
        $tag = sprintf('#[url=%s]%s[/url]', $parsedobj->id, $parsedobj->content);
        $item['body'] = sprintf(t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag);
    }
    if ($item['verb'] === ACTIVITY_FAVORITE) {
        if ($item['object-type'] == "") {
            return;
        }
        $Aname = $item['author-name'];
        $Alink = $item['author-link'];
        $xmlhead = "<" . "?xml version='1.0' encoding='UTF-8' ?" . ">";
        $obj = parse_xml_string($xmlhead . $item['object']);
        if (strlen($obj->id)) {
            $r = q("select * from item where uri = '%s' and uid = %d limit 1", dbesc($obj->id), intval($item['uid']));
            if (count($r) && $r[0]['plink']) {
                $target = $r[0];
                $Bname = $target['author-name'];
                $Blink = $target['author-link'];
                $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
                $B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
                $P = '[url=' . $target['plink'] . ']' . t('post/item') . '[/url]';
                $item['body'] = sprintf(t('%1$s marked %2$s\'s %3$s as favorite'), $A, $B, $P) . "\n";
            }
        }
    }
    $matches = null;
    if (preg_match_all('/@\\[url=(.*?)\\]/is', $item['body'], $matches, PREG_SET_ORDER)) {
        foreach ($matches as $mtch) {
            if (!strpos($mtch[1], 'zrl=')) {
                $item['body'] = str_replace($mtch[0], '@[url=' . zrl($mtch[1]) . ']', $item['body']);
            }
        }
    }
    if (preg_match_all('/\\[url=(.*?)\\/photos\\/(.*?)\\/image\\/(.*?)\\]\\[img(.*?)\\]h(.*?)\\[\\/img\\]\\[\\/url\\]/is', $item['body'], $matches, PREG_SET_ORDER)) {
        logger('matched');
        foreach ($matches as $mtch) {
            $item['body'] = str_replace($mtch[0], '[url=' . zrl($mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3], true) . '][img' . $mtch[4] . ']h' . $mtch[5] . '[/img][/url]', $item['body']);
        }
    }
}
コード例 #5
0
ファイル: boot.php プロジェクト: HaakonME/redmatrix
/**
 * @brief Return absolut URL for given $path.
 *
 * @param string $path
 *
 * @return string
 */
function absurl($path)
{
    if (strpos($path, '/') === 0) {
        return z_path() . $path;
    }
    return $path;
}
コード例 #6
0
ファイル: message.php プロジェクト: ZerGabriel/friendica
 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;
 }
コード例 #7
0
ファイル: enotify.php プロジェクト: nextgensh/friendica
function notification($params)
{
    logger('notification: entry', LOGGER_DEBUG);
    $a = get_app();
    $banner = t('Friendica Notification');
    $product = FRIENDICA_PLATFORM;
    $siteurl = z_path();
    $thanks = t('Thank You,');
    $sitename = get_config('config', 'sitename');
    $site_admin = sprintf(t('%s Administrator'), $sitename);
    $sender_name = $product;
    $sender_email = t('noreply') . '@' . $a->get_hostname();
    if (array_key_exists('item', $params)) {
        $title = $params['item']['title'];
        $body = $params['item']['body'];
    } else {
        $title = $body = '';
    }
    if ($params['type'] == NOTIFY_MAIL) {
        $subject = sprintf(t('New mail received at %s'), $sitename);
        $preamble = sprintf(t('%s sent you a new private message at %s.'), $params['source_name'], $sitename);
        $sitelink = t('Please visit %s to view and/or reply to your private messages.');
        $tsitelink = sprintf($sitelink, $siteurl . '/message');
        $hsitelink = sprintf($sitelink, '<a href="' . $siteurl . '/message">' . $sitename . '</a>');
        $itemlink = '';
    }
    if ($params['type'] == NOTIFY_COMMENT) {
        $subject = sprintf(t('%s commented on an item at %s'), $params['source_name'], $sitename);
        $preamble = sprintf(t('%s commented on an item/conversation you have been following.'), $params['source_name']);
        $sitelink = t('Please visit %s to view and/or reply to the conversation.');
        $tsitelink = sprintf($sitelink, $siteurl);
        $hsitelink = sprintf($sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
        $itemlink = $params['link'];
    }
    if ($params['type'] == NOTIFY_WALL) {
        $preamble = $subject = sprintf(t('%s posted to your profile wall at %s'), $params['source_name'], $sitename);
        $sitelink = t('Please visit %s to view and/or reply to the conversation.');
        $tsitelink = sprintf($sitelink, $siteurl);
        $hsitelink = sprintf($sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
        $itemlink = $params['link'];
    }
    if ($params['type'] == NOTIFY_TAGSELF) {
        $preamble = $subject = sprintf(t('%s tagged you at %s'), $params['source_name'], $sitename);
        $sitelink = t('Please visit %s to view and/or reply to the conversation.');
        $tsitelink = sprintf($sitelink, $siteurl);
        $hsitelink = sprintf($sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
        $itemlink = $params['link'];
    }
    if ($params['type'] == NOTIFY_TAGSHARE) {
        $preamble = $subject = sprintf(t('%s tagged your post at %s'), $params['source_name'], $sitename);
        $sitelink = t('Please visit %s to view and/or reply to the conversation.');
        $tsitelink = sprintf($sitelink, $siteurl);
        $hsitelink = sprintf($sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
        $itemlink = $params['link'];
    }
    if ($params['type'] == NOTIFY_INTRO) {
        $subject = sprintf(t('Introduction received at %s'), $sitename);
        $preamble = sprintf(t('You\'ve received an introduction from \'%s\' at %s'), $params['source_name'], $sitename);
        $body = sprintf(t('You may visit their profile at %s'), $params['source_link']);
        $sitelink = t('Please visit %s to approve or reject the introduction.');
        $tsitelink = sprintf($sitelink, $siteurl);
        $hsitelink = sprintf($sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
        $itemlink = $params['link'];
    }
    if ($params['type'] == NOTIFY_SUGGEST) {
        $subject = sprintf(t('Friend suggestion received at %s'), $sitename);
        $preamble = sprintf(t('You\'ve received a friend suggestion from \'%s\' at %s'), $params['source_name'], $sitename);
        $body = t('Name:') . ' ' . $params['item']['name'] . "\n";
        $body .= t('Photo:') . ' ' . $params['item']['photo'] . "\n";
        $body .= sprintf(t('You may visit their profile at %s'), $params['item']['url']);
        $sitelink = t('Please visit %s to approve or reject the suggestion.');
        $tsitelink = sprintf($sitelink, $siteurl);
        $hsitelink = sprintf($sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
        $itemlink = $params['link'];
    }
    if ($params['type'] == NOTIFY_CONFIRM) {
    }
    // TODO - create notification entry in DB
    // send email notification if notification preferences permit
    require_once 'bbcode.php';
    if (intval($params['notify_flags']) & intval($params['type'])) {
        logger('notification: sending notification email');
        push_lang($params['language']);
        $textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r", "\\n"), "\n", $body))), ENT_QUOTES, 'UTF-8'));
        $htmlversion = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r", "\\n\\n", "\\n"), "<br />\n", $body))));
        // load the template for private message notifications
        $tpl = get_markup_template('email_notify_html.tpl');
        $email_html_body = replace_macros($tpl, array('$banner' => $banner, '$product' => $product, '$preamble' => $preamble, '$sitename' => $sitename, '$siteurl' => $siteurl, '$source_name' => $parama['source_name'], '$source_link' => $params['source_link'], '$source_photo' => $params['source_photo'], '$username' => $params['to_name'], '$hsitelink' => $hsitelink, '$itemlink' => '<a href="' . $itemlink . '">' . $itemlink . '</a>', '$thanks' => $thanks, '$site_admin' => $site_admin, '$title' => stripslashes($title), '$htmlversion' => $htmlversion));
        // load the template for private message notifications
        $tpl = get_markup_template('email_notify_text.tpl');
        $email_text_body = replace_macros($tpl, array('$banner' => $banner, '$product' => $product, '$preamble' => $preamble, '$sitename' => $sitename, '$siteurl' => $siteurl, '$source_name' => $parama['source_name'], '$source_link' => $params['source_link'], '$source_photo' => $params['source_photo'], '$username' => $params['to_name'], '$tsitelink' => $tsitelink, '$itemlink' => $itemlink, '$thanks' => $thanks, '$site_admin' => $site_admin, '$title' => stripslashes($title), '$textversion' => $textversion));
        //		logger('text: ' . $email_text_body);
        // use the EmailNotification library to send the message
        enotify::send(array('fromName' => $sender_name, 'fromEmail' => $sender_email, 'replyTo' => $sender_email, 'toEmail' => $params['to_email'], 'messageSubject' => $subject, 'htmlVersion' => $email_html_body, 'textVersion' => $email_text_body));
        pop_lang();
    }
}
コード例 #8
0
ファイル: message.php プロジェクト: robhell/friendica
function message_content(&$a)
{
    $o = '';
    nav_set_selected('messages');
    if (!local_user()) {
        notice(t('Permission denied.') . EOL);
        return;
    }
    $myprofile = $a->get_baseurl(true) . '/profile/' . $a->user['nickname'];
    $tpl = get_markup_template('mail_head.tpl');
    $header = replace_macros($tpl, array('$messages' => t('Messages'), '$tab_content' => $tab_content));
    if ($a->argc == 3 && ($a->argv[1] === 'drop' || $a->argv[1] === 'dropconv')) {
        if (!intval($a->argv[2])) {
            return;
        }
        $cmd = $a->argv[1];
        if ($cmd === 'drop') {
            $r = q("DELETE FROM `mail` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($a->argv[2]), intval(local_user()));
            if ($r) {
                info(t('Message deleted.') . EOL);
            }
            goaway($a->get_baseurl(true) . '/message');
        } else {
            $r = q("SELECT `parent-uri`,`convid` FROM `mail` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($a->argv[2]), intval(local_user()));
            if (count($r)) {
                $parent = $r[0]['parent-uri'];
                $convid = $r[0]['convid'];
                $r = q("DELETE FROM `mail` WHERE `parent-uri` = '%s' AND `uid` = %d ", dbesc($parent), intval(local_user()));
                // remove diaspora conversation pointer
                // Actually if we do this, we can never receive another reply to that conversation,
                // as we will never again have the info we need to re-create it.
                // We'll just have to orphan it.
                //if($convid) {
                //	q("delete from conv where id = %d limit 1",
                //		intval($convid)
                //	);
                //}
                if ($r) {
                    info(t('Conversation removed.') . EOL);
                }
            }
            goaway($a->get_baseurl(true) . '/message');
        }
    }
    if ($a->argc > 1 && $a->argv[1] === 'new') {
        $o .= $header;
        $plaintext = false;
        if (intval(get_pconfig(local_user(), 'system', 'plaintext'))) {
            $plaintext = true;
        }
        $tpl = get_markup_template('msg-header.tpl');
        $a->page['htmlhead'] .= replace_macros($tpl, array('$baseurl' => $a->get_baseurl(true), '$editselect' => $plaintext ? 'none' : '/(profile-jot-text|prvmail-text)/', '$nickname' => $a->user['nickname'], '$linkurl' => t('Please enter a link URL:')));
        $preselect = isset($a->argv[2]) ? array($a->argv[2]) : false;
        $prename = $preurl = $preid = '';
        if ($preselect) {
            $r = q("select name, url, id from contact where uid = %d and id = %d limit 1", intval(local_user()), intval($a->argv[2]));
            if (count($r)) {
                $prename = $r[0]['name'];
                $preurl = $r[0]['url'];
                $preid = $r[0]['id'];
            }
        }
        $prefill = $preselect ? $prename : '';
        // the ugly select box
        $select = contact_select('messageto', 'message-to-select', $preselect, 4, true, false, false, 10);
        $tpl = get_markup_template('prv_message.tpl');
        $o .= replace_macros($tpl, array('$header' => t('Send Private Message'), '$to' => t('To:'), '$showinputs' => 'true', '$prefill' => $prefill, '$autocomp' => $autocomp, '$preid' => $preid, '$subject' => t('Subject:'), '$subjtxt' => x($_REQUEST, 'subject') ? strip_tags($_REQUEST['subject']) : '', '$text' => x($_REQUEST, 'body') ? escape_tags(htmlspecialchars($_REQUEST['body'])) : '', '$readonly' => '', '$yourmessage' => t('Your message:'), '$select' => $select, '$parent' => '', '$upload' => t('Upload photo'), '$insert' => t('Insert web link'), '$wait' => t('Please wait'), '$submit' => t('Submit')));
        return $o;
    }
    if ($a->argc == 1) {
        // list messages
        $o .= $header;
        $r = q("SELECT count(*) AS `total` FROM `mail` \n\t\t\tWHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `created` DESC", intval(local_user()), dbesc($myprofile));
        if (count($r)) {
            $a->set_pager_total($r[0]['total']);
        }
        $r = q("SELECT max(`mail`.`created`) AS `mailcreated`, min(`mail`.`seen`) AS `mailseen`, \n\t\t\t`mail`.* , `contact`.`name`, `contact`.`url`, `contact`.`thumb` , `contact`.`network`,\n\t\t\tcount( * ) as count\n\t\t\tFROM `mail` LEFT JOIN `contact` ON `mail`.`contact-id` = `contact`.`id` \n\t\t\tWHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `mailcreated` DESC  LIMIT %d , %d ", intval(local_user()), intval($a->pager['start']), intval($a->pager['itemspage']));
        if (!count($r)) {
            info(t('No messages.') . EOL);
            return $o;
        }
        $tpl = get_markup_template('mail_list.tpl');
        foreach ($r as $rr) {
            if ($rr['unknown']) {
                $partecipants = sprintf(t("Unknown sender - %s"), $rr['from-name']);
            } elseif (link_compare($rr['from-url'], $myprofile)) {
                $partecipants = sprintf(t("You and %s"), $rr['name']);
            } else {
                $partecipants = sprintf(t("%s and You"), $rr['from-name']);
            }
            $o .= replace_macros($tpl, array('$id' => $rr['id'], '$from_name' => $partecipants, '$from_url' => $rr['network'] === NETWORK_DFRN ? $a->get_baseurl(true) . '/redir/' . $rr['contact-id'] : $rr['url'], '$sparkle' => ' sparkle', '$from_photo' => $rr['thumb'] ? $rr['thumb'] : $rr['from-photo'], '$subject' => template_escape($rr['mailseen'] ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'), '$delete' => t('Delete conversation'), '$body' => template_escape($rr['body']), '$to_name' => template_escape($rr['name']), '$date' => datetime_convert('UTC', date_default_timezone_get(), $rr['mailcreated'], t('D, d M Y - g:i A')), '$seen' => $rr['mailseen'], '$count' => sprintf(tt('%d message', '%d messages', $rr['count']), $rr['count'])));
        }
        $o .= paginate($a);
        return $o;
    }
    if ($a->argc > 1 && intval($a->argv[1])) {
        $o .= $header;
        $r = q("SELECT `mail`.*, `contact`.`name`, `contact`.`url`, `contact`.`thumb` \n\t\t\tFROM `mail` LEFT JOIN `contact` ON `mail`.`contact-id` = `contact`.`id` \n\t\t\tWHERE `mail`.`uid` = %d AND `mail`.`id` = %d LIMIT 1", intval(local_user()), intval($a->argv[1]));
        if (count($r)) {
            $contact_id = $r[0]['contact-id'];
            $convid = $r[0]['convid'];
            $sql_extra = sprintf(" and `mail`.`parent-uri` = '%s' ", dbesc($r[0]['parent-uri']));
            if ($convid) {
                $sql_extra = sprintf(" and ( `mail`.`parent-uri` = '%s' OR `mail`.`convid` = '%d' ) ", dbesc($r[0]['parent-uri']), intval($convid));
            }
            $messages = q("SELECT `mail`.*, `contact`.`name`, `contact`.`url`, `contact`.`thumb` \n\t\t\t\tFROM `mail` LEFT JOIN `contact` ON `mail`.`contact-id` = `contact`.`id` \n\t\t\t\tWHERE `mail`.`uid` = %d {$sql_extra} ORDER BY `mail`.`created` ASC", intval(local_user()));
        }
        if (!count($messages)) {
            notice(t('Message not available.') . EOL);
            return $o;
        }
        $r = q("UPDATE `mail` SET `seen` = 1 WHERE `parent-uri` = '%s' AND `uid` = %d", dbesc($r[0]['parent-uri']), intval(local_user()));
        require_once "include/bbcode.php";
        $tpl = get_markup_template('msg-header.tpl');
        $a->page['htmlhead'] .= replace_macros($tpl, array('$nickname' => $a->user['nickname'], '$baseurl' => $a->get_baseurl(true)));
        $mails = array();
        $seen = 0;
        $unknown = false;
        foreach ($messages as $message) {
            if ($message['unknown']) {
                $unknown = true;
            }
            if ($message['from-url'] == $myprofile) {
                $from_url = $myprofile;
                $sparkle = '';
            } else {
                $from_url = $a->get_baseurl(true) . '/redir/' . $message['contact-id'];
                $sparkle = ' sparkle';
            }
            $Text = $message['body'];
            $saved_image = '';
            $img_start = strpos($Text, '[img]data:');
            $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('id' => $message['id'], 'from_name' => template_escape($message['from-name']), 'from_url' => $from_url, 'sparkle' => $sparkle, 'from_photo' => $message['from-photo'], 'subject' => template_escape($message['title']), 'body' => template_escape(smilies(bbcode($message['body']))), 'delete' => t('Delete message'), 'to_name' => template_escape($message['name']), 'date' => datetime_convert('UTC', date_default_timezone_get(), $message['created'], 'D, d M Y - g:i A'));
            $seen = $message['seen'];
        }
        $select = $message['name'] . '<input type="hidden" name="messageto" value="' . $contact_id . '" />';
        $parent = '<input type="hidden" name="replyto" value="' . $message['parent-uri'] . '" />';
        $tpl = get_markup_template('mail_display.tpl');
        $o = replace_macros($tpl, array('$thread_id' => $a->argv[1], '$thread_subject' => $message['title'], '$thread_seen' => $seen, '$delete' => t('Delete conversation'), '$canreply' => $unknown ? false : '1', '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."), '$mails' => $mails, '$header' => t('Send Reply'), '$to' => t('To:'), '$showinputs' => '', '$subject' => t('Subject:'), '$subjtxt' => template_escape($message['title']), '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ', '$yourmessage' => t('Your message:'), '$text' => '', '$select' => $select, '$parent' => $parent, '$upload' => t('Upload photo'), '$insert' => t('Insert web link'), '$wait' => t('Please wait')));
        return $o;
    }
}