Skip to content

Commit 6d88950

Browse files
committed
show the configured password policy requirements
Signed-off-by: NAYANAR <nayana.r5@ibm.com>
1 parent 6a2c2e9 commit 6d88950

File tree

4 files changed

+37
-19
lines changed

4 files changed

+37
-19
lines changed

.env.example

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,10 @@ ARGON2ID_PARALLELISM=1
178178

179179
# Password Policy Configuration
180180
PASSWORD_MIN_LENGTH=8
181-
PASSWORD_REQUIRE_UPPERCASE=false
182-
PASSWORD_REQUIRE_LOWERCASE=false
181+
PASSWORD_REQUIRE_UPPERCASE=true
182+
PASSWORD_REQUIRE_LOWERCASE=true
183183
PASSWORD_REQUIRE_NUMBERS=false
184-
PASSWORD_REQUIRE_SPECIAL=false
184+
PASSWORD_REQUIRE_SPECIAL=true
185185

186186
# Account Security Configuration
187187
# Maximum failed login attempts before account lockout

charts/mcp-stack/values.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -409,10 +409,10 @@ mcpContextForge:
409409
ARGON2ID_MEMORY_COST: "65536" # Argon2id memory cost in KiB
410410
ARGON2ID_PARALLELISM: "1" # Argon2id parallelism (threads)
411411
PASSWORD_MIN_LENGTH: "8" # minimum password length
412-
PASSWORD_REQUIRE_UPPERCASE: "false" # require uppercase letters in passwords
413-
PASSWORD_REQUIRE_LOWERCASE: "false" # require lowercase letters in passwords
412+
PASSWORD_REQUIRE_UPPERCASE: "true" # require uppercase letters in passwords
413+
PASSWORD_REQUIRE_LOWERCASE: "true" # require lowercase letters in passwords
414414
PASSWORD_REQUIRE_NUMBERS: "false" # require numbers in passwords
415-
PASSWORD_REQUIRE_SPECIAL: "false" # require special characters in passwords
415+
PASSWORD_REQUIRE_SPECIAL: "true" # require special characters in passwords
416416
MAX_FAILED_LOGIN_ATTEMPTS: "5" # maximum failed login attempts before lockout
417417
ACCOUNT_LOCKOUT_DURATION_MINUTES: "30" # account lockout duration in minutes
418418
MIN_PASSWORD_LENGTH: "12" # minimum password length for validation

mcpgateway/admin.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4915,10 +4915,10 @@ async def admin_get_user_edit(
49154915
<span class="inline-flex items-center justify-center w-4 h-4 bg-gray-400 text-white rounded-full text-xs mr-2">✗</span>
49164916
<span>At least {settings.password_min_length} characters long</span>
49174917
</div>
4918-
{'<div class="flex items-center" id="req-uppercase"><span class="inline-flex items-center justify-center w-4 h-4 bg-gray-400 text-white rounded-full text-xs mr-2">✗</span><span>Contains uppercase letters (A-Z)</span></div>' if settings.password_require_uppercase else ''}
4919-
{'<div class="flex items-center" id="req-lowercase"><span class="inline-flex items-center justify-center w-4 h-4 bg-gray-400 text-white rounded-full text-xs mr-2">✗</span><span>Contains lowercase letters (a-z)</span></div>' if settings.password_require_lowercase else ''}
4918+
<div class="flex items-center" id="req-uppercase"><span class="inline-flex items-center justify-center w-4 h-4 bg-gray-400 text-white rounded-full text-xs mr-2">✗</span><span>Contains uppercase letters (A-Z)</span></div>
4919+
<div class="flex items-center" id="req-lowercase"><span class="inline-flex items-center justify-center w-4 h-4 bg-gray-400 text-white rounded-full text-xs mr-2">✗</span><span>Contains lowercase letters (a-z)</span></div>
49204920
{'<div class="flex items-center" id="req-numbers"><span class="inline-flex items-center justify-center w-4 h-4 bg-gray-400 text-white rounded-full text-xs mr-2">✗</span><span>Contains numbers (0-9)</span></div>' if settings.password_require_numbers else ''}
4921-
{'<div class="flex items-center" id="req-special"><span class="inline-flex items-center justify-center w-4 h-4 bg-gray-400 text-white rounded-full text-xs mr-2">✗</span><span>Contains special characters (!@#$%^&amp;*(),.?&quot;:{{}}|&lt;&gt;)</span></div>' if settings.password_require_special else ''}
4921+
<div class="flex items-center" id="req-special"><span class="inline-flex items-center justify-center w-4 h-4 bg-gray-400 text-white rounded-full text-xs mr-2">✗</span><span>Contains special characters (!@#$%^&amp;*(),.?&quot;:{{}}|&lt;&gt;)</span></div>
49224922
</div>
49234923
</div>
49244924
</div>
@@ -4934,6 +4934,8 @@ async def admin_get_user_edit(
49344934
requireSpecial: {'true' if settings.password_require_special else 'false'}
49354935
}};
49364936

4937+
// (No debug output) passwordPolicy available in JS for logic below
4938+
49374939
function updateRequirementIcon(elementId, isValid) {{
49384940
const req = document.getElementById(elementId);
49394941
if (req) {{
@@ -4957,19 +4959,19 @@ async def admin_get_user_edit(
49574959

49584960
// Check uppercase requirement (if enabled)
49594961
const uppercaseCheck = !passwordPolicy.requireUppercase || /[A-Z]/.test(password);
4960-
updateRequirementIcon('req-uppercase', /[A-Z]/.test(password));
4962+
updateRequirementIcon('req-uppercase', uppercaseCheck);
49614963

49624964
// Check lowercase requirement (if enabled)
49634965
const lowercaseCheck = !passwordPolicy.requireLowercase || /[a-z]/.test(password);
4964-
updateRequirementIcon('req-lowercase', /[a-z]/.test(password));
4966+
updateRequirementIcon('req-lowercase', lowercaseCheck);
49654967

49664968
// Check numbers requirement (if enabled)
49674969
const numbersCheck = !passwordPolicy.requireNumbers || /[0-9]/.test(password);
4968-
updateRequirementIcon('req-numbers', /[0-9]/.test(password));
4970+
updateRequirementIcon('req-numbers', numbersCheck);
49694971

49704972
// Check special character requirement (if enabled) - matches backend set
49714973
const specialCheck = !passwordPolicy.requireSpecial || /[!@#$%^&*(),.?":{{}}|<>]/.test(password);
4972-
updateRequirementIcon('req-special', /[!@#$%^&*(),.?":{{}}|<>]/.test(password));
4974+
updateRequirementIcon('req-special', specialCheck);
49734975

49744976
// Enable/disable submit button based on active requirements
49754977
const submitButton = document.querySelector('#user-edit-modal-content button[type="submit"]');
@@ -5000,9 +5002,25 @@ async def admin_get_user_edit(
50005002
}}
50015003
}}
50025004

5003-
// Initialize validation on page load
5004-
document.addEventListener('DOMContentLoaded', function() {{
5005-
validatePasswordRequirements();
5005+
// Initialize validation when the form is present (supports HTMX-injected content)
5006+
(function initPasswordValidation() {{
5007+
if (document.getElementById('password-field')) {{
5008+
validatePasswordRequirements();
5009+
validatePasswordMatch();
5010+
}}
5011+
}})();
5012+
5013+
// Re-run validation after HTMX swaps content into the DOM (modal loaded via HTMX)
5014+
document.addEventListener('htmx:afterSwap', function(event) {{
5015+
try {{
5016+
const target = event.detail && event.detail.target ? event.detail.target : null;
5017+
if (target && (target.querySelector('#password-field') || target.id === 'user-edit-modal-content')) {{
5018+
validatePasswordRequirements();
5019+
validatePasswordMatch();
5020+
}}
5021+
}} catch (e) {{
5022+
// Ignore errors from HTMX event handling
5023+
}}
50065024
}});
50075025
</script>
50085026
<div class="flex justify-end space-x-3">

mcpgateway/config.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,10 @@ class Settings(BaseSettings):
301301

302302
# Password Policy Configuration
303303
password_min_length: int = Field(default=8, description="Minimum password length")
304-
password_require_uppercase: bool = Field(default=False, description="Require uppercase letters in passwords")
305-
password_require_lowercase: bool = Field(default=False, description="Require lowercase letters in passwords")
304+
password_require_uppercase: bool = Field(default=True, description="Require uppercase letters in passwords")
305+
password_require_lowercase: bool = Field(default=True, description="Require lowercase letters in passwords")
306306
password_require_numbers: bool = Field(default=False, description="Require numbers in passwords")
307-
password_require_special: bool = Field(default=False, description="Require special characters in passwords")
307+
password_require_special: bool = Field(default=True, description="Require special characters in passwords")
308308

309309
# Account Security Configuration
310310
max_failed_login_attempts: int = Field(default=5, description="Maximum failed login attempts before account lockout")

0 commit comments

Comments
 (0)