{"record":{"id":"d8b948903e73cd09","repo":"puppetlabs/puppet","slug":"password-maximum-age-must-be-provided-as-a-number","errorCode":null,"errorMessage":"Password maximum age must be provided as a number.","messagePattern":"Password maximum age must be provided as a number\\.","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/type/user.rb","lineNumber":316,"sourceCode":"        end\n      end\n    end\n\n    newproperty(:password_max_age, :required_features => :manages_password_age) do\n      desc \"The maximum number of days a password may be used before it must be changed.\"\n\n      munge do |value|\n        case value\n        when String\n          Integer(value)\n        else\n          value\n        end\n      end\n\n      validate do |value|\n        if value.to_s !~ /^-?\\d+$/\n          raise ArgumentError, _(\"Password maximum age must be provided as a number.\")\n        end\n      end\n    end\n\n    newproperty(:password_warn_days, :required_features => :manages_password_age) do\n      desc \"The number of days before a password is going to expire (see the maximum password age) during which the user should be warned.\"\n\n      munge do |value|\n        case value\n        when String\n          Integer(value)\n        else\n          value\n        end\n      end\n\n      validate do |value|\n        if value.to_s !~ /^-?\\d+$/","sourceCodeStart":298,"sourceCodeEnd":334,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/type/user.rb#L298-L334","documentation":"The user type's `password_max_age` property (days before a password must be changed; maps to chage -M) validates its value's string form against /^-?\\d+$/ (lib/puppet/type/user.rb:316), mirroring password_min_age. Non-numeric, decimal, or empty values raise ArgumentError.","triggerScenarios":"`password_max_age => '90 days'`; `=> 89.5`; `=> ''`; values pulled from a policy API as 'N days' strings.","commonSituations":"Password-policy data expressed with units; float ages; empty-string defaults from ENC data.","solutions":["Pass an integer or integer string, e.g. password_max_age => 90","Strip units and cast in the wrapper (e.g. Integer(regsubst($v, '^.*(\\d+).*$', '\u0001')))","Use undef instead of '' when no maximum applies"],"exampleFix":"# before\nuser { 'alice':\n  ensure           => present,\n  password_max_age => '90 days',\n}\n\n# after\nuser { 'alice':\n  ensure           => present,\n  password_max_age => 90,\n}","handlingStrategy":"validation","validationCode":"if $password_max_age != undef and \"$password_max_age\" !~ /^-?\\d+$/ {\n  fail('password_max_age must be an integer (days)')\n}","typeGuard":"def valid_age?(v)\n  v.is_a?(Integer) || (v.is_a?(String) && v =~ /\\A-?\\d+\\z/)\nend","tryCatchPattern":"begin\n  Puppet::Type.type(:user).new(name: 'a', password_max_age: '90 days')\nrescue ArgumentError => e\n  raise unless e.message.include?('maximum age')\n  # cast days to Integer and rebuild\nend","preventionTips":["Type policy parameters as Integer in Puppet signatures","Strip unit suffixes from policy-API data before use","Set both min/max age from one normalized policy hash"],"tags":["puppet","user","password-policy","invalid-value"],"backgroundTag":"invalid-number-format","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}