package detectors.amazon_s3_auto_paginated_with_prefix; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.iterable.S3Objects; import com.amazonaws.services.s3.model.ListObjectsV2Request; import com.amazonaws.services.s3.model.ListObjectsV2Result; import com.amazonaws.services.s3.model.S3ObjectSummary; public class AmazonS3AutoPaginatedWithPrefix { // {fact rule=amazon-s3-auto-paginated-with-prefix@v1.0 defects=1} public void s3GetObjectsNoncompliant(AmazonS3 amazonS3Client, String bucketName) { String continuationToken = null; ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request().withBucketName(bucketName); ListObjectsV2Result listObjectsV2Result; do { // Noncompliant: uses manual pagination. listObjectsV2Result = amazonS3Client.listObjectsV2(listObjectsV2Request); for (S3ObjectSummary objectSummary : listObjectsV2Result.getObjectSummaries()) { System.out.printf(" - %s (size: %d)\n", objectSummary.getKey(), objectSummary.getSize()); } continuationToken = listObjectsV2Result.getNextContinuationToken(); listObjectsV2Request.setContinuationToken(continuationToken); } while (continuationToken != null); } // {/fact} // {fact rule=amazon-s3-auto-paginated-with-prefix@v1.0 defects=0} public void s3GetObjectsCompliant(AmazonS3 amazonS3Client, String bucketName, String prefix) { // Compliant: uses S3Objects.withPrefix() for pagination. for (S3ObjectSummary objectSummary : S3Objects.withPrefix(amazonS3Client, bucketName, prefix)) { System.out.printf(" - %s (size: %d)\n", objectSummary.getKey(), objectSummary.getSize()); } } // {/fact} }