1 line
11 KiB
JavaScript
1 line
11 KiB
JavaScript
(()=>{var e={};e.id=4899,e.ids=[2620,4899],e.modules={3295:e=>{"use strict";e.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},5097:(e,r,t)=>{"use strict";t.r(r),t.d(r,{patchFetch:()=>d,routeModule:()=>a,serverHooks:()=>u,workAsyncStorage:()=>c,workUnitAsyncStorage:()=>l});var s=t(96559),o=t(48088),n=t(37719),i=t(22620);let a=new s.AppRouteRouteModule({definition:{kind:o.RouteKind.APP_ROUTE,page:"/api/storage/files/content/route",pathname:"/api/storage/files/content",filename:"route",bundlePath:"app/api/storage/files/content/route"},resolvedPagePath:"/Users/alma/Documents/NeahNew/app/api/storage/files/content/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:c,workUnitAsyncStorage:l,serverHooks:u}=a;function d(){return(0,n.patchFetch)({workAsyncStorage:c,workUnitAsyncStorage:l})}},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")},14182:(e,r,t)=>{"use strict";t.d(r,{$R:()=>i,Ui:()=>l,XB:()=>a,XR:()=>c,YE:()=>o,ZT:()=>d,b4:()=>u,oD:()=>n});var s=t(91043);let o={endpoint:"https://dome-api.slm-lab.net",region:"us-east-1",bucket:process.env.S3_BUCKET||"pages",accessKey:"4aBT4CMb7JIMMyUtp4Pl",secretKey:"HGn39XhCIlqOjmDVzRK9MED2Fci2rYvDDgbLFElg"},n=new s.S3Client({region:o.region,endpoint:o.endpoint,credentials:{accessKeyId:o.accessKey,secretAccessKey:o.secretKey},forcePathStyle:!0});async function i(e,r,t){let i=new s.PutObjectCommand({Bucket:o.bucket,Key:e,Body:"string"==typeof r?Buffer.from(r,"utf-8"):r,ContentType:t||"text/plain"});return await n.send(i),{key:e}}async function a(e){try{let r=new s.GetObjectCommand({Bucket:o.bucket,Key:e}),t=await n.send(r);if(!t.Body)return null;let i=[];for await(let e of t.Body)i.push(e);return Buffer.concat(i).toString("utf-8")}catch(e){return console.error("Error getting object content:",e),null}}async function c(e){let r=new s.DeleteObjectCommand({Bucket:o.bucket,Key:e});await n.send(r)}async function l(e,r){let t=`user-${e}/${r}/`,i=new s.ListObjectsV2Command({Bucket:o.bucket,Prefix:t,Delimiter:"/"});return((await n.send(i)).Contents||[]).filter(e=>e.Key&&!e.Key.endsWith("/")&&!e.Key.includes(".placeholder")).map(e=>({key:e.Key,name:e.Key.split("/").pop()||e.Key,size:e.Size,lastModified:e.LastModified}))}function u(e,r){if(!e)return"";if(e.startsWith("http"))return e;let t=e.startsWith("/")?e.substring(1):e,s=o.endpoint?.replace(/\/$/,""),n=r||o.bucket;return s?`${s}/${n}/${t}`:t}async function d(e){for(let r of["notes","diary","health","contacts"])try{let t=`user-${e}/${r}/`;await i(t,"","application/x-directory");let s=`user-${e}/${r}/.placeholder`;await i(s,"Folder placeholder","text/plain"),console.log(`Created folder: ${t}`)}catch(t){console.error(`Error creating folder ${r} for user ${e}:`,t)}}},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]}}))})},22620:(e,r,t)=>{"use strict";t.r(r),t.d(r,{GET:()=>c});var s=t(32190),o=t(19854),n=t(26690),i=t(14182);async function a(e){let r=await (0,o.getServerSession)(n.N);return r?.user?.id?{authorized:!0,userId:r.user.id}:(console.error("Unauthorized access attempt:",{url:e.url,method:e.method,headers:Object.fromEntries(e.headers)}),{authorized:!1,userId:null})}async function c(e){try{let r,{authorized:t,userId:o}=await a(e);if(!t||!o)return s.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:n}=new URL(e.url),c=n.get("path"),l=n.get("id");if(!c&&!l)return s.NextResponse.json({error:"Path or ID parameter is required"},{status:400});if(l){if(!(r=l).startsWith(`user-${o}/`))return console.error("Unauthorized file access attempt:",{userId:o,fileId:l}),s.NextResponse.json({error:"Unauthorized access to file"},{status:403})}else if(!c)return s.NextResponse.json({error:"Invalid parameters"},{status:400});else if(c.includes(`/files/cube-${o}/`)||c.includes(`user-${o}/`))r=c;else{if(!(c.startsWith("/files/")||c.includes("/Private/")))return console.error("Unauthorized file access attempt:",{userId:o,filePath:c}),s.NextResponse.json({error:"Unauthorized access to file"},{status:403});let e=c.split("/").filter(Boolean),t=e[e.length-1],n="notes";c.includes("/Notes/")?n="notes":c.includes("/Diary/")?n="diary":c.includes("/Contacts/")?n="contacts":c.includes("/Health/")&&(n="health"),r=`user-${o}/${n}/${t}`,console.log("Converted NextCloud path to S3 key:",{path:c,key:r})}console.log("Fetching file content from S3:",{key:r});let u=await (0,i.XB)(r);if(!u)return s.NextResponse.json({error:"File not found"},{status:404});return s.NextResponse.json({content:u})}catch(e){return console.error("Error fetching file content:",e),s.NextResponse.json({error:"Internal server error",details:e instanceof Error?e.message:String(e)},{status:500})}}},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}},28354:e=>{"use strict";e.exports=require("util")},29294:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-async-storage.external.js")},44870:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},55511:e=>{"use strict";e.exports=require("crypto")},55591:e=>{"use strict";e.exports=require("https")},63033:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},74075:e=>{"use strict";e.exports=require("zlib")},78335:()=>{},79428:e=>{"use strict";e.exports=require("buffer")},79551:e=>{"use strict";e.exports=require("url")},81630:e=>{"use strict";e.exports=require("http")},91043:e=>{"use strict";e.exports=require("@aws-sdk/client-s3")},94735:e=>{"use strict";e.exports=require("events")},96487:()=>{}};var r=require("../../../../../webpack-runtime.js");r.C(e);var t=e=>r(r.s=e),s=r.X(0,[4243,5419,580],()=>t(5097));module.exports=s})(); |