Merge branch 'master' of https://github.com/jgoodman/Freeside
[freeside.git] / rt / lib / RT / Interface / REST.pm
index ae1d6ad..17fe446 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
 #
 # END BPS TAGGED BLOCK }}}
 
-# lib/RT/Interface/REST.pm
-#
-
 package RT::Interface::REST;
+use LWP::MediaTypes qw(guess_media_type);
 use strict;
+use warnings;
 use RT;
 
-BEGIN {
-    use base 'Exporter';
-    use vars qw($VERSION @EXPORT);
-
-    $VERSION = do { my @r = (q$Revision: 1.1.1.9 $ =~ /\d+/g); sprintf "%d."."%02d"x$#r, @r };
-
-    @EXPORT = qw(expand_list form_parse form_compose vpush vsplit);
-}
+use base 'Exporter';
+our @EXPORT = qw(expand_list form_parse form_compose vpush vsplit process_attachments);
 
 sub custom_field_spec {
     my $self    = shift;
     my $capture = shift;
 
-    my $CF_char = '[\sa-z0-9_ :()/-]';
-    my $CF_name = $CF_char . '+';
+    my $CF_name = '[^,]+';
     $CF_name = '(' . $CF_name . ')' if $capture;
 
     my $new_style = 'CF\.\{'.$CF_name.'\}';
@@ -160,8 +152,8 @@ sub form_parse {
                 pop @v while (@v && $v[-1] eq '');
 
                 # Strip longest common leading indent from text.
-                my ($ws, $ls) = ("");
-                foreach $ls (map {/^(\s+)/} @v[1..$#v]) {
+                my $ws = ("");
+                foreach my $ls (map {/^(\s+)/} @v[1..$#v]) {
                     $ws = $ls if (!$ws || length($ls) < length($ws));
                 }
                 s/^$ws// foreach @v;
@@ -189,8 +181,7 @@ sub form_parse {
     }
     push(@forms, [ $c, $o, $k, $e ]) if ($e || $c || @$o);
 
-    my $l;
-    foreach $l (keys %$k) {
+    foreach my $l (keys %$k) {
         $k->{$l} = vsplit($k->{$l}) if (ref $k->{$l} eq 'ARRAY');
     }
 
@@ -200,9 +191,9 @@ sub form_parse {
 # Returns text representing a set of forms.
 sub form_compose {
     my ($forms) = @_;
-    my (@text, $form);
+    my (@text);
 
-    foreach $form (@$forms) {
+    foreach my $form (@$forms) {
         my ($c, $o, $k, $e) = @$form;
         my $text = "";
 
@@ -214,10 +205,10 @@ sub form_compose {
             $text .= $e;
         }
         elsif ($o) {
-            my (@lines, $key);
+            my (@lines);
 
-            foreach $key (@$o) {
-                my ($line, $sp, $v);
+            foreach my $key (@$o) {
+                my ($line, $sp);
                 my @values = (ref $k->{$key} eq 'ARRAY') ?
                                @{ $k->{$key} } :
                                   $k->{$key};
@@ -225,7 +216,7 @@ sub form_compose {
                 $sp = " "x(length("$key: "));
                 $sp = " "x4 if length($sp) > 16;
 
-                foreach $v (@values) {
+                foreach my $v (@values) {
                     $v = '' unless defined $v;
                     if ( $v =~ /\n/) {
                         $v =~ s/^/$sp/gm;
@@ -293,9 +284,9 @@ sub vpush {
 # "Normalise" a hash key that's known to be multi-valued.
 sub vsplit {
     my ($val) = @_;
-    my ($line, $word, @words);
+    my @words;
 
-    foreach $line (map {split /\n/} (ref $val eq 'ARRAY') ? @$val : ($val||''))
+    foreach my $line (map {split /\n/} (ref $val eq 'ARRAY') ? @$val : ($val||''))
     {
         # XXX: This should become a real parser, ? la Text::ParseWords.
         $line =~ s/^\s+//;
@@ -306,15 +297,46 @@ sub vsplit {
     return \@words;
 }
 
-eval "require RT::Interface::REST_Vendor";
-if ($@ && $@ !~ qr{^Can't locate RT/Interface/REST_Vendor.pm}) {
-    die $@;
-};
+sub process_attachments {
+    my $entity = shift;
+    my @list = @_;
+    return 1 unless @list;
+
+    my $m = $HTML::Mason::Commands::m;
+    my $cgi = $m->cgi_object;
+
+    my $i = 1;
+    foreach my $e ( @list ) {
+
+        my $fh = $cgi->upload("attachment_$i");
+        return (0, "No attachment for $e") unless $fh;
+
+        local $/=undef;
+
+        my $file = $e;
+        $file =~ s#^.*[\\/]##;
+
+        my ($tmp_fh, $tmp_fn) = File::Temp::tempfile( UNLINK => 1 );
+
+        my $buf;
+        while (sysread($fh, $buf, 8192)) {
+            syswrite($tmp_fh, $buf);
+        }
+
+        my $info = $cgi->uploadInfo($fh);
+        my $new_entity = $entity->attach(
+            Path => $tmp_fn,
+            Type => $info->{'Content-Type'} || guess_media_type($tmp_fn),
+            Filename => $file,
+            Disposition => "attachment",
+        );
+        $new_entity->bodyhandle->{'_dirty_hack_to_save_a_ref_tmp_fh'} = $tmp_fh;
+        $i++;
+    }
+    return (1);
+}
 
-eval "require RT::Interface::REST_Local";
-if ($@ && $@ !~ qr{^Can't locate RT/Interface/REST_Local.pm}) {
-    die $@;
-};
+RT::Base->_ImportOverlays();
 
 1;