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