diff --git a/build.gradle b/build.gradle index 388b586..01e2d66 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ description = "ECS browser website" group = 'com.emc.ecs' -version = '1.0.1' +version = '1.0.2' ext.licenseName = '' ext.licenseUrl = '' @@ -30,7 +30,7 @@ defaultTasks 'build' jar { baseName = 'ecs-browser' - version = '1.0.1' + version = '1.0.2' into('META-INF/dependency-license') { from 'build/reports/dependency-license' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c1db481..18ebbe1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -# Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. +# Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/Application.java b/src/main/java/com/emc/ecs/browser/spring/Application.java index 847f514..afca09f 100644 --- a/src/main/java/com/emc/ecs/browser/spring/Application.java +++ b/src/main/java/com/emc/ecs/browser/spring/Application.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java index 03e54b5..e76cea4 100644 --- a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java +++ b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -16,11 +16,7 @@ import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; @@ -40,7 +36,6 @@ import org.eclipse.jetty.util.StringUtil; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -83,17 +78,46 @@ public class ServiceController { private static final String PROXY_PATH = SERVLET_PATH + PROXY_SUBPATH; + private static final String SEPARATOR = "/"; + + private static final String DOUBLE_SEPARATOR = SEPARATOR + SEPARATOR; + + private static final String PASSTHROUGH_HEADER_START = "X-Passthrough-"; + + private static final String ENDPOINT_HEADER = PASSTHROUGH_HEADER_START + "Endpoint"; + + private static final String METHOD_HEADER = PASSTHROUGH_HEADER_START + "Method"; + + private static final String NAMESPACE_HEADER = PASSTHROUGH_HEADER_START + "Namespace"; + + private static final String KEY_HEADER = PASSTHROUGH_HEADER_START + "Key"; + + private static final String SECRET_HEADER = PASSTHROUGH_HEADER_START + "Secret"; + + private static final String TYPE_HEADER = PASSTHROUGH_HEADER_START + "Type"; + + private static final String EXPIRES_HEADER = PASSTHROUGH_HEADER_START + "Expires"; + + private static final String DOWNLOAD_FOLDER_HEADER = PASSTHROUGH_HEADER_START + "Download-Folder"; + + private static final String MARKER_PARAMETER = "marker"; + @RequestMapping(value = PROXY_SUBPATH + "/**", method = RequestMethod.POST, produces="*/*", consumes="*/*") public ResponseEntity postProxy(HttpServletRequest request) throws Exception { S3Config s3Config = getS3Config(request); - HttpMethod method = getMethod(request); + HttpMethod method = HttpMethod.valueOf(request.getHeader(METHOD_HEADER)); + + String endpoint = request.getHeader(ENDPOINT_HEADER); + while (endpoint.endsWith(SEPARATOR)) { + endpoint = endpoint.substring(0, endpoint.length() - 1); + } String resource = request.getRequestURI(); resource = resource.substring(resource.indexOf(PROXY_PATH) + PROXY_PATH.length()); - if (!resource.startsWith("/")) { - resource = "/" + resource; + if (!resource.startsWith(SEPARATOR)) { + resource = SEPARATOR + resource; } else { - while (resource.startsWith("//")) { + while (resource.startsWith(DOUBLE_SEPARATOR)) { resource = resource.substring(1); } } @@ -107,7 +131,7 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception String headerName = headerNames.nextElement(); if ("accept".equalsIgnoreCase(headerName)) { RestUtil.putSingle(headers, "Accept", "application/xml"); - } else if (!headerName.startsWith("X-Passthrough-")) { + } else if (!headerName.startsWith(PASSTHROUGH_HEADER_START)) { List headerValue = new ArrayList(); Enumeration headerValues = request.getHeaders(headerName); while (headerValues.hasMoreElements()) { @@ -151,12 +175,12 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception RestUtil.putSingle(headers, "Content-Length", Integer.toString(dataLength)); Object dataToReturn = null; - if ("presign".equals(request.getHeader("X-Passthrough-Type"))) { - while (resource.startsWith( "/" ) ) { + if ("presign".equals(request.getHeader(TYPE_HEADER))) { + while (resource.startsWith( SEPARATOR ) ) { resource = resource.substring(1); } - int delimiterIndex = resource.indexOf( "/" ); + int delimiterIndex = resource.indexOf( SEPARATOR ); String bucketName = null; String key = null; if ( delimiterIndex < 0 ) { @@ -169,154 +193,68 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception } Date expirationTime = new Date(); - expirationTime.setTime(Long.parseLong(request.getHeader("X-Passthrough-Expires"))); - PresignedUrlRequest presignedUrlRequest = new PresignedUrlRequest(Method.valueOf(getMethodName(request)), bucketName, key, expirationTime); + expirationTime.setTime(Long.parseLong(request.getHeader(EXPIRES_HEADER))); + PresignedUrlRequest presignedUrlRequest = new PresignedUrlRequest(Method.valueOf(request.getHeader(METHOD_HEADER)), bucketName, key, expirationTime); presignedUrlRequest.setVersionId(parameters.get("versionId")); presignedUrlRequest.setNamespace(s3Config.getNamespace()); S3SignerV2 s3Signer = new S3SignerV2(s3Config); dataToReturn = s3Signer.generatePresignedUrl(presignedUrlRequest).toString(); - } else if ("download".equals(request.getHeader("X-Passthrough-Type"))) { - String downloadFolder = request.getHeader("X-Passthrough-Download-Folder"); + } else if ("download".equals(request.getHeader(TYPE_HEADER))) { + String downloadFolder = request.getHeader(DOWNLOAD_FOLDER_HEADER); if (StringUtil.isBlank(downloadFolder)) { downloadFolder = "/usr/src/app/"; } - sign(method.toString(), resource, parameters, headers, s3Config); - - HttpHeaders newHeaders = new HttpHeaders(); - for (Entry> header : headers.entrySet()) { - List headerValue = new ArrayList(header.getValue().size()); - for (Object value : header.getValue()) { - headerValue.add((String) value); - } - newHeaders.put(header.getKey(), headerValue); - } - - String queryString = RestUtil.generateRawQueryString(parameters); - if (StringUtil.isNotBlank(queryString)) { - resource = resource + "?" + queryString; - } - String endpoint = request.getHeader("X-Passthrough-Endpoint"); - while (endpoint.endsWith("/")) { - endpoint = endpoint.substring(0, endpoint.length() - 1); - } - resource = endpoint + resource; - - RequestEntity requestEntity = new RequestEntity(data, newHeaders, method, new URI(resource)); + RequestEntity requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); RestTemplate client = new RestTemplate(); try { dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); - if ( ((ResponseEntity) dataToReturn).getStatusCode().is2xxSuccessful() ) { - ListObjectsResult objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); + ListObjectsResult objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); + downloadObjects( downloadFolder, objectsToDownload.getBucketName(), objectsToDownload.getObjects(), s3Config ); + while ( objectsToDownload.isTruncated() ) { + parameters.put( MARKER_PARAMETER, getNextMarker( objectsToDownload ) ); + requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); + dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); + objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); downloadObjects( downloadFolder, objectsToDownload.getBucketName(), objectsToDownload.getObjects(), s3Config ); - String separator = resource.indexOf("?") < 0 ? "?" : "&"; - while ( objectsToDownload.isTruncated() ) { - String marker = objectsToDownload.getNextMarker(); - if ( ( marker == null ) || marker.isEmpty() ) { - String lastKey = ""; - if ( ( objectsToDownload.getObjects() != null ) && ( objectsToDownload.getObjects().size() > 0 ) ) { - lastKey = objectsToDownload.getObjects().get( objectsToDownload.getObjects().size() - 1 ).getKey(); - } - String lastPrefix = ""; - if ( ( objectsToDownload.getCommonPrefixes() != null ) && ( objectsToDownload.getCommonPrefixes().size() > 0 ) ) { - lastPrefix = objectsToDownload.getCommonPrefixes().get( objectsToDownload.getCommonPrefixes().size() - 1 ); - } - marker = ( lastPrefix.compareTo(lastKey) > 0 ) ? lastPrefix : lastKey; - } - String newUrl = resource + separator + "marker=" + RestUtil.urlEncode(marker); - System.out.println("Another page after " + marker + " using " + newUrl ); - requestEntity = new RequestEntity(data, newHeaders, method, new URI(newUrl)); - dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); - if ( !((ResponseEntity) dataToReturn).getStatusCode().is2xxSuccessful() ) { - break; - } - objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); - downloadObjects( downloadFolder, objectsToDownload.getBucketName(), objectsToDownload.getObjects(), s3Config ); - } } } catch (HttpClientErrorException e) { - dataToReturn = new ErrorData(e); // handle and display on the other end + if ( dataToReturn == null ) { + dataToReturn = new ErrorData(e); // handle and display on the other end + } e.printStackTrace(System.out); } catch (Exception e) { dataToReturn = new ErrorData(e); // handle and display on the other end e.printStackTrace(System.out); } - } else if ("listAll".equals(request.getHeader("X-Passthrough-Type"))) { - sign(method.toString(), resource, parameters, headers, s3Config); - - HttpHeaders newHeaders = new HttpHeaders(); - for (Entry> header : headers.entrySet()) { - List headerValue = new ArrayList(header.getValue().size()); - for (Object value : header.getValue()) { - headerValue.add((String) value); - } - newHeaders.put(header.getKey(), headerValue); - } - - String queryString = RestUtil.generateRawQueryString(parameters); - if (StringUtil.isNotBlank(queryString)) { - resource = resource + "?" + queryString; - } - String endpoint = request.getHeader("X-Passthrough-Endpoint"); - while (endpoint.endsWith("/")) { - endpoint = endpoint.substring(0, endpoint.length() - 1); - } - resource = endpoint + resource; - - RequestEntity requestEntity = new RequestEntity(data, newHeaders, method, new URI(resource)); + } else if ("listAll".equals(request.getHeader(TYPE_HEADER))) { + RequestEntity requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); RestTemplate client = new RestTemplate(); try { ResponseEntity baseResponse = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); dataToReturn = baseResponse; - if ( baseResponse.getStatusCode().is2xxSuccessful() ) { - ListObjectsResult listResult = baseResponse.getBody(); - String separator = resource.indexOf("?") < 0 ? "?" : "&"; - while ( listResult.isTruncated() ) { - String marker = listResult.getNextMarker(); - if ( ( marker == null ) || marker.isEmpty() ) { - String lastKey = ""; - if ( ( listResult.getObjects() != null ) && ( listResult.getObjects().size() > 0 ) ) { - lastKey = listResult.getObjects().get( listResult.getObjects().size() - 1 ).getKey(); - } - String lastPrefix = ""; - if ( ( listResult.getCommonPrefixes() != null ) && ( listResult.getCommonPrefixes().size() > 0 ) ) { - lastPrefix = listResult.getCommonPrefixes().get( listResult.getCommonPrefixes().size() - 1 ); - } - marker = ( lastPrefix.compareTo(lastKey) > 0 ) ? lastPrefix : lastKey; - } - String newUrl = resource + separator + "marker=" + RestUtil.urlEncode(marker); - System.out.println("Another page after " + marker + " using " + newUrl ); - requestEntity = new RequestEntity(data, newHeaders, method, new URI(newUrl)); - ResponseEntity newListResponse = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); - if ( !newListResponse.getStatusCode().is2xxSuccessful() ) { - dataToReturn = newListResponse; - break; - } - ListObjectsResult newListResult = newListResponse.getBody(); - listResult.setTruncated(newListResult.isTruncated()); - listResult.setNextMarker(newListResult.getNextMarker()); - listResult.getObjects().addAll(newListResult.getObjects()); - listResult.getCommonPrefixes().addAll(newListResult.getCommonPrefixes()); - } + ListObjectsResult listResult = baseResponse.getBody(); + while ( listResult.isTruncated() ) { + parameters.put( MARKER_PARAMETER, getNextMarker( listResult ) ); + requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); + ResponseEntity newListResponse = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); + ListObjectsResult newListResult = newListResponse.getBody(); + listResult.setTruncated( newListResult.isTruncated() ); + listResult.setNextMarker( getNextMarker( newListResult ) ); + listResult.getObjects().addAll( newListResult.getObjects() ); + listResult.getCommonPrefixes().addAll( newListResult.getCommonPrefixes() ); } } catch (HttpClientErrorException e) { - dataToReturn = new ErrorData(e); // handle and display on the other end + if ( dataToReturn == null ) { + dataToReturn = new ErrorData(e); // handle and display on the other end + } e.printStackTrace(System.out); } catch (Exception e) { dataToReturn = new ErrorData(e); // handle and display on the other end e.printStackTrace(System.out); } } else { - sign(method.toString(), resource, parameters, headers, s3Config); - - HttpHeaders newHeaders = new HttpHeaders(); - for (Entry> header : headers.entrySet()) { - List headerValue = new ArrayList(header.getValue().size()); - for (Object value : header.getValue()) { - headerValue.add((String) value); - } - newHeaders.put(header.getKey(), headerValue); - } + RequestEntity requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); Class responseClass = null; if (resource.length() <= 1) { // no bucket name exists @@ -335,7 +273,7 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception } else if (parameters.containsKey("versions")) { responseClass = ListVersionsResult.class; } else { - int firstSlash = resource.indexOf('/', 2); + int firstSlash = resource.indexOf(SEPARATOR, 2); if (firstSlash < 0) { // no object name exists responseClass = ListObjectsResult.class; } else if (copySource) { @@ -346,17 +284,6 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception } } - String queryString = RestUtil.generateRawQueryString(parameters); - if (StringUtil.isNotBlank(queryString)) { - resource = resource + "?" + queryString; - } - String endpoint = request.getHeader("X-Passthrough-Endpoint"); - while (endpoint.endsWith("/")) { - endpoint = endpoint.substring(0, endpoint.length() - 1); - } - resource = endpoint + resource; - - RequestEntity requestEntity = new RequestEntity(data, newHeaders, method, new URI(resource)); RestTemplate client = new RestTemplate(); try { dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, responseClass) ); @@ -367,13 +294,73 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception return ResponseEntity.ok( dataToReturn ); } + /** + * @param data + * @param resource + * @param parameters + * @param headers + * @param method + * @param endpoint + * @param s3Config + * @return + * @throws Exception + */ + private static final RequestEntity getRequestEntity(byte[] data, String resource, Map parameters, + Map> headers, HttpMethod method, String endpoint, S3Config s3Config) throws Exception { + sign(method.toString(), resource, parameters, headers, s3Config); + + HttpHeaders newHeaders = new HttpHeaders(); + for (Entry> header : headers.entrySet()) { + List headerValue = new ArrayList(header.getValue().size()); + for (Object value : header.getValue()) { + headerValue.add((String) value); + } + newHeaders.put(header.getKey(), headerValue); + } + + String queryString = RestUtil.generateRawQueryString(parameters); + if (StringUtil.isNotBlank(queryString)) { + resource = resource + "?" + queryString; + } + resource = endpoint + resource; + + return new RequestEntity(data, newHeaders, method, new URI(resource)); + } + + /** + * @param objectList + * @return + */ + private static final String getNextMarker( ListObjectsResult objectList ) { + String marker = null; + + if ( objectList.isTruncated() ) { + marker = objectList.getNextMarker(); + if ( ( marker == null ) || marker.isEmpty() ) { + String lastKey = ""; + if ( ( objectList.getObjects() != null ) && ( objectList.getObjects().size() > 0 ) ) { + lastKey = objectList.getObjects().get( objectList.getObjects().size() - 1 ).getKey(); + } + String lastPrefix = ""; + if ( ( objectList.getCommonPrefixes() != null ) && ( objectList.getCommonPrefixes().size() > 0 ) ) { + lastPrefix = objectList.getCommonPrefixes().get( objectList.getCommonPrefixes().size() - 1 ); + } + marker = ( lastPrefix.compareTo(lastKey) > 0 ) ? lastPrefix : lastKey; + } + + System.out.println( "Fetching another page after " + marker ); + } + + return marker; + } + /** * @param downloadFolder * @param objects * @param s3Config * @throws Exception */ - private void downloadObjects(String downloadFolder, String bucketName, List objects, S3Config s3Config) throws Exception { + private static final void downloadObjects(String downloadFolder, String bucketName, List objects, S3Config s3Config) throws Exception { File downloadBucketParent = new File( downloadFolder ); File downloadBucket = new File( downloadBucketParent, bucketName ); if ( !downloadBucket.exists() ) { @@ -396,6 +383,8 @@ private void downloadObjects(String downloadFolder, String bucketName, List parameters, Map> headers) throws Exception { + private static final byte[] convertToXmlAsNeeded(byte[] data, Map parameters, Map> headers) throws Exception { Class outputClass = null; if (parameters.containsKey("acl")) { outputClass = AccessControlList.class; @@ -477,7 +466,7 @@ private byte[] convertToXmlAsNeeded(byte[] data, Map parameters, * @return * @throws Exception */ - private byte[] readBody(HttpServletRequest request) throws Exception { + private static final byte[] readBody(HttpServletRequest request) throws Exception { byte[] buffer = new byte[request.getContentLength()]; request.getInputStream().read(buffer); return buffer; @@ -490,7 +479,7 @@ private byte[] readBody(HttpServletRequest request) throws Exception { * @param headers * @param s3Config */ - private void sign(String method, String resource, Map parameters, Map> headers, + private static final void sign(String method, String resource, Map parameters, Map> headers, S3Config s3Config) { if (StringUtil.isBlank(s3Config.getSecretKey())) { // no auth secret; skip signing, e.g. for public read-only buckets. @@ -502,27 +491,11 @@ private void sign(String method, String resource, Map parameters s3Signer.sign(method, resource, parameters, headers); } - /** - * @param request - * @return - */ - private static final HttpMethod getMethod(HttpServletRequest request) { - return HttpMethod.valueOf(getMethodName(request)); - } - - /** - * @param request - * @return - */ - private static String getMethodName(HttpServletRequest request) { - return request.getHeader("X-Passthrough-Method"); - } - /** * @param list * @return */ - private Boolean isNotEmpty(List list) { + private static final Boolean isNotEmpty(List list) { return ((list != null) && (list.size() > 0)); } diff --git a/src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java b/src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java index 89566d2..da57a02 100644 --- a/src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java +++ b/src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java @@ -1,5 +1,5 @@ /** - * Copyright 2016-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2016-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/StaticController.java b/src/main/java/com/emc/ecs/browser/spring/StaticController.java index 667e0eb..53febb0 100644 --- a/src/main/java/com/emc/ecs/browser/spring/StaticController.java +++ b/src/main/java/com/emc/ecs/browser/spring/StaticController.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/WebConfiguration.java b/src/main/java/com/emc/ecs/browser/spring/WebConfiguration.java index 0840f3e..711075a 100644 --- a/src/main/java/com/emc/ecs/browser/spring/WebConfiguration.java +++ b/src/main/java/com/emc/ecs/browser/spring/WebConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/WrappedResponseEntity.java b/src/main/java/com/emc/ecs/browser/spring/WrappedResponseEntity.java index ebffdc2..4d415cd 100644 --- a/src/main/java/com/emc/ecs/browser/spring/WrappedResponseEntity.java +++ b/src/main/java/com/emc/ecs/browser/spring/WrappedResponseEntity.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/object/s3/bean/ConcreteAccessControlList.java b/src/main/java/com/emc/object/s3/bean/ConcreteAccessControlList.java index 593f636..77c4056 100644 --- a/src/main/java/com/emc/object/s3/bean/ConcreteAccessControlList.java +++ b/src/main/java/com/emc/object/s3/bean/ConcreteAccessControlList.java @@ -1,5 +1,5 @@ /** - * Copyright 2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2018-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/object/s3/bean/ConcreteGrant.java b/src/main/java/com/emc/object/s3/bean/ConcreteGrant.java index 18f9558..6790ca8 100644 --- a/src/main/java/com/emc/object/s3/bean/ConcreteGrant.java +++ b/src/main/java/com/emc/object/s3/bean/ConcreteGrant.java @@ -1,5 +1,5 @@ /** - * Copyright 2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2018-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java b/src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java index 5f92f05..7e7e569 100644 --- a/src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java +++ b/src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java @@ -1,5 +1,5 @@ /** - * Copyright 2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2018-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/object/s3/bean/SlimCopyObjectResult.java b/src/main/java/com/emc/object/s3/bean/SlimCopyObjectResult.java index 6494572..db0aee8 100644 --- a/src/main/java/com/emc/object/s3/bean/SlimCopyObjectResult.java +++ b/src/main/java/com/emc/object/s3/bean/SlimCopyObjectResult.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index a875a7e..de8fb84 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -1,6 +1,6 @@