Class: Redwood::Chunk::Attachment
Constant Summary collapse
- @@view_tempfiles =
store tempfile objects as class variables so that they are not removed when the viewing process returns. they should be garbage collected when the class variable is removed.
[]
Instance Attribute Summary collapse
-
#content_type ⇒ Object
readonly
raw_content is the post-MIME-decode content.
-
#filename ⇒ Object
readonly
raw_content is the post-MIME-decode content.
-
#lines ⇒ Object
readonly
raw_content is the post-MIME-decode content.
-
#raw_content ⇒ Object
readonly
raw_content is the post-MIME-decode content.
Instance Method Summary collapse
- #color ⇒ Object
- #expandable? ⇒ Boolean
- #indexable? ⇒ Boolean
- #initial_state ⇒ Object
-
#initialize(content_type, filename, encoded_content, sibling_types) ⇒ Attachment
constructor
A new instance of Attachment.
-
#inlineable? ⇒ Boolean
an attachment is exapndable if we’ve managed to decode it into something we can display inline.
- #patina_color ⇒ Object
- #patina_text ⇒ Object
- #safe_filename ⇒ Object
-
#to_s ⇒ Object
used when viewing the attachment as text.
- #view! ⇒ Object
- #view_default!(path) ⇒ Object
- #viewable? ⇒ Boolean
- #write_to_disk ⇒ Object
Constructor Details
#initialize(content_type, filename, encoded_content, sibling_types) ⇒ Attachment
Returns a new instance of Attachment.
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/sup/message_chunks.rb', line 112 def initialize content_type, filename, encoded_content, sibling_types @content_type = content_type.downcase if Shellwords.escape(@content_type) != @content_type warn "content_type #{@content_type} is not safe, changed to application/octet-stream" @content_type = 'application/octet-stream' end @filename = filename @quotable = false # changed to true if we can parse it through the # mime-decode hook, or if it's plain text @raw_content = if encoded_content.body encoded_content.decode else "For some bizarre reason, RubyMail was unable to parse this attachment.\n" end text = case @content_type when /^text\/plain\b/ @raw_content else HookManager.run "mime-decode", :content_type => @content_type, :filename => lambda { write_to_disk }, :charset => encoded_content.charset, :sibling_types => sibling_types end @lines = nil if text text = text.transcode(encoded_content.charset || $encoding, text.encoding) begin @lines = text.gsub("\r\n", "\n").gsub(/\t/, " ").gsub(/\r/, "").split("\n") rescue Encoding::CompatibilityError @lines = text.fix_encoding!.gsub("\r\n", "\n").gsub(/\t/, " ").gsub(/\r/, "").split("\n") debug "error while decoding message text, falling back to default encoding, expect errors in encoding: #{text.fix_encoding!}" end @quotable = true end end |
Instance Attribute Details
#content_type ⇒ Object (readonly)
raw_content is the post-MIME-decode content. this is used for saving the attachment to disk.
104 105 106 |
# File 'lib/sup/message_chunks.rb', line 104 def content_type @content_type end |
#filename ⇒ Object (readonly)
raw_content is the post-MIME-decode content. this is used for saving the attachment to disk.
104 105 106 |
# File 'lib/sup/message_chunks.rb', line 104 def filename @filename end |
#lines ⇒ Object (readonly)
raw_content is the post-MIME-decode content. this is used for saving the attachment to disk.
104 105 106 |
# File 'lib/sup/message_chunks.rb', line 104 def lines @lines end |
#raw_content ⇒ Object (readonly)
raw_content is the post-MIME-decode content. this is used for saving the attachment to disk.
104 105 106 |
# File 'lib/sup/message_chunks.rb', line 104 def raw_content @raw_content end |
Instance Method Details
#color ⇒ Object
153 |
# File 'lib/sup/message_chunks.rb', line 153 def color; :text_color end |
#expandable? ⇒ Boolean
167 |
# File 'lib/sup/message_chunks.rb', line 167 def ; !viewable? end |
#indexable? ⇒ Boolean
168 |
# File 'lib/sup/message_chunks.rb', line 168 def indexable?; end |
#initial_state ⇒ Object
169 |
# File 'lib/sup/message_chunks.rb', line 169 def initial_state; :open end |
#inlineable? ⇒ Boolean
an attachment is exapndable if we’ve managed to decode it into something we can display inline. otherwise, it’s viewable.
166 |
# File 'lib/sup/message_chunks.rb', line 166 def inlineable?; false end |
#patina_color ⇒ Object
154 |
# File 'lib/sup/message_chunks.rb', line 154 def patina_color; :attachment_color end |
#patina_text ⇒ Object
155 156 157 158 159 160 161 |
# File 'lib/sup/message_chunks.rb', line 155 def patina_text if "Attachment: #{filename} (#{lines.length} lines)" else "Attachment: #{filename} (#{content_type}; #{@raw_content.size.to_human_size})" end end |
#safe_filename ⇒ Object
162 |
# File 'lib/sup/message_chunks.rb', line 162 def safe_filename; Shellwords.escape(@filename).gsub("/", "_") end |
#to_s ⇒ Object
used when viewing the attachment as text
217 218 219 |
# File 'lib/sup/message_chunks.rb', line 217 def to_s @lines || @raw_content end |
#view! ⇒ Object
183 184 185 186 187 188 189 |
# File 'lib/sup/message_chunks.rb', line 183 def view! write_to_disk do |path| ret = HookManager.run "mime-view", :content_type => @content_type, :filename => path ret || view_default!(path) end end |
#view_default!(path) ⇒ Object
171 172 173 174 175 176 177 178 179 180 181 |
# File 'lib/sup/message_chunks.rb', line 171 def view_default! path case RbConfig::CONFIG['arch'] when /darwin/ cmd = "open #{path}" else cmd = "/usr/bin/run-mailcap --action=view #{@content_type}:#{path}" end debug "running: #{cmd.inspect}" BufferManager.shell_out(cmd) $? == 0 end |
#viewable? ⇒ Boolean
170 |
# File 'lib/sup/message_chunks.rb', line 170 def viewable?; @lines.nil? end |
#write_to_disk ⇒ Object
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/sup/message_chunks.rb', line 191 def write_to_disk begin # Add the original extension to the generated tempfile name only if the # extension is "safe" (won't be interpreted by the shell). Since # Tempfile.new always generates safe file names this should prevent # attacking the user with funny attachment file names. tempname = if (File.extname @filename) =~ /^\.[[:alnum:]]+$/ then ["sup-attachment", File.extname(@filename)] else "sup-attachment" end file = Tempfile.new(tempname) file.print @raw_content file.flush @@view_tempfiles.push file # make sure the tempfile is not garbage collected before sup stops yield file.path if block_given? return file.path ensure file.close end end |