Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 77 additions & 1 deletion app/dada/DADA/App.pm
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,8 @@ sub setup {
'transform_to_pro' => \&transform_to_pro,
'yikes' => \&yikes,
'rate_limit_reached' => \&rate_limit_reached,
'status_405' => \&status_405,
'status_405' => \&status_405,
'dir' => \&dir,

# These handled the oldstyle confirmation. For some backwards compat, I've changed
# them so that there's at least a shim to the new system,
Expand Down Expand Up @@ -17192,6 +17193,81 @@ sub scheduled_jobs {
);
}


sub decontaminate_path {
my ($path) = @_;

$path =~ s/[^\w\d\s._\-\/]//g;
$path =~ s/\.\.//g;
$path =~ /([\w\d\s._\-\/]+)/;
$path = $1;
return $path;
}


sub dir {
my $self = shift;

my $q = $self->query;

my $root = $DADA::Config::SUPPORT_FILES->{dir} . '/' . 'file_uploads';
my $dir = $q->param('data-dir') || '';
$dir = decontaminate_path($dir);
# delete the / at the beginning
$dir =~ s/^\///;

my $path = $dir ? "$root/$dir" : $root;

my $dataId = $q->param('data-id');
my $dataTarget = $q->param('data-target');

my $ret = qq(<p class="fbrowser_head">\n);
$ret .= qq(<span class="fbrowser"><i>Select a file ...</i></span>);
$ret .= qq(<button class="btn_small fclose" data-id="$dataId">Close File Selector</button>);
$ret .= qq(</p>);
if ($dir) {
my ($parentDir) = $dir =~ m/(.+)\/.*/;
$ret .= qq(<p>\n);
$ret .= qq(<span class="fbrowser"><a class="fbrowse" data-id="$dataId" data-dir="$parentDir" data-target="$dataTarget" href="">..</a></span>);
$ret .= qq(</p>);
}


my @dirs; my @files;
while (my $file = <$path/*>) {

my $rel_path = $file;
$rel_path =~ s/$root\///;

if (-d $file) {
push @dirs, $rel_path;
}
else {
push @files, $rel_path;
}
}

foreach my $dir (@dirs) {
my $value = $dir;

$ret .= qq(<p>\n);
$ret .= qq(<span class="fbrowser"><a class="fbrowse" data-id="$dataId" data-dir="$dir" data-target="$dataTarget" href="">$dir</a></span>);
$ret .= qq(<button class="btn_small fselect" data-target="$dataTarget" data-value="$value">Select</button>);
$ret .= qq(</p>);
}

foreach my $file (@files) {
my $value = $file;
$ret .= qq(<p>\n);
$ret .= qq(<span class="fbrowser">$file</span>);
$ret .= qq(<button class="btn_small fselect" data-target="$dataTarget" data-value="$value">Select</button>);
$ret .= qq(</p>);
}

$self->header_add(-type => 'text/html');
return $ret;
}

sub DESTROY {

# warn 'DADA::App::DESTROY called.';
Expand Down
8 changes: 8 additions & 0 deletions app/dada/DADA/App/MassSend.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1497,6 +1497,8 @@ sub send_email {
rich_filemanager_url => $DADA::Config::FILE_BROWSER_OPTIONS->{rich_filemanager}->{url},
rich_filemanager_upload_dir => $DADA::Config::FILE_BROWSER_OPTIONS->{rich_filemanager}->{upload_dir},
rich_filemanager_upload_url => $DADA::Config::FILE_BROWSER_OPTIONS->{rich_filemanager}->{upload_url},

fileselect_enabled => $DADA::Config::FILE_BROWSER_OPTIONS->{fileselect}->{enabled},

can_use_www_engine => $can_use_www_engine,
www_engine_error => $www_engine_error,
Expand Down Expand Up @@ -2455,6 +2457,9 @@ sub has_attachments {
elsif ( $DADA::Config::FILE_BROWSER_OPTIONS->{rich_filemanager}->{enabled} == 1 ) {
$filemanager = 'rich_filemanager';
}
elsif ( $DADA::Config::FILE_BROWSER_OPTIONS->{fileselect}->{enabled} == 1 ) {
$filemanager = 'fileselect';
}

my @ive_got = ();

Expand Down Expand Up @@ -2514,6 +2519,9 @@ sub make_attachment {
elsif ( $DADA::Config::FILE_BROWSER_OPTIONS->{rich_filemanager}->{enabled} == 1 ) {
$filemanager = 'rich_filemanager';
}
elsif ( $DADA::Config::FILE_BROWSER_OPTIONS->{fileselect}->{enabled} == 1 ) {
$filemanager = 'fileselect';
}

if ( !$name ) {
warn '!$name';
Expand Down
14 changes: 9 additions & 5 deletions app/dada/DADA/Config.pm
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ use vars qw($PROGRAM_ROOT_PASSWORD $MAILPROG $DIR $FILES $PROGRAM_URL $S_PROGRAM
#
#

$PROGRAM_CONFIG_FILE_DIR = 'auto';
$PROGRAM_CONFIG_FILE_DIR = '/home/maximilian/dada/.dada_files/.configs';

#
#
Expand All @@ -47,7 +47,7 @@ BEGIN {
#
#

$PROGRAM_ERROR_LOG = undef;
$PROGRAM_ERROR_LOG = '/home/maximilian/dada/.dada_files/.logs/errors.txt';

#
#
Expand Down Expand Up @@ -129,6 +129,10 @@ $FILE_BROWSER_OPTIONS //= {
upload_url => '',
connector => '',
},
fileselect => {
enabled => 0,
upload_dir => '',
},
none => {
enabled => 1,
}
Expand Down Expand Up @@ -1069,8 +1073,8 @@ $ADMIN_MENU //= [

];

$LIST_QUOTA //= undef;
$SUBSCRIPTION_QUOTA //= undef;
$LIST_QUOTA //= 3;
$SUBSCRIPTION_QUOTA //= 100;
$MAILOUT_AT_ONCE_LIMIT //= 1;
$MAILOUT_STALE_AFTER //= 86400;

Expand Down Expand Up @@ -1945,7 +1949,7 @@ $LIST_HEADERS //= {

$GIVE_PROPS_IN_EMAIL //= 1;
$GIVE_PROPS_IN_HTML //= 1;
$GIVE_PROPS_IN_ADMIN //= 0;
$GIVE_PROPS_IN_ADMIN //= 1;
$GIVE_PROPS_IN_SUBSCRIBE_FORM //= 1;
$PROGRAM_IMG_FILENAME //= 'dada_mail_logo.png';
##########################################
Expand Down
34 changes: 33 additions & 1 deletion app/dada/static/css/vendor/foundation/app.css

Large diffs are not rendered by default.

175 changes: 172 additions & 3 deletions app/dada/templates/send_email_file_attachments_widget.tmpl
Original file line number Diff line number Diff line change
@@ -1,9 +1,177 @@
<!-- begin send_email_file_attachments_widget.tmpl -->

<!-- tmpl_if expr="((core5_filemanager_enabled == 1) || (rich_filemanager_enabled == 1))" -->
<!-- tmpl_if expr="((core5_filemanager_enabled == 1) || (rich_filemanager_enabled == 1) || (fileselect_enabled == 1))" -->

<div id="attachment_widgets">

<!-- tmpl_if fileselect_enabled -->

<p class="row fselect">
<label for="attachment1">attachment 1</label>
<input type="text" class="fselect" id="attachment1" name="attachment1" value="">
<button class="fbrowse" data-dir="" data-id="attachment1-browser" data-target="attachment1">Select File</button>
</p>
<div id="attachment1-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment2">attachment 2</label>
<input type="text" class="fselect" id="attachment2" name="attachment2" value="">
<button class="fbrowse" data-dir="" data-id="attachment2-browser" data-target="attachment2">Select File</button>
</p>
<div id="attachment2-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment3">attachment 3</label>
<input type="text" class="fselect" id="attachment3" name="attachment3" value="">
<button class="fbrowse" data-dir="" data-id="attachment3-browser" data-target="attachment3">Select File</button>
</p>
<div id="attachment3-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment4">attachment 4</label>
<input type="text" class="fselect" id="attachment1" name="attachment4" value="">
<button class="fbrowse" data-dir="" data-id="attachment1-browser" data-target="attachment4">Select File</button>
</p>
<div id="attachment4-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment5">attachment 5</label>
<input type="text" class="fselect" id="attachment5" name="attachment5" value="">
<button class="fbrowse" data-dir="" data-id="attachment5-browser" data-target="attachment5">Select File</button>
</p>
<div id="attachment5-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment6">attachment 6</label>
<input type="text" class="fselect" id="attachment6" name="attachment6" value="">
<button class="fbrowse" data-dir="" data-id="attachment6-browser" data-target="attachment6">Select File</button>
</p>
<div id="attachment6-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment7">attachment 7</label>
<input type="text" class="fselect" id="attachment7" name="attachment7" value="">
<button class="fbrowse" data-dir="" data-id="attachment7-browser" data-target="attachment7">Select File</button>
</p>
<div id="attachment7-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment8">attachment 8</label>
<input type="text" class="fselect" id="attachment8" name="attachment8" value="">
<button class="fbrowse" data-dir="" data-id="attachment8-browser" data-target="attachment8">Select File</button>
</p>
<div id="attachment8-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment9">attachment 9</label>
<input type="text" class="fselect" id="attachment9" name="attachment9" value="">
<button class="fbrowse" data-dir="" data-id="attachment9-browser" data-target="attachment9">Select File</button>
</p>
<div id="attachment9-browser" class="fbrowser_placeholder">
</div>

<p class="row fselect">
<label for="attachment10">attachment 10</label>
<input type="text" class="fselect" id="attachment10" name="attachment10" value="">
<button class="fbrowse" data-dir="" data-id="attachment10-browser" data-target="attachment10">Select File</button>
</p>
<div id="attachment1-browser" class="fbrowser_placeholder">
</div>

<script defer="defer">
let registerEvents = function () {
let links = document.querySelectorAll("a.fbrowse");
for (let l of Array.from(links)) {
l.addEventListener('click', event => {
event.preventDefault();
SendRequest(event.target)
});
}

let select_buttons = document.querySelectorAll("button.fselect");
for (let b of Array.from(select_buttons) ) {
b.addEventListener('click', event => {
event.preventDefault();
insertFilename(event.target)
});
}

let close_buttons = document.querySelectorAll("button.fclose");
for (let cb of Array.from(close_buttons) ) {
cb.addEventListener('click', event => {
event.preventDefault();
hideBrowser(event.target);
});
}

};

let hideBrowser = function (target) {
let id = target.getAttribute('data-id');
let element = document.getElementById(id);
element.innerHTML = '';
element.className = 'fbrowser invisible';

}

let insertFilename = function (target) {
let id = target.getAttribute('data-target');
let filename = target.getAttribute('data-value');
let element = document.getElementById(id);
element.setAttribute('value',filename);
}

let SendRequest = function (target) {
let dir = target.getAttribute("data-dir") || '';
let tar = target.getAttribute('data-target') || '';
let id = target.getAttribute('data-id') || '';

let url = `?flavor=dir&data-dir=${dir}&data-target=${tar}&data-id=${id}`;

if (http != null) {
http.open("GET",url, true);
http.onreadystatechange = function () {ausgeben(target);};
http.send();
}

}

let ausgeben = function (target) {
if (http.readyState == 4) {
let text = http.responseText;
let id = target.getAttribute('data-id');
let element = document.getElementById(id);
element.innerHTML = text;
element.className = 'fbrowser';
registerEvents();
}
}

let http = null;
if (window.XMLHttpRequest) {
http = new XMLHttpRequest();
} else if (window.ActiveXObject) {
http = new ActiveXObject("Microsoft.XMLHTTP");
}
let buttons = document.querySelectorAll("button.fbrowse");
for (let b of Array.from(buttons)) {
b.addEventListener('click', event => {
event.preventDefault();
SendRequest(event.target)
});
}
</script>

<!-- /tmpl_if -->

<!-- tmpl_if core5_filemanager_enabled -->

<input type="hidden" id="core5_filemanager_enabled" name="core5_filemanager_enabled" value="<!-- tmpl_var core5_filemanager_enabled -->" >
Expand All @@ -19,6 +187,7 @@
<input type="hidden" id="rich_filemanager_upload_url" name="rich_filemanager_upload_url" value="<!-- tmpl_var rich_filemanager_upload_url -->" >
<!-- /tmpl_if -->

<!-- tmpl_unless fileselect_enabled -->
<input type="hidden" id="SUPPORT_FILES_URL" name="SUPPORT_FILES_URL" value="<!-- tmpl_var SUPPORT_FILES_URL -->" >

<div class="row">
Expand Down Expand Up @@ -125,10 +294,10 @@
</div>
</div>



<!-- /tmpl_unless -->

</div>

<!-- tmpL_else -->
<div class="alert-box info radius">

Expand Down