Repository: jclouds-labs Updated Branches: refs/heads/master fa63f6b1f -> 036c68f2d
JCLOUDS-1362: Proper password generation with custom constraints for each cloud Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/036c68f2 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/036c68f2 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/036c68f2 Branch: refs/heads/master Commit: 036c68f2de1296585dcccb1e29b301cdf78f7607 Parents: fa63f6b Author: Ignasi Barrera <[email protected]> Authored: Thu Jan 4 01:44:14 2018 +0100 Committer: Ignasi Barrera <[email protected]> Committed: Mon Jan 8 08:48:37 2018 +0100 ---------------------------------------------------------------------- .../AzureComputeServiceContextModule.java | 16 +++++++ .../CreateResourcesThenCreateNodes.java | 9 ++-- .../CreateResourcesThenCreateNodesTest.java | 3 +- .../compute/OneandoneComputeServiceAdapter.java | 12 ++--- .../OneAndOneComputeServiceContextModule.java | 16 ++++++- .../ProfitBricksComputeServiceAdapter.java | 47 +++++++++++--------- ...ProfitBricksComputeServiceContextModule.java | 12 +++++ .../profitbricks/rest/domain/Volume.java | 5 ++- .../profitbricks/rest/util/Preconditions.java | 10 +++++ 9 files changed, 96 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java index de33fdf..0a81ecb 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java @@ -53,6 +53,7 @@ import org.jclouds.compute.functions.NodeAndTemplateOptionsToStatementWithoutPub import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet; import org.jclouds.net.domain.IpPermission; +import org.jclouds.util.PasswordGenerator; import com.google.common.base.Function; import com.google.common.cache.CacheBuilder; @@ -102,6 +103,21 @@ public class AzureComputeServiceContextModule extends bind(new TypeLiteral<SecurityGroupExtension>() { }).to(AzureComputeSecurityGroupExtension.class); } + + @Provides + @Singleton + protected PasswordGenerator.Config providePasswordGenerator() { + // Guest passwords must be between 6-72 characters long. + // Must contain an upper case character. + // Must contain a lower case character. + // Must contain a numeric digit. + // Must contain a special character. Control characters are not allowed. + return new PasswordGenerator() + .lower().min(2).max(10) + .upper().min(2).max(10) + .numbers().min(2).max(10) + .symbols().min(2).max(10); + } @Provides @Singleton http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java index e5d38fb..511d531 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java @@ -52,7 +52,7 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; -import org.jclouds.util.Passwords; +import org.jclouds.util.PasswordGenerator; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; @@ -84,6 +84,7 @@ public class CreateResourcesThenCreateNodes extends CreateNodesWithGroupEncodedI private final String defaultVnetAddressPrefix; private final String defaultSubnetAddressPrefix; private final TemplateToAvailabilitySet templateToAvailabilitySet; + private final PasswordGenerator.Config passwordGenerator; @Inject protected CreateResourcesThenCreateNodes( @@ -95,7 +96,8 @@ public class CreateResourcesThenCreateNodes extends CreateNodesWithGroupEncodedI AzureComputeApi api, @Named(DEFAULT_VNET_ADDRESS_SPACE_PREFIX) String defaultVnetAddressPrefix, @Named(DEFAULT_SUBNET_ADDRESS_PREFIX) String defaultSubnetAddressPrefix, LoadingCache<ResourceGroupAndNameAndIngressRules, String> securityGroupMap, - TemplateToAvailabilitySet templateToAvailabilitySet) { + TemplateToAvailabilitySet templateToAvailabilitySet, + PasswordGenerator.Config passwordGenerator) { super(addNodeWithGroupStrategy, listNodesStrategy, namingConvention, userExecutor, customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory); this.api = api; @@ -103,6 +105,7 @@ public class CreateResourcesThenCreateNodes extends CreateNodesWithGroupEncodedI this.defaultVnetAddressPrefix = defaultVnetAddressPrefix; this.defaultSubnetAddressPrefix = defaultSubnetAddressPrefix; this.templateToAvailabilitySet = templateToAvailabilitySet; + this.passwordGenerator = passwordGenerator; } @Override @@ -141,7 +144,7 @@ public class CreateResourcesThenCreateNodes extends CreateNodesWithGroupEncodedI TemplateOptions options = template.getOptions(); if (options.getLoginPassword() == null) { Optional<String> passwordOptional = template.getImage().getDefaultCredentials().getOptionalPassword(); - options.overrideLoginPassword(passwordOptional.or(Passwords.generate())); + options.overrideLoginPassword(passwordOptional.or(passwordGenerator.generate())); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodesTest.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodesTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodesTest.java index 51a45af..45c56a3 100644 --- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodesTest.java +++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodesTest.java @@ -24,6 +24,7 @@ import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties; import org.jclouds.azurecompute.arm.domain.Subnet; import org.jclouds.azurecompute.arm.features.PublicIPAddressApi; import org.jclouds.azurecompute.arm.features.SubnetApi; +import org.jclouds.util.PasswordGenerator; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; @@ -101,7 +102,7 @@ public class CreateResourcesThenCreateNodesTest { } private static CreateResourcesThenCreateNodes strategy(AzureComputeApi api) { - return new CreateResourcesThenCreateNodes(null, null, null, null, null, api, null, null, null, null); + return new CreateResourcesThenCreateNodes(null, null, null, null, null, api, null, null, null, null, new PasswordGenerator().lower()); } private static String netResource(String resource) { http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/OneandoneComputeServiceAdapter.java ---------------------------------------------------------------------- diff --git a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/OneandoneComputeServiceAdapter.java b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/OneandoneComputeServiceAdapter.java index 031970a..5e27c4b 100644 --- a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/OneandoneComputeServiceAdapter.java +++ b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/OneandoneComputeServiceAdapter.java @@ -43,7 +43,6 @@ import org.apache.jclouds.oneandone.rest.domain.Types; import org.apache.jclouds.oneandone.rest.domain.options.GenericQueryOptions; import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Volume; import org.jclouds.compute.options.TemplateOptions; @@ -53,7 +52,7 @@ import static org.jclouds.compute.util.ComputeServiceUtils.getPortRangesFromList import org.jclouds.domain.LoginCredentials; import org.jclouds.logging.Logger; import org.jclouds.rest.ResourceNotFoundException; -import org.jclouds.util.Passwords; +import org.jclouds.util.PasswordGenerator; @Singleton public class OneandoneComputeServiceAdapter implements ComputeServiceAdapter<Server, HardwareFlavour, SingleServerAppliance, DataCenter> { @@ -65,13 +64,16 @@ public class OneandoneComputeServiceAdapter implements ComputeServiceAdapter<Ser private final CleanupResources cleanupResources; private final OneAndOneApi api; private final Predicate<Server> waitServerUntilAvailable; + private final PasswordGenerator.Config passwordGenerator; @Inject OneandoneComputeServiceAdapter(OneAndOneApi api, CleanupResources cleanupResources, - @Named(POLL_PREDICATE_SERVER) Predicate<Server> waitServerUntilAvailable) { + @Named(POLL_PREDICATE_SERVER) Predicate<Server> waitServerUntilAvailable, + PasswordGenerator.Config passwordGenerator) { this.api = api; this.cleanupResources = cleanupResources; this.waitServerUntilAvailable = waitServerUntilAvailable; + this.passwordGenerator = passwordGenerator; } @Override @@ -83,7 +85,7 @@ public class OneandoneComputeServiceAdapter implements ComputeServiceAdapter<Ser Server updateServer = null; final String loginUser = isNullOrEmpty(options.getLoginUser()) ? "root" : options.getLoginUser(); - final String password = options.hasLoginPassword() ? options.getLoginPassword() : Passwords.generate(); + final String password = options.hasLoginPassword() ? options.getLoginPassword() : passwordGenerator.generate(); final String privateKey = options.hasLoginPrivateKey() ? options.getPrivateKey() : null; final org.jclouds.compute.domain.Image image = template.getImage(); final int[] inboundPorts = template.getOptions().getInboundPorts(); @@ -92,7 +94,6 @@ public class OneandoneComputeServiceAdapter implements ComputeServiceAdapter<Ser List<? extends Volume> volumes = hardware.getVolumes(); List<Hdd.CreateHdd> hdds = new ArrayList<Hdd.CreateHdd>(); - int i = 1; for (final Volume volume : volumes) { try { //check if the bootable device has enough size to run the appliance(image). @@ -122,7 +123,6 @@ public class OneandoneComputeServiceAdapter implements ComputeServiceAdapter<Ser } try { - List<? extends Processor> processors = hardware.getProcessors(); org.apache.jclouds.oneandone.rest.domain.Hardware.CreateHardware hardwareRequest = org.apache.jclouds.oneandone.rest.domain.Hardware.CreateHardware.create(cores, 1, ram, hdds); final Server.CreateServer serverRequest = Server.CreateServer.builder() http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/config/OneAndOneComputeServiceContextModule.java ---------------------------------------------------------------------- diff --git a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/config/OneAndOneComputeServiceContextModule.java b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/config/OneAndOneComputeServiceContextModule.java index ba8fb25..25e4fef 100644 --- a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/config/OneAndOneComputeServiceContextModule.java +++ b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/compute/config/OneAndOneComputeServiceContextModule.java @@ -51,12 +51,13 @@ import org.jclouds.compute.functions.NodeAndTemplateOptionsToStatementWithoutPub import org.jclouds.compute.reference.ComputeServiceConstants.PollPeriod; import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.domain.Location; +import org.jclouds.util.PasswordGenerator; + import static org.jclouds.util.Predicates2.retry; public class OneAndOneComputeServiceContextModule extends ComputeServiceAdapterContextModule<Server, HardwareFlavour, SingleServerAppliance, DataCenter> { - @SuppressWarnings("unchecked") @Override protected void configure() { super.configure(); @@ -85,7 +86,18 @@ public class OneAndOneComputeServiceContextModule extends bind(new TypeLiteral<Function<DataCenter, Location>>() { }).to(DataCenterToLocation.class); - + } + + @Provides + @Singleton + protected PasswordGenerator.Config providePasswordGenerator() { + // Guest passwords must contain more than 8 characters using upper case letters, + // numbers and other special symbols. + return new PasswordGenerator() + .lower().min(2).max(5) + .upper().min(2).max(5) + .numbers().min(2).max(5) + .symbols().min(2).max(5); } @Provides http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java ---------------------------------------------------------------------- diff --git a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java index 40b7f60..c098249 100644 --- a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java +++ b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java @@ -17,21 +17,19 @@ package org.apache.jclouds.profitbricks.rest.compute; import static com.google.common.base.Preconditions.checkArgument; -import com.google.common.base.Predicate; import static com.google.common.base.Strings.isNullOrEmpty; -import com.google.common.base.Supplier; -import com.google.common.base.Throwables; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import static com.google.common.collect.Iterables.contains; import static com.google.common.collect.Iterables.filter; -import com.google.common.collect.Lists; import static com.google.common.util.concurrent.Futures.getUnchecked; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.inject.Inject; import static java.lang.String.format; +import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER; +import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_NIC; +import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_SERVER; +import static org.jclouds.Constants.PROPERTY_USER_THREADS; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; +import static org.jclouds.compute.util.ComputeServiceUtils.getPortRangesFromList; + import java.net.URI; import java.util.ArrayList; import java.util.Arrays; @@ -39,17 +37,16 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; + import javax.annotation.Resource; import javax.inject.Named; import javax.inject.Singleton; + import org.apache.jclouds.profitbricks.rest.ProfitBricksApi; import org.apache.jclouds.profitbricks.rest.compute.concurrent.ProvisioningJob; import org.apache.jclouds.profitbricks.rest.compute.concurrent.ProvisioningManager; import org.apache.jclouds.profitbricks.rest.compute.function.ProvisionableToImage; import org.apache.jclouds.profitbricks.rest.compute.strategy.TemplateWithDataCenter; -import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER; -import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_NIC; -import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_SERVER; import org.apache.jclouds.profitbricks.rest.domain.DataCenter; import org.apache.jclouds.profitbricks.rest.domain.FirewallRule; import org.apache.jclouds.profitbricks.rest.domain.Image; @@ -67,10 +64,7 @@ import org.apache.jclouds.profitbricks.rest.ids.NicRef; import org.apache.jclouds.profitbricks.rest.ids.ServerRef; import org.apache.jclouds.profitbricks.rest.ids.VolumeRef; import org.apache.jclouds.profitbricks.rest.util.Trackables; -import static org.jclouds.Constants.PROPERTY_USER_THREADS; import org.jclouds.compute.ComputeServiceAdapter; -import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; -import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Processor; @@ -80,13 +74,23 @@ import org.jclouds.compute.domain.internal.VolumeImpl; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.util.ComputeServiceUtils; -import static org.jclouds.compute.util.ComputeServiceUtils.getPortRangesFromList; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.LoginCredentials; import org.jclouds.logging.Logger; import org.jclouds.rest.ResourceNotFoundException; -import org.jclouds.util.Passwords; +import org.jclouds.util.PasswordGenerator; + +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.base.Throwables; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.inject.Inject; @Singleton public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<ServerInDataCenter, Hardware, Provisionable, Location> { @@ -106,6 +110,7 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter< private final ListeningExecutorService executorService; private final ProvisioningJob.Factory jobFactory; private final ProvisioningManager provisioningManager; + private final PasswordGenerator.Config passwordGenerator; private List<DataCenter> datacetners; private static final Integer DEFAULT_LAN_ID = 1; @@ -121,7 +126,8 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter< @Named(POLL_PREDICATE_NIC) Predicate<NicRef> waitNICUntilAvailable, Trackables trackables, ProvisioningJob.Factory jobFactory, - ProvisioningManager provisioningManager) { + ProvisioningManager provisioningManager, + PasswordGenerator.Config passwordGenerator) { this.api = api; this.waitDcUntilAvailable = waitDcUntilAvailable; this.waitVolumeUntilAvailable = waitVolumeUntilAvailable; @@ -133,6 +139,7 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter< this.executorService = executorService; this.jobFactory = jobFactory; this.provisioningManager = provisioningManager; + this.passwordGenerator = passwordGenerator; this.datacetners = ImmutableList.of(); } @@ -149,7 +156,7 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter< TemplateOptions options = template.getOptions(); final String loginUser = isNullOrEmpty(options.getLoginUser()) ? "root" : options.getLoginUser(); final String pubKey = options.getPublicKey(); - final String password = options.hasLoginPassword() ? options.getLoginPassword() : Passwords.generate(); + final String password = options.hasLoginPassword() ? options.getLoginPassword() : passwordGenerator.generate(); final org.jclouds.compute.domain.Image image = template.getImage(); final int[] inboundPorts = template.getOptions().getInboundPorts(); http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/config/ProfitBricksComputeServiceContextModule.java ---------------------------------------------------------------------- diff --git a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/config/ProfitBricksComputeServiceContextModule.java b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/config/ProfitBricksComputeServiceContextModule.java index a144418..a64c3f7 100644 --- a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/config/ProfitBricksComputeServiceContextModule.java +++ b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/config/ProfitBricksComputeServiceContextModule.java @@ -70,6 +70,8 @@ import org.jclouds.functions.IdentityFunction; import org.jclouds.lifecycle.Closer; import org.jclouds.location.suppliers.ImplicitLocationSupplier; import org.jclouds.location.suppliers.implicit.OnlyLocationOrFirstZone; +import org.jclouds.util.PasswordGenerator; + import static org.jclouds.util.Predicates2.retry; public class ProfitBricksComputeServiceContextModule extends @@ -106,6 +108,16 @@ public class ProfitBricksComputeServiceContextModule extends bind(new TypeLiteral<ImageExtension>() { }).to(ProfitBricksImageExtension.class); } + + @Provides + @Singleton + protected PasswordGenerator.Config providePasswordGenerator() { + return new PasswordGenerator() + .lower().min(2).max(10).exclude("ilowyz".toCharArray()) + .upper().min(2).max(10).exclude("IOWYZ".toCharArray()) + .numbers().min(2).max(10).exclude("10".toCharArray()) + .symbols().count(0); + } @Provides @Singleton http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Volume.java ---------------------------------------------------------------------- diff --git a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Volume.java b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Volume.java index 1744655..5f9c816 100644 --- a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Volume.java +++ b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Volume.java @@ -20,9 +20,10 @@ import com.google.auto.value.AutoValue; import com.google.common.base.Enums; import static com.google.common.base.Preconditions.checkArgument; import java.util.Set; + +import org.apache.jclouds.profitbricks.rest.util.Preconditions; import org.jclouds.javax.annotation.Nullable; import org.jclouds.json.SerializedNames; -import org.jclouds.util.Passwords; @AutoValue public abstract class Volume extends Trackable { @@ -197,7 +198,7 @@ public abstract class Volume extends Trackable { CreatePayload payload = autoBuild(); if (payload.imagePassword() != null) { - checkArgument(Passwords.isValidPassword(payload.imagePassword()), "Password's format is not valid"); + Preconditions.checkPassword(payload.imagePassword()); } checkArgument( http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/036c68f2/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/util/Preconditions.java ---------------------------------------------------------------------- diff --git a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/util/Preconditions.java b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/util/Preconditions.java index 9b2e97b..c0cbd7a 100644 --- a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/util/Preconditions.java +++ b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/util/Preconditions.java @@ -87,4 +87,14 @@ public final class Preconditions { checkArgument(size > 1, "Storage size must be > 1GB"); } + private static final int VALID_PASSWORD_MIN_LENGTH = 8; + private static final int VALID_PASSWORD_MAX_LENGTH = 50; + private static final String PASSWORD_FORMAT = String.format( + "[a-zA-Z0-9][^iIloOwWyYzZ10]{%d,%d}", VALID_PASSWORD_MIN_LENGTH - 1, VALID_PASSWORD_MAX_LENGTH); + private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_FORMAT); + + public static void checkPassword(String password) { + checkArgument(PASSWORD_PATTERN.matcher(password).matches(), "Password must be between 8 and 50 characters, " + + "only a-z, A-Z, 0-9 without characters i, I, l, o, O, w, W, y, Y, z, Z and 1, 0"); + } }
