Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 8
- Log:
Updated to HEAD revision from SVN repository for 22-Jul-2006 at
about 6:30pm.
- Author:
- adh
- Date:
- Sat Jul 22 19:30:50 +0100 2006
- Size:
- 3578 Bytes
1 | module ReceivedMail |
2 | def from_guest? |
3 | User.find_by_email(self.from.first.downcase) == nil |
4 | end |
5 | |
6 | def from_unauthorized_user? |
7 | User.find_by_email(self.from.first.downcase).sends_email == 0 |
8 | end |
9 | |
10 | def author |
11 | if user = User.find_by_email(self.from.first.downcase) |
12 | return user |
13 | else |
14 | name = TMail::Address.parse(self['from'].to_s).phrase |
15 | name = TMail::Unquoter.unquote_and_convert_to(name, 'utf-8') |
16 | if name.nil? || name.size < 2 |
17 | name = 'unknown' |
18 | end |
19 | email = self.from.first |
20 | return Guest.new(name, email) |
21 | end |
22 | end |
23 | |
24 | def parent |
25 | if self.references.nil? and self.in_reply_to.nil? |
26 | return nil |
27 | end |
28 | |
29 | if self['in-reply-to'] |
30 | if self.in_reply_to.first |
31 | parent_messageid = self.in_reply_to.first |
32 | else |
33 | # TMail fails to parse in-reply-to headers where <> is missing, |
34 | # so we do it manually here |
35 | parent_messageid = self['in-reply-to'].phrases.first |
36 | end |
37 | else |
38 | parent_messageid = self.references.reverse.first |
39 | end |
40 | |
41 | parent_messageid = parent_messageid.to_s.tr('<>', '') |
42 | |
43 | if post = Post.find_by_messageid(parent_messageid) |
44 | return post |
45 | else |
46 | if self.cleaned_subject =~ /^Re:/i |
47 | raise 'parent not found' |
48 | else |
49 | # if no parent is found and subject is no reply, treat as new topic |
50 | return nil |
51 | end |
52 | end |
53 | end |
54 | |
55 | def forum |
56 | ((self.to || []) | (self.cc || [])).each do |address| |
57 | if forum = Forum.find_by_list_address(address.downcase) |
58 | return forum |
59 | end |
60 | end |
61 | |
62 | raise "mail for unknown forum received (#{self.to.inspect})" |
63 | end |
64 | |
65 | def create_post |
66 | if Post.find_by_messageid(self.message_id.tr('<>', '')) |
67 | raise 'messageid : has already been taken' |
68 | end |
69 | |
70 | if self.parent |
71 | self.parent.add_reply(self.to_post) |
72 | else |
73 | self.forum.add_post(self.to_post) |
74 | end |
75 | end |
76 | |
77 | def to_post |
78 | post = Post.new |
79 | post.subject = self.cleaned_subject |
80 | post.text = self.cleaned_text |
81 | post.author = self.author |
82 | post.post_method = 'mail' |
83 | post.messageid = self.message_id.tr('<>', '') |
84 | post |
85 | end |
86 | |
87 | def cleaned_subject |
88 | s = self.subject |
89 | # remove first [tag] from subject |
90 | s.sub!(/\[.+?\] ?/, '') |
91 | s.strip! |
92 | if s.size == 0 |
93 | s = '(no subject)' |
94 | end |
95 | s |
96 | end |
97 | |
98 | def remove_signature(s) |
99 | s = s.dup |
100 | s.gsub!(/\n--(\n.+){0,3}\s*\Z/, '') |
101 | s.gsub!(/\n-- (\n.+){0,6}\s*\Z/, '') |
102 | s.gsub!(/\n-----+(\n.+){0,6}\s*\Z/, '') |
103 | s.gsub!(/\n______+(\n.+){0,6}\s*\Z/, '') |
104 | s |
105 | end |
106 | |
107 | def cleaned_text |
108 | s = self.plaintext_body |
109 | |
110 | s = remove_signature(s) |
111 | |
112 | # remove TOFU |
113 | s.gsub!(/(\n>.*)+\s*\Z/, '') |
114 | if $1 |
115 | # remove "xy wrote:" |
116 | s.gsub!(/\s*\n.*wrote.*:\s*\Z/, '') |
117 | end |
118 | |
119 | # remove attached "original message" |
120 | s.gsub!(/\s*\n-+Original Message-+.*$/m, '') |
121 | |
122 | # remove too long quoting |
123 | s.gsub!(/^(>.*\n)+?((>+.*\n){10})\s*/, '\3') |
124 | |
125 | s.strip! |
126 | s |
127 | end |
128 | |
129 | def plaintext_body |
130 | if self.multipart? |
131 | # look for multipart/alternative parts |
132 | alternative_parts = self.parts.reject {|p| not p.content_type =~ /^multipart/ } |
133 | interesting_parts = (alternative_parts.first.parts rescue []) + self.parts |
134 | plaintext_parts = interesting_parts.reject {|p| p.content_type != 'text/plain' } |
135 | raise "couln't find a text/plain mime part" if plaintext_parts.empty? |
136 | plaintext_parts.first.body |
137 | else |
138 | raise "body is not text/plain" unless self.content_type = 'text/plain' |
139 | self.body |
140 | end |
141 | end |
142 | end |