From b9668a92e6d808739ae8fd337a72c52c6a07396f Mon Sep 17 00:00:00 2001 From: dsyoon Date: Sat, 7 Feb 2026 20:56:28 +0900 Subject: [PATCH] Gate link access by login level MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disable open/copy for non-allowed services based on anonymous/logged-in/admin email tiers and show an '접근 제한' tag on restricted cards. Co-authored-by: Cursor --- script.js | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++--- styles.css | 18 ++++++++++++++++++ 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/script.js b/script.js index 94f6ace..83deebf 100644 --- a/script.js +++ b/script.js @@ -69,6 +69,36 @@ canManage: false, }; + // Access levels (open/copy) + const ACCESS_ANON_IDS = new Set(["dsyoon-ncue-net", "family-ncue-net", "link-ncue-net"]); + const ACCESS_USER_IDS = new Set([ + "dsyoon-ncue-net", + "family-ncue-net", + "tts-ncue-net", + "meeting-ncue-net", + "link-ncue-net", + "dreamgirl-ncue-net", + ]); + const ACCESS_ADMIN_EMAILS = new Set(["dosangyoon@gmail.com", "dsyoon@ncue.net"]); + + function getUserEmail() { + const e = auth && auth.user && auth.user.email ? String(auth.user.email) : ""; + return e.trim().toLowerCase(); + } + + function isAdminEmail(email) { + const e = String(email || "").trim().toLowerCase(); + return ACCESS_ADMIN_EMAILS.has(e); + } + + function canAccessLink(link) { + const email = getUserEmail(); + if (email && isAdminEmail(email)) return true; + const id = String(link && link.id ? link.id : ""); + if (email) return ACCESS_USER_IDS.has(id); + return ACCESS_ANON_IDS.has(id); + } + const auth = { client: null, user: null, @@ -261,9 +291,11 @@ const desc = escapeHtml(link.description || ""); const url = escapeHtml(link.url); const starClass = link.favorite ? "star on" : "star"; + const accessible = canAccessLink(link); const tags = (link.tags || []).slice(0, 8); const tagHtml = [ link.favorite ? `★ 즐겨찾기` : "", + accessible ? "" : `접근 제한`, ...tags.map((t) => `#${escapeHtml(t)}`), ] .filter(Boolean) @@ -274,8 +306,20 @@ const lockTitle = state.canManage ? "" : ' title="관리 기능은 로그인 후 사용 가능합니다."'; const fav = faviconUrl(link.url); + const accessDisabledAttr = accessible ? "" : " disabled aria-disabled=\"true\""; + const accessDisabledTitle = accessible ? "" : " title=\"이 링크는 현재 권한으로 접근할 수 없습니다.\""; + + const openHtml = accessible + ? `열기` + : ``; + + const copyDisabledAttr = accessible ? "" : " disabled aria-disabled=\"true\""; + const copyDisabledTitle = accessible ? "" : " title=\"이 링크는 현재 권한으로 접근할 수 없습니다.\""; + return ` -
+