NeahNew/.next/server/chunks/6624.js
2025-05-06 23:01:34 +02:00

1 line
25 KiB
JavaScript

exports.id=6624,exports.ids=[6624],exports.modules={25037:(e,o,t)=>{"use strict";t.d(o,{_:()=>s});var r=t(70762);let s=r.z.object({NODE_ENV:r.z.enum(["development","test","production"]).default("development"),DATABASE_URL:r.z.string().url(),NEWSDB_URL:r.z.string().regex(/^postgresql:\/\//,"Must be a valid PostgreSQL URL"),NEWS_API_URL:r.z.string().url(),KEYCLOAK_CLIENT_ID:r.z.string(),KEYCLOAK_CLIENT_SECRET:r.z.string(),KEYCLOAK_REALM:r.z.string(),KEYCLOAK_ISSUER:r.z.string().url(),LEANTIME_TOKEN:r.z.string(),LEANTIME_API_URL:r.z.string().url(),ROCKET_CHAT_TOKEN:r.z.string(),ROCKET_CHAT_USER_ID:r.z.string()}).parse(process.env)},26690:(e,o,t)=>{"use strict";t.d(o,{N:()=>c});var r=t(1926),s=t(10591);function n(e){let o=process.env[e];if(!o)throw Error(`Missing required environment variable: ${e}`);return o}async function a(e){try{let o=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 o.json();if(!o.ok)throw t;return{...e,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,accessTokenExpires:Date.now()+1e3*t.expires_in}}catch(o){return console.error("Error refreshing access token:",o),{...e,error:"RefreshAccessTokenError"}}}let c={providers:[(0,r.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 o=e.realm_access?.roles||[];console.log("Profile callback raw roles:",o);let t=o.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:o,profile:t}){if(o&&t){let r=(t.realm_access?.roles||[]).map(e=>e.replace(/^ROLE_/,"").toLowerCase());e.accessToken=o.access_token??"",e.refreshToken=o.refresh_token??"",e.accessTokenExpires=o.expires_at??0,e.sub=t.sub,e.role=r,e.username=t.preferred_username??"",e.first_name=t.given_name??"",e.last_name=t.family_name??""}else if(e.accessToken)try{let o=(0,s.s)(e.accessToken);o.realm_access?.roles&&(e.role=o.realm_access.roles.map(e=>e.replace(/^ROLE_/,"").toLowerCase()))}catch(e){console.error("Error decoding token:",e)}return Date.now()<1e3*e.accessTokenExpires?e:a(e)},async session({session:e,token:o}){if(o.error)throw Error(o.error);let t=Array.isArray(o.role)?o.role:[];return e.user={id:o.sub??"",email:o.email??null,name:o.name??null,image:null,username:o.username??"",first_name:o.first_name??"",last_name:o.last_name??"",role:t,nextcloudInitialized:!1},e.accessToken=o.accessToken,e}},pages:{signIn:"/signin",error:"/signin"},debug:!1}},42873:(e,o,t)=>{"use strict";t.d(o,{GW:()=>u,J1:()=>h,oK:()=>f});var r=t(94612);let s=process.env.MICROSOFT_TENANT_ID||"common",n=`https://login.microsoftonline.com/${s}/oauth2/v2.0/authorize`,a=`https://login.microsoftonline.com/${s}/oauth2/v2.0/token`,c=process.env.MICROSOFT_CLIENT_ID,l=process.env.MICROSOFT_CLIENT_SECRET,i=process.env.MICROSOFT_REDIRECT_URI;console.log("Microsoft OAuth Configuration:",{tenantId:s,authorizeUrl:n,tokenUrl:a,clientIdFirstChars:c?c.substring(0,5)+"...":"undefined",redirectUri:i});let d="offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send";function u(e){let o=new URLSearchParams({client_id:c,response_type:"code",redirect_uri:i,scope:d,state:e,response_mode:"query"});return`${n}?${o.toString()}`}async function f(e){let o=new URLSearchParams({client_id:c,client_secret:l,code:e,redirect_uri:i,grant_type:"authorization_code"});try{console.log(`Exchanging code for tokens. URL: ${a}`);let e=await r.A.post(a,o.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}});return console.log("Token exchange successful!"),{access_token:e.data.access_token,refresh_token:e.data.refresh_token,expires_in:e.data.expires_in}}catch(e){if(console.error("Error exchanging code for tokens:",e),e.response){console.error("Response data:",e.response.data),console.error("Response status:",e.response.status),console.error("Response headers:",e.response.headers);let o=e.response.data;if(o&&o.error_description)throw Error(`Token exchange failed: ${o.error_description}`)}throw Error("Failed to exchange authorization code for tokens")}}async function h(e){let o=new URLSearchParams({client_id:c,client_secret:l,refresh_token:e,grant_type:"refresh_token",scope:d});try{console.log(`Refreshing access token. URL: ${a}`);let e=await r.A.post(a,o.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}});return console.log("Token refresh successful!"),{access_token:e.data.access_token,refresh_token:e.data.refresh_token,expires_in:e.data.expires_in}}catch(e){if(console.error("Error refreshing token:",e),e.response){console.error("Response data:",e.response.data),console.error("Response status:",e.response.status),console.error("Response headers:",e.response.headers);let o=e.response.data;if(o&&o.error_description)throw Error(`Token refresh failed: ${o.error_description}`)}throw Error("Failed to refresh access token")}}},78335:()=>{},79464:(e,o,t)=>{"use strict";t.d(o,{z:()=>n});var r=t(96330),s=t(25037);let n=globalThis.prisma||new r.PrismaClient({datasources:{db:{url:s._.DATABASE_URL}},log:["query"]})},87795:(e,o,t)=>{"use strict";t.d(o,{uu:()=>R,Yg:()=>b,cE:()=>T,IF:()=>$,nJ:()=>C,QM:()=>E,e9:()=>I,tE:()=>A,ZM:()=>O,vC:()=>x,Nw:()=>v});var r=t(67218);t(79130);var s=t(12461),n=t(49526),a=t(79464),c=t(29908),l=t(36781),i=t(42873);async function d(e,o){try{console.log(`Checking if token refresh is needed for ${o}`);let t=(0,l.nr)(),r=l.Rk.CREDENTIALS(e,o),s=await t.get(r);if(!s)return console.log(`No credentials found in Redis for ${o}`),{accessToken:"",success:!1};let n=JSON.parse(s);if(!n.useOAuth||!n.refreshToken)return console.log(`Account ${o} is not using OAuth or missing refresh token`),{accessToken:"",success:!1};if(n.tokenExpiry&&n.accessToken&&n.tokenExpiry>Date.now()+3e5)return console.log(`Token for ${o} is still valid, no refresh needed`),{accessToken:n.accessToken,success:!0};console.log(`Refreshing token for ${o}`);let a=await (0,i.J1)(n.refreshToken);return n.accessToken=a.access_token,a.refresh_token&&(n.refreshToken=a.refresh_token),n.tokenExpiry=Date.now()+1e3*a.expires_in,await t.set(r,JSON.stringify(n),"EX",86400),console.log(`Token for ${o} refreshed and cached in Redis`),{accessToken:a.access_token,success:!0}}catch(e){return console.error(`Error refreshing token for ${o}:`,e),{accessToken:"",success:!1}}}var u=t(17478);let f={},h=0,m=0,g=0,p=0,w=Date.now();async function $(e,o){let t=Date.now();if(h++,console.log(`Getting IMAP connection for user ${e}${o?` account ${o}`:""}`),!o||"default"===o){console.log(`No specific account provided or 'default' requested, trying to find first account for user ${e}`);let t=await (0,l.mX)(e);if(t&&t.defaultAccountId)o=t.defaultAccountId,console.log(`Using cached default account ID: ${o}`);else{let r=await a.z.mailCredentials.findMany({where:{userId:e},orderBy:{createdAt:"asc"},take:1});if(r&&r.length>0){let s=r[0];console.log(`Using first available account: ${s.id} (${s.email})`),o=s.id,t?await (0,l.Kb)(e,{...t,defaultAccountId:o,lastActive:Date.now()}):await (0,l.Kb)(e,{lastActive:Date.now(),defaultAccountId:o})}else throw p++,Error("No email accounts configured for this user")}}let r=`${e}:${o}`;if(f[r]){let s=f[r];if(s.isConnecting&&s.connectionPromise){console.log(`Connection in progress for ${r}, waiting for existing connection`);try{let e=await s.connectionPromise;return s.lastUsed=Date.now(),g++,console.log(`[IMAP] Reused pending connection for ${r} in ${Date.now()-t}ms`),e}catch(e){console.error(`Error waiting for connection for ${r}:`,e)}}try{if(s.client&&s.client.usable)return s.lastUsed=Date.now(),console.log(`Reusing existing IMAP connection for ${r}`),await _(e,o),g++,console.log(`[IMAP] Successfully reused connection for ${r} in ${Date.now()-t}ms`),s.client;console.log(`Existing connection for ${r} not usable, recreating`)}catch(e){console.warn(`Error checking existing connection for ${r}:`,e)}}console.log(`Creating new IMAP connection for ${r}`);let s=await (0,l.Po)(e,o);if(console.log(`Retrieved credentials from Redis cache for ${e}:${o}:`,s?{email:s.email,hasPassword:!!s.password,useOAuth:!!s.useOAuth,hasAccessToken:!!s.accessToken,hasRefreshToken:!!s.refreshToken}:"No credentials found in cache"),!s){console.log(`Credentials not found in cache for ${e}${o?` account ${o}`:""}, attempting database lookup`);let t=await a.z.mailCredentials.findFirst({where:{AND:[{userId:e},o?{id:o}:{}]}});if(!t)throw console.error(`No credentials found for user ${e}${o?` account ${o}`:""}`),p++,Error("Email account credentials not found");console.log(`Database lookup returned credentials for ${t.email}:`,{email:t.email,hasPassword:!!t.password,fields:Object.keys(t)}),s={email:t.email,password:t.password||"",host:t.host,port:t.port,secure:t.secure,smtp_host:t.smtp_host||void 0,smtp_port:t.smtp_port||void 0,smtp_secure:t.smtp_secure??!1,display_name:t.display_name||void 0,color:t.color||void 0}}let n=s;if("outlook.office365.com"===n.host&&(console.log(`Microsoft account detected (${n.email}), setting useOAuth=true`),n.useOAuth=!0,!n.password&&!n.accessToken))try{let t=await (0,l.Po)(e,o);t&&t.refreshToken?(console.log(`Found refresh token in Redis for ${n.email}, will use it`),n.refreshToken=t.refreshToken,n.accessToken=t.accessToken,n.tokenExpiry=t.tokenExpiry,await (0,l.pz)(e,o,n)):console.warn(`No refresh token found for ${n.email} in Redis cache`)}catch(e){console.error(`Error retrieving cached credentials for ${n.email}:`,e)}if(n.useOAuth){console.log("Account is configured to use OAuth"),n.accessToken||console.error(`OAuth is enabled but no access token for account ${n.email}`);try{console.log(`Ensuring fresh token for OAuth account ${n.email}`);let{accessToken:o,success:t}=await d(e,n.email);t&&o?(n.accessToken=o,console.log(`Successfully refreshed token for ${n.email}`)):console.error(`Failed to refresh token for ${n.email}`)}catch(e){console.error(`Error refreshing token for ${n.email}:`,e)}}f[r]={client:null,lastUsed:Date.now(),isConnecting:!0,connectionAttempts:(f[r]?.connectionAttempts||0)+1};let c=setTimeout(()=>{console.error(`[IMAP] Connection for ${r} timed out after 60 seconds`),f[r]?.isConnecting&&(delete f[r],p++)},6e4),i=k(n,r).then(s=>(f[r].client=s,f[r].isConnecting=!1,f[r].lastUsed=Date.now(),c&&(clearTimeout(c),c=null),_(e,o).catch(e=>{console.error(`Failed to update session data: ${e.message}`)}),m++,console.log(`[IMAP] Created new connection for ${r} in ${Date.now()-t}ms (attempt #${f[r].connectionAttempts})`),s)).catch(e=>{throw c&&(clearTimeout(c),c=null),console.error(`Failed to create IMAP connection for ${r}:`,e),delete f[r],p++,e});return f[r].connectionPromise=i,i}async function k(e,o){let t;if(console.log("Creating IMAP connection with credentials:",{email:e.email,host:e.host,port:e.port,hasPassword:!!e.password,useOAuth:!!e.useOAuth,hasAccessToken:!!e.accessToken,hasRefreshToken:!!e.refreshToken,hasTokenExpiry:!!e.tokenExpiry}),e.useOAuth&&e.accessToken)console.log(`Using XOAUTH2 authentication for ${o} (OAuth enabled)`),t={user:e.email,accessToken:e.accessToken},console.log(`XOAUTH2 auth configured for ${o}`);else if(e.password)console.log(`Using password authentication for ${o} (OAuth not enabled or no token)`),t={user:e.email,pass:e.password};else throw console.error(`No authentication method found for ${o}:`,{hasPassword:!!e.password,useOAuth:!!e.useOAuth,hasAccessToken:!!e.accessToken}),Error(`No authentication method available for ${o} - need either password or OAuth token`);console.log(`Creating ImapFlow client for ${o} with authentication type: ${e.useOAuth?"OAuth":"Password"}`);let r=new s._({host:e.host,port:e.port,secure:e.secure??!0,auth:t,logger:!1,emitLogs:!1,tls:{rejectUnauthorized:!1},disableAutoIdle:!1});try{console.log(`Connecting to IMAP server: ${e.host}:${e.port}`),await r.connect(),console.log(`Successfully connected to IMAP server for ${o}`)}catch(e){throw console.error(`Failed to connect to IMAP server for ${o}:`,e),e}return r.on("error",e=>{console.error(`IMAP connection error for ${o}:`,e),f[o]&&delete f[o]}),r}async function _(e,o){let t=await (0,l.mX)(e);t?await (0,l.Kb)(e,{...t,lastActive:Date.now(),...o&&{defaultAccountId:o}}):await (0,l.Kb)(e,{lastActive:Date.now(),...o&&{defaultAccountId:o}})}async function E(e,o){let t=await a.z.mailCredentials.findFirst({where:{AND:[{userId:e},o?{id:o}:{}]}});return t?{email:t.email,password:t.password,host:t.host,port:t.port,secure:t.secure,smtp_host:t.smtp_host||void 0,smtp_port:t.smtp_port||void 0,smtp_secure:t.smtp_secure??!1,display_name:t.display_name||void 0,color:t.color||void 0}:null}async function A(e,o,t){if(console.log("Saving credentials for user:",e,"account:",o),!t)throw Error("No credentials provided");let r={useOAuth:t.useOAuth,accessToken:t.accessToken,refreshToken:t.refreshToken,tokenExpiry:t.tokenExpiry},s={email:t.email,password:t.password??"",host:t.host,port:t.port,secure:t.secure??!0,smtp_host:t.smtp_host||null,smtp_port:t.smtp_port||null,smtp_secure:t.smtp_secure??!1,display_name:t.display_name||null,color:t.color||null};try{console.log("Saving credentials to database:",{...s,password:s.password?"***":null}),console.log("OAuth data will be saved to Redis cache only:",{hasOAuth:!!r.useOAuth,hasAccessToken:!!r.accessToken,hasRefreshToken:!!r.refreshToken}),await a.z.mailCredentials.upsert({where:{id:await a.z.mailCredentials.findFirst({where:{AND:[{userId:e},{email:o}]},select:{id:!0}}).then(e=>e?.id??"")},update:s,create:{userId:e,...s}});let t={...s,...r};await (0,l.pz)(e,o,t),console.log("Successfully saved credentials to database and cached full data with OAuth tokens")}catch(e){throw console.error("Error saving credentials:",e),e}}async function T(e,o,t=1,r=20,s,n=!1){console.log(`[getEmails] Processing request for folder: ${o}, normalized to ${o}, account: ${s||"default"}, checkOnly: ${n}`);try{let a=await $(e,s),c=s||"default";try{let s=await a.mailboxOpen(o);console.log(`Opened mailbox ${o} with ${s.exists} messages`);let i=await C(a,c),d=s.exists||0,u=Math.ceil(d/r);if(0===d){let s={emails:[],totalEmails:0,page:t,perPage:r,totalPages:0,folder:o,mailboxes:i,newestEmailId:0};return n||await (0,l.dF)(e,c,o,t,r,s),s}if(n){console.log("[getEmails] checkOnly mode: fetching only the most recent email ID");let e=d.toString();console.log(`[getEmails] Fetching latest message with sequence: ${e}`);let s=await a.fetch(e,{uid:!0}),n=0;for await(let e of s)n=e.uid;return console.log(`[getEmails] Latest email UID: ${n}`),{emails:[],totalEmails:d,page:t,perPage:r,totalPages:u,folder:o,mailboxes:i,newestEmailId:n}}let f=Math.max(1,d-t*r+1),h=Math.max(1,d-(t-1)*r);console.log(`Fetching messages ${f}:${h} from ${o} for account ${c}`);let m=await a.fetch(`${f}:${h}`,{envelope:!0,flags:!0,bodyStructure:!0,uid:!0}),g=[],p=0;for await(let e of m){e.uid>p&&(p=e.uid);let t={id:e.uid.toString(),from:e.envelope.from?.map(e=>({name:e.name||"",address:e.address||""}))||[],to:e.envelope.to?.map(e=>({name:e.name||"",address:e.address||""}))||[],subject:e.envelope.subject||"",date:e.envelope.date||new Date,flags:{seen:e.flags.has("\\Seen"),flagged:e.flags.has("\\Flagged"),answered:e.flags.has("\\Answered"),draft:e.flags.has("\\Draft"),deleted:e.flags.has("\\Deleted")},size:e.size||0,hasAttachments:e.bodyStructure?.childNodes?.some(e=>"attachment"===e.disposition)||!1,folder:o,contentFetched:!1,accountId:c,content:{text:"",html:"",isHtml:!1,direction:"ltr"}};g.push(t)}let w={emails:g,totalEmails:d,page:t,perPage:r,totalPages:Math.ceil(d/r),folder:o,mailboxes:i,newestEmailId:p};return n||await (0,l.dF)(e,c,o,t,r,w),w}catch(e){throw console.error("Error fetching emails:",e),e}}catch(e){throw console.error("Error fetching emails:",e),e}}function y(e){return e&&Array.isArray(e)?e.map(e=>({name:e.name||e.address||"",address:e.address||""})):[]}async function b(e,o,t="INBOX",r){if(!e||!o||!t)throw Error("Missing required parameters");if(!/^\d+$/.test(o))throw Error("Invalid email ID format: must be a numeric UID");let s=parseInt(o,10);if(isNaN(s))throw Error("Email ID must be a number");let n=(t.includes(":")?t.split(":")[0]:r)||r||"default",a=t.includes(":")?t.split(":")[1]:t;console.log(`[getEmailContent] Fetching email ${o} from folder ${a}, account ${n}`);let i=await (0,l.Ij)(e,n,o);if(i)return console.log(`Using cached email content for ${e}:${n}:${o}`),i;console.log(`Cache miss for email content ${e}:${n}:${o}, fetching from IMAP`);let d=await $(e,n);try{let t,r;await d.mailboxOpen(a),console.log(`[DEBUG] Fetching email ${o} from folder ${a} for account ${n}`);let i=await d.mailboxOpen(a);if(!i||"boolean"==typeof i)throw Error(`Failed to open mailbox: ${a} for account ${n}`);console.log(`[DEBUG] Mailbox ${a} opened for account ${n}, total messages: ${i.exists}`);let u=i.uidValidity,f=i.uidNext;if(console.log(`[DEBUG] Mailbox UIDVALIDITY: ${u}, UIDNEXT: ${f} for account ${n}`),s>=f)throw Error(`Email ID ${s} is greater than or equal to the highest UID in mailbox (${f}) for account ${n}`);let h=await d.search({uid:s.toString()});if(!h||0===h.length)throw Error(`Email with UID ${s} not found in folder ${a} for account ${n}`);let m=h[0];console.log(`[DEBUG] Found sequence number ${m} for UID ${s} in account ${n}`);try{t=await d.fetchOne(m.toString(),{source:!0,envelope:!0,flags:!0,size:!0})}catch(e){throw console.error(`Error fetching message with sequence ${m}:`,e),Error(`Failed to fetch email: ${e instanceof Error?e.message:"Unknown error"}`)}if(!t)throw Error(`Email not found with sequence number ${m} in folder ${a} for account ${n}`);if(!t.source||!t.envelope)throw Error("Invalid email data received: missing source or envelope data");let{source:g,envelope:p,flags:w,size:$}=t;if(!p)throw Error("Email envelope data is missing");try{r=await (0,c.simpleParser)(g.toString(),{skipHtmlToText:!0,keepCidLinks:!0})}catch(e){throw console.error(`Error parsing email content for ${o}:`,e),Error(`Failed to parse email content: ${e instanceof Error?e.message:"Unknown error"}`)}let k=Array.from(w),_=r.html||"",E={id:o,messageId:p.messageId,subject:p.subject||"(No Subject)",from:y(p.from),to:y(p.to),cc:y(p.cc),bcc:y(p.bcc),date:p.date||new Date,flags:{seen:k.includes("\\Seen"),flagged:k.includes("\\Flagged"),answered:k.includes("\\Answered"),deleted:k.includes("\\Deleted"),draft:k.includes("\\Draft")},hasAttachments:r.attachments?.length>0,attachments:r.attachments?.map(e=>({filename:e.filename||"attachment",contentType:e.contentType,size:e.size||0})),content:{text:r.text||"",html:_||"",isHtml:!!_,direction:"ltr"},folder:a,contentFetched:!0,size:$||0,accountId:n};return await (0,l.wp)(e,n,o,E),E}catch(t){throw console.error("[ERROR] Email fetch failed:",{userId:e,emailId:o,folder:a,accountId:n,error:t instanceof Error?t.message:"Unknown error",details:t instanceof Error?t.stack:void 0}),t}finally{try{await d.mailboxClose()}catch(e){console.error("Error closing mailbox:",e)}}}async function I(e,o,t,r="INBOX",s){let n=(r.includes(":")?r.split(":")[0]:s)||s||"default",a=r.includes(":")?r.split(":")[1]:r;console.log(`[markEmailReadStatus] Marking email ${o} as ${t?"read":"unread"} in folder ${a}, account ${n}`);let c=await $(e,n);try{return await c.mailboxOpen(a),t?await c.messageFlagsAdd(o,["\\Seen"]):await c.messageFlagsRemove(o,["\\Seen"]),await (0,l.nV)(e,n,o),await (0,l.gU)(e,n,a),!0}catch(e){return console.error(`Error marking email ${o} as ${t?"read":"unread"} in folder ${a}, account ${n}:`,e),!1}finally{try{await c.mailboxClose()}catch(e){console.error("Error closing mailbox:",e)}}}async function v(e,o,t,r="INBOX",s){let n=(r.includes(":")?r.split(":")[0]:s)||s||"default",a=r.includes(":")?r.split(":")[1]:r;console.log(`[toggleEmailFlag] Marking email ${o} as ${t?"flagged":"unflagged"} in folder ${a}, account ${n}`);let c=await $(e,n);try{return await c.mailboxOpen(a),t?await c.messageFlagsAdd(o,["\\Flagged"]):await c.messageFlagsRemove(o,["\\Flagged"]),await (0,l.nV)(e,n,o),!0}catch(e){return console.error(`Error toggling flag for email ${o} in folder ${a}, account ${n}:`,e),!1}finally{try{await c.mailboxClose()}catch(e){console.error("Error closing mailbox:",e)}}}async function O(e,o){let t=await E(e);if(!t)return{success:!1,error:"No email credentials found"};let r=t.useOAuth&&t.accessToken?{type:"OAuth2",user:t.email,accessToken:t.accessToken}:{user:t.email,pass:t.password},s=n.createTransport({host:t.smtp_host||"smtp.infomaniak.com",port:t.smtp_port||587,secure:t.smtp_secure||!1,auth:r,tls:{rejectUnauthorized:!1}});try{let e=await s.sendMail({from:t.email,to:o.to,cc:o.cc,bcc:o.bcc,subject:o.subject,text:o.body,html:o.body,attachments:o.attachments?.map(e=>({filename:e.name,content:e.content,contentType:e.type}))});return{success:!0,messageId:e.messageId}}catch(e){return console.error("Failed to send email:",e),{success:!1,error:e instanceof Error?e.message:"Unknown error"}}}async function C(e,o){try{let t=await e.list();if(o)return t.map(e=>`${o}:${e.path}`);return t.map(e=>e.path)}catch(e){return console.error("Error fetching mailboxes:",e),[]}}async function x(e){console.log("Testing connection with:",{...e,password:e.password?"***":void 0,accessToken:e.accessToken?"***":void 0,refreshToken:e.refreshToken?"***":void 0});try{let o;console.log(`Testing IMAP connection to ${e.host}:${e.port} for ${e.email}`),e.useOAuth&&e.accessToken?(console.log("Using XOAUTH2 authentication mechanism"),o={user:e.email,accessToken:e.accessToken},console.log(`Access token available (length: ${e.accessToken.length})`)):(console.log("Using password authentication mechanism"),o={user:e.email,pass:e.password});let t=new s._({host:e.host,port:e.port,secure:e.secure??!0,auth:o,logger:!1,tls:{rejectUnauthorized:!1}});console.log("Attempting to connect to IMAP server..."),await t.connect(),console.log("IMAP connection successful! Getting mailboxes...");let r=await C(t);await t.logout(),console.log(`IMAP connection successful for ${e.email}`),console.log(`Found ${r.length} folders:`,r);let a=!1;if(e.smtp_host&&e.smtp_port)try{console.log(`Testing SMTP connection to ${e.smtp_host}:${e.smtp_port}`);let o=e.useOAuth&&e.accessToken?{type:"OAuth2",user:e.email,accessToken:e.accessToken}:{user:e.email,pass:e.password},t=n.createTransport({host:e.smtp_host,port:e.smtp_port,secure:e.smtp_secure??!1,auth:o,tls:{rejectUnauthorized:!1}});await t.verify(),console.log(`SMTP connection successful for ${e.email}`),a=!0}catch(o){return console.error(`SMTP connection failed for ${e.email}:`,o),{imap:!0,smtp:!1,error:`SMTP connection failed: ${o instanceof Error?o.message:"Unknown error"}`,folders:r}}return{imap:!0,smtp:a,folders:r}}catch(o){return console.error(`IMAP connection failed for ${e.email}:`,o),{imap:!1,error:`IMAP connection failed: ${o instanceof Error?o.message:"Unknown error"}`}}}async function R(e){try{let o=await a.z.mailCredentials.findMany({where:{userId:e}});if(!o||0===o.length)return console.log(`No email accounts found for user ${e}`),!1;for(let t of o){let o={host:t.host,port:t.port,email:t.email,password:t.password||void 0,secure:t.secure,smtp_host:t.smtp_host||void 0,smtp_port:t.smtp_port||void 0,smtp_secure:t.smtp_secure||void 0,display_name:t.display_name||void 0,color:t.color||void 0};await (0,l.pz)(e,t.id,o),console.log(`Recached credentials for user ${e}, account ${t.id}`),await (0,l.gU)(e,t.id,"*"),await (0,l.nV)(e,t.id,"*")}return!0}catch(o){return console.error(`Error recaching credentials for user ${e}:`,o),!1}}setInterval(()=>{let e=Date.now(),o=Object.keys(f);e-w>36e5&&(console.log(`[IMAP METRICS] Total requests: ${h}, New connections: ${m}, Reused: ${g}, Errors: ${p}, Success rate: ${((g+m)/h*100).toFixed(2)}%`),h=0,m=0,g=0,p=0,w=e);let t={};o.forEach(e=>{let o=e.split(":")[0];t[o]||(t[o]=[]),t[o].push(e)}),Object.entries(t).forEach(([o,t])=>{let r=t.map(e=>({key:e,lastUsed:f[e].lastUsed})).sort((e,o)=>e.lastUsed-o.lastUsed),s=new Set(r.slice(-2).map(e=>e.key));r.forEach(({key:o,lastUsed:t})=>{if(!s.has(o)&&!f[o].isConnecting&&e-t>18e5){console.log(`Closing idle IMAP connection for ${o} (idle for ${Math.round((e-t)/1e3)}s)`);try{f[o].client.usable&&f[o].client.logout().catch(e=>{console.error(`Error closing idle connection for ${o}:`,e)})}catch(e){console.error(`Error checking connection status for ${o}:`,e)}finally{delete f[o],console.log(`Removed idle connection for ${o} from pool (pool size: ${Object.keys(f).length})`)}}})});let r=o.filter(e=>{let o=f[e];return!o.isConnecting&&(o.client?.usable||!1)}).length,s=o.filter(e=>f[e].isConnecting).length;console.log(`[IMAP POOL] Size: ${o.length}, Active: ${r}, Connecting: ${s}, Max: 20`)},6e4),(0,u.D)([$,E,A,T,b,I,v,O,C,x,R]),(0,r.A)($,"600528b29b4effb3dfffbb4ac0b40a5892135cff9b",null),(0,r.A)(E,"60624dc244af7f822e7cf2f2a416fca71f0f6a3023",null),(0,r.A)(A,"707a67d0a7ca9279d96141225e723a5fe214c4a735",null),(0,r.A)(T,"7e76edd695ba1c6b60a50d9f517953f2e592e97352",null),(0,r.A)(b,"78d83111d1c012759dad167432affb7d8d8d98cd33",null),(0,r.A)(I,"7c9b414f13445c0a6cf7f5af0864c0a3acf38a6878",null),(0,r.A)(v,"7c7f5d5e66956af89b74ffbd59650b767db2316b77",null),(0,r.A)(O,"60023f066940400bb4b31628f742482a64e8f8fb8d",null),(0,r.A)(C,"60e95a1735db6ded320579f695ad4d93a03daaef8b",null),(0,r.A)(x,"40ffe2e562761be02ad5d7c3f8cee4316dd6e0d5f6",null),(0,r.A)(R,"406f28c76c2dd4d32ced5b13b189617b649b9bfed6",null)},96487:()=>{}};