@oaknational/google-classroom-addon 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
- "use strict";var t=require("@googleapis/classroom"),e=require("crypto"),r=require("google-auth-library");function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var i=n(e),o=function(){return o=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var i in e=arguments[r])Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},o.apply(this,arguments)};function s(t,e,r,n){return new(r||(r=Promise))(function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(s,a)}c((n=n.apply(t,e||[])).next())})}function a(t,e){var r,n,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(o=0)),o;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,n=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){o.label=a[1];break}if(6===a[0]&&o.label<i[1]){o.label=i[1],i=a;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(a);break}i[2]&&o.ops.pop(),o.trys.pop();continue}a=e.call(t,o)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}"function"==typeof SuppressedError&&SuppressedError;var c,u={};
1
+ "use strict";var t=require("@googleapis/classroom"),e=require("zod"),r=require("crypto"),n=require("google-auth-library");function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var o=i(e),s=i(r),a=function(){return a=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var i in e=arguments[r])Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},a.apply(this,arguments)};function c(t,e,r,n){return new(r||(r=Promise))(function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(s,a)}c((n=n.apply(t,e||[])).next())})}function u(t,e){var r,n,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(o=0)),o;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,n=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){o.label=a[1];break}if(6===a[0]&&o.label<i[1]){o.label=i[1],i=a;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(a);break}i[2]&&o.ops.pop(),o.trys.pop();continue}a=e.call(t,o)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}"function"==typeof SuppressedError&&SuppressedError;var l,d={};
2
2
  /*!
3
3
  * cookie
4
4
  * Copyright(c) 2012-2014 Roman Shtylman
5
5
  * Copyright(c) 2015 Douglas Christopher Wilson
6
6
  * MIT Licensed
7
- */!function(){if(c)return u;c=1,u.parse=function(t,r){if("string"!=typeof t)throw new TypeError("argument str must be a string");var n={},i=t.length;if(i<2)return n;var o=r&&r.decode||l,c=0,u=0,d=0;do{if(-1===(u=t.indexOf("=",c)))break;if(-1===(d=t.indexOf(";",c)))d=i;else if(u>d){c=t.lastIndexOf(";",u-1)+1;continue}var f=s(t,c,u),p=a(t,u,f),w=t.slice(f,p);if(!e.call(n,w)){var g=s(t,u+1,d),y=a(t,d,g);34===t.charCodeAt(g)&&34===t.charCodeAt(y-1)&&(g++,y--);var m=t.slice(g,y);n[w]=h(m,o)}c=d+1}while(c<i);return n},u.serialize=function(e,s,a){var c=a&&a.encode||encodeURIComponent;if("function"!=typeof c)throw new TypeError("option encode is invalid");if(!r.test(e))throw new TypeError("argument name is invalid");var u=c(s);if(!n.test(u))throw new TypeError("argument val is invalid");var l=e+"="+u;if(!a)return l;if(null!=a.maxAge){var h=Math.floor(a.maxAge);if(!isFinite(h))throw new TypeError("option maxAge is invalid");l+="; Max-Age="+h}if(a.domain){if(!i.test(a.domain))throw new TypeError("option domain is invalid");l+="; Domain="+a.domain}if(a.path){if(!o.test(a.path))throw new TypeError("option path is invalid");l+="; Path="+a.path}if(a.expires){var d=a.expires;if(!function(e){return"[object Date]"===t.call(e)}(d)||isNaN(d.valueOf()))throw new TypeError("option expires is invalid");l+="; Expires="+d.toUTCString()}a.httpOnly&&(l+="; HttpOnly");a.secure&&(l+="; Secure");a.partitioned&&(l+="; Partitioned");if(a.priority){switch("string"==typeof a.priority?a.priority.toLowerCase():a.priority){case"low":l+="; Priority=Low";break;case"medium":l+="; Priority=Medium";break;case"high":l+="; Priority=High";break;default:throw new TypeError("option priority is invalid")}}if(a.sameSite){switch("string"==typeof a.sameSite?a.sameSite.toLowerCase():a.sameSite){case!0:l+="; SameSite=Strict";break;case"lax":l+="; SameSite=Lax";break;case"strict":l+="; SameSite=Strict";break;case"none":l+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}}return l};var t=Object.prototype.toString,e=Object.prototype.hasOwnProperty,r=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,n=/^("?)[\u0021\u0023-\u002B\u002D-\u003A\u003C-\u005B\u005D-\u007E]*\1$/,i=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,o=/^[\u0020-\u003A\u003D-\u007E]*$/;function s(t,e,r){do{var n=t.charCodeAt(e);if(32!==n&&9!==n)return e}while(++e<r);return r}function a(t,e,r){for(;e>r;){var n=t.charCodeAt(--e);if(32!==n&&9!==n)return e+1}return r}function l(t){return-1!==t.indexOf("%")?decodeURIComponent(t):t}function h(t,e){try{return e(t)}catch(e){return t}}}();var l={},h=Array.from({length:64});for(let t=0,e="A".charCodeAt(0),r="Z".charCodeAt(0);t+e<=r;t++){const r=String.fromCharCode(t+e);l[r]=t,h[t]=r}for(let t=0,e="a".charCodeAt(0),r="z".charCodeAt(0);t+e<=r;t++){const r=String.fromCharCode(t+e),n=t+26;l[r]=n,h[n]=r}for(let t=0;t<10;t++){l[t.toString(10)]=t+52;const e=t.toString(10),r=t+52;l[e]=r,h[r]=e}l["-"]=62,h[62]="-",l._=63,h[63]="_";var d=t=>(new TextEncoder).encode(t),f=t=>{const e=t+"=".repeat((4-t.length%4)%4);let r=e.length/4*3;e.endsWith("==")?r-=2:e.endsWith("=")&&r--;const n=new ArrayBuffer(r),i=new DataView(n);for(let t=0;t<e.length;t+=4){let r=0,n=0;for(let i=t,o=t+3;i<=o;i++)if("="===e[i])r>>=6;else{if(!(e[i]in l))throw new TypeError(`Invalid character ${e[i]} in base64 string.`);r|=l[e[i]]<<6*(o-i),n+=6}const o=t/4*3;r>>=n%8;const s=Math.floor(n/8);for(let t=0;t<s;t++){const e=8*(s-t-1);i.setUint8(o+t,(r&255<<e)>>e)}}return new Uint8Array(n)},p=t=>{const e="string"==typeof t?d(t):t;let r="";for(let t=0;t<e.length;t+=3){let n=0,i=0;for(let r=t,o=Math.min(t+3,e.length);r<o;r++)n|=e[r]<<8*(o-r-1),i+=8;const o=Math.ceil(i/6);n<<=6*o-i;for(let t=1;t<=o;t++){const e=6*(o-t);r+=h[(n&63<<e)>>e]}}return r},w={encryption:{saltBits:256,algorithm:"aes-256-cbc",iterations:1,minPasswordlength:32},integrity:{saltBits:256,algorithm:"sha256",iterations:1,minPasswordlength:32},ttl:0,timestampSkewSec:60,localtimeOffsetMsec:0},g=t=>({...t,encryption:{...t.encryption},integrity:{...t.integrity}}),y={"aes-128-ctr":{keyBits:128,ivBits:128,name:"AES-CTR"},"aes-256-cbc":{keyBits:256,ivBits:128,name:"AES-CBC"},sha256:{keyBits:256,name:"SHA-256"}},m="Fe26.2",v=(t,e)=>{if(e<1)throw new Error("Invalid random bits count");return((t,e)=>{const r=new Uint8Array(e);return t.getRandomValues(r),r})(t,Math.ceil(e/8))},S=async(t,e,r)=>{var n;if(!(null==e?void 0:e.length))throw new Error("Empty password");if(null==r||"object"!=typeof r)throw new Error("Bad options");if(!(r.algorithm in y))throw new Error(`Unknown algorithm: ${r.algorithm}`);const i=y[r.algorithm],o={},s=null!=(n=r.hmac)&&n,a=s?{name:"HMAC",hash:i.name}:{name:i.name},c=s?["sign","verify"]:["encrypt","decrypt"];if("string"==typeof e){if(e.length<r.minPasswordlength)throw new Error(`Password string too short (min ${r.minPasswordlength} characters required)`);let{salt:n=""}=r;if(!n){const{saltBits:e=0}=r;if(!e)throw new Error("Missing salt and saltBits options");const i=v(t,e);n=[...new Uint8Array(i)].map(t=>t.toString(16).padStart(2,"0")).join("")}const s=await(async(t,e,r,n,i,o)=>{const s=d(e),a=await t.subtle.importKey("raw",s,{name:"PBKDF2"},!1,["deriveBits"]),c={name:"PBKDF2",hash:o,salt:d(r),iterations:n};return await t.subtle.deriveBits(c,a,8*i)})(t,e,n,r.iterations,i.keyBits/8,"SHA-1"),u=await t.subtle.importKey("raw",s,a,!1,c);o.key=u,o.salt=n}else{if(e.length<i.keyBits/8)throw new Error("Key buffer (password) too small");o.key=await t.subtle.importKey("raw",e,a,!1,c),o.salt=""}return r.iv?o.iv=r.iv:"ivBits"in i&&(o.iv=v(t,i.ivBits)),o},C=(t,e,r)=>["aes-128-ctr"===t?{name:"AES-CTR",counter:e.iv,length:128}:{name:"AES-CBC",iv:e.iv},e.key,"string"==typeof r?d(r):r],E=async(t,e,r,n)=>{const i=await S(t,e,r),o=await t.subtle.decrypt(...C(r.algorithm,i,n));return s=new Uint8Array(o),(new TextDecoder).decode(s);var s},A=async(t,e,r,n)=>{const i=await S(t,e,{...r,hmac:!0}),o=d(n),s=await t.subtle.sign({name:"HMAC"},i.key,o);return{digest:p(new Uint8Array(s)),salt:i.salt}},b=t=>"string"==typeof t||t instanceof Uint8Array?{encryption:t,integrity:t}:"secret"in t?{id:t.id,encryption:t.secret,integrity:t.secret}:{id:t.id,encryption:t.encryption,integrity:t.integrity},k=async(t,e,r,n)=>{if(!r)throw new Error("Empty password");const i=g(n),o=Date.now()+(i.localtimeOffsetMsec||0),s=JSON.stringify(e),a=b(r),{id:c="",encryption:u,integrity:l}=a;if(c&&!/^\w+$/.test(c))throw new Error("Invalid password id");const{encrypted:h,key:d}=await(async(t,e,r,n)=>{const i=await S(t,e,r),o=await t.subtle.encrypt(...C(r.algorithm,i,n));return{encrypted:new Uint8Array(o),key:i}})(t,u,i.encryption,s),f=p(new Uint8Array(h)),w=p(d.iv),y=i.ttl?o+i.ttl:"",v=`${m}*${c}*${d.salt}*${w}*${f}*${y}`,E=await A(t,l,i.integrity,v);return`${v}*${E.salt}*${E.digest}`};const T=globalThis.crypto,O=T.subtle,I=()=>T.randomUUID(),_=t=>T.getRandomValues(t),U={randomUUID:I,getRandomValues:_,subtle:O};var R=Object.freeze({__proto__:null,default:U,getRandomValues:_,randomUUID:I,subtle:O});function x(t){return"string"==typeof t?{1:t}:t}var N,P=function(t){return async function(e,{password:r,ttl:n=1209600}){const i=x(r),o=Math.max(...Object.keys(i).map(Number)),s={id:o.toString(),secret:i[o]};return`${await k(t,e,s,{...w,ttl:1e3*n})}~2`}}(R),B=function(t){return async function(e,{password:r,ttl:n=1209600}){const i=x(r),{sealWithoutVersion:o,tokenVersion:s}=function(t){const[e,r]=t.split("~");return{sealWithoutVersion:e,tokenVersion:null==r?null:parseInt(r,10)}}(e);try{const e=await(async(t,e,r,n)=>{if(!r)throw new Error("Empty password");const i=g(n),o=Date.now()+(i.localtimeOffsetMsec||0),s=e.split("*");if(8!==s.length)throw new Error("Incorrect number of sealed components");const a=s[0];let c=s[1];const u=s[2],l=s[3],h=s[4],d=s[5],p=s[6],w=s[7],y=`${a}*${c}*${u}*${l}*${h}*${d}`;if(m!==a)throw new Error("Wrong mac prefix");if(d){if(!/^\d+$/.test(d))throw new Error("Invalid expiration");if(Number.parseInt(d,10)<=o-1e3*i.timestampSkewSec)throw new Error("Expired seal")}let v="";if(c=c||"default","string"==typeof r||r instanceof Uint8Array)v=r;else{if(!(c in r))throw new Error(`Cannot find password: ${c}`);v=r[c]}v=b(v);const S=i.integrity;if(S.salt=p,!((t,e)=>{let r=t.length===e.length?0:1;r&&(e=t);for(let n=0;n<t.length;n+=1)r|=t.charCodeAt(n)^e.charCodeAt(n);return 0===r})((await A(t,v.integrity,S,y)).digest,w))throw new Error("Bad hmac value");const C=f(h),k=i.encryption;k.salt=u,k.iv=f(l);const T=await E(t,v.encryption,k,C);return T?JSON.parse(T):null})(t,o,i,{...w,ttl:1e3*n})??{};return 2===s?e:{...e.persistent}}catch(t){if(t instanceof Error&&/^(Expired seal|Bad hmac value|Cannot find password|Incorrect number of sealed components)/.test(t.message))return{};throw t}}}(R),H=function(){function e(t,e){this.baseUrl=t,this.oAuthClient=e,this.baseUrl=t,this.oAuthClient=e}return e.prototype.getClassroomClient=function(){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return[4,this.oAuthClient.getOAuth2Client()];case 1:return e=r.sent(),[2,new t.classroom_v1.Classroom({auth:e})]}})})},e.prototype.createAnnouncementAttachment=function(t){return s(this,void 0,void 0,function(){var e,r,n,i,s,c,u,l,h,d,f,p;return a(this,function(a){switch(a.label){case 0:return e=t.courseId,r=t.itemId,n=t.addOnToken,i=t.title,s=t.lessonSlug,c=t.programeSlug,u=t.unitSlug,l=t.maxPoints,[4,this.getClassroomClient()];case 1:return h=a.sent(),d=l?{maxPoints:l,studentWorkReviewUri:{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(c,"/units/").concat(u,"/lessons/").concat(s)}}:{},[4,h.courses.courseWork.addOnAttachments.create({courseId:e,itemId:r,addOnToken:n,requestBody:o({title:i,teacherViewUri:{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(c,"/units/").concat(u,"/lessons/").concat(s)},studentViewUri:{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(c,"/units/").concat(u,"/lessons/").concat(s)}},d)})];case 2:return f=a.sent(),p=f.data.maxPoints?{maxPoints:f.data.maxPoints,studentWorkReviewUri:f.data.studentWorkReviewUri}:{},[2,o({courseId:f.data.courseId,postId:f.data.postId,id:f.data.id,title:f.data.title,teacherViewUri:f.data.teacherViewUri,studentViewUri:f.data.studentViewUri,itemId:f.data.itemId},p)]}})})},e.prototype.submitPupilResponse=function(t){return s(this,void 0,void 0,function(){return a(this,function(e){switch(e.label){case 0:return[4,this.getClassroomClient()];case 1:return[4,e.sent().courses.courseWork.addOnAttachments.studentSubmissions.patch({courseId:t.courseId,itemId:t.itemId,attachmentId:t.attachmentId,submissionId:t.submissionId,updateMask:"pointsEarned",requestBody:{pointsEarned:t.pointsEarned}})];case 2:return[2,e.sent().data]}})})},e.prototype.fetchPupilResponse=function(t){return s(this,void 0,void 0,function(){return a(this,function(e){switch(e.label){case 0:return[4,this.getClassroomClient()];case 1:return[4,e.sent().courses.courseWork.addOnAttachments.studentSubmissions.get({courseId:t.courseId,itemId:t.itemId,attachmentId:t.attachmentId,submissionId:t.submissionId})];case 2:return[2,e.sent().data]}})})},e}(),D=function(){function t(t){this.encryptionSecret=t,this.ENCRYPTION_SECRET=t}return t.prototype.encryptString=function(e){var r=i.default.randomBytes(t.SALT_BYTES).toString("hex"),n=i.default.randomBytes(t.IV_LENGTH),o=i.default.scryptSync(this.ENCRYPTION_SECRET,r,t.ENCRYPTION_KEY_LENGTH),s=i.default.createCipheriv(t.ALGORITHM,o,n),a=s.update(e,"utf8","hex");return a+=s.final("hex"),"".concat(n.toString("hex"),":").concat(a,":").concat(r)},t.prototype.decryptString=function(e){var r=function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,i,o=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=o.next()).done;)s.push(n.value)}catch(t){i={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(i)throw i.error}}return s}(e.split(":"),3),n=r[0],o=r[1],s=r[2];if(!n||!o||!s)throw new Error("Invalid encrypted string");var a=Buffer.from(n,"hex"),c=i.default.scryptSync(this.ENCRYPTION_SECRET,s,t.ENCRYPTION_KEY_LENGTH),u=i.default.createDecipheriv(t.ALGORITHM,c,a),l=u.update(o,"hex","utf8");return l+=u.final("utf8")},t.ALGORITHM="aes-256-cbc",t.IV_LENGTH=16,t.SALT_BYTES=16,t.ENCRYPTION_KEY_LENGTH=32,t}();!function(t){t.CONNECTED_USERS_CREDENTIALS="connectedUsersCredentials",t.CLASSROOM_ATTACHMENTS="classroomAttachments"}(N||(N={}));var L=function(){function t(t){this.firestore=t,this._firestore=t}return t.prototype.getConnectedUserCredentials=function(t){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this._firestore.collection(N.CONNECTED_USERS_CREDENTIALS).doc(t).get()];case 1:return[2,r.sent()];case 2:throw e=r.sent(),console.error(e),new Error("Failed to save users credentials");case 3:return[2]}})})},t.prototype.upsertConnectedUserCredentials=function(t){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),this._firestore.settings({ignoreUndefinedProperties:!0}),[4,this._firestore.collection(N.CONNECTED_USERS_CREDENTIALS).doc(t.loginHint).set(t)];case 1:return r.sent(),[3,3];case 2:throw e=r.sent(),console.error(e),new Error("Failed to upsert users credentials");case 3:return[2]}})})},t.prototype.upsertClassroomAttachment=function(t){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this._firestore.collection(N.CLASSROOM_ATTACHMENTS).doc(t.attachmentId).set(t)];case 1:return r.sent(),[3,3];case 2:throw e=r.sent(),console.error(e),new Error("Failed to upsert classroom attachment");case 3:return[2]}})})},t.prototype.getClassroomAttachmentById=function(t){return s(this,void 0,void 0,function(){var e,r;return a(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this._firestore.collection(N.CLASSROOM_ATTACHMENTS).doc(t).get()];case 1:return(e=n.sent()).exists?[2,e.data()]:[2,null];case 2:throw r=n.sent(),console.error(r),new Error("Failed to get classroom attachment by ID");case 3:return[2]}})})},t}(),M=function(){function t(t,e,n,i,o){var c=this;if(this.googleClientId=t,this.googleClientSecret=e,this.callbackUrl=n,this.accessToken=i,this.refreshToken=o,!t)throw new Error("Google Client ID is missing");if(!e)throw new Error("Google Client Secret is missing");if(!n)throw new Error("Google OAuth Callback URL is missing");var u=new r.OAuth2Client({clientId:t,clientSecret:e,redirectUri:n,forceRefreshOnFailure:!1});"true"===process.env.GOOGLE_CLASSROOM_DEV_MODE&&i&&(u.refreshHandler=function(){return s(c,void 0,void 0,function(){return a(this,function(t){return[2,{access_token:i,expiry_date:(new Date).getTime()+36e5}]})})}),(i||o)&&u.setCredentials({access_token:i,refresh_token:o}),this.client=u,this.clientId=t}return t.prototype.getAuthenticateUrl=function(t,e){void 0===e&&(e=!1);try{return this.client.generateAuthUrl({access_type:"offline",include_granted_scopes:!0,scope:["https://www.googleapis.com/auth/userinfo.profile","https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/classroom.courses.readonly","https://www.googleapis.com/auth/classroom.addons.student","https://www.googleapis.com/auth/classroom.addons.teacher"],loginHint:t,subscribeToNewsletter:e})}catch(t){return console.error(t),null}},t.prototype.exchangeCodeForTokens=function(t){return s(this,void 0,void 0,function(){var e,r,n,i;return a(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,this.client.getToken(t)];case 1:return e=o.sent().tokens,[4,this.client.verifyIdToken({idToken:e.id_token,audience:this.clientId})];case 2:if(r=o.sent(),n=r.getPayload(),!e.access_token)throw new Error("Access token is missing");if(!(null==n?void 0:n.sub))throw new Error("User sub is missing");return[2,{accessToken:e.access_token,loginHint:n.sub,refreshToken:e.refresh_token,profilePictureUrl:null==n?void 0:n.picture,email:n.email}];case 3:return i=o.sent(),console.error(i),[2,null];case 4:return[2]}})})},t.prototype.refreshAccessToken=function(t){return s(this,void 0,void 0,function(){var e,r;return a(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),this.client.setCredentials({refresh_token:t}),[4,this.client.getAccessToken()];case 1:if(!(e=n.sent()).token)throw new Error("Unable to refresh access token");return[2,e.token];case 2:return r=n.sent(),console.error(r),[2,null];case 3:return[2]}})})},t.prototype.isAuthenticated=function(t){return s(this,void 0,void 0,function(){var e,r;return a(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this.client.getTokenInfo(t)];case 1:return e=n.sent(),e.expiry_date<Date.now()?[2,!1]:[2,!0];case 2:return r=n.sent(),console.error(r),[2,!1];case 3:return[2]}})})},t.prototype.getOAuth2Client=function(){return s(this,void 0,void 0,function(){return a(this,function(t){return[2,this.client]})})},t}(),$=function(){function t(t,e,r,n,i,o,s){this.encryptionSecret=t,this.firestore=e,this.googleOAuthClientId=r,this.googleOAuthClientSecret=n,this.googleOAuthCallbackApiRoute=i,this.sessionSecret=o,this.baseUrl=s,this.encryptionService=new D(t),this.firestoreClient=new L(e),this._googleOAuthClientId=r,this._googleOAuthClientSecret=n,this._googleOAuthCallbackApiRoute=i,this._sessionSecret=o}return t.prototype.getOAuthClient=function(t,e){return new M(this._googleOAuthClientId,this._googleOAuthClientSecret,this._googleOAuthCallbackApiRoute,t,e)},t.prototype.getGoogleSignInUrl=function(t){return s(this,arguments,void 0,function(t,e){var r,n;return void 0===e&&(e=!1),a(this,function(i){if(r=this.getOAuthClient(),!(n=r.getAuthenticateUrl(t,e)))throw new Error("Failed to get Google Authentication URL");return[2,n]})})},t.prototype.handleGoogleSignInCallback=function(t,e){return s(this,void 0,void 0,function(){var r,n,i,o,s;return a(this,function(a){switch(a.label){case 0:return[4,this.getOAuthClient().exchangeCodeForTokens(t)];case 1:if(!(r=a.sent()))throw new Error("Failed to authenticate Google sign-in");return n=r.accessToken,i=r.refreshToken?this.encryptionService.encryptString(r.refreshToken):void 0,o=r.profilePictureUrl?this.encryptionService.encryptString(r.profilePictureUrl):void 0,[4,P({loginHint:r.loginHint,accessToken:n},{password:this._sessionSecret})];case 2:return s=a.sent(),[4,this.firestoreClient.upsertConnectedUserCredentials({refreshToken:i,profilePictureUrl:o,loginHint:r.loginHint})];case 3:return a.sent(),e&&r.email?[4,e(r.email)]:[3,5];case 4:a.sent(),a.label=5;case 5:return[2,{encryptedSession:s,accessToken:n,profilePictureUrl:r.profilePictureUrl}]}})})},t.prototype.decryptSession=function(t){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return[4,B(t,{password:this._sessionSecret})];case 1:return(null==(e=r.sent())?void 0:e.accessToken)&&(null==e?void 0:e.loginHint)?[2,e]:[2,null]}})})},t.prototype.getSessionAndUser=function(t){return s(this,void 0,void 0,function(){var e,r,n;return a(this,function(i){switch(i.label){case 0:return[4,this.decryptSession(t)];case 1:return(e=i.sent())?[4,this.firestoreClient.getConnectedUserCredentials(e.loginHint)]:[2,null];case 2:return(r=i.sent())?(n=r.refreshToken?this.encryptionService.decryptString(r.refreshToken):void 0,r.refreshToken=n,process.env.GOOGLE_CLASSROOM_DEV_REFRESH_TOKEN&&(r.refreshToken=process.env.GOOGLE_CLASSROOM_DEV_REFRESH_TOKEN),[2,{session:e,user:r}]):[2,null]}})})},t.prototype.verifyAuthSession=function(t,e){return s(this,void 0,void 0,function(){var r,n,i,o;return a(this,function(s){switch(s.label){case 0:return t&&e?[4,this.getSessionAndUser(t)]:[2,null];case 1:return(r=s.sent())&&e&&(null===(o=null==r?void 0:r.session)||void 0===o?void 0:o.accessToken)===e?[4,(n=this.getOAuthClient(e,r.user.refreshToken)).isAuthenticated(e)]:[2,null];case 2:return s.sent()?[2,{session:t,token:e}]:[4,n.refreshAccessToken(r.user.refreshToken)];case 3:return(i=s.sent())?[4,P({loginHint:r.session.loginHint,accessToken:i},{password:this._sessionSecret})]:[3,5];case 4:return[2,{session:s.sent(),token:i}];case 5:return[2,null]}})})},t.prototype.createAttachment=function(t,e,r){return s(this,void 0,void 0,function(){var n,i,s,c;return a(this,function(a){switch(a.label){case 0:return[4,this.getSessionAndUser(r)];case 1:if(!(n=a.sent())||e!==n.session.accessToken)throw new Error("Invalid Google Classroom session");return i=this.getOAuthClient(e,n.user.refreshToken),[4,new H(this.baseUrl,i).createAnnouncementAttachment(t)];case 2:return s=a.sent(),c=o(o({},s),{attachmentId:s.id||"",createdAt:(new Date).toISOString()}),[4,this.firestoreClient.upsertClassroomAttachment(c)];case 3:return a.sent(),[4,this.firestoreClient.getClassroomAttachmentById(s.id)];case 4:return[2,a.sent()]}})})},t}();exports.OakGoogleClassroomAddOn=$;
7
+ */!function(){if(l)return d;l=1,d.parse=function(t,r){if("string"!=typeof t)throw new TypeError("argument str must be a string");var n={},i=t.length;if(i<2)return n;var o=r&&r.decode||c,l=0,d=0,h=0;do{if(-1===(d=t.indexOf("=",l)))break;if(-1===(h=t.indexOf(";",l)))h=i;else if(d>h){l=t.lastIndexOf(";",d-1)+1;continue}var f=s(t,l,d),p=a(t,d,f),g=t.slice(f,p);if(!e.call(n,g)){var w=s(t,d+1,h),y=a(t,h,w);34===t.charCodeAt(w)&&34===t.charCodeAt(y-1)&&(w++,y--);var m=t.slice(w,y);n[g]=u(m,o)}l=h+1}while(l<i);return n},d.serialize=function(e,s,a){var c=a&&a.encode||encodeURIComponent;if("function"!=typeof c)throw new TypeError("option encode is invalid");if(!r.test(e))throw new TypeError("argument name is invalid");var u=c(s);if(!n.test(u))throw new TypeError("argument val is invalid");var l=e+"="+u;if(!a)return l;if(null!=a.maxAge){var d=Math.floor(a.maxAge);if(!isFinite(d))throw new TypeError("option maxAge is invalid");l+="; Max-Age="+d}if(a.domain){if(!i.test(a.domain))throw new TypeError("option domain is invalid");l+="; Domain="+a.domain}if(a.path){if(!o.test(a.path))throw new TypeError("option path is invalid");l+="; Path="+a.path}if(a.expires){var h=a.expires;if(!function(e){return"[object Date]"===t.call(e)}(h)||isNaN(h.valueOf()))throw new TypeError("option expires is invalid");l+="; Expires="+h.toUTCString()}a.httpOnly&&(l+="; HttpOnly");a.secure&&(l+="; Secure");a.partitioned&&(l+="; Partitioned");if(a.priority){switch("string"==typeof a.priority?a.priority.toLowerCase():a.priority){case"low":l+="; Priority=Low";break;case"medium":l+="; Priority=Medium";break;case"high":l+="; Priority=High";break;default:throw new TypeError("option priority is invalid")}}if(a.sameSite){switch("string"==typeof a.sameSite?a.sameSite.toLowerCase():a.sameSite){case!0:l+="; SameSite=Strict";break;case"lax":l+="; SameSite=Lax";break;case"strict":l+="; SameSite=Strict";break;case"none":l+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}}return l};var t=Object.prototype.toString,e=Object.prototype.hasOwnProperty,r=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,n=/^("?)[\u0021\u0023-\u002B\u002D-\u003A\u003C-\u005B\u005D-\u007E]*\1$/,i=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,o=/^[\u0020-\u003A\u003D-\u007E]*$/;function s(t,e,r){do{var n=t.charCodeAt(e);if(32!==n&&9!==n)return e}while(++e<r);return r}function a(t,e,r){for(;e>r;){var n=t.charCodeAt(--e);if(32!==n&&9!==n)return e+1}return r}function c(t){return-1!==t.indexOf("%")?decodeURIComponent(t):t}function u(t,e){try{return e(t)}catch(e){return t}}}();var h={},f=Array.from({length:64});for(let t=0,e="A".charCodeAt(0),r="Z".charCodeAt(0);t+e<=r;t++){const r=String.fromCharCode(t+e);h[r]=t,f[t]=r}for(let t=0,e="a".charCodeAt(0),r="z".charCodeAt(0);t+e<=r;t++){const r=String.fromCharCode(t+e),n=t+26;h[r]=n,f[n]=r}for(let t=0;t<10;t++){h[t.toString(10)]=t+52;const e=t.toString(10),r=t+52;h[e]=r,f[r]=e}h["-"]=62,f[62]="-",h._=63,f[63]="_";var p=t=>(new TextEncoder).encode(t),g=t=>{const e=t+"=".repeat((4-t.length%4)%4);let r=e.length/4*3;e.endsWith("==")?r-=2:e.endsWith("=")&&r--;const n=new ArrayBuffer(r),i=new DataView(n);for(let t=0;t<e.length;t+=4){let r=0,n=0;for(let i=t,o=t+3;i<=o;i++)if("="===e[i])r>>=6;else{if(!(e[i]in h))throw new TypeError(`Invalid character ${e[i]} in base64 string.`);r|=h[e[i]]<<6*(o-i),n+=6}const o=t/4*3;r>>=n%8;const s=Math.floor(n/8);for(let t=0;t<s;t++){const e=8*(s-t-1);i.setUint8(o+t,(r&255<<e)>>e)}}return new Uint8Array(n)},w=t=>{const e="string"==typeof t?p(t):t;let r="";for(let t=0;t<e.length;t+=3){let n=0,i=0;for(let r=t,o=Math.min(t+3,e.length);r<o;r++)n|=e[r]<<8*(o-r-1),i+=8;const o=Math.ceil(i/6);n<<=6*o-i;for(let t=1;t<=o;t++){const e=6*(o-t);r+=f[(n&63<<e)>>e]}}return r},y={encryption:{saltBits:256,algorithm:"aes-256-cbc",iterations:1,minPasswordlength:32},integrity:{saltBits:256,algorithm:"sha256",iterations:1,minPasswordlength:32},ttl:0,timestampSkewSec:60,localtimeOffsetMsec:0},m=t=>({...t,encryption:{...t.encryption},integrity:{...t.integrity}}),v={"aes-128-ctr":{keyBits:128,ivBits:128,name:"AES-CTR"},"aes-256-cbc":{keyBits:256,ivBits:128,name:"AES-CBC"},sha256:{keyBits:256,name:"SHA-256"}},S="Fe26.2",C=(t,e)=>{if(e<1)throw new Error("Invalid random bits count");return((t,e)=>{const r=new Uint8Array(e);return t.getRandomValues(r),r})(t,Math.ceil(e/8))},A=async(t,e,r)=>{var n;if(!(null==e?void 0:e.length))throw new Error("Empty password");if(null==r||"object"!=typeof r)throw new Error("Bad options");if(!(r.algorithm in v))throw new Error(`Unknown algorithm: ${r.algorithm}`);const i=v[r.algorithm],o={},s=null!=(n=r.hmac)&&n,a=s?{name:"HMAC",hash:i.name}:{name:i.name},c=s?["sign","verify"]:["encrypt","decrypt"];if("string"==typeof e){if(e.length<r.minPasswordlength)throw new Error(`Password string too short (min ${r.minPasswordlength} characters required)`);let{salt:n=""}=r;if(!n){const{saltBits:e=0}=r;if(!e)throw new Error("Missing salt and saltBits options");const i=C(t,e);n=[...new Uint8Array(i)].map(t=>t.toString(16).padStart(2,"0")).join("")}const s=await(async(t,e,r,n,i,o)=>{const s=p(e),a=await t.subtle.importKey("raw",s,{name:"PBKDF2"},!1,["deriveBits"]),c={name:"PBKDF2",hash:o,salt:p(r),iterations:n};return await t.subtle.deriveBits(c,a,8*i)})(t,e,n,r.iterations,i.keyBits/8,"SHA-1"),u=await t.subtle.importKey("raw",s,a,!1,c);o.key=u,o.salt=n}else{if(e.length<i.keyBits/8)throw new Error("Key buffer (password) too small");o.key=await t.subtle.importKey("raw",e,a,!1,c),o.salt=""}return r.iv?o.iv=r.iv:"ivBits"in i&&(o.iv=C(t,i.ivBits)),o},E=(t,e,r)=>["aes-128-ctr"===t?{name:"AES-CTR",counter:e.iv,length:128}:{name:"AES-CBC",iv:e.iv},e.key,"string"==typeof r?p(r):r],b=async(t,e,r,n)=>{const i=await A(t,e,r),o=await t.subtle.decrypt(...E(r.algorithm,i,n));return s=new Uint8Array(o),(new TextDecoder).decode(s);var s},T=async(t,e,r,n)=>{const i=await A(t,e,{...r,hmac:!0}),o=p(n),s=await t.subtle.sign({name:"HMAC"},i.key,o);return{digest:w(new Uint8Array(s)),salt:i.salt}},k=t=>"string"==typeof t||t instanceof Uint8Array?{encryption:t,integrity:t}:"secret"in t?{id:t.id,encryption:t.secret,integrity:t.secret}:{id:t.id,encryption:t.encryption,integrity:t.integrity},O=async(t,e,r,n)=>{if(!r)throw new Error("Empty password");const i=m(n),o=Date.now()+(i.localtimeOffsetMsec||0),s=JSON.stringify(e),a=k(r),{id:c="",encryption:u,integrity:l}=a;if(c&&!/^\w+$/.test(c))throw new Error("Invalid password id");const{encrypted:d,key:h}=await(async(t,e,r,n)=>{const i=await A(t,e,r),o=await t.subtle.encrypt(...E(r.algorithm,i,n));return{encrypted:new Uint8Array(o),key:i}})(t,u,i.encryption,s),f=w(new Uint8Array(d)),p=w(h.iv),g=i.ttl?o+i.ttl:"",y=`${S}*${c}*${h.salt}*${p}*${f}*${g}`,v=await T(t,l,i.integrity,y);return`${y}*${v.salt}*${v.digest}`};const I=globalThis.crypto,_=I.subtle,U=()=>I.randomUUID(),x=t=>I.getRandomValues(t),R={randomUUID:U,getRandomValues:x,subtle:_};var P=Object.freeze({__proto__:null,default:R,getRandomValues:x,randomUUID:U,subtle:_});function N(t){return"string"==typeof t?{1:t}:t}var B=function(t){return async function(e,{password:r,ttl:n=1209600}){const i=N(r),o=Math.max(...Object.keys(i).map(Number)),s={id:o.toString(),secret:i[o]};return`${await O(t,e,s,{...y,ttl:1e3*n})}~2`}}(P),H=function(t){return async function(e,{password:r,ttl:n=1209600}){const i=N(r),{sealWithoutVersion:o,tokenVersion:s}=function(t){const[e,r]=t.split("~");return{sealWithoutVersion:e,tokenVersion:null==r?null:parseInt(r,10)}}(e);try{const e=await(async(t,e,r,n)=>{if(!r)throw new Error("Empty password");const i=m(n),o=Date.now()+(i.localtimeOffsetMsec||0),s=e.split("*");if(8!==s.length)throw new Error("Incorrect number of sealed components");const a=s[0];let c=s[1];const u=s[2],l=s[3],d=s[4],h=s[5],f=s[6],p=s[7],w=`${a}*${c}*${u}*${l}*${d}*${h}`;if(S!==a)throw new Error("Wrong mac prefix");if(h){if(!/^\d+$/.test(h))throw new Error("Invalid expiration");if(Number.parseInt(h,10)<=o-1e3*i.timestampSkewSec)throw new Error("Expired seal")}let y="";if(c=c||"default","string"==typeof r||r instanceof Uint8Array)y=r;else{if(!(c in r))throw new Error(`Cannot find password: ${c}`);y=r[c]}y=k(y);const v=i.integrity;if(v.salt=f,!((t,e)=>{let r=t.length===e.length?0:1;r&&(e=t);for(let n=0;n<t.length;n+=1)r|=t.charCodeAt(n)^e.charCodeAt(n);return 0===r})((await T(t,y.integrity,v,w)).digest,p))throw new Error("Bad hmac value");const C=g(d),A=i.encryption;A.salt=u,A.iv=g(l);const E=await b(t,y.encryption,A,C);return E?JSON.parse(E):null})(t,o,i,{...y,ttl:1e3*n})??{};return 2===s?e:{...e.persistent}}catch(t){if(t instanceof Error&&/^(Expired seal|Bad hmac value|Cannot find password|Incorrect number of sealed components)/.test(t.message))return{};throw t}}}(P),D=o.default.object({courseId:o.default.string(),itemId:o.default.string(),addOnToken:o.default.string(),title:o.default.string(),lessonSlug:o.default.string(),programmeSlug:o.default.string(),unitSlug:o.default.string(),maxPoints:o.default.number().optional()}),L=o.default.object({courseId:o.default.string(),postId:o.default.string(),id:o.default.string(),title:o.default.string(),teacherViewUri:o.default.object({uri:o.default.string()}),studentViewUri:o.default.object({uri:o.default.string()}),studentWorkReviewUri:o.default.object({uri:o.default.string()}).optional(),itemId:o.default.string(),maxPoints:o.default.number().optional()});o.default.string();var M=o.default.object({accessToken:o.default.string(),loginHint:o.default.string(),refreshToken:o.default.string().optional(),profilePictureUrl:o.default.string().optional(),email:o.default.string().optional()}),$=o.default.object({token:o.default.string()});o.default.tuple([D,o.default.string().min(1),o.default.string().min(1)]);var G,V=L.extend({attachmentId:o.default.string(),createdAt:o.default.string()}),j=o.default.object({loginHint:o.default.string(),refreshToken:o.default.string().optional(),profilePictureUrl:o.default.string().optional()}),F=function(){function e(t,e){this.baseUrl=t,this.oAuthClient=e,this.baseUrl=t,this.oAuthClient=e}return e.prototype.getClassroomClient=function(){return c(this,void 0,void 0,function(){var e;return u(this,function(r){switch(r.label){case 0:return[4,this.oAuthClient.getOAuth2Client()];case 1:return e=r.sent(),[2,new t.classroom_v1.Classroom({auth:e})]}})})},e.prototype.createAnnouncementAttachment=function(t){return c(this,void 0,void 0,function(){var e,r,n,i,o,s,c,l,d,h,f,p,g;return u(this,function(u){switch(u.label){case 0:return e=t.courseId,r=t.itemId,n=t.addOnToken,i=t.title,o=t.lessonSlug,s=t.programmeSlug,c=t.unitSlug,l=t.maxPoints,[4,this.getClassroomClient()];case 1:return d=u.sent(),h=l?{maxPoints:l,studentWorkReviewUri:{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(s,"/units/").concat(c,"/lessons/").concat(o)}}:{},[4,d.courses.courseWork.addOnAttachments.create({courseId:e,itemId:r,addOnToken:n,requestBody:a({title:i,teacherViewUri:{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(s,"/units/").concat(c,"/lessons/").concat(o)},studentViewUri:{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(s,"/units/").concat(c,"/lessons/").concat(o)}},h)})];case 2:return f=u.sent(),p=L.parse(f.data),g=p.maxPoints?{maxPoints:p.maxPoints,studentWorkReviewUri:p.studentWorkReviewUri}:{},[2,a({courseId:p.courseId,postId:p.postId,id:p.id,title:p.title,teacherViewUri:p.teacherViewUri,studentViewUri:p.studentViewUri,itemId:p.itemId},g)]}})})},e.prototype.submitPupilResponse=function(t){return c(this,void 0,void 0,function(){return u(this,function(e){switch(e.label){case 0:return[4,this.getClassroomClient()];case 1:return[4,e.sent().courses.courseWork.addOnAttachments.studentSubmissions.patch({courseId:t.courseId,itemId:t.itemId,attachmentId:t.attachmentId,submissionId:t.submissionId,updateMask:"pointsEarned",requestBody:{pointsEarned:t.pointsEarned}})];case 2:return[2,e.sent().data]}})})},e.prototype.fetchPupilResponse=function(t){return c(this,void 0,void 0,function(){return u(this,function(e){switch(e.label){case 0:return[4,this.getClassroomClient()];case 1:return[4,e.sent().courses.courseWork.addOnAttachments.studentSubmissions.get({courseId:t.courseId,itemId:t.itemId,attachmentId:t.attachmentId,submissionId:t.submissionId})];case 2:return[2,e.sent().data]}})})},e}(),W=function(){function t(t){this.encryptionSecret=t,this.ENCRYPTION_SECRET=t}return t.prototype.encryptString=function(e){var r=s.default.randomBytes(t.SALT_BYTES).toString("hex"),n=s.default.randomBytes(t.IV_LENGTH),i=s.default.scryptSync(this.ENCRYPTION_SECRET,r,t.ENCRYPTION_KEY_LENGTH),o=s.default.createCipheriv(t.ALGORITHM,i,n),a=o.update(e,"utf8","hex");return a+=o.final("hex"),"".concat(n.toString("hex"),":").concat(a,":").concat(r)},t.prototype.decryptString=function(e){var r=function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,i,o=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=o.next()).done;)s.push(n.value)}catch(t){i={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(i)throw i.error}}return s}(e.split(":"),3),n=r[0],i=r[1],o=r[2];if(!n||!i||!o)throw new Error("Invalid encrypted string");var a=Buffer.from(n,"hex"),c=s.default.scryptSync(this.ENCRYPTION_SECRET,o,t.ENCRYPTION_KEY_LENGTH),u=s.default.createDecipheriv(t.ALGORITHM,c,a),l=u.update(i,"hex","utf8");return l+=u.final("utf8")},t.ALGORITHM="aes-256-cbc",t.IV_LENGTH=16,t.SALT_BYTES=16,t.ENCRYPTION_KEY_LENGTH=32,t}();!function(t){t.CONNECTED_USERS_CREDENTIALS="connectedUsersCredentials",t.CLASSROOM_ATTACHMENTS="classroomAttachments"}(G||(G={}));var z=function(){function t(t){this.firestore=t,this._firestore=t}return t.prototype.getConnectedUserCredentials=function(t){return c(this,void 0,void 0,function(){var e,r;return u(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this._firestore.collection(G.CONNECTED_USERS_CREDENTIALS).doc(t).get()];case 1:return(e=n.sent()).exists?[2,j.parse(e.data())]:[2,null];case 2:throw r=n.sent(),console.error(r),new Error("Failed to save users credentials");case 3:return[2]}})})},t.prototype.upsertConnectedUserCredentials=function(t){return c(this,void 0,void 0,function(){var e,r;return u(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),e=j.parse(t),this._firestore.settings({ignoreUndefinedProperties:!0}),[4,this._firestore.collection(G.CONNECTED_USERS_CREDENTIALS).doc(e.loginHint).set(e)];case 1:return n.sent(),[3,3];case 2:throw r=n.sent(),console.error(r),new Error("Failed to upsert users credentials");case 3:return[2]}})})},t.prototype.upsertClassroomAttachment=function(t){return c(this,void 0,void 0,function(){var e,r;return u(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),e=V.parse(t),this._firestore.settings({ignoreUndefinedProperties:!0}),[4,this._firestore.collection(G.CLASSROOM_ATTACHMENTS).doc(e.attachmentId).set(e)];case 1:return n.sent(),[3,3];case 2:throw r=n.sent(),console.error(r),new Error("Failed to upsert classroom attachment");case 3:return[2]}})})},t.prototype.getClassroomAttachmentById=function(t){return c(this,void 0,void 0,function(){var e,r;return u(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this._firestore.collection(G.CLASSROOM_ATTACHMENTS).doc(t).get()];case 1:return(e=n.sent()).exists?[2,V.parse(e.data())]:[2,null];case 2:throw r=n.sent(),console.error(r),new Error("Failed to get classroom attachment by ID");case 3:return[2]}})})},t}(),K=function(){function t(t,e,r,i,o){var s=this;if(this.googleClientId=t,this.googleClientSecret=e,this.callbackUrl=r,this.accessToken=i,this.refreshToken=o,!t)throw new Error("Google Client ID is missing");if(!e)throw new Error("Google Client Secret is missing");if(!r)throw new Error("Google OAuth Callback URL is missing");var a=new n.OAuth2Client({clientId:t,clientSecret:e,redirectUri:r,forceRefreshOnFailure:!1});"true"===process.env.GOOGLE_CLASSROOM_DEV_MODE&&i&&(a.refreshHandler=function(){return c(s,void 0,void 0,function(){return u(this,function(t){return[2,{access_token:i,expiry_date:(new Date).getTime()+36e5}]})})}),(i||o)&&a.setCredentials({access_token:i,refresh_token:o}),this.client=a,this.clientId=t}return t.prototype.getAuthenticateUrl=function(t,e){void 0===e&&(e=!1);try{return this.client.generateAuthUrl({access_type:"offline",include_granted_scopes:!0,scope:["https://www.googleapis.com/auth/userinfo.profile","https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/classroom.courses.readonly","https://www.googleapis.com/auth/classroom.addons.student","https://www.googleapis.com/auth/classroom.addons.teacher"],loginHint:t,subscribeToNewsletter:e})}catch(t){return console.error(t),null}},t.prototype.exchangeCodeForTokens=function(t){return c(this,void 0,void 0,function(){var e,r,n,i,o;return u(this,function(s){switch(s.label){case 0:return s.trys.push([0,3,,4]),[4,this.client.getToken(t)];case 1:return e=s.sent().tokens,[4,this.client.verifyIdToken({idToken:e.id_token,audience:this.clientId})];case 2:return r=s.sent(),n=r.getPayload(),i={accessToken:e.access_token,loginHint:null==n?void 0:n.sub,refreshToken:e.refresh_token,profilePictureUrl:null==n?void 0:n.picture,email:null==n?void 0:n.email},[2,M.parse(i)];case 3:return o=s.sent(),console.error(o),[2,null];case 4:return[2]}})})},t.prototype.refreshAccessToken=function(t){return c(this,void 0,void 0,function(){var e,r;return u(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),this.client.setCredentials({refresh_token:t}),[4,this.client.getAccessToken()];case 1:return e=n.sent(),[2,$.parse(e).token];case 2:return r=n.sent(),console.error(r),[2,null];case 3:return[2]}})})},t.prototype.isAuthenticated=function(t){return c(this,void 0,void 0,function(){var e,r;return u(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this.client.getTokenInfo(t)];case 1:return e=n.sent(),e.expiry_date<Date.now()?[2,!1]:[2,!0];case 2:return r=n.sent(),console.error(r),[2,!1];case 3:return[2]}})})},t.prototype.getOAuth2Client=function(){return c(this,void 0,void 0,function(){return u(this,function(t){return[2,this.client]})})},t}(),Y=function(){function t(t,e,r,n,i,o,s){this.encryptionSecret=t,this.firestore=e,this.googleOAuthClientId=r,this.googleOAuthClientSecret=n,this.googleOAuthCallbackApiRoute=i,this.sessionSecret=o,this.baseUrl=s,this.encryptionService=new W(t),this.firestoreClient=new z(e),this._googleOAuthClientId=r,this._googleOAuthClientSecret=n,this._googleOAuthCallbackApiRoute=i,this._sessionSecret=o}return t.prototype.getOAuthClient=function(t,e){return new K(this._googleOAuthClientId,this._googleOAuthClientSecret,this._googleOAuthCallbackApiRoute,t,e)},t.prototype.getGoogleSignInUrl=function(t){return c(this,arguments,void 0,function(t,e){var r,n;return void 0===e&&(e=!1),u(this,function(i){if(r=this.getOAuthClient(),!(n=r.getAuthenticateUrl(t,e)))throw new Error("Failed to get Google Authentication URL");return[2,n]})})},t.prototype.handleGoogleSignInCallback=function(t,e){return c(this,void 0,void 0,function(){var r,n,i,o,s,a;return u(this,function(c){switch(c.label){case 0:return[4,this.getOAuthClient().exchangeCodeForTokens(t)];case 1:return r=c.sent(),n=M.parse(r),i=n.accessToken,o=n.refreshToken?this.encryptionService.encryptString(n.refreshToken):void 0,s=n.profilePictureUrl?this.encryptionService.encryptString(n.profilePictureUrl):void 0,[4,B({loginHint:n.loginHint,accessToken:i},{password:this._sessionSecret})];case 2:return a=c.sent(),[4,this.firestoreClient.upsertConnectedUserCredentials({refreshToken:o,profilePictureUrl:s,loginHint:n.loginHint})];case 3:return c.sent(),e&&n.email?[4,e(n.email)]:[3,5];case 4:c.sent(),c.label=5;case 5:return[2,{encryptedSession:a,accessToken:i,profilePictureUrl:n.profilePictureUrl}]}})})},t.prototype.decryptSession=function(t){return c(this,void 0,void 0,function(){var e;return u(this,function(r){switch(r.label){case 0:return[4,H(t,{password:this._sessionSecret})];case 1:return(null==(e=r.sent())?void 0:e.accessToken)&&(null==e?void 0:e.loginHint)?[2,e]:[2,null]}})})},t.prototype.getSessionAndUser=function(t){return c(this,void 0,void 0,function(){var e,r,n;return u(this,function(i){switch(i.label){case 0:return[4,this.decryptSession(t)];case 1:return(e=i.sent())?[4,this.firestoreClient.getConnectedUserCredentials(e.loginHint)]:[2,null];case 2:return(r=i.sent())?(n=r.refreshToken?this.encryptionService.decryptString(r.refreshToken):void 0,r.refreshToken=n,process.env.GOOGLE_CLASSROOM_DEV_REFRESH_TOKEN&&(r.refreshToken=process.env.GOOGLE_CLASSROOM_DEV_REFRESH_TOKEN),[2,{session:e,user:r}]):[2,null]}})})},t.prototype.verifyAuthSession=function(t,e){return c(this,void 0,void 0,function(){var r,n,i,o;return u(this,function(s){switch(s.label){case 0:return t&&e?[4,this.getSessionAndUser(t)]:[2,null];case 1:return(r=s.sent())&&e&&(null===(o=null==r?void 0:r.session)||void 0===o?void 0:o.accessToken)===e?[4,(n=this.getOAuthClient(e,r.user.refreshToken)).isAuthenticated(e)]:[2,null];case 2:return s.sent()?[2,{session:t,token:e}]:[4,n.refreshAccessToken(r.user.refreshToken)];case 3:return(i=s.sent())?[4,B({loginHint:r.session.loginHint,accessToken:i},{password:this._sessionSecret})]:[3,5];case 4:return[2,{session:s.sent(),token:i}];case 5:return[2,null]}})})},t.prototype.createAttachment=function(t,e,r){return c(this,void 0,void 0,function(){var n,i,o,s;return u(this,function(c){switch(c.label){case 0:return[4,this.getSessionAndUser(r)];case 1:if(!(n=c.sent())||e!==n.session.accessToken)throw new Error("Invalid Google Classroom session");return i=this.getOAuthClient(e,n.user.refreshToken),[4,new F(this.baseUrl,i).createAnnouncementAttachment(t)];case 2:return o=c.sent(),s=a(a({},o),{attachmentId:o.id,createdAt:(new Date).toISOString()}),[4,this.firestoreClient.upsertClassroomAttachment(s)];case 3:return c.sent(),[4,this.firestoreClient.getClassroomAttachmentById(o.id)];case 4:return[2,c.sent()]}})})},t}();exports.OakGoogleClassroomAddOn=Y;
8
8
  //# sourceMappingURL=index.js.map