1
+ // Papercut
2
+ //
3
+ // Copyright © 2008 - 2012 Ken Robertson
4
+ // Copyright © 2013 - 2017 Jaben Cargman
5
+ //
6
+ // Licensed under the Apache License, Version 2.0 (the "License");
7
+ // you may not use this file except in compliance with the License.
8
+ // You may obtain a copy of the License at
9
+ //
10
+ // http://www.apache.org/licenses/LICENSE-2.0
11
+ //
12
+ // Unless required by applicable law or agreed to in writing, software
13
+ // distributed under the License is distributed on an "AS IS" BASIS,
14
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ // See the License for the specific language governing permissions and
16
+ // limitations under the License.
17
+
18
+
19
+ namespace Papercut . Module . WebUI . Controllers
20
+ {
21
+ using System . Linq ;
22
+ using System . Net ;
23
+ using System . Net . Http ;
24
+ using System . Net . Http . Headers ;
25
+ using System . Net . Mime ;
26
+ using System . Web . Http ;
27
+ using Helpers ;
28
+ using Message ;
29
+ using MimeKit ;
30
+ using Models ;
31
+ using Message . Helpers ;
32
+ using System ;
33
+ using System . Collections . Generic ;
34
+ using System . IO ;
35
+
36
+ using Common . Extensions ;
37
+
38
+ public class MessagesController : ApiController
39
+ {
40
+ readonly MessageRepository messageRepository ;
41
+ readonly MimeMessageLoader messageLoader ;
42
+
43
+ public MessagesController ( MessageRepository messageRepository , MimeMessageLoader messageLoader )
44
+ {
45
+ this . messageRepository = messageRepository ;
46
+ this . messageLoader = messageLoader ;
47
+ }
48
+
49
+ [ HttpGet ]
50
+ public HttpResponseMessage GetAll ( int limit = 10 , int start = 0 )
51
+ {
52
+ var messageEntries = messageRepository . LoadMessages ( ) ;
53
+
54
+ var messages = messageEntries
55
+ . OrderByDescending ( msg => msg . ModifiedDate )
56
+ . Skip ( start )
57
+ . Take ( limit )
58
+ . Select ( e => MimeMessageEntry . RefDto . CreateFrom ( new MimeMessageEntry ( e , messageLoader . LoadMailMessage ( e ) ) ) )
59
+ . ToList ( ) ;
60
+
61
+ return Request . CreateResponse ( HttpStatusCode . OK , new
62
+ {
63
+ TotalMessageCount = messageEntries . Count ,
64
+ Messages = messages
65
+ } ) ;
66
+ }
67
+
68
+ [ HttpDelete ]
69
+ public HttpResponseMessage DeleteAll ( )
70
+ {
71
+ messageRepository . LoadMessages ( )
72
+ . ForEach ( msg =>
73
+ {
74
+ try
75
+ {
76
+ messageRepository . DeleteMessage ( msg ) ;
77
+ } catch { }
78
+ } ) ;
79
+
80
+ return Request . CreateResponse ( HttpStatusCode . OK ) ;
81
+ }
82
+
83
+ [ HttpGet ]
84
+ public HttpResponseMessage Get ( string id )
85
+ {
86
+ var messageEntry = messageRepository . LoadMessages ( ) . FirstOrDefault ( msg => msg . Name == id ) ;
87
+ if ( messageEntry == null )
88
+ {
89
+ return Request . CreateResponse ( HttpStatusCode . NotFound ) ;
90
+ }
91
+
92
+ var dto = MimeMessageEntry . DetailDto . CreateFrom ( new MimeMessageEntry ( messageEntry , messageLoader . LoadMailMessage ( messageEntry ) ) ) ;
93
+ return Request . CreateResponse ( HttpStatusCode . OK , dto ) ;
94
+ }
95
+
96
+ [ HttpGet ]
97
+ public HttpResponseMessage DownloadRaw ( string messageId )
98
+ {
99
+ var messageEntry = messageRepository . LoadMessages ( ) . FirstOrDefault ( msg => msg . Name == messageId ) ;
100
+ if ( messageEntry == null )
101
+ {
102
+ return Request . CreateResponse ( HttpStatusCode . NotFound ) ;
103
+ }
104
+
105
+ var response = Request . CreateResponse ( HttpStatusCode . OK ) ;
106
+ response . Content = new StreamContent ( File . OpenRead ( messageEntry . File ) ) ;
107
+ response . Content . Headers . ContentDisposition = new ContentDispositionHeaderValue ( DispositionTypeNames . Attachment )
108
+ {
109
+ FileName = Uri . EscapeDataString ( messageId )
110
+ } ;
111
+ response . Content . Headers . ContentType = new MediaTypeHeaderValue ( "message/rfc822" ) ;
112
+ return response ;
113
+ }
114
+
115
+ [ HttpGet ]
116
+ public HttpResponseMessage DownloadSection ( string messageId , int index )
117
+ {
118
+ return DownloadSection ( messageId , sections => ( index >= 0 && index < sections . Count ? sections [ index ] : null ) ) ;
119
+ }
120
+
121
+ [ HttpGet ]
122
+ public HttpResponseMessage DownloadSectionContent ( string messageId , string contentId )
123
+ {
124
+ return DownloadSection ( messageId , ( sections ) => sections . FirstOrDefault ( s => s . ContentId == contentId ) ) ;
125
+ }
126
+
127
+ HttpResponseMessage DownloadSection ( string messageId , Func < List < MimePart > , MimePart > findSection )
128
+ {
129
+ var messageEntry = messageRepository . LoadMessages ( ) . FirstOrDefault ( msg => msg . Name == messageId ) ;
130
+ if ( messageEntry == null )
131
+ {
132
+ return Request . CreateResponse ( HttpStatusCode . NotFound ) ;
133
+ }
134
+
135
+ var mimeMessage = new MimeMessageEntry ( messageEntry , messageLoader . LoadMailMessage ( messageEntry ) ) ;
136
+ var sections = mimeMessage . MailMessage . BodyParts . OfType < MimePart > ( ) . ToList ( ) ;
137
+
138
+ var mimePart = findSection ( sections ) ;
139
+ if ( mimePart == null )
140
+ {
141
+ return Request . CreateResponse ( HttpStatusCode . NotFound ) ;
142
+ }
143
+
144
+ var response = new MimePartResponseMessage ( Request , mimePart . ContentObject ) ;
145
+ var filename = mimePart . FileName ?? mimePart . ContentId ?? Guid . NewGuid ( ) . ToString ( ) ;
146
+ response . Content . Headers . ContentDisposition = new ContentDispositionHeaderValue ( DispositionTypeNames . Attachment )
147
+ {
148
+ FileName = Uri . EscapeDataString ( FileHelper . NormalizeFilename ( filename ) )
149
+ } ;
150
+ response . Content . Headers . ContentType = new MediaTypeHeaderValue ( $ "{ mimePart . ContentType . MediaType } /{ mimePart . ContentType . MediaSubtype } ") ;
151
+ return response ;
152
+ }
153
+ }
154
+ }
0 commit comments