Deva
Deva

Reputation: 1039

How to add SAS for file services of azure in java?

I got code in c# or code for blob storage. I need some reference code in java to have SAS token for file storage in azure. The SAS may be applicable for account or services.

Code 1 :

static string GetAccountSASToken()
{
    // To create the account SAS, you need to use your shared key credentials. Modify for your account.
    const string ConnectionString = "DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key";
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);

    // Create a new access policy for the account.
    SharedAccessAccountPolicy policy = new SharedAccessAccountPolicy()
        {
            Permissions = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write | SharedAccessAccountPermissions.List,
            Services = SharedAccessAccountServices.Blob | SharedAccessAccountServices.File,
            ResourceTypes = SharedAccessAccountResourceTypes.Service,
            SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
            Protocols = SharedAccessProtocol.HttpsOnly
        };

    // Return the SAS token.
    return storageAccount.GetSharedAccessSignature(policy);
}

This code is about creating SAS token for account verification and expiry time.I need the same in java. I am not getting few things like, in first code how I can write the 'Permission' in java? I mean multiple in one line. Please provide equivalent java code for this.

Code 2 :

@Test
    public String testFileSAS(CloudFileShare share, CloudFile file) throws InvalidKeyException,
            IllegalArgumentException, StorageException, URISyntaxException, InterruptedException {
        SharedAccessFilePolicy policy = createSharedAccessPolicy(EnumSet.of(SharedAccessFilePermissions.READ,
                SharedAccessFilePermissions.LIST, SharedAccessFilePermissions.WRITE), 24);
        FileSharePermissions perms = new FileSharePermissions();
        // SharedAccessProtocols protocol = SharedAccessProtocols.HTTPS_ONLY;
        perms.getSharedAccessPolicies().put("readperm", policy);

        share.uploadPermissions(perms);
        // Thread.sleep(30000);

        CloudFile sasFile = new CloudFile(
                new URI(file.getUri().toString() + "?" + file.generateSharedAccessSignature(null, "readperm")));
        sasFile.download(new ByteArrayOutputStream());

        // do not give the client and check that the new file's client has the
        // correct permissions
        CloudFile fileFromUri = new CloudFile(
                PathUtility.addToQuery(file.getStorageUri(), file.generateSharedAccessSignature(null, "readperm")));
        assertEquals(StorageCredentialsSharedAccessSignature.class.toString(),
                fileFromUri.getServiceClient().getCredentials().getClass().toString());

        // create credentials from sas
        StorageCredentials creds = new StorageCredentialsSharedAccessSignature(
                file.generateSharedAccessSignature(policy, null, null));
        System.out.println("Generated SAS token is : " + file.generateSharedAccessSignature(policy, null, null));
        String token = file.generateSharedAccessSignature(policy, null, null);
        CloudFileClient client = new CloudFileClient(sasFile.getServiceClient().getStorageUri(), creds);

        CloudFile fileFromClient = client.getShareReference(file.getShare().getName()).getRootDirectoryReference()
                .getFileReference(file.getName());
        assertEquals(StorageCredentialsSharedAccessSignature.class.toString(),
                fileFromClient.getServiceClient().getCredentials().getClass().toString());
        assertEquals(client, fileFromClient.getServiceClient());
        // self written
        // String sharedUri =
        // file.generateSharedAccessSignature(policy,null,null);
        // System.out.println("token created is : "+sharedUri);
        return token;
    }

    private final static SharedAccessFilePolicy createSharedAccessPolicy(EnumSet<SharedAccessFilePermissions> sap,
            int expireTimeInSeconds) {

        Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
        calendar.setTime(new Date());
        calendar.add(Calendar.HOUR, expireTimeInSeconds);
        SharedAccessFilePolicy policy = new SharedAccessFilePolicy();
        policy.setPermissions(sap);
        policy.setSharedAccessExpiryTime(calendar.getTime());
        return policy;
    }

This code is a jUnit test. I don' want to import jUnit library. Want to do it in pure java.How I can convert the code? What I can use instead of assertEqauls?

Upvotes: 0

Views: 1111

Answers (1)

Aaron Chen
Aaron Chen

Reputation: 9950

Please consider the following code snippet in Java.

public static final String storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key";

public String getAccountSASToken() throws InvalidKeyException, URISyntaxException, StorageException {

    CloudStorageAccount account = CloudStorageAccount.parse(storageConnectionString);

    SharedAccessAccountPolicy policy = new SharedAccessAccountPolicy();
    policy.setPermissions(EnumSet.of(SharedAccessAccountPermissions.READ, SharedAccessAccountPermissions.WRITE, SharedAccessAccountPermissions.LIST));
    policy.setServices(EnumSet.of(SharedAccessAccountService.BLOB, SharedAccessAccountService.FILE) );
    policy.setResourceTypes(EnumSet.of(SharedAccessAccountResourceType.SERVICE));
    policy.setSharedAccessExpiryTime(Date.from(ZonedDateTime.now(ZoneOffset.UTC).plusHours(24L).toInstant()));
    policy.setProtocols(SharedAccessProtocols.HTTPS_ONLY);

    return account.generateSharedAccessSignature(policy);
}

Upvotes: 5

Related Questions