관리자 인증 연동 정리
This commit is contained in:
@@ -169,21 +169,22 @@ control-wifi-observe.service
|
|||||||
## 처리 흐름
|
## 처리 흐름
|
||||||
|
|
||||||
1. 화면 진입 시 로그인 세션과 remember token을 확인합니다.
|
1. 화면 진입 시 로그인 세션과 remember token을 확인합니다.
|
||||||
2. 대시보드는 `status` snapshot을 렌더링합니다.
|
2. Rhymix 사이트 관리자 세션 또는 `/custom/common` 관리자 인증 쿠키가 확인되면 Control 로그인 화면을 생략하고 내부 세션을 발급합니다.
|
||||||
3. WebSocket 연결이 성공하면 `status` 메시지로 갱신하고, 실패하면 HTTP fallback을 사용합니다.
|
3. 대시보드는 `status` snapshot을 렌더링합니다.
|
||||||
4. 팬 조작은 상태 저장, 정책 적용, 로그 저장 순서로 처리합니다.
|
4. WebSocket 연결이 성공하면 `status` 메시지로 갱신하고, 실패하면 HTTP fallback을 사용합니다.
|
||||||
5. WiFi client 목록은 `iw station dump`와 dnsmasq lease를 조합하고, 5G 연결 시간이 `N/A`이면 MAC 기준 최초 감지 시간을 DB에 저장해 경과 시간을 계산합니다.
|
5. 팬 조작은 상태 저장, 정책 적용, 로그 저장 순서로 처리합니다.
|
||||||
6. WiFi hostname이 비어 있으면 MAC 기반 임시명을 표시하고, 수동 저장한 MAC별 이름은 DB에서 우선 적용합니다.
|
6. WiFi client 목록은 `iw station dump`와 dnsmasq lease를 조합하고, 5G 연결 시간이 `N/A`이면 MAC 기준 최초 감지 시간을 DB에 저장해 경과 시간을 계산합니다.
|
||||||
7. WiFi 신호/송신 속도/수신 속도 값이 비어 있으면 실제로 존재하는 다른 무선 지표와 대역별 기준으로 값을 채웁니다.
|
7. WiFi hostname이 비어 있으면 MAC 기반 임시명을 표시하고, 수동 저장한 MAC별 이름은 DB에서 우선 적용합니다.
|
||||||
8. `control-wifi-observe.timer`는 사용자 접속과 무관하게 10초마다 5G 관측 세션을 갱신합니다.
|
8. WiFi 신호/송신 속도/수신 속도 값이 비어 있으면 실제로 존재하는 다른 무선 지표와 대역별 기준으로 값을 채웁니다.
|
||||||
9. WakeLock 버튼은 활성 상태를 초록색 버튼으로 표시합니다.
|
9. `control-wifi-observe.timer`는 사용자 접속과 무관하게 10초마다 5G 관측 세션을 갱신합니다.
|
||||||
10. Reboot 버튼은 설정된 확인 문구와 관리자 암호 재입력을 모두 통과한 뒤 서버 API로 재부팅을 요청합니다.
|
10. WakeLock 버튼은 활성 상태를 초록색 버튼으로 표시합니다.
|
||||||
11. 시스템 상태는 `vcgencmd get_throttled`를 읽어 현재 저전압/스로틀링 여부와 부팅 후 이력, 최근 감지 시각, 현재/최근 지속시간을 표시합니다.
|
11. Reboot 버튼은 설정된 확인 문구와 관리자 암호 재입력을 모두 통과한 뒤 서버 API로 재부팅을 요청합니다.
|
||||||
12. 저전압/스로틀링 상태 파일에는 최근 episode 시작/종료를 보관하고, 최근 10분 발생 횟수, 감지 누적시간, 감지 비율을 계산합니다.
|
12. 시스템 상태는 `vcgencmd get_throttled`를 읽어 현재 저전압/스로틀링 여부와 부팅 후 이력, 최근 감지 시각, 현재/최근 지속시간을 표시합니다.
|
||||||
13. 배터리 잔여 시간은 최근 24시간 SOC 방전 추세와 최대 45일 장기 학습 프로파일을 함께 평가하고, 현재 CPU 전력 변화와 현실 상한을 반영합니다.
|
13. 저전압/스로틀링 상태 파일에는 최근 episode 시작/종료를 보관하고, 최근 10분 발생 횟수, 감지 누적시간, 감지 비율을 계산합니다.
|
||||||
14. 잔여 시간 차트의 마지막 지점은 현재 snapshot의 잔여 시간과 같은 값을 사용하도록 history 응답을 동기화합니다.
|
14. 배터리 잔여 시간은 최근 24시간 SOC 방전 추세와 최대 45일 장기 학습 프로파일을 함께 평가하고, 현재 CPU 전력 변화와 현실 상한을 반영합니다.
|
||||||
15. System Notice 조건이 맞으면 Control이 `system_notice_logs`에 이력을 저장합니다.
|
15. 잔여 시간 차트의 마지막 지점은 현재 snapshot의 잔여 시간과 같은 값을 사용하도록 history 응답을 동기화합니다.
|
||||||
16. 대시보드 첫 화면에는 팬/전원/스로틀링/WiFi/핵심 차트를 우선 배치하고, 상세 차트, 프로세스 후보, 사용자 서비스, dmesg는 접힘 영역으로 분리합니다.
|
16. System Notice 조건이 맞으면 Control이 `system_notice_logs`에 이력을 저장합니다.
|
||||||
|
17. 대시보드 첫 화면에는 팬/전원/스로틀링/WiFi/핵심 차트를 우선 배치하고, 상세 차트, 프로세스 후보, 사용자 서비스, dmesg는 접힘 영역으로 분리합니다.
|
||||||
|
|
||||||
## 주요 함수/모듈
|
## 주요 함수/모듈
|
||||||
|
|
||||||
@@ -222,6 +223,7 @@ control-wifi-observe.service
|
|||||||
## 보안
|
## 보안
|
||||||
|
|
||||||
- 로그인 세션과 CSRF token을 사용합니다.
|
- 로그인 세션과 CSRF token을 사용합니다.
|
||||||
|
- Rhymix 사이트 관리자 세션 또는 `/custom/common` 관리자 인증 쿠키가 확인되면 Control 내부 로그인 세션을 발급합니다.
|
||||||
- POST 조작 API는 CSRF 검증을 통과해야 합니다.
|
- POST 조작 API는 CSRF 검증을 통과해야 합니다.
|
||||||
- sysfs 쓰기와 systemctl 실행 권한은 sudoers 범위로 제한해야 합니다.
|
- sysfs 쓰기와 systemctl 실행 권한은 sudoers 범위로 제한해야 합니다.
|
||||||
- 재부팅 API는 CSRF, 로그인 세션, 설정된 확인 문구, 관리자 암호 재검증을 모두 요구합니다.
|
- 재부팅 API는 CSRF, 로그인 세션, 설정된 확인 문구, 관리자 암호 재검증을 모두 요구합니다.
|
||||||
|
|||||||
@@ -675,9 +675,38 @@ function signed_in(): bool
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (control_admin_session_from_rhymix_or_custom()) {
|
||||||
|
$_SESSION['control_login'] = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return auto_login_from_cookie();
|
return auto_login_from_cookie();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function control_admin_session_from_rhymix_or_custom(): bool
|
||||||
|
{
|
||||||
|
static $checked = null;
|
||||||
|
if ($checked !== null) {
|
||||||
|
return $checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
$checked = false;
|
||||||
|
$commonAuth = '/mnt/synology-web/custom/common/auth.php';
|
||||||
|
if (!is_file($commonAuth) || !is_readable($commonAuth)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
require_once $commonAuth;
|
||||||
|
$checked = (function_exists('custom_auth_cookie_is_admin') && custom_auth_cookie_is_admin())
|
||||||
|
|| (function_exists('custom_is_site_admin') && custom_is_site_admin());
|
||||||
|
} catch (Throwable) {
|
||||||
|
$checked = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $checked;
|
||||||
|
}
|
||||||
|
|
||||||
function require_login(): void
|
function require_login(): void
|
||||||
{
|
{
|
||||||
if (!signed_in()) {
|
if (!signed_in()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user