1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.openr66.context.task;
21
22 import org.waarp.common.file.AbstractDir;
23 import org.waarp.common.logging.WaarpLogger;
24 import org.waarp.common.logging.WaarpLoggerFactory;
25 import org.waarp.common.utility.WaarpStringUtils;
26 import org.waarp.openr66.context.R66Session;
27 import org.waarp.openr66.context.task.exception.OpenR66RunnerException;
28
29 import java.io.File;
30 import java.util.regex.Pattern;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public class ChModTask extends AbstractTask {
63
64
65
66 private static final WaarpLogger logger =
67 WaarpLoggerFactory.getLogger(ChModTask.class);
68 private static final Pattern BLANK = WaarpStringUtils.BLANK;
69
70
71
72
73
74
75
76 public ChModTask(final String argRule, final int delay,
77 final String argTransfer, final R66Session session) {
78 super(TaskType.CHMOD, delay, argRule, argTransfer, session);
79 }
80
81 @Override
82 public final void run() {
83 String finalname = argRule;
84 finalname = AbstractDir.normalizePath(
85 getReplacedValue(finalname, BLANK.split(argTransfer))).trim()
86 .toLowerCase();
87 logger.info("ChMod with arg {} from {}", finalname, session);
88 final File file = session.getFile().getTrueFile();
89 boolean user;
90 boolean all;
91 boolean isall = false;
92 boolean ur;
93 boolean uw;
94 boolean ux;
95 boolean ar = false;
96 boolean aw = false;
97 boolean ax = false;
98 ur = file.canRead();
99 uw = file.canWrite();
100 ux = file.canExecute();
101 final String[] chmods = BLANK.split(finalname);
102 for (final String chmod : chmods) {
103 user = chmod.indexOf('u') >= 0;
104 all = chmod.indexOf('a') >= 0;
105 if (!user && !all) {
106
107 continue;
108 }
109 isall |= all;
110 boolean isp = false;
111 boolean ism = false;
112 boolean ise = false;
113 if (chmod.indexOf('=') >= 0) {
114 ise = true;
115 } else if (chmod.indexOf('+') >= 0) {
116 isp = true;
117 } else if (chmod.indexOf('-') >= 0) {
118 ism = true;
119 } else {
120
121 continue;
122 }
123 final boolean isr;
124 final boolean isw;
125 final boolean isx;
126 isr = chmod.indexOf('r') >= 0;
127 isw = chmod.indexOf('w') >= 0;
128 isx = chmod.indexOf('x') >= 0;
129 if (!isr && !isw && !isx) {
130
131 continue;
132 }
133 if (user) {
134 ur = ise && isr || isp && (isr || ur) || ism && !isr && ur;
135 uw = ise && isw || isp && (isw || uw) || ism && !isw && uw;
136 ux = ise && isx || isp && (isx || ux) || ism && !isx && ux;
137 }
138 if (all) {
139 ar = ise && isr || isp && (isr || ar) || ism && !isr && ar;
140 aw = ise && isw || isp && (isw || aw) || ism && !isw && aw;
141 ax = ise && isx || isp && (isx || ax) || ism && !isx && ax;
142 }
143 }
144 boolean result = true;
145 if (isall) {
146 result &= file.setReadable(ar, false);
147 result &= file.setWritable(aw, false);
148 result &= file.setExecutable(ax, false);
149 }
150 result &= file.setReadable(ur, true);
151 result &= file.setWritable(uw, true);
152 result &= file.setExecutable(ux, true);
153 if (result) {
154 futureCompletion.setSuccess();
155 } else {
156 logger.error(
157 "ChMod " + finalname + " on file : " + file + " " + session);
158 futureCompletion.setFailure(
159 new OpenR66RunnerException("Chmod not fully applied on File"));
160 }
161 }
162
163 }