NeahNew/.next/server/app/courrier/[id]/route.js
2026-01-02 14:32:36 +01:00

1 line
13 KiB
JavaScript

(()=>{var e={};e.id=9402,e.ids=[9402],e.modules={3295:e=>{"use strict";e.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:e=>{"use strict";e.exports=require("node:buffer")},8086:e=>{"use strict";e.exports=require("module")},10846:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},11723:e=>{"use strict";e.exports=require("querystring")},12269:(e,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0})},12412:e=>{"use strict";e.exports=require("assert")},14985:e=>{"use strict";e.exports=require("dns")},19854:(e,r,t)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var s={};Object.defineProperty(r,"default",{enumerable:!0,get:function(){return n.default}});var o=t(12269);Object.keys(o).forEach(function(e){!("default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(s,e))&&(e in r&&r[e]===o[e]||Object.defineProperty(r,e,{enumerable:!0,get:function(){return o[e]}}))});var n=function(e,r){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=i(r);if(t&&t.has(e))return t.get(e);var s={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in e)if("default"!==n&&({}).hasOwnProperty.call(e,n)){var a=o?Object.getOwnPropertyDescriptor(e,n):null;a&&(a.get||a.set)?Object.defineProperty(s,n,a):s[n]=e[n]}return s.default=e,t&&t.set(e,s),s}(t(35426));function i(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(i=function(e){return e?t:r})(e)}Object.keys(n).forEach(function(e){!("default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(s,e))&&(e in r&&r[e]===n[e]||Object.defineProperty(r,e,{enumerable:!0,get:function(){return n[e]}}))})},25037:(e,r,t)=>{"use strict";t.d(r,{_:()=>o});var s=t(70762);let o=s.z.object({NODE_ENV:s.z.enum(["development","test","production"]).default("development"),DATABASE_URL:s.z.string().url(),NEWSDB_URL:s.z.string().regex(/^postgresql:\/\//,"Must be a valid PostgreSQL URL"),NEWS_API_URL:s.z.string().url(),KEYCLOAK_CLIENT_ID:s.z.string(),KEYCLOAK_CLIENT_SECRET:s.z.string(),KEYCLOAK_REALM:s.z.string(),KEYCLOAK_ISSUER:s.z.string().url(),LEANTIME_TOKEN:s.z.string(),LEANTIME_API_URL:s.z.string().url(),ROCKET_CHAT_TOKEN:s.z.string(),ROCKET_CHAT_USER_ID:s.z.string()}).parse(process.env)},26690:(e,r,t)=>{"use strict";t.d(r,{N:()=>a});var s=t(1926),o=t(10591);function n(e){let r=process.env[e];if(!r)throw Error(`Missing required environment variable: ${e}`);return r}async function i(e){try{let r=await fetch(`${process.env.KEYCLOAK_ISSUER}/protocol/openid-connect/token`,{headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:process.env.KEYCLOAK_CLIENT_ID,client_secret:process.env.KEYCLOAK_CLIENT_SECRET,grant_type:"refresh_token",refresh_token:e.refreshToken||""}),method:"POST"}),t=await r.json();if(!r.ok){if("invalid_grant"===t.error||t.error_description?.includes("Session not active")||t.error_description?.includes("Token is not active"))return console.log("Keycloak session invalidated (likely logged out from iframe), marking token for removal"),{...e,error:"SessionNotActive"};throw t}return{...e,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,idToken:e.idToken,accessTokenExpires:Date.now()+1e3*t.expires_in}}catch(r){if(console.error("Error refreshing access token:",r),r?.error==="invalid_grant"||r?.error_description?.includes("Session not active")||r?.error_description?.includes("Token is not active"))return{...e,error:"SessionNotActive"};return{...e,error:"RefreshAccessTokenError"}}}let a={providers:[(0,s.A)({clientId:n("KEYCLOAK_CLIENT_ID"),clientSecret:n("KEYCLOAK_CLIENT_SECRET"),issuer:n("KEYCLOAK_ISSUER"),authorization:{params:{scope:"openid profile email roles"}},profile(e){console.log("Keycloak profile callback:",{rawProfile:e,rawRoles:e.roles,realmAccess:e.realm_access,groups:e.groups});let r=e.realm_access?.roles||[];console.log("Profile callback raw roles:",r);let t=r.map(e=>e.replace(/^ROLE_/,"").toLowerCase());return console.log("Profile callback cleaned roles:",t),{id:e.sub,name:e.name??e.preferred_username,email:e.email,first_name:e.given_name??"",last_name:e.family_name??"",username:e.preferred_username??e.email?.split("@")[0]??"",role:t}}})],session:{strategy:"jwt",maxAge:2592e3},callbacks:{async jwt({token:e,account:r,profile:t}){if(r&&t){let s=(t.realm_access?.roles||[]).map(e=>e.replace(/^ROLE_/,"").toLowerCase());e.accessToken=r.access_token??"",e.refreshToken=r.refresh_token??"",e.idToken=r.id_token??"",e.accessTokenExpires=r.expires_at??0,e.sub=t.sub,e.role=s,e.username=t.preferred_username??"",e.first_name=t.given_name??"",e.last_name=t.family_name??""}else if(e.accessToken)try{let r=(0,o.s)(e.accessToken);r.realm_access?.roles&&(e.role=r.realm_access.roles.map(e=>e.replace(/^ROLE_/,"").toLowerCase()))}catch(e){console.error("Error decoding token:",e)}let s=e.accessTokenExpires;if(s&&Date.now()<s)return e;if(!e.refreshToken)return console.log("No refresh token available, cannot refresh"),{...e,accessToken:void 0,refreshToken:void 0,idToken:void 0,error:"NoRefreshToken"};let n=await i(e);return"SessionNotActive"===n.error?(console.log("Keycloak session invalidated, clearing token to force re-authentication"),{...n,accessToken:void 0,refreshToken:void 0,idToken:void 0}):"RefreshAccessTokenError"!==n.error||n.accessToken?n:(console.log("Refresh token invalid, clearing session to force re-authentication"),{...n,accessToken:void 0,refreshToken:void 0,idToken:void 0})},async session({session:e,token:r}){if("SessionNotActive"===r.error||"NoRefreshToken"===r.error||!r.accessToken||!r.refreshToken)return console.log("Session invalidated or tokens missing, user will be signed out",{error:r.error,hasAccessToken:!!r.accessToken,hasRefreshToken:!!r.refreshToken}),null;if(r.error)throw Error(r.error);let t=Array.isArray(r.role)?r.role:[];return e.user={id:r.sub??"",email:r.email??null,name:r.name??null,image:null,username:r.username??"",first_name:r.first_name??"",last_name:r.last_name??"",role:t,nextcloudInitialized:!1},e.accessToken=r.accessToken,e.idToken=r.idToken,e.refreshToken=r.refreshToken,e}},pages:{signIn:"/signin",error:"/signin"},debug:!1}},27910:e=>{"use strict";e.exports=require("stream")},28354:e=>{"use strict";e.exports=require("util")},29021:e=>{"use strict";e.exports=require("fs")},29294:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-async-storage.external.js")},33873:e=>{"use strict";e.exports=require("path")},34631:e=>{"use strict";e.exports=require("tls")},41204:e=>{"use strict";e.exports=require("string_decoder")},44870:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},48161:e=>{"use strict";e.exports=require("node:os")},55511:e=>{"use strict";e.exports=require("crypto")},55591:e=>{"use strict";e.exports=require("https")},57075:e=>{"use strict";e.exports=require("node:stream")},63033:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},73566:e=>{"use strict";e.exports=require("worker_threads")},74075:e=>{"use strict";e.exports=require("zlib")},76760:e=>{"use strict";e.exports=require("node:path")},78335:()=>{},78474:e=>{"use strict";e.exports=require("node:events")},79428:e=>{"use strict";e.exports=require("buffer")},79464:(e,r,t)=>{"use strict";t.d(r,{z:()=>n});var s=t(96330),o=t(25037);let n=globalThis.prisma||new s.PrismaClient({datasources:{db:{url:o._.DATABASE_URL}},log:["query"]})},79551:e=>{"use strict";e.exports=require("url")},81630:e=>{"use strict";e.exports=require("http")},91645:e=>{"use strict";e.exports=require("net")},94735:e=>{"use strict";e.exports=require("events")},96330:e=>{"use strict";e.exports=require("@prisma/client")},96487:()=>{},96571:(e,r,t)=>{"use strict";t.r(r),t.d(r,{patchFetch:()=>x,routeModule:()=>h,serverHooks:()=>E,workAsyncStorage:()=>_,workUnitAsyncStorage:()=>k});var s={};t.r(s),t.d(s,{GET:()=>m,POST:()=>g});var o=t(96559),n=t(48088),i=t(37719),a=t(32190),l=t(12461),c=t(19854),u=t(26690),d=t(79464),p=t(29908);let f=new Map;async function m(e,r){let t=await r.params;try{console.log(`[DEBUG] GET request for single email ID: ${t.id}`);let r=await (0,c.getServerSession)(u.N);if(!r||!r.user?.id)return console.log("[DEBUG] Not authenticated"),a.NextResponse.json({error:"Not authenticated"},{status:401});let{id:s}=t;if(!s)return console.log("[DEBUG] Missing email ID"),a.NextResponse.json({error:"Missing email ID"},{status:400});let o=`${r.user.id}:${s}`,n=f.get(o),i=Date.now();if(n&&i-n.timestamp<18e5)return console.log(`[DEBUG] Using cached content for email ${s}`),a.NextResponse.json({id:s,content:n.content,contentFetched:!0,fromCache:!0});let m=await d.z.mailCredentials.findFirst({where:{userId:r.user.id}});if(!m)return console.log("[DEBUG] No mail credentials found"),a.NextResponse.json({error:"No mail credentials found"},{status:404});let{searchParams:g}=new URL(e.url),h=g.get("folder")||"INBOX";console.log(`[DEBUG] Fetching email ${s} from folder ${h}`);let _=null;try{_=new l._({host:m.host,port:m.port,secure:!0,auth:{user:m.email,pass:m.password||void 0},logger:!1}),await _.connect(),console.log(`[DEBUG] Connected to IMAP server to fetch email ${s}`);let e=await _.mailboxOpen(h);console.log(`[DEBUG] Opened mailbox ${h}, total messages: ${e.exists}`);let r=await _.fetchOne(Number(s),{source:!0,envelope:!0});if(!r)return console.log(`[DEBUG] Email ${s} not found`),a.NextResponse.json({error:"Email not found"},{status:404});let{source:t,envelope:n}=r;console.log(`[DEBUG] Successfully fetched email source, length: ${t.length}`);let c=await (0,p.simpleParser)(t.toString());console.log(`[DEBUG] Parsed email source: has HTML: ${!!c.html}, has text: ${!!c.text}`);let u=c.html||c.textAsHtml||c.text||"";return f.set(o,{content:u,timestamp:i}),a.NextResponse.json({id:s,subject:n.subject,content:u,contentFetched:!0})}catch(e){return console.error("[DEBUG] Error fetching email content:",e),a.NextResponse.json({error:"Failed to fetch email content",message:e.message,details:e.stack},{status:500})}finally{if(_)try{await _.mailboxClose(),await _.logout(),console.log(`[DEBUG] Closed IMAP connection for email ${s}`)}catch(e){console.error("[DEBUG] Error closing IMAP connection:",e)}}}catch(e){return console.error("[DEBUG] Unhandled error in GET:",e),a.NextResponse.json({error:"Internal server error",message:e.message,details:e.stack},{status:500})}}async function g(e,r){let t=await r.params;try{console.log(`[DEBUG] POST request for email ID: ${t.id}`);let r=await (0,c.getServerSession)(u.N);if(!r||!r.user?.id)return a.NextResponse.json({error:"Not authenticated"},{status:401});let{id:s}=t;if(!s)return a.NextResponse.json({error:"Missing email ID"},{status:400});let{action:o}=await e.json();if("mark-read"!==o&&"mark-unread"!==o)return a.NextResponse.json({error:"Invalid action. Supported actions: mark-read, mark-unread"},{status:400});console.log(`[DEBUG] Processing action ${o} for email ${s}`);let n=await d.z.mailCredentials.findFirst({where:{userId:r.user.id}});if(!n)return a.NextResponse.json({error:"No mail credentials found"},{status:404});let{searchParams:i}=new URL(e.url),p=i.get("folder")||"INBOX",f=null;try{return f=new l._({host:n.host,port:n.port,secure:!0,auth:{user:n.email,pass:n.password||void 0},logger:!1}),await f.connect(),console.log(`[DEBUG] Connected to IMAP server for ${o}`),await f.mailboxOpen(p),console.log(`[DEBUG] Opened mailbox ${p} for ${o}`),"mark-read"===o?(await f.messageFlagsAdd(Number(s),["\\Seen"]),console.log(`[DEBUG] Marked email ${s} as read`)):(await f.messageFlagsRemove(Number(s),["\\Seen"]),console.log(`[DEBUG] Marked email ${s} as unread`)),a.NextResponse.json({success:!0,action:o})}catch(e){return console.error(`[DEBUG] Error ${o}:`,e),a.NextResponse.json({error:`Failed to ${o}`,message:e.message},{status:500})}finally{if(f)try{await f.mailboxClose(),await f.logout(),console.log(`[DEBUG] Closed IMAP connection after ${o}`)}catch(e){console.error("[DEBUG] Error closing IMAP connection:",e)}}}catch(e){return console.error("[DEBUG] Unhandled error in POST:",e),a.NextResponse.json({error:"Internal server error",message:e.message},{status:500})}}let h=new o.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/courrier/[id]/route",pathname:"/courrier/[id]",filename:"route",bundlePath:"app/courrier/[id]/route"},resolvedPagePath:"/Users/alma/Documents/NeahNew/app/courrier/[id]/route.ts",nextConfigOutput:"",userland:s}),{workAsyncStorage:_,workUnitAsyncStorage:k,serverHooks:E}=h;function x(){return(0,i.patchFetch)({workAsyncStorage:_,workUnitAsyncStorage:k})}}};var r=require("../../../webpack-runtime.js");r.C(e);var t=e=>r(r.s=e),s=r.X(0,[4243,5419,580,762,8376,2461,9908],()=>t(96571));module.exports=s})();