@@ -213,21 +213,20 @@ public void delete(PackageMetadata packageMetadata) {
213213
214214 @ Transactional
215215 public PackageMetadata upload (UploadRequest uploadRequest ) {
216- validateUploadRequest ( uploadRequest );
216+
217217 Repository localRepositoryToUpload = getRepositoryToUpload (uploadRequest .getRepoName ());
218218 Path packageDirPath = null ;
219219 try {
220220 packageDirPath = TempFileUtils .createTempDirectory ("skipperUpload" );
221+ validateUploadRequest (packageDirPath , uploadRequest );
221222 File packageDir = new File (packageDirPath + File .separator + uploadRequest .getName ());
222223 packageDir .mkdir ();
223- Path packageFile = Paths
224- .get (packageDir .getPath () + File .separator + uploadRequest .getName () + "-"
225- + uploadRequest .getVersion () + "." + uploadRequest .getExtension ());
224+ String fullName = uploadRequest .getName ().trim () + "-" + uploadRequest .getVersion ().trim () + "." + uploadRequest .getExtension ().trim ();
225+ Path packageFile = Paths .get (packageDir .getPath () + File .separator + fullName );
226226 Assert .isTrue (packageDir .exists (), "Package directory doesn't exist." );
227227 Files .write (packageFile , uploadRequest .getPackageFileAsBytes ());
228228 ZipUtil .unpack (packageFile .toFile (), packageDir );
229- String unzippedPath = packageDir .getAbsolutePath () + File .separator + uploadRequest .getName ()
230- + "-" + uploadRequest .getVersion ();
229+ String unzippedPath = packageDir .getAbsolutePath () + File .separator + uploadRequest .getName () + "-" + uploadRequest .getVersion ();
231230 File unpackagedFile = new File (unzippedPath );
232231 Assert .isTrue (unpackagedFile .exists (), "Package is expected to be unpacked, but it doesn't exist" );
233232 Package packageToUpload = this .packageReader .read (unpackagedFile );
@@ -267,7 +266,7 @@ private Repository getRepositoryToUpload(String repoName) {
267266 return localRepositoryToUpload ;
268267 }
269268
270- private void validateUploadRequest (UploadRequest uploadRequest ) {
269+ private void validateUploadRequest (Path packageDirPath , UploadRequest uploadRequest ) throws IOException {
271270 Assert .notNull (uploadRequest .getRepoName (), "Repo name can not be null" );
272271 Assert .notNull (uploadRequest .getName (), "Name of package can not be null" );
273272 Assert .notNull (uploadRequest .getVersion (), "Version can not be null" );
@@ -283,11 +282,16 @@ private void validateUploadRequest(UploadRequest uploadRequest) {
283282 + uploadRequest .getExtension ());
284283 Assert .notNull (uploadRequest .getPackageFileAsBytes (), "Package file as bytes must not be null" );
285284 Assert .isTrue (uploadRequest .getPackageFileAsBytes ().length != 0 , "Package file as bytes must not be empty" );
285+ File destinationFile = new File (packageDirPath .toFile (), uploadRequest .getName ().trim ());
286+ String canonicalDestinationDirPath = packageDirPath .toFile ().getCanonicalPath ();
287+ String canonicalDestinationFile = destinationFile .getCanonicalPath ();
288+ if (!canonicalDestinationFile .startsWith (canonicalDestinationDirPath + File .separator )) {
289+ throw new SkipperException ("Entry is outside of the target dir: " + uploadRequest .getName ());
290+ }
286291 PackageMetadata existingPackageMetadata = this .packageMetadataRepository .findByRepositoryNameAndNameAndVersion (
287292 uploadRequest .getRepoName ().trim (), uploadRequest .getName ().trim (), uploadRequest .getVersion ().trim ());
288293 if (existingPackageMetadata != null ) {
289- throw new SkipperException (String .format ("Failed to upload the package. " + "" +
290- "Package [%s:%s] in Repository [%s] already exists." ,
294+ throw new SkipperException (String .format ("Failed to upload the package. Package [%s:%s] in Repository [%s] already exists." ,
291295 uploadRequest .getName (), uploadRequest .getVersion (), uploadRequest .getRepoName ().trim ()));
292296 }
293297 }
0 commit comments