Leon4gr45 commited on
Commit
3484334
·
verified ·
1 Parent(s): 49671a0

Upload folder using huggingface_hub (part 3)

Browse files
tests/test_settings_root_password.py ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import sys
3
+ from unittest.mock import MagicMock
4
+
5
+ sys.modules['sentence_transformers'] = MagicMock()
6
+ sys.modules['torch'] = MagicMock()
7
+ sys.modules['langchain'] = MagicMock()
8
+ sys.modules['langchain.prompts'] = MagicMock()
9
+ sys.modules['langchain.embeddings'] = MagicMock()
10
+ sys.modules['langchain.embeddings.base'] = MagicMock()
11
+ sys.modules['models'] = MagicMock()
12
+
13
+ import pytest
14
+ from helpers import settings, runtime, dotenv
15
+
16
+ def test_non_root_docker_empty_root_password(monkeypatch):
17
+ monkeypatch.setenv("HF_SPACE", "true")
18
+ monkeypatch.setattr("os.geteuid", lambda: 1000, raising=False)
19
+
20
+ mock_sub = MagicMock()
21
+ monkeypatch.setattr("subprocess.run", mock_sub)
22
+
23
+ assert settings.can_manage_root_password() is False
24
+
25
+ curr = settings.get_settings()
26
+ curr["root_password"] = ""
27
+ settings._write_sensitive_settings(curr)
28
+
29
+ mock_sub.assert_not_called()
30
+
31
+ def test_non_root_docker_placeholder_password(monkeypatch):
32
+ monkeypatch.setenv("HF_SPACE", "true")
33
+ monkeypatch.setattr("os.geteuid", lambda: 1000, raising=False)
34
+
35
+ mock_sub = MagicMock()
36
+ monkeypatch.setattr("subprocess.run", mock_sub)
37
+
38
+ curr = settings.get_settings()
39
+ curr["root_password"] = settings.PASSWORD_PLACEHOLDER
40
+ settings._write_sensitive_settings(curr)
41
+
42
+ mock_sub.assert_not_called()
43
+
44
+ def test_non_root_docker_unrelated_settings_change(monkeypatch):
45
+ monkeypatch.setenv("HF_SPACE", "true")
46
+ monkeypatch.setattr("os.geteuid", lambda: 1000, raising=False)
47
+
48
+ mock_sub = MagicMock()
49
+ monkeypatch.setattr("subprocess.run", mock_sub)
50
+
51
+ curr = settings.get_settings()
52
+ curr["timezone"] = "UTC"
53
+ curr["root_password"] = ""
54
+
55
+ # Should complete without error
56
+ settings._write_sensitive_settings(curr)
57
+ mock_sub.assert_not_called()
58
+
59
+ def test_privileged_docker_root_password_functional(monkeypatch):
60
+ monkeypatch.setenv("HF_SPACE", "true")
61
+ monkeypatch.setattr("os.geteuid", lambda: 0, raising=False)
62
+ monkeypatch.setattr("shutil.which", lambda cmd: "/usr/sbin/chpasswd")
63
+
64
+ mock_sub = MagicMock()
65
+ monkeypatch.setattr("subprocess.run", mock_sub)
66
+
67
+ assert settings.can_manage_root_password() is True
68
+
69
+ settings.set_root_password("new_secure_pass")
70
+ mock_sub.assert_called_once()
71
+
72
+ def test_non_root_explicit_password_handled_safely(monkeypatch):
73
+ monkeypatch.setenv("HF_SPACE", "true")
74
+ monkeypatch.setattr("os.geteuid", lambda: 1000, raising=False)
75
+
76
+ mock_sub = MagicMock()
77
+ monkeypatch.setattr("subprocess.run", mock_sub)
78
+
79
+ curr = settings.get_settings()
80
+ curr["root_password"] = "attempted_root_change"
81
+
82
+ # Should handle safely without raising CalledProcessError
83
+ settings._write_sensitive_settings(curr)
84
+ mock_sub.assert_not_called()
85
+
86
+ def test_secret_leakage_protection(monkeypatch, capsys):
87
+ dummy_secret = "test-secret-value-never-expose"
88
+ monkeypatch.setenv("HF_SPACE", "true")
89
+
90
+ curr = settings.get_settings()
91
+ curr["auth_password"] = dummy_secret
92
+ out = settings.convert_out(curr)
93
+
94
+ captured = capsys.readouterr()
95
+ assert dummy_secret not in captured.out
96
+ assert dummy_secret not in captured.err
97
+ assert dummy_secret not in json.dumps(out)
webui/components/settings/external/auth.html CHANGED
@@ -45,7 +45,7 @@
45
  </button>
46
 
47
  <div class="settings-advanced-body" x-show="advOpen" x-transition.opacity>
48
- <template x-if="additional.is_dockerized">
49
  <div class="field">
50
  <div class="field-label">
51
  <div class="field-title">Container root password</div>
 
45
  </button>
46
 
47
  <div class="settings-advanced-body" x-show="advOpen" x-transition.opacity>
48
+ <template x-if="additional.can_manage_root_password">
49
  <div class="field">
50
  <div class="field-label">
51
  <div class="field-title">Container root password</div>