@@ -14,58 +14,78 @@ do("$ENV{'THEME_ROOT'}/extensions/file-manager/file-manager-lib.pl");
14
14
my @entries_list = get_entries_list();
15
15
my %errors ;
16
16
my $status ;
17
- my $action = $in {' action' };
18
- my $action_name = $action eq ' encrypt' ? ' encrypted' : ' decrypted' ;
19
- my $delete = $in {' delete' };
20
- my $passphrase = $in {' passphrase' };
21
- my $safe_mode = $config {' config_portable_module_filemanager_files_safe_mode' } ne ' false' ;
17
+ my $action = $in {' action' };
18
+ my $key = quotemeta ($in {' key' });
19
+ my $delete = $in {' delete' };
20
+ my $passphrase = $in {' passphrase' };
21
+ my $keyuser = $in {' keyuser' };
22
+ my $homeuser = $in {' homeuser' };
23
+ my $safe_mode = $config {' config_portable_module_filemanager_files_safe_mode' } ne ' false' ;
22
24
23
25
my $gpgpath = get_gpg_path();
24
26
my $no_command ;
25
27
28
+ # Get user level
29
+ my ($user_level ) = get_user_level();
30
+
31
+ # In case this is a master admin login,
32
+ # and the key to encrypt data belonging
33
+ # to /root, do not switch to the current
34
+ # home directory user and use that instead
35
+ my $forceuser ;
36
+ if (!$user_level && $keyuser ) {
37
+ $forceuser = $keyuser ;
38
+ }
39
+
26
40
# Set user env and switch to remote user first
27
- switch_to_given_unix_user();
41
+ switch_to_given_unix_user($forceuser );
28
42
29
43
foreach my $name (@entries_list ) {
30
- my ($iname , $fname , $fext );
44
+ my ($iname );
31
45
my $gpg ;
32
46
33
47
$iname = $name ;
48
+ $iname .= ($key ? (" _" . substr ($key , 0, 6)) : ' ' );
34
49
35
- # Clean name when decrypting
50
+ # Clean extension name when decrypting
36
51
if ($action eq " decrypt" ) {
37
- $iname =~ s /\. (gpg|pgp)$// ;
38
- $iname =~ s / (?|(_encrypted\(\d +\) )|(_encrypted))// ;
52
+ $iname =~ s / (_[a-h0-9]+\. gpg|pgp)$// i ;
39
53
}
40
- ($fname , $fext ) = file_name_extension_splitter($iname );
41
- $fext = " .$fext " if ($fext );
42
- $iname = $fname . " _" . $action_name ;
54
+
43
55
my $ffext ;
44
56
$ffext = " .gpg" if ($action eq " encrypt" );
45
57
46
58
# Check if file exist
47
- if ($safe_mode && -e " $cwd /$iname$fext$ ffext " ) {
48
- my $__ = 1 ;
59
+ if ($safe_mode && -e " $cwd /$iname$ffext " ) {
60
+ my $__ = 0 ;
49
61
for (;;) {
50
- my $niname = " $iname (" . $__++ . " )" ;
51
- if (!-e " $cwd /$niname$fext$ffext " ) {
52
- $iname = " $niname$fext " ;
62
+ $__++;
63
+ my $niname = " $iname (" . $__ . " )" ;
64
+ if ($action eq ' decrypt' ) {
65
+ my ($fname , $fext ) = file_name_extension_splitter($iname );
66
+ $niname = " $fname (" . $__ . " )" . ($fext ? " .$fext " : ' ' );
67
+ }
68
+ if (!-e " $cwd /$niname$ffext " ) {
69
+ $iname = " $niname$ffext " ;
53
70
last ;
54
71
}
55
72
}
56
73
} else {
57
- $iname .= $fext ;
74
+ $iname = " $iname$ffext " ;
58
75
unlink_file(" $cwd /$iname$ffext " ) if (-e " $cwd /$iname$ffext " );
59
76
}
60
77
$status = 0;
61
78
62
79
if ($action eq " encrypt" ) {
63
- my $key = quotemeta ($in {' key' });
64
80
my $fpath = " $cwd /$name " ;
65
81
$gpg =
66
- " cd @{[quotemeta($cwd )]} && $gpgpath --encrypt --always-trust --output @{[quotemeta($iname )]}.gpg --recipient $key @{[quotemeta($fpath )]}" ;
82
+ " cd @{[quotemeta($cwd )]} && $gpgpath --encrypt --always-trust --output @{[quotemeta($iname )]} --recipient $key @{[quotemeta($fpath )]}" ;
67
83
$status = system ($gpg );
68
84
85
+ # Set file owner in case was encrypted usign master admin keys
86
+ system (" chown --reference=" . quotemeta ($cwd ) . " " . quotemeta (" $cwd /$iname " ))
87
+ if (!$status && $homeuser && !$user_level );
88
+
69
89
} elsif ($action eq " decrypt" ) {
70
90
my $extra ;
71
91
if ($passphrase ) {
@@ -83,6 +103,10 @@ foreach my $name (@entries_list) {
83
103
print $fh $passphrase ;
84
104
close $fh ;
85
105
$status = $? ;
106
+
107
+ # Set file owner in case was decrypted usign master admin keys
108
+ system (" chown --reference=" . quotemeta ($cwd ) . " " . quotemeta (" $cwd /$iname " ))
109
+ if (!$status && $homeuser && !$user_level );
86
110
}
87
111
88
112
if ($delete && $status == 0) {
0 commit comments