com web/news: Use the new Nntp and fMailbox classes to download attachments: getpart.php
| From: | Ben Ramsey | Date: | Sat, 23 Jan 2016 05:39:00 +0000 |
| Subject: | com web/news: Use the new Nntp and fMailbox classes to download attachments: getpart.php | ||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-24514@lists.php.net to get a copy of this message | ||
Commit: 3579c9d6ae4200abfc712a99a69b6c562f72a72a
Author: Ben Ramsey <ben@benramsey.com> Sat, 23 Jan 2016 00:39:00 -0500
Parents: 151949772442ed3b9a1b5202a000ae88de1bc468
Branches: master
Link: http://git.php.net/?p=web/news.git;a=commitdiff;h=3579c9d6ae4200abfc712a99a69b6c562f72a72a
Log:
Use the new Nntp and fMailbox classes to download attachments
Changed paths:
M getpart.php
Diff:
diff --git a/getpart.php b/getpart.php
index 815b4cd..986d04e 100644
--- a/getpart.php
+++ b/getpart.php
@@ -20,134 +20,40 @@ if (isset($_GET['part'])) {
error("No part specified");
}
-$s = nntp_connect(NNTP_HOST);
-if (!$s) {
- error("Failed to connect to news server");
-}
+try {
+ $nntpClient = new \Web\News\Nntp(NNTP_HOST);
+ $message = $nntpClient->readArticle($article, $group);
-if ($group) {
- $res = nntp_cmd($s,"GROUP $group",211);
- if (!$res) {
- error("Failed to select group");
+ if ($message === null) {
+ error('No article found');
}
-}
-$res = nntp_cmd($s, "ARTICLE $article",220);
-if (!$res) {
- error("Failed to get article ". $article);
+ $mail = fMailbox::parseMessage($message);
+} catch (Exception $e) {
+ error($e->getMessage());
}
-$emit = false;
-
-$inheaders = 1; $headers = array();
-$boundary = $charset = $encoding = "";
-$mimecount = 0; // number of mime parts
-$boundaries = array();
-$lk = '';
-while (!feof($s)) {
- $line = fgets($s, 4096);
- if ($line == ".\r\n") {
- break;
- }
- if ($inheaders && ($line == "\n" || $line == "\r\n")) {
- $inheaders = 0;
- if (!empty($headers['content-type'])
- && preg_match("/charset=(\"|'|)(.+)\\1/is",
$headers['content-type'], $m)) {
- $charset = trim($m[2]);
- }
- if (!empty($headers['content-type'])
- && preg_match("/boundary=(\"|'|)(.+)\\1/is",
$headers['content-type'], $m)) {
- $boundaries[] = trim($m[2]);
- $boundary = end($boundaries);
- }
- if (!empty($headers['content-type'])
- && preg_match("/([^;]+)(;|\$)/", $headers['content-type'], $m)) {
- ++$mimecount;
- }
-
- $emit = ($mimecount == $part);
+if (!empty($mail['attachment'][$part])) {
+ $attachment = $mail['attachment'][$part];
- if (!empty($headers['content-transfer-encoding'])) {
- $encoding = strtolower(trim($headers['content-transfer-encoding']));
- }
- if ($emit) {
- /* check if content-type exist is made above */
- header('Content-Type: ' . $headers['content-type']);
- /* Do not rely on user-provided content-deposition header, generate own one to */
- /* make the content downloadable, do NOT use inline, we can't trust the attachment*/
- /* Downside of this approach: images should be downloaded before use */
- /* this is safer though, and prevents doing evil things on php.net domain */
- $contentdisposition = 'attachment';
- if (isset($headers['content-disposition'])
- && preg_match('/filename=([\'"]?).+?\1/',
$headers['content-disposition'], $m)) {
- $contentdisposition .= '; ' . $m[0];
- }
- header('Content-Disposition: ' . $contentdisposition);
- // if (isset($headers['content-disposition'])) {
- // header('Content-Disposition: ' . $headers['content-disposition']);
- //}
- if (isset($headers['content-description'])) {
- header('Content-Description: ' . $headers['content-description']);
- }
- }
+ /* Do not rely on user-provided content-deposition header, generate own one to */
+ /* make the content downloadable, do NOT use inline, we can't trust the attachment*/
+ /* Downside of this approach: images should be downloaded before use */
+ /* this is safer though, and prevents doing evil things on php.net domain */
+ $contentdisposition = 'attachment';
- continue;
- }
- # fix lines that started with a period and got escaped
- if (substr($line,0,2) == "..") {
- $line = substr($line,1);
+ if (!empty($attachment['filename'])) {
+ $contentdisposition .= '; filename="' . $attachment['filename'] .
'"';
}
- if ($inheaders) {
- /* header fields can be split across lines: CRLF WSP where WSP */
- /* is a space (ASCII 32) or tab (ASCII 9) */
- if ($lk && ($line[0] == ' ' || $line[0] == "\t")) {
- $headers[$lk] .= $line;
- } else {
- @list($k,$v) = explode(": ", $line, 2);
- if ($k && $v) {
- $headers[strtolower($k)] = $v;
- $lk = strtolower($k);
- } // else not a header field
- }
- } else {
-
- if ($boundary
- && substr($line,0,2) == '--'
- && substr($line,2,strlen($boundary)) == $boundary) {
-
- $inheaders = 1;
- if (substr($line,2+strlen($boundary)) == '--') {
- # end of this container
- array_pop($boundaries);
- $boundary = end($boundaries);
- } else {
- /* next section starts with no headers */
- $headers = null;
- }
+ header('Content-Type: ' . $attachment['mimetype']);
+ header('Content-Disposition: ' . $contentdisposition);
- continue;
- }
-
- if (!$emit) {
- continue;
- }
-
- switch($encoding) {
- case "quoted-printable":
- $line = quoted_printable_decode($line);
- break;
- case "base64":
- $line = base64_decode($line);
- break;
- }
-
- echo $line;
-
- /* done with attachment, no need to continue */
- if ($emit) {
- break;
- }
+ if (isset($attachment['description'])) {
+ header('Content-Description: ' . $attachment['description']);
}
-}
+ echo $attachment['data'];
+} else {
+ error('Part not found');
+}