]> source.dussan.org Git - archiva.git/blob
f297aa7004db6e2eb6b7700537c24510b233e1ac
[archiva.git] /
1 package org.apache.maven.archiva.policies;
2
3 import org.codehaus.plexus.digest.ChecksumFile;
4 import org.codehaus.plexus.digest.Digester;
5 import org.codehaus.plexus.digest.DigesterException;
6 import org.codehaus.plexus.logging.AbstractLogEnabled;
7
8 import java.io.File;
9 import java.io.FileNotFoundException;
10 import java.io.IOException;
11 import java.util.HashSet;
12 import java.util.Properties;
13 import java.util.Set;
14
15 public class ChecksumPolicy
16     extends AbstractLogEnabled
17     implements PostDownloadPolicy
18 {
19     /**
20      * The FAIL policy indicates that if the checksum does not match the
21      * downloaded file, then remove the downloaded artifact, and checksum
22      * files, and fail the transfer to the client side.
23      */
24     public static final String FAIL = "fail";
25
26     /**
27      * The FIX policy indicates that if the checksum does not match the
28      * downloaded file, then fix the checksum file locally, and return
29      * to the client side the corrected checksum.
30      */
31     public static final String FIX = "fix";
32
33     /**
34      * The IGNORE policy indicates that the checksum is never tested
35      * and even bad downloads and checksum files are left in place
36      * on the local repository.
37      */
38     public static final String IGNORED = "ignored";
39
40     /**
41      * @plexus.requirement role-hint="sha1"
42      */
43     private Digester digestSha1;
44
45     /**
46      * @plexus.requirement role-hint="md5"
47      */
48     private Digester digestMd5;
49
50     /**
51      * @plexus.requirement
52      */
53     private ChecksumFile checksumFile;
54
55     private Set validPolicyCodes = new HashSet();
56
57     public ChecksumPolicy()
58     {
59         validPolicyCodes.add( FAIL );
60         validPolicyCodes.add( FIX );
61         validPolicyCodes.add( IGNORED );
62     }
63
64     public boolean applyPolicy( String policySetting, Properties request, File localFile )
65     {
66         if ( !validPolicyCodes.contains( policySetting ) )
67         {
68             // No valid code? false it is then.
69             getLogger().error( "Unknown checksum policyCode [" + policySetting + "]" );
70             return false;
71         }
72
73         if ( IGNORED.equals( policySetting ) )
74         {
75             // Ignore.
76             return true;
77         }
78
79         if ( !localFile.exists() )
80         {
81             // Local File does not exist.
82             getLogger().debug( "Local file " + localFile.getAbsolutePath() + " does not exist." );
83             return false;
84         }
85
86         File sha1File = new File( localFile.getAbsolutePath() + ".sha1" );
87         File md5File = new File( localFile.getAbsolutePath() + ".md5" );
88
89         if ( FAIL.equals( policySetting ) )
90         {
91             if ( !sha1File.exists() && !md5File.exists() )
92             {
93                 getLogger().error( "File " + localFile.getAbsolutePath() + " has no checksum files (sha1 or md5)." );
94                 localFile.delete();
95                 return false;
96             }
97
98             // Test for sha1 first, then md5
99
100             if ( sha1File.exists() )
101             {
102                 try
103                 {
104                     return checksumFile.isValidChecksum( sha1File );
105                 }
106                 catch ( FileNotFoundException e )
107                 {
108                     getLogger().warn( "Unable to find sha1 file: " + sha1File.getAbsolutePath(), e );
109                     return false;
110                 }
111                 catch ( DigesterException e )
112                 {
113                     getLogger().warn( "Unable to process sha1 file: " + sha1File.getAbsolutePath(), e );
114                     return false;
115                 }
116                 catch ( IOException e )
117                 {
118                     getLogger().warn( "Unable to process sha1 file: " + sha1File.getAbsolutePath(), e );
119                     return false;
120                 }
121             }
122
123             if ( md5File.exists() )
124             {
125                 try
126                 {
127                     return checksumFile.isValidChecksum( md5File );
128                 }
129                 catch ( FileNotFoundException e )
130                 {
131                     getLogger().warn( "Unable to find md5 file: " + md5File.getAbsolutePath(), e );
132                     return false;
133                 }
134                 catch ( DigesterException e )
135                 {
136                     getLogger().warn( "Unable to process md5 file: " + md5File.getAbsolutePath(), e );
137                     return false;
138                 }
139                 catch ( IOException e )
140                 {
141                     getLogger().warn( "Unable to process md5 file: " + md5File.getAbsolutePath(), e );
142                     return false;
143                 }
144             }
145         }
146
147         if ( FIX.equals( policySetting ) )
148         {
149             if ( !sha1File.exists() )
150             {
151                 try
152                 {
153                     checksumFile.createChecksum( localFile, digestSha1 );
154                 }
155                 catch ( DigesterException e )
156                 {
157                     getLogger().warn( "Unable to create sha1 file: " + e.getMessage(), e );
158                     return false;
159                 }
160                 catch ( IOException e )
161                 {
162                     getLogger().warn( "Unable to create sha1 file: " + e.getMessage(), e );
163                     return false;
164                 }
165             }
166             else
167             {
168                 try
169                 {
170                     checksumFile.isValidChecksum( sha1File );
171                 }
172                 catch ( FileNotFoundException e )
173                 {
174                     getLogger().warn( "Unable to find sha1 file: " + sha1File.getAbsolutePath(), e );
175                     return false;
176                 }
177                 catch ( DigesterException e )
178                 {
179                     getLogger().warn( "Unable to process sha1 file: " + sha1File.getAbsolutePath(), e );
180                     return false;
181                 }
182                 catch ( IOException e )
183                 {
184                     getLogger().warn( "Unable to process sha1 file: " + sha1File.getAbsolutePath(), e );
185                     return false;
186                 }
187             }
188
189             if ( !md5File.exists() )
190             {
191                 try
192                 {
193                     checksumFile.createChecksum( localFile, digestMd5 );
194                 }
195                 catch ( DigesterException e )
196                 {
197                     getLogger().warn( "Unable to create md5 file: " + e.getMessage(), e );
198                     return false;
199                 }
200                 catch ( IOException e )
201                 {
202                     getLogger().warn( "Unable to create md5 file: " + e.getMessage(), e );
203                     return false;
204                 }
205             }
206             else
207             {
208                 try
209                 {
210                     return checksumFile.isValidChecksum( md5File );
211                 }
212                 catch ( FileNotFoundException e )
213                 {
214                     getLogger().warn( "Unable to find md5 file: " + md5File.getAbsolutePath(), e );
215                     return false;
216                 }
217                 catch ( DigesterException e )
218                 {
219                     getLogger().warn( "Unable to process md5 file: " + md5File.getAbsolutePath(), e );
220                     return false;
221                 }
222                 catch ( IOException e )
223                 {
224                     getLogger().warn( "Unable to process md5 file: " + md5File.getAbsolutePath(), e );
225                     return false;
226                 }
227             }
228         }
229
230         getLogger().error( "Unhandled policyCode [" + policySetting + "]" );
231         return false;
232     }
233
234     public String getDefaultPolicySetting()
235     {
236         return FIX;
237     }
238
239 }