1 package org.apache.maven.plugin.assembly.utils;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
23 import org.codehaus.plexus.logging.Logger;
24
25 import java.util.List;
26
27
28
29
30 public final class TypeConversionUtils
31 {
32
33 private static final int U_R = 256;
34
35 private static final int U_W = 128;
36
37 private static final int U_X = 64;
38
39 private static final int G_R = 32;
40
41 private static final int G_W = 16;
42
43 private static final int G_X = 8;
44
45 private static final int W_R = 4;
46
47 private static final int W_W = 2;
48
49 private static final int W_X = 1;
50
51 private TypeConversionUtils()
52 {
53 }
54
55 public static String[] toStringArray( final List<String> list )
56 {
57 String[] result = null;
58
59 if ( ( list != null ) && !list.isEmpty() )
60 {
61 result = list.toArray( new String[0] );
62 }
63
64 return result;
65 }
66
67 public static int modeToInt( final String mode, final Logger logger ) throws AssemblyFormattingException
68 {
69 if ( mode == null || mode.trim()
70 .length() < 1 )
71 {
72 return -1;
73 }
74
75 try
76 {
77 final int value = Integer.parseInt( mode, 8 );
78
79
80 verifyModeSanity( value, logger );
81
82 return value;
83 }
84 catch ( final NumberFormatException e )
85 {
86 throw new AssemblyFormattingException( "Failed to parse mode as an octal number: \'" + mode + "\'.", e );
87 }
88 }
89
90
91
92 public static boolean verifyModeSanity( final int mode, final Logger logger )
93 {
94 final StringBuffer messages = new StringBuffer();
95
96 messages.append( "The mode: " + Integer.toString( mode, 8 ) + " contains nonsensical permissions:" );
97
98 boolean warn = false;
99
100
101 if ( ( ( mode & U_R ) == 0 ) && ( ( mode & G_R ) == G_R ) )
102 {
103 messages.append( "\n- Group has read access, but user does not." );
104 warn = true;
105 }
106
107 if ( ( ( mode & U_R ) == 0 ) && ( ( mode & W_R ) == W_R ) )
108 {
109 messages.append( "\n- World has read access, but user does not." );
110 warn = true;
111 }
112
113 if ( ( ( mode & G_R ) == 0 ) && ( ( mode & W_R ) == W_R ) )
114 {
115 messages.append( "\n- World has read access, but group does not." );
116 warn = true;
117 }
118
119
120
121 if ( ( ( mode & U_W ) == 0 ) && ( ( mode & G_W ) == G_W ) )
122 {
123 messages.append( "\n- Group has write access, but user does not." );
124 warn = true;
125 }
126
127 if ( ( ( mode & U_W ) == 0 ) && ( ( mode & W_W ) == W_W ) )
128 {
129 messages.append( "\n- World has write access, but user does not." );
130 warn = true;
131 }
132
133 if ( ( ( mode & G_W ) == 0 ) && ( ( mode & W_W ) == W_W ) )
134 {
135 messages.append( "\n- World has write access, but group does not." );
136 warn = true;
137 }
138
139
140
141 if ( ( ( mode & U_X ) == 0 ) && ( ( mode & G_X ) == G_X ) )
142 {
143 messages.append( "\n- Group has execute/list access, but user does not." );
144 warn = true;
145 }
146
147 if ( ( ( mode & U_X ) == 0 ) && ( ( mode & W_X ) == W_X ) )
148 {
149 messages.append( "\n- World has execute/list access, but user does not." );
150 warn = true;
151 }
152
153 if ( ( ( mode & G_X ) == 0 ) && ( ( mode & W_X ) == W_X ) )
154 {
155 messages.append( "\n- World has execute/list access, but group does not." );
156 warn = true;
157 }
158
159
160 if ( warn )
161 {
162 logger.warn( messages.toString() );
163 }
164
165 return !warn;
166 }
167
168 }