ghost 3.42.5 → 3.42.9

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.
@@ -90,10 +90,17 @@ super(...arguments),e=this,t="dropdown",s=this,(n=a)&&Object.defineProperty(e,t,
90
90
  var l,d,u,m,c,p,h=Ember._setComponentTemplate(i,o)
91
91
  e.default=h})),define("ghost-admin/components/gh-billing-iframe",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
92
92
  const t=Ember.HTMLBars.template({id:"cEwCQjwt",block:'{"symbols":[],"statements":[[10,"iframe"],[14,1,"billing-frame"],[14,0,"billing-frame"],[14,"frameborder","0"],[12],[13]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-billing-iframe.hbs"}})
93
- var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),ajax:Ember.inject.service(),didInsertElement(){let e=!1
94
- this.billing.getBillingIframe().src=this.billing.getIframeURL(),window.addEventListener("message",(t=>{if(t&&t.data&&"token"===t.data.request){const t=this.get("ghostPaths.url").api("identities")
95
- this.ajax.request(t).then((e=>{const t=e&&e.identities&&e.identities[0]&&e.identities[0].token
96
- this.billing.getBillingIframe().contentWindow.postMessage({request:"token",response:t},"*")})),e||this.billing.get("subscription")||(e=!0,this.billing.getBillingIframe().contentWindow.postMessage({query:"getSubscription",response:"subscription"},"*"))}t&&t.data&&t.data.subscription&&this.billing.set("subscription",t.data.subscription)}))}}))
93
+ var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),ajax:Ember.inject.service(),notifications:Ember.inject.service(),isOwner:null,didInsertElement(){this._super(...arguments)
94
+ let e=!1
95
+ this.billing.getBillingIframe().src=this.billing.getIframeURL(),window.addEventListener("message",(t=>{let n
96
+ if(t&&t.data&&"token"===t.data.request){const t=this.get("ghostPaths.url").api("identities")
97
+ this.ajax.request(t).then((e=>{n=e&&e.identities&&e.identities[0]&&e.identities[0].token,this.billing.getBillingIframe().contentWindow.postMessage({request:"token",response:n},"*"),this.set("isOwner",!0)})).catch((e=>{var t,n
98
+ if(null===(t=e.payload)||void 0===t||!t.errors||"NoPermissionError"!==(null===(n=e.payload.errors[0])||void 0===n?void 0:n.type))throw e
99
+ this.set("isOwner",!1),this.billing.getBillingIframe().contentWindow.postMessage({request:"token",response:null},"*")})),e||this.billing.get("subscription")||!n||(e=!0,this.billing.getBillingIframe().contentWindow.postMessage({query:"getSubscription",response:"subscription"},"*"))}if(t&&t.data&&"forceUpgradeInfo"===t.data.request){let e=null
100
+ const t=this.billing.get("ownerUser")
101
+ t&&(e={name:t.get("name"),email:t.get("email")}),this.billing.getBillingIframe().contentWindow.postMessage({request:"forceUpgradeInfo",response:{forceUpgrade:this.config.get("forceUpgrade"),isOwner:this.get("isOwner"),ownerUser:e}},"*")}var s,a,r,i,o
102
+ if(t&&t.data&&t.data.subscription)if(this.billing.set("subscription",t.data.subscription),this.billing.set("checkoutRoute",(null===(s=t.data)||void 0===s?void 0:s.checkoutRoute)||"/plans"),"active"===t.data.subscription.status&&this.config.get("forceUpgrade")&&this.config.set("forceUpgrade",!1),"past_due"===t.data.subscription.status||"unpaid"===t.data.subscription.status?this.notifications.showAlert("Billing error: This site is queued for suspension. The owner of this site must update payment information.",{type:"error",key:"billing.overdue"}):this.notifications.closeAlerts("billing.overdue"),null!==(a=t.data)&&void 0!==a&&a.exceededLimits&&null!==(r=t.data)&&void 0!==r&&r.exceededLimits.length&&(null===(i=t.data)||void 0===i?void 0:i.exceededLimits.indexOf("members"))>=0&&null!==(o=t.data)&&void 0!==o&&o.checkoutRoute){const e=this.billing.get("billingRouteRoot")+"?action=checkout"
103
+ this.notifications.showAlert(Ember.String.htmlSafe(`Your audience has grown! To continue publishing, the site owner must confirm pricing for this number of members <a href="${e}">here</a>`),{type:"warn",key:"billing.exceeded"})}else this.notifications.closeAlerts("billing.exceeded")}))}}))
97
104
  e.default=n})),define("ghost-admin/components/gh-billing-modal",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
98
105
  const t=Ember.HTMLBars.template({id:"UTF+FkW9",block:'{"symbols":[],"statements":[[10,"div"],[15,0,[31,[[32,0,["visibilityClass"]]]]],[12],[2,"\\n "],[10,"div"],[14,0,"gh-billing-container"],[12],[2,"\\n\\n "],[8,"gh-billing-iframe",[],[[],[]],[["default"],[{"statements":[],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-billing-modal.hbs"}})
99
106
  var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),visibilityClass:Ember.computed("billing.billingWindowOpen",(function(){return this.billing.get("billingWindowOpen")?"gh-billing":"gh-billing closed"})),didInsertElement(){this._super(...arguments),this._setupShortcuts()},willDestroyElement(){this._super(...arguments),this._removeShortcuts()},_setupShortcuts(){Ember.run((function(){document.activeElement.blur()})),this._previousKeymasterScope=key.getScope(),key("enter","modal",(()=>{this.send("confirm")})),key.setScope("modal")},_removeShortcuts(){key.unbind("enter","modal"),key.setScope(this._previousKeymasterScope)}}))
@@ -676,8 +683,8 @@ return this.get("clock.second"),e?(0,t.default)().tz(e).format("HH:mm:ss"):(0,t.
676
683
  e.default=s})),define("ghost-admin/components/gh-token-input",["exports","ghost-admin/utils/computed-fallback-if-undefined","ember-power-select/utils/group-utils","@ember-decorators/component","ember-concurrency"],(function(e,t,n,s,a){var r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A
677
684
  function D(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function I(e,t,n,s,a){var r={}
678
685
  return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
679
- const N=Ember.HTMLBars.template({id:"DRFngbBr",block:'{"symbols":["option","@class","@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matchTriggerWidth","@noMatchesMessage","@onClose","@onInput","@onOpen","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerId","@verticalPosition","@tabindex"],"statements":[[8,"gh-token-input/select-multiple",[[16,0,[30,[36,1],["gh-token-input ",[32,2]],null]]],[["@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@closeOnSelect","@defaultHighlighted","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matcher","@matchTriggerWidth","@noMatchesMessage","@onBlur","@onChange","@onClose","@onFocus","@onInput","@onKeydown","@onOpen","@options","@optionsComponent","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@search","@searchEnabled","@searchField","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerComponent","@triggerId","@verticalPosition","@tabindex"],[[32,3],[32,4],[32,5],[32,6],[32,7],[32,8],[32,9],[32,10],[32,11],[32,12],[32,0,["closeOnSelect"]],[32,0,["defaultHighlighted"]],[32,13],[32,14],[32,15],[32,16],[32,17],[32,18],[32,19],[32,20],[32,0,["matcher"]],[32,21],[32,22],[32,0,["handleBlur"]],[32,0,["selectOrCreate"]],[32,23],[32,0,["handleFocus"]],[32,24],[32,0,["handleKeydown"]],[32,25],[32,0,["optionsWithoutSelected"]],[32,0,["optionsComponent"]],[32,26],[32,27],[32,28],[32,29],[32,30],[32,31],[32,32],[32,0,["searchAndSuggest"]],true,[32,0,["searchField"]],[32,33],[32,34],[32,35],[32,36],[32,37],[32,38],[32,39],[32,0,["triggerComponent"]],[32,40],[32,41],[32,42]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[32,1,["__isSuggestion__"]]],null,[["default","else"],[{"statements":[[2," "],[8,"gh-token-input/suggested-option",[],[["@option"],[[32,1]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,0],[[32,1],[32,0,["labelField"]]],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["get","concat","if"]}',meta:{moduleName:"ghost-admin/components/gh-token-input.hbs"}}),{Handlebars:U}=Ember
680
- let z=(r=(0,s.tagName)(""),i=(0,t.default)(!0),o=(0,t.default)(!1),l=(0,t.default)("name"),d=(0,t.default)(n.defaultMatcher),u=(0,t.default)("name"),m=(0,t.default)("gh-token-input/trigger"),c=(0,t.default)("power-select-vertical-collection-options"),p=Ember.computed("options.[]","selected.[]"),h=Ember._action,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=(0,a.task)((function*(){let e=yield this.options,t=yield this.selected
686
+ const U=Ember.HTMLBars.template({id:"DRFngbBr",block:'{"symbols":["option","@class","@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matchTriggerWidth","@noMatchesMessage","@onClose","@onInput","@onOpen","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerId","@verticalPosition","@tabindex"],"statements":[[8,"gh-token-input/select-multiple",[[16,0,[30,[36,1],["gh-token-input ",[32,2]],null]]],[["@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@closeOnSelect","@defaultHighlighted","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matcher","@matchTriggerWidth","@noMatchesMessage","@onBlur","@onChange","@onClose","@onFocus","@onInput","@onKeydown","@onOpen","@options","@optionsComponent","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@search","@searchEnabled","@searchField","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerComponent","@triggerId","@verticalPosition","@tabindex"],[[32,3],[32,4],[32,5],[32,6],[32,7],[32,8],[32,9],[32,10],[32,11],[32,12],[32,0,["closeOnSelect"]],[32,0,["defaultHighlighted"]],[32,13],[32,14],[32,15],[32,16],[32,17],[32,18],[32,19],[32,20],[32,0,["matcher"]],[32,21],[32,22],[32,0,["handleBlur"]],[32,0,["selectOrCreate"]],[32,23],[32,0,["handleFocus"]],[32,24],[32,0,["handleKeydown"]],[32,25],[32,0,["optionsWithoutSelected"]],[32,0,["optionsComponent"]],[32,26],[32,27],[32,28],[32,29],[32,30],[32,31],[32,32],[32,0,["searchAndSuggest"]],true,[32,0,["searchField"]],[32,33],[32,34],[32,35],[32,36],[32,37],[32,38],[32,39],[32,0,["triggerComponent"]],[32,40],[32,41],[32,42]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[32,1,["__isSuggestion__"]]],null,[["default","else"],[{"statements":[[2," "],[8,"gh-token-input/suggested-option",[],[["@option"],[[32,1]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,0],[[32,1],[32,0,["labelField"]]],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["get","concat","if"]}',meta:{moduleName:"ghost-admin/components/gh-token-input.hbs"}}),{Handlebars:N}=Ember
687
+ let R=(r=(0,s.tagName)(""),i=(0,t.default)(!0),o=(0,t.default)(!1),l=(0,t.default)("name"),d=(0,t.default)(n.defaultMatcher),u=(0,t.default)("name"),m=(0,t.default)("gh-token-input/trigger"),c=(0,t.default)("power-select-vertical-collection-options"),p=Ember.computed("options.[]","selected.[]"),h=Ember._action,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=(0,a.task)((function*(){let e=yield this.options,t=yield this.selected
681
688
  return e.filter((e=>!t.includes(e)))})),w=(0,a.task)((function*(e,t){let n=(yield this.optionsWithoutSelected).toArray()
682
689
  if(0===e.length)return n
683
690
  let s=this.search
@@ -690,9 +697,9 @@ let s=e.find((e=>e.__isSuggestion__))
690
697
  s?this.onCreate(s.__value__,t):this.onChange(e,t),t.actions.search("")}defaultHighlighted(e){let{results:t}=e,s=(0,n.advanceSelectableOption)(t,void 0,1)
691
698
  return t.length>1&&s.__isSuggestion__&&(s=(0,n.advanceSelectableOption)(t,s,1)),s}_addCreateOption(e,t){this._shouldShowCreateOption(e,t)&&t.unshift(this._buildSuggestionForTerm(e))}_shouldShowCreateOption(e,t){return!!this.allowCreation&&(this.showCreateWhen?this.showCreateWhen(e,t):this._hideCreateOptionOnSameTerm(e,t))}_buildSuggestionForTerm(e){return{__isSuggestion__:!0,__value__:e,text:this._buildSuggestionLabel(e)}}_hideCreateOptionOnSameTerm(e,t){let n=this.searchField
692
699
  return!t.findBy(n,e)}_filter(e,t){let s
693
- return s=this.searchField?(e,t)=>this.matcher(Ember.get(e,this.searchField),t):(e,t)=>this.matcher(e,t),(0,n.filterOptions)(e||[],t,s)}_buildSuggestionLabel(e){return this.buildSuggestion?this.buildSuggestion(e):Ember.String.htmlSafe(`Add <strong>"${U.Utils.escapeExpression(e)}"...</strong>`)}},k=I((_=A).prototype,"allowCreation",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=I(_.prototype,"closeOnSelect",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=I(_.prototype,"labelField",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=I(_.prototype,"matcher",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=I(_.prototype,"searchField",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=I(_.prototype,"triggerComponent",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=I(_.prototype,"optionsComponent",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I(_.prototype,"optionsWithoutSelected",[p],Object.getOwnPropertyDescriptor(_.prototype,"optionsWithoutSelected"),_.prototype),I(_.prototype,"handleKeydown",[h],Object.getOwnPropertyDescriptor(_.prototype,"handleKeydown"),_.prototype),I(_.prototype,"handleFocus",[g],Object.getOwnPropertyDescriptor(_.prototype,"handleFocus"),_.prototype),I(_.prototype,"handleBlur",[f],Object.getOwnPropertyDescriptor(_.prototype,"handleBlur"),_.prototype),I(_.prototype,"searchAndSuggest",[b],Object.getOwnPropertyDescriptor(_.prototype,"searchAndSuggest"),_.prototype),I(_.prototype,"selectOrCreate",[v],Object.getOwnPropertyDescriptor(_.prototype,"selectOrCreate"),_.prototype),O=I(_.prototype,"optionsWithoutSelectedTask",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=I(_.prototype,"searchAndSuggestTask",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=_))||E)
694
- var R=Ember._setComponentTemplate(N,z)
695
- e.default=R})),define("ghost-admin/components/gh-token-input/label-token",["exports","ember-drag-drop/components/draggable-object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
700
+ return s=this.searchField?(e,t)=>this.matcher(Ember.get(e,this.searchField),t):(e,t)=>this.matcher(e,t),(0,n.filterOptions)(e||[],t,s)}_buildSuggestionLabel(e){return this.buildSuggestion?this.buildSuggestion(e):Ember.String.htmlSafe(`Add <strong>"${N.Utils.escapeExpression(e)}"...</strong>`)}},k=I((_=A).prototype,"allowCreation",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=I(_.prototype,"closeOnSelect",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=I(_.prototype,"labelField",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=I(_.prototype,"matcher",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=I(_.prototype,"searchField",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=I(_.prototype,"triggerComponent",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=I(_.prototype,"optionsComponent",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I(_.prototype,"optionsWithoutSelected",[p],Object.getOwnPropertyDescriptor(_.prototype,"optionsWithoutSelected"),_.prototype),I(_.prototype,"handleKeydown",[h],Object.getOwnPropertyDescriptor(_.prototype,"handleKeydown"),_.prototype),I(_.prototype,"handleFocus",[g],Object.getOwnPropertyDescriptor(_.prototype,"handleFocus"),_.prototype),I(_.prototype,"handleBlur",[f],Object.getOwnPropertyDescriptor(_.prototype,"handleBlur"),_.prototype),I(_.prototype,"searchAndSuggest",[b],Object.getOwnPropertyDescriptor(_.prototype,"searchAndSuggest"),_.prototype),I(_.prototype,"selectOrCreate",[v],Object.getOwnPropertyDescriptor(_.prototype,"selectOrCreate"),_.prototype),O=I(_.prototype,"optionsWithoutSelectedTask",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=I(_.prototype,"searchAndSuggestTask",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=_))||E)
701
+ var z=Ember._setComponentTemplate(U,R)
702
+ e.default=z})),define("ghost-admin/components/gh-token-input/label-token",["exports","ember-drag-drop/components/draggable-object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
696
703
  const n=Ember.HTMLBars.template({id:"PKCFtPBX",block:'{"symbols":["&default"],"statements":[[18,1,null],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-token-input/label-token.hbs"}})
697
704
  var s=Ember._setComponentTemplate(n,t.default.extend({attributeBindings:["title"],classNames:["label-token"],title:"Label"}))
698
705
  e.default=s})),define("ghost-admin/components/gh-token-input/select-multiple",["exports","jquery","ember-power-select/components/power-select-multiple","@ember-decorators/component"],(function(e,t,n,s){var a,r,i,o,l,d
@@ -1120,25 +1127,25 @@ var t=Ember.Controller.extend({ui:Ember.inject.service()})
1120
1127
  e.default=t})),define("ghost-admin/controllers/error",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1121
1128
  var t=Ember.Controller.extend({stack:!1,error:Ember.computed.readOnly("model"),code:Ember.computed("error.status",(function(){return this.get("error.status")>200?this.get("error.status"):500})),message:Ember.computed("error.statusText",(function(){return 404===this.code?"Page not found":"error"!==this.get("error.statusText")?this.get("error.statusText"):"Internal Server Error"}))})
1122
1129
  e.default=t}))
1123
- define("ghost-admin/controllers/member",["exports","ghost-admin/utils/bound-one-way","moment","ember-concurrency-decorators"],(function(e,t,n,s){var a,r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,N
1124
- function U(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function z(e,t,n,s,a){var r={}
1130
+ define("ghost-admin/controllers/member",["exports","ghost-admin/utils/bound-one-way","moment","ember-concurrency-decorators"],(function(e,t,n,s){var a,r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,U
1131
+ function N(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function R(e,t,n,s,a){var r={}
1125
1132
  return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1126
- const R=["name","email","note"]
1127
- let L=(a=Ember.inject.controller,r=Ember.inject.service,i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember._tracked,c=Ember._tracked,p=Ember._tracked,h=Ember._tracked,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=Ember._action,w=Ember._action,E=Ember._action,_=(0,s.task)({drop:!0}),N=class extends Ember.Controller{constructor(...e){super(...e),U(this,"members",x,this),U(this,"session",P,this),U(this,"dropdown",j,this),U(this,"membersStats",T,this),U(this,"notifications",M,this),U(this,"router",S,this),U(this,"store",O,this),U(this,"isLoading",C,this),U(this,"showDeleteMemberModal",A,this),U(this,"showImpersonateMemberModal",D,this),U(this,"showUnsavedChangesModal",I,this),function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"leaveScreenTransition",null)}get member(){return this.model}set member(e){this.model=e}get scratchMember(){let e=Ember.Object.create({member:this.member})
1128
- return R.forEach((n=>Ember.defineProperty(e,n,(0,t.default)(`member.${n}`)))),e}get subscribedAt(){let e=(0,n.default)(this.member.get("createdAtUTC")).from((0,n.default)())
1133
+ const z=["name","email","note"]
1134
+ let L=(a=Ember.inject.controller,r=Ember.inject.service,i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember._tracked,c=Ember._tracked,p=Ember._tracked,h=Ember._tracked,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=Ember._action,w=Ember._action,E=Ember._action,_=(0,s.task)({drop:!0}),U=class extends Ember.Controller{constructor(...e){super(...e),N(this,"members",x,this),N(this,"session",P,this),N(this,"dropdown",j,this),N(this,"membersStats",T,this),N(this,"notifications",M,this),N(this,"router",S,this),N(this,"store",O,this),N(this,"isLoading",C,this),N(this,"showDeleteMemberModal",A,this),N(this,"showImpersonateMemberModal",D,this),N(this,"showUnsavedChangesModal",I,this),function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"leaveScreenTransition",null)}get member(){return this.model}set member(e){this.model=e}get scratchMember(){let e=Ember.Object.create({member:this.member})
1135
+ return z.forEach((n=>Ember.defineProperty(e,n,(0,t.default)(`member.${n}`)))),e}get subscribedAt(){let e=(0,n.default)(this.member.get("createdAtUTC")).from((0,n.default)())
1129
1136
  return`${(0,n.default)(this.member.get("createdAtUTC")).format("D MMM YYYY")} (${e})`}setProperty(e,t){this._saveMemberProperty(e,t)}toggleDeleteMemberModal(){this.showDeleteMemberModal=!this.showDeleteMemberModal}toggleImpersonateMemberModal(){this.showImpersonateMemberModal=!this.showImpersonateMemberModal}save(){return this.saveTask.perform()}deleteMember(e=!1){let t={adapterOptions:{cancel:e}}
1130
1137
  return this.member.destroyRecord(t).then((()=>(this.members.refreshData(),this.transitionToRoute("members"))),(e=>this.notifications.showAPIError(e,{key:"member.delete"})))}toggleUnsavedChangesModal(e){let t=this.leaveScreenTransition
1131
1138
  if(!e&&this.showUnsavedChangesModal)return this.leaveScreenTransition=null,void(this.showUnsavedChangesModal=!1)
1132
1139
  if(!t||e.targetName===t.targetName){if(this.leaveScreenTransition=e,this.save.isRunning)return this.save.last.then((()=>{e.retry()}))
1133
- this.showUnsavedChangesModal=!0}}leaveScreen(){return this.member.rollbackAttributes(),this.leaveScreenTransition.retry()}*saveTask(){let{member:e,scratchMember:t}=this,n=t.getProperties(R)
1140
+ this.showUnsavedChangesModal=!0}}leaveScreen(){return this.member.rollbackAttributes(),this.leaveScreenTransition.retry()}*saveTask(){let{member:e,scratchMember:t}=this,n=t.getProperties(z)
1134
1141
  e.setProperties(n)
1135
1142
  try{return yield e.save(),e.updateLabels(),this.members.refreshData(),this.replaceRoute("member",e),e}catch(s){s&&this.notifications.showAPIError(s,{key:"member.save"})}}*fetchMemberTask(e){this.isLoading=!0,this.member=yield this.store.findRecord("member",e,{reload:!0}),this.isLoading=!1}_saveMemberProperty(e,t){let n=this.member.get(e)
1136
- t&&(t=t.trim()),(!1===t||t||n)&&this.member.set(e,t)}},x=z((k=N).prototype,"members",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=z(k.prototype,"session",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=z(k.prototype,"dropdown",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=z(k.prototype,"membersStats",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=z(k.prototype,"notifications",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=z(k.prototype,"router",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=z(k.prototype,"store",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=z(k.prototype,"isLoading",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),A=z(k.prototype,"showDeleteMemberModal",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),D=z(k.prototype,"showImpersonateMemberModal",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),I=z(k.prototype,"showUnsavedChangesModal",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),z(k.prototype,"setProperty",[g],Object.getOwnPropertyDescriptor(k.prototype,"setProperty"),k.prototype),z(k.prototype,"toggleDeleteMemberModal",[f],Object.getOwnPropertyDescriptor(k.prototype,"toggleDeleteMemberModal"),k.prototype),z(k.prototype,"toggleImpersonateMemberModal",[b],Object.getOwnPropertyDescriptor(k.prototype,"toggleImpersonateMemberModal"),k.prototype),z(k.prototype,"save",[v],Object.getOwnPropertyDescriptor(k.prototype,"save"),k.prototype),z(k.prototype,"deleteMember",[y],Object.getOwnPropertyDescriptor(k.prototype,"deleteMember"),k.prototype),z(k.prototype,"toggleUnsavedChangesModal",[w],Object.getOwnPropertyDescriptor(k.prototype,"toggleUnsavedChangesModal"),k.prototype),z(k.prototype,"leaveScreen",[E],Object.getOwnPropertyDescriptor(k.prototype,"leaveScreen"),k.prototype),z(k.prototype,"saveTask",[_],Object.getOwnPropertyDescriptor(k.prototype,"saveTask"),k.prototype),z(k.prototype,"fetchMemberTask",[s.task],Object.getOwnPropertyDescriptor(k.prototype,"fetchMemberTask"),k.prototype),k)
1137
- e.default=L})),define("ghost-admin/controllers/members",["exports","ghost-admin/utils/ghost-paths","moment","ghost-admin/helpers/gh-pluralize","ember-concurrency-decorators","ember-concurrency"],(function(e,t,n,s,a,r){var i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,N,U,z,R,L,B,V,F,H,q,$,W,K,Y,G,J,Z,Q,X,ee,te
1143
+ t&&(t=t.trim()),(!1===t||t||n)&&this.member.set(e,t)}},x=R((k=U).prototype,"members",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=R(k.prototype,"session",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=R(k.prototype,"dropdown",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=R(k.prototype,"membersStats",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=R(k.prototype,"notifications",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=R(k.prototype,"router",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=R(k.prototype,"store",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=R(k.prototype,"isLoading",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),A=R(k.prototype,"showDeleteMemberModal",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),D=R(k.prototype,"showImpersonateMemberModal",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),I=R(k.prototype,"showUnsavedChangesModal",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),R(k.prototype,"setProperty",[g],Object.getOwnPropertyDescriptor(k.prototype,"setProperty"),k.prototype),R(k.prototype,"toggleDeleteMemberModal",[f],Object.getOwnPropertyDescriptor(k.prototype,"toggleDeleteMemberModal"),k.prototype),R(k.prototype,"toggleImpersonateMemberModal",[b],Object.getOwnPropertyDescriptor(k.prototype,"toggleImpersonateMemberModal"),k.prototype),R(k.prototype,"save",[v],Object.getOwnPropertyDescriptor(k.prototype,"save"),k.prototype),R(k.prototype,"deleteMember",[y],Object.getOwnPropertyDescriptor(k.prototype,"deleteMember"),k.prototype),R(k.prototype,"toggleUnsavedChangesModal",[w],Object.getOwnPropertyDescriptor(k.prototype,"toggleUnsavedChangesModal"),k.prototype),R(k.prototype,"leaveScreen",[E],Object.getOwnPropertyDescriptor(k.prototype,"leaveScreen"),k.prototype),R(k.prototype,"saveTask",[_],Object.getOwnPropertyDescriptor(k.prototype,"saveTask"),k.prototype),R(k.prototype,"fetchMemberTask",[s.task],Object.getOwnPropertyDescriptor(k.prototype,"fetchMemberTask"),k.prototype),k)
1144
+ e.default=L})),define("ghost-admin/controllers/members",["exports","ghost-admin/utils/ghost-paths","moment","ghost-admin/helpers/gh-pluralize","ember-concurrency-decorators","ember-concurrency"],(function(e,t,n,s,a,r){var i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,U,N,R,z,L,B,V,F,H,q,$,W,K,Y,G,J,Z,Q,X,ee,te
1138
1145
  function ne(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function se(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ae(e,t,n,s,a){var r={}
1139
1146
  return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1140
1147
  const re=[{name:"All members",value:null},{name:"Free members",value:"false"},{name:"Paid members",value:"true"}]
1141
- let ie=(i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember.inject.service,c=Ember.inject.service,p=Ember._tracked,h=Ember._tracked,g=Ember._tracked,f=Ember._tracked,b=Ember._tracked,v=Ember._tracked,y=Ember._tracked,w=Ember._tracked,E=Ember._tracked,_=Ember._tracked,k=Ember._action,x=Ember._action,P=Ember._action,j=Ember._action,T=Ember._action,M=Ember._action,S=Ember._action,O=Ember._action,C=Ember._action,A=Ember._action,D=Ember._action,I=(0,a.task)({restartable:!0}),N=(0,a.task)({restartable:!0}),U=(0,a.task)({drop:!0}),te=class extends Ember.Controller{constructor(){super(...arguments),ne(this,"ajax",R,this),ne(this,"config",L,this),ne(this,"ellaSparse",B,this),ne(this,"feature",V,this),ne(this,"ghostPaths",F,this),ne(this,"membersStats",H,this),ne(this,"store",q,this),se(this,"queryParams",["label",{paidParam:"paid"},{searchParam:"search"},{orderParam:"order"}]),ne(this,"members",$,this),ne(this,"searchText",W,this),ne(this,"searchParam",K,this),ne(this,"paidParam",Y,this),ne(this,"label",G,this),ne(this,"orderParam",J,this),ne(this,"modalLabel",Z,this),ne(this,"showLabelModal",Q,this),ne(this,"showDeleteMembersModal",X,this),ne(this,"_availableLabels",ee,this),se(this,"paidParams",re),this._availableLabels=this.store.peekAll("label")}get listHeader(){let{searchText:e,selectedLabel:t,members:n}=this
1148
+ let ie=(i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember.inject.service,c=Ember.inject.service,p=Ember._tracked,h=Ember._tracked,g=Ember._tracked,f=Ember._tracked,b=Ember._tracked,v=Ember._tracked,y=Ember._tracked,w=Ember._tracked,E=Ember._tracked,_=Ember._tracked,k=Ember._action,x=Ember._action,P=Ember._action,j=Ember._action,T=Ember._action,M=Ember._action,S=Ember._action,O=Ember._action,C=Ember._action,A=Ember._action,D=Ember._action,I=(0,a.task)({restartable:!0}),U=(0,a.task)({restartable:!0}),N=(0,a.task)({drop:!0}),te=class extends Ember.Controller{constructor(){super(...arguments),ne(this,"ajax",z,this),ne(this,"config",L,this),ne(this,"ellaSparse",B,this),ne(this,"feature",V,this),ne(this,"ghostPaths",F,this),ne(this,"membersStats",H,this),ne(this,"store",q,this),se(this,"queryParams",["label",{paidParam:"paid"},{searchParam:"search"},{orderParam:"order"}]),ne(this,"members",$,this),ne(this,"searchText",W,this),ne(this,"searchParam",K,this),ne(this,"paidParam",Y,this),ne(this,"label",G,this),ne(this,"orderParam",J,this),ne(this,"modalLabel",Z,this),ne(this,"showLabelModal",Q,this),ne(this,"showDeleteMembersModal",X,this),ne(this,"_availableLabels",ee,this),se(this,"paidParams",re),this._availableLabels=this.store.peekAll("label")}get listHeader(){let{searchText:e,selectedLabel:t,members:n}=this
1142
1149
  if(n.loading)return"Loading..."
1143
1150
  if(e)return"Search result"
1144
1151
  let a=(0,s.ghPluralize)(n.length,"member")
@@ -1157,7 +1164,7 @@ let i=new Date,o=!e||t!==this._lastLabel||s!==this._lastPaidParam||a!==this._las
1157
1164
  if(this._lastLabel=t,this._lastPaidParam=s,this._lastSearchParam=a,this._lastOrderParam=r,!o&&this._startDate&&!(this._startDate-i>6e4))return this.members
1158
1165
  this._startDate=i,this.members=yield this.ellaSparse.array(((e={},i={})=>{const o=t?`label:'${t}'+`:"",l=s?{paid:s}:{},d=a?{search:a}:{},u=r?`${r} desc`:"created_at desc"
1159
1166
  return i=Object.assign({order:u,limit:e.length,page:e.page,filter:`${o}created_at:<='${n.default.utc(this._startDate).format("YYYY-MM-DD HH:mm:ss")}'`},l,d,i),this.store.query("member",i).then((e=>({data:e,total:e.meta.pagination.total})))}),{limit:50})}*deleteMembersTask(){let{label:e,paidParam:t,searchParam:n}=this,s=e?`label:${e}`:"",a=t?{paid:t}:{},r=n?{search:n}:{},i=e||t||n?{}:{all:!0},o=new URLSearchParams(Object.assign({},{filter:s},a,r,i)),l=`${this.ghostPaths.url.api("members")}?${o}`,d=yield this.ajax.del(l)
1160
- return this.store.unloadAll("member"),this.reload(),d.meta.stats}resetSearch(){this.searchText=""}reload(){this.membersStats.invalidate(),this.membersStats.fetch(),this.fetchMembersTask.perform()}},R=ae((z=te).prototype,"ajax",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=ae(z.prototype,"config",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=ae(z.prototype,"ellaSparse",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=ae(z.prototype,"feature",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=ae(z.prototype,"ghostPaths",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=ae(z.prototype,"membersStats",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=ae(z.prototype,"store",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=ae(z.prototype,"members",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),W=ae(z.prototype,"searchText",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),K=ae(z.prototype,"searchParam",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),Y=ae(z.prototype,"paidParam",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),G=ae(z.prototype,"label",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),J=ae(z.prototype,"orderParam",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Z=ae(z.prototype,"modalLabel",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Q=ae(z.prototype,"showLabelModal",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),X=ae(z.prototype,"showDeleteMembersModal",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),ee=ae(z.prototype,"_availableLabels",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),ae(z.prototype,"refreshData",[k],Object.getOwnPropertyDescriptor(z.prototype,"refreshData"),z.prototype),ae(z.prototype,"changeOrder",[x],Object.getOwnPropertyDescriptor(z.prototype,"changeOrder"),z.prototype),ae(z.prototype,"search",[P],Object.getOwnPropertyDescriptor(z.prototype,"search"),z.prototype),ae(z.prototype,"exportData",[j],Object.getOwnPropertyDescriptor(z.prototype,"exportData"),z.prototype),ae(z.prototype,"changeLabel",[T],Object.getOwnPropertyDescriptor(z.prototype,"changeLabel"),z.prototype),ae(z.prototype,"addLabel",[M],Object.getOwnPropertyDescriptor(z.prototype,"addLabel"),z.prototype),ae(z.prototype,"editLabel",[S],Object.getOwnPropertyDescriptor(z.prototype,"editLabel"),z.prototype),ae(z.prototype,"toggleLabelModal",[O],Object.getOwnPropertyDescriptor(z.prototype,"toggleLabelModal"),z.prototype),ae(z.prototype,"changePaidParam",[C],Object.getOwnPropertyDescriptor(z.prototype,"changePaidParam"),z.prototype),ae(z.prototype,"toggleDeleteMembersModal",[A],Object.getOwnPropertyDescriptor(z.prototype,"toggleDeleteMembersModal"),z.prototype),ae(z.prototype,"deleteMembers",[D],Object.getOwnPropertyDescriptor(z.prototype,"deleteMembers"),z.prototype),ae(z.prototype,"searchTask",[I],Object.getOwnPropertyDescriptor(z.prototype,"searchTask"),z.prototype),ae(z.prototype,"fetchLabelsTask",[a.task],Object.getOwnPropertyDescriptor(z.prototype,"fetchLabelsTask"),z.prototype),ae(z.prototype,"fetchMembersTask",[N],Object.getOwnPropertyDescriptor(z.prototype,"fetchMembersTask"),z.prototype),ae(z.prototype,"deleteMembersTask",[U],Object.getOwnPropertyDescriptor(z.prototype,"deleteMembersTask"),z.prototype),z)
1167
+ return this.store.unloadAll("member"),this.reload(),d.meta.stats}resetSearch(){this.searchText=""}reload(){this.membersStats.invalidate(),this.membersStats.fetch(),this.fetchMembersTask.perform()}},z=ae((R=te).prototype,"ajax",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=ae(R.prototype,"config",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=ae(R.prototype,"ellaSparse",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=ae(R.prototype,"feature",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=ae(R.prototype,"ghostPaths",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=ae(R.prototype,"membersStats",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=ae(R.prototype,"store",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=ae(R.prototype,"members",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),W=ae(R.prototype,"searchText",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),K=ae(R.prototype,"searchParam",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),Y=ae(R.prototype,"paidParam",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),G=ae(R.prototype,"label",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),J=ae(R.prototype,"orderParam",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Z=ae(R.prototype,"modalLabel",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Q=ae(R.prototype,"showLabelModal",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),X=ae(R.prototype,"showDeleteMembersModal",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),ee=ae(R.prototype,"_availableLabels",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),ae(R.prototype,"refreshData",[k],Object.getOwnPropertyDescriptor(R.prototype,"refreshData"),R.prototype),ae(R.prototype,"changeOrder",[x],Object.getOwnPropertyDescriptor(R.prototype,"changeOrder"),R.prototype),ae(R.prototype,"search",[P],Object.getOwnPropertyDescriptor(R.prototype,"search"),R.prototype),ae(R.prototype,"exportData",[j],Object.getOwnPropertyDescriptor(R.prototype,"exportData"),R.prototype),ae(R.prototype,"changeLabel",[T],Object.getOwnPropertyDescriptor(R.prototype,"changeLabel"),R.prototype),ae(R.prototype,"addLabel",[M],Object.getOwnPropertyDescriptor(R.prototype,"addLabel"),R.prototype),ae(R.prototype,"editLabel",[S],Object.getOwnPropertyDescriptor(R.prototype,"editLabel"),R.prototype),ae(R.prototype,"toggleLabelModal",[O],Object.getOwnPropertyDescriptor(R.prototype,"toggleLabelModal"),R.prototype),ae(R.prototype,"changePaidParam",[C],Object.getOwnPropertyDescriptor(R.prototype,"changePaidParam"),R.prototype),ae(R.prototype,"toggleDeleteMembersModal",[A],Object.getOwnPropertyDescriptor(R.prototype,"toggleDeleteMembersModal"),R.prototype),ae(R.prototype,"deleteMembers",[D],Object.getOwnPropertyDescriptor(R.prototype,"deleteMembers"),R.prototype),ae(R.prototype,"searchTask",[I],Object.getOwnPropertyDescriptor(R.prototype,"searchTask"),R.prototype),ae(R.prototype,"fetchLabelsTask",[a.task],Object.getOwnPropertyDescriptor(R.prototype,"fetchLabelsTask"),R.prototype),ae(R.prototype,"fetchMembersTask",[U],Object.getOwnPropertyDescriptor(R.prototype,"fetchMembersTask"),R.prototype),ae(R.prototype,"deleteMembersTask",[N],Object.getOwnPropertyDescriptor(R.prototype,"deleteMembersTask"),R.prototype),R)
1161
1168
  e.default=ie})),define("ghost-admin/controllers/members/import",["exports","ghost-admin/helpers/reset-query-params"],(function(e,t){var n,s,a,r,i,o,l,d
1162
1169
  function u(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function m(e,t,n,s,a){var r={}
1163
1170
  return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
@@ -1693,14 +1700,14 @@ var n=t.default.extend({buildRouteInfoMetadata:()=>({titleToken:"About"})})
1693
1700
  e.default=n})),define("ghost-admin/routes/application",["exports","ember-simple-auth/mixins/application-route-mixin","ember-simple-auth/configuration","ghost-admin/mixins/shortcuts-route","ghost-admin/utils/ctrl-or-cmd","ghost-admin/utils/window-proxy","ember-ajax/errors","ghost-admin/services/ajax"],(function(e,t,n,s,a,r,i,o){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1694
1701
  let l={esc:{action:"closeMenus",scope:"default"}}
1695
1702
  l[`${a.default}+s`]={action:"save",scope:"all"}
1696
- var d=Ember.Route.extend(t.default,s.default,{ajax:Ember.inject.service(),config:Ember.inject.service(),feature:Ember.inject.service(),ghostPaths:Ember.inject.service(),notifications:Ember.inject.service(),router:Ember.inject.service(),settings:Ember.inject.service(),tour:Ember.inject.service(),ui:Ember.inject.service(),whatsNew:Ember.inject.service(),shortcuts:l,routeAfterAuthentication:"home",init(){this._super(...arguments),this.router.on("routeDidChange",(()=>{this.notifications.displayDelayed()}))},beforeModel(){return this.config.fetchUnauthenticated()},afterModel(e,t){if(this._super(...arguments),this.get("session.isAuthenticated"))return this.set("appLoadTransition",t),t.send("loadServerNotifications"),Ember.RSVP.all([this.config.fetchAuthenticated(),this.feature.fetch(),this.settings.fetch(),this.tour.fetchViewed()]).then((e=>(this._appLoaded=!0,this.whatsNew.fetchLatest.perform(),e)))
1703
+ var d=Ember.Route.extend(t.default,s.default,{ajax:Ember.inject.service(),config:Ember.inject.service(),feature:Ember.inject.service(),ghostPaths:Ember.inject.service(),notifications:Ember.inject.service(),router:Ember.inject.service(),settings:Ember.inject.service(),tour:Ember.inject.service(),ui:Ember.inject.service(),whatsNew:Ember.inject.service(),billing:Ember.inject.service(),shortcuts:l,routeAfterAuthentication:"home",init(){this._super(...arguments),this.router.on("routeDidChange",(()=>{this.notifications.displayDelayed()}))},beforeModel(){return this.config.fetchUnauthenticated()},afterModel(e,t){if(this._super(...arguments),this.get("session.isAuthenticated"))return this.set("appLoadTransition",t),t.send("loadServerNotifications"),Ember.RSVP.all([this.config.fetchAuthenticated(),this.feature.fetch(),this.settings.fetch(),this.tour.fetchViewed()]).then((e=>(this._appLoaded=!0,this.whatsNew.fetchLatest.perform(),e)))
1697
1704
  this._appLoaded=!0},actions:{closeMenus(){this.ui.closeMenus()},didTransition(){this.set("appLoadTransition",null),this.send("closeMenus")},signedIn(){this.notifications.clearAll(),this.send("loadServerNotifications",!0)},authorizationFailed(){r.default.replaceLocation(n.default.rootURL)},loadServerNotifications(e){this.get("session.isAuthenticated")&&this.get("session.user").then((t=>{t.get("isAuthorOrContributor")||this.store.findAll("notification",{reload:!0}).then((t=>{t.forEach((t=>{t.get("top")||t.get("custom")?this.notifications.handleNotification(t,e):this.upgradeStatus.handleUpgradeNotification(t)}))}))}))},save:function(){return this},error(e,t){if((0,i.isUnauthorizedError)(e))return!1
1698
1705
  if((0,i.isNotFoundError)(e)){t&&t.abort()
1699
1706
  let e=t.to,n=this.router,s=[]
1700
1707
  for(let t of Object.keys(e.params))s.push(e.params[t])
1701
1708
  let a=n.urlFor(e.name,...s).replace(/^#\//,"").replace(/^\//,"").replace(/^ghost\//,"")
1702
1709
  return this.replaceWith("error404",a)}return(!(0,o.isVersionMismatchError)(e)||(t&&t.abort(),this.upgradeStatus.requireUpgrade(),!this._appLoaded))&&((!(0,o.isMaintenanceError)(e)||(t&&t.abort(),this.upgradeStatus.maintenanceAlert(),!this._appLoaded))&&!(((0,i.isAjaxError)(e)||e&&e.payload&&Ember.isArray(e.payload.errors))&&(this.notifications.showAPIError(e),!t)))}},sessionAuthenticated(){this.get("session.skipAuthSuccessHandler")||(this._super(...arguments),this.get("session.user").then((e=>{this.send("signedIn",e)})))},sessionInvalidated(){let e=this.appLoadTransition
1703
- e?e.send("authorizationFailed"):Ember.run.scheduleOnce("routerTransitions",this,"send","authorizationFailed")}})
1710
+ e?e.send("authorizationFailed"):Ember.run.scheduleOnce("routerTransitions",this,"send","authorizationFailed"),this.config.get("forceUpgrade")&&this.billing.openBillingWindow(this.router.currentURL,"/pro")}})
1704
1711
  e.default=d})),define("ghost-admin/routes/authenticated",["exports","ember-simple-auth/mixins/authenticated-route-mixin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1705
1712
  var n=Ember.Route.extend(t.default,{authenticationRoute:"signin"})
1706
1713
  e.default=n})),define("ghost-admin/routes/editor",["exports","jquery","ghost-admin/routes/authenticated","ghost-admin/mixins/shortcuts-route","ghost-admin/utils/ctrl-or-cmd"],(function(e,t,n,s,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
@@ -1756,10 +1763,10 @@ break
1756
1763
  case"scheduled":t="scheduled"}return{status:t}},_filterString:e=>Object.keys(e).map((t=>{let n=e[t]
1757
1764
  if(!Ember.isBlank(n))return`${t}:${e[t]}`})).compact().join("+")})
1758
1765
  e.default=n})),define("ghost-admin/routes/pro",["exports","ghost-admin/routes/authenticated"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1759
- var n=t.default.extend({billing:Ember.inject.service(),ui:Ember.inject.service(),queryParams:{action:{refreshModel:!0}},beforeModel(e){return this._super(...arguments),this.session.user.then((t=>{if(!t.isOwner)return this.transitionTo("home")
1760
- this.billing.set("previousTransition",e)}))},model(e){e.action&&this.billing.set("action",e.action),this.billing.setBillingWindowOpen(!0)},activate(){this.ui.set("showTour",!1)},deactivate(){this.ui.set("showTour",!0)},actions:{willTransition(e){let t=!1
1766
+ var n=t.default.extend({billing:Ember.inject.service(),ui:Ember.inject.service(),session:Ember.inject.service(),config:Ember.inject.service(),queryParams:{action:{refreshModel:!0}},beforeModel(e){return this._super(...arguments),this.session.user.then((t=>{if(!t.get("isOwner")&&!this.config.get("forceUpgrade"))return this.transitionTo("home")
1767
+ this.billing.set("previousTransition",e)}))},model(e){e.action&&this.billing.set("action",e.action),this.billing.toggleProWindow(!0)},activate(){this.ui.set("showTour",!1)},deactivate(){this.ui.set("showTour",!0)},actions:{willTransition(e){let t=!1
1761
1768
  if(e){let n="string"==typeof e.to?e.to:e.intent?e.intent.url:""
1762
- null!=n&&n.includes("/pro")&&(t=!0)}this.billing.setBillingWindowOpen(t)}},buildRouteInfoMetadata:()=>({titleToken:"Ghost(Pro)"})})
1769
+ null!=n&&n.includes("/pro")&&(t=!0)}this.billing.toggleProWindow(t)}},buildRouteInfoMetadata:()=>({titleToken:"Ghost(Pro)"})})
1763
1770
  e.default=n})),define("ghost-admin/routes/reset",["exports","ghost-admin/mixins/unauthenticated-route-mixin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1764
1771
  var n=Ember.Route.extend(t.default,{notifications:Ember.inject.service(),session:Ember.inject.service(),beforeModel(){this.get("session.isAuthenticated")&&this.notifications.showAlert("You can't reset your password while you're signed in.",{type:"warn",delayed:!0,key:"password.reset.signed-in"}),this._super(...arguments)},setupController(e,t){e.token=t.token},deactivate(){this._super(...arguments),this.controller.clearData()},buildRouteInfoMetadata:()=>({bodyClasses:["unauthenticated-route"]})})
1765
1772
  e.default=n})),define("ghost-admin/routes/settings/code-injection",["exports","ghost-admin/routes/authenticated","ghost-admin/mixins/current-user-settings"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
@@ -1934,13 +1941,13 @@ e&&(Ember.isArray(e)||(e=[e]),n.errors=e.map((function(e){return"string"==typeof
1934
1941
  k.reopen({contentType:"application/json; charset=UTF-8"})
1935
1942
  var x=k
1936
1943
  e.default=x})),define("ghost-admin/services/billing",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1937
- var t=Ember.Service.extend({router:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),billingRouteRoot:"#/pro",billingWindowOpen:!1,subscription:null,previousRoute:null,init(){this._super(...arguments),this.config.get("billingUrl")&&window.addEventListener("message",(e=>{e&&e.data&&e.data.route&&this.handleRouteChangeInIframe(e.data.route)}))},handleRouteChangeInIframe(e){if(this.get("billingWindowOpen")){let t=this.get("billingRouteRoot")
1938
- "/"!==e&&(t+=e),window.location.hash!==t&&window.history.replaceState(window.history.state,"",t)}},getIframeURL(){let e=this.config.get("billingUrl")
1944
+ var t=Ember.Service.extend({router:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),store:Ember.inject.service(),billingRouteRoot:"#/pro",billingWindowOpen:!1,subscription:null,previousRoute:null,action:null,ownerUser:null,init(){this._super(...arguments),this.config.get("billingUrl")&&window.addEventListener("message",(e=>{e&&e.data&&e.data.route&&this.handleRouteChangeInIframe(e.data.route)}))},handleRouteChangeInIframe(e){if(this.get("billingWindowOpen")){let t=this.get("billingRouteRoot")
1945
+ "/"!==e&&(t+=e),window.location.hash!==t&&window.history.replaceState(window.history.state,"",t)}},getIframeURL(){this.getOwnerUser()
1946
+ let e=this.config.get("billingUrl")
1939
1947
  if(window.location.hash&&window.location.hash.includes(this.get("billingRouteRoot"))){let t=window.location.hash.replace(this.get("billingRouteRoot"),"")
1940
- t&&(e+=t)}return e},setBillingWindowOpen(e){let t=this.getBillingIframe()
1941
- t&&e&&t.contentWindow.location.replace(this.getIframeURL()),this.set("billingWindowOpen",e)},openBillingWindow(e,t){this.set("previousRoute",e),window.location.hash=t||"/pro",this.router.transitionTo(t||"/pro")},closeBillingWindow(){this.set("billingWindowOpen",!1)
1942
- let e=this.get("previousRoute")||"/"
1943
- this.router.transitionTo(e)},getBillingIframe:()=>document.getElementById("billing-frame")})
1948
+ t&&(e+=t)}return e},async getOwnerUser(){if(!this.get("ownerUser")){let e=this.store.peekAll("user").findBy("isOwner",!0)
1949
+ e||(await this.store.findAll("user",{reload:!0}),e=this.store.peekAll("user").findBy("isOwner",!0)),this.set("ownerUser",e)}return this.get("ownerUser")},sendRouteUpdate(){const e=this.get("action")
1950
+ e&&("checkout"===e&&this.getBillingIframe().contentWindow.postMessage({query:"routeUpdate",response:this.get("checkoutRoute")},"*"),this.set("action",null))},toggleProWindow(e){this.get("billingWindowOpen")&&e&&!this.get("action")||(this.sendRouteUpdate(),this.set("billingWindowOpen",e))},openBillingWindow(e,t){this.getOwnerUser(),this.get("billingWindowOpen")||(this.set("previousRoute",e),window.location.hash=t||"/pro",this.sendRouteUpdate(),this.router.transitionTo(t||"/pro"))},getBillingIframe(){return this.getOwnerUser(),document.getElementById("billing-frame")}})
1944
1951
  e.default=t})),define("ghost-admin/services/clock",["exports","ghost-admin/config/environment","moment"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1945
1952
  var s=Ember.Service.extend({second:null,minute:null,hour:null,init(){this._super(...arguments),this.tick()},tick(){let e=(0,n.default)().utc()
1946
1953
  this.setProperties({second:e.seconds(),minute:e.minutes(),hour:e.hours()}),"test"!==t.default.environment&&Ember.run.later((()=>{this.tick()}),1e3)}})
@@ -2311,7 +2318,8 @@ return i}
2311
2318
  const t=/[aeiou]$/i,n=/[bcdfghjklmnpqrstvwxyz]$/i
2312
2319
  function s(e,t){var n,a,r,i=new Uint8Array(t)
2313
2320
  for(n in r=i,window.crypto.getRandomValues(r),i)if(Object.prototype.hasOwnProperty.call(i,n)&&(a=i[n])>e&&a<t)return a
2314
- return s(e,t)}})),define("ghost-admin/utils/route",[],(function(){Ember.Route.reopen({actions:{willTransition(e){return!this.get("upgradeStatus.isRequired")||(e.abort(),this.upgradeStatus.requireUpgrade(),!1)}}})})),define("ghost-admin/utils/titleize",["exports","ember-cli-string-helpers/utils/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/utils/window-proxy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
2321
+ return s(e,t)}})),define("ghost-admin/utils/route",[],(function(){Ember.Route.reopen({config:Ember.inject.service(),billing:Ember.inject.service(),router:Ember.inject.service(),actions:{willTransition(e){return this.get("upgradeStatus.isRequired")?(e.abort(),this.upgradeStatus.requireUpgrade(),!1):!this.config.get("forceUpgrade")||("pro.index"===(null===(t=e.to)||void 0===t?void 0:t.name)||"signout"===(null===(n=e.to)||void 0===n?void 0:n.name)||(e.abort(),this.billing.openBillingWindow(this.router.currentURL,"/pro"),!1))
2322
+ var t,n}}})})),define("ghost-admin/utils/titleize",["exports","ember-cli-string-helpers/utils/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/utils/window-proxy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
2315
2323
  var t={changeLocation(e){window.location=e},replaceLocation(e){window.location.replace(e)},replaceState(e,t,n){window.history.replaceState(e,t,n)}}
2316
2324
  e.default=t})),define("ghost-admin/validators/base",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
2317
2325
  var t=Ember.Object.extend({passed:!1,init(){this._super(...arguments),this.properties=this.properties||[]},check(e,t){return this.set("passed",!0),t&&this[t]?this[t](e):this.properties.forEach((t=>{this[t]&&this[t](e)})),this.passed},invalidate(){this.set("passed",!1)}})
@@ -41,7 +41,7 @@ function getMembersHelper() {
41
41
  const stripeDirectPublishableKey = settingsCache.get('stripe_publishable_key');
42
42
  const stripeConnectAccountId = settingsCache.get('stripe_connect_account_id');
43
43
 
44
- let membersHelper = `<script defer src="https://unpkg.com/@tryghost/portal@~0.15.0/umd/portal.min.js" data-ghost="${urlUtils.getSiteUrl()}"></script>`;
44
+ let membersHelper = `<script defer src="https://unpkg.com/@tryghost/portal@~0.16.0/umd/portal.min.js" data-ghost="${urlUtils.getSiteUrl()}"></script>`;
45
45
  membersHelper += (`<style> ${templateStyles}</style>`);
46
46
  if ((!!stripeDirectSecretKey && !!stripeDirectPublishableKey) || !!stripeConnectAccountId) {
47
47
  membersHelper += '<script async src="https://js.stripe.com/v3/"></script>';
@@ -11,7 +11,12 @@ module.exports = function url(options) {
11
11
  const absolute = options && options.hash.absolute && options.hash.absolute !== 'false';
12
12
  let outputUrl = getMetaDataUrl(this, absolute);
13
13
 
14
- outputUrl = encodeURI(decodeURI(outputUrl));
14
+ try {
15
+ outputUrl = encodeURI(decodeURI(outputUrl));
16
+ } catch (err) {
17
+ // Happens when the outputURL contains an invalid URI character like "%%" or "%80"
18
+ return new SafeString('');
19
+ }
15
20
 
16
21
  return new SafeString(outputUrl);
17
22
  };
@@ -22,8 +22,9 @@ module.exports = {
22
22
  clientExtensions: config.get('clientExtensions') || {},
23
23
  enableDeveloperExperiments: config.get('enableDeveloperExperiments') || false,
24
24
  stripeDirect: config.get('stripeDirect'),
25
- mailgunIsConfigured: config.get('bulkEmail') && config.get('bulkEmail').mailgun,
26
- emailAnalytics: config.get('emailAnalytics')
25
+ mailgunIsConfigured: !!(config.get('bulkEmail') && config.get('bulkEmail').mailgun),
26
+ emailAnalytics: config.get('emailAnalytics'),
27
+ forceUpgrade: config.get('host_settings:forceUpgrade') || false
27
28
  };
28
29
  if (billingUrl) {
29
30
  response.billingUrl = billingUrl;
@@ -23,7 +23,8 @@ module.exports = {
23
23
  enableDeveloperExperiments: config.get('enableDeveloperExperiments') || false,
24
24
  stripeDirect: config.get('stripeDirect'),
25
25
  mailgunIsConfigured: config.get('bulkEmail') && config.get('bulkEmail').mailgun,
26
- emailAnalytics: config.get('emailAnalytics')
26
+ emailAnalytics: config.get('emailAnalytics'),
27
+ forceUpgrade: config.get('host_settings:forceUpgrade') || false
27
28
  };
28
29
  if (billingUrl) {
29
30
  response.billingUrl = billingUrl;
@@ -85,6 +85,8 @@ class OEmbed {
85
85
  }
86
86
 
87
87
  async fetchBookmarkData(url) {
88
+ // Metascraper doesn't handle leading/trailing whitespace
89
+ url = url.trim();
88
90
  const metascraper = require('metascraper')([
89
91
  require('metascraper-url')(),
90
92
  require('metascraper-title')(),
@@ -154,6 +156,10 @@ class OEmbed {
154
156
  }
155
157
 
156
158
  fetchOembedData(_url, cardType) {
159
+ // Trimming solves the difference of url validation between `new URL(url)`
160
+ // and metascraper.
161
+ _url = _url.trim();
162
+
157
163
  // parse the url then validate the protocol and host to make sure it's
158
164
  // http(s) and not an IP address or localhost to avoid potential access to
159
165
  // internal network endpoints
@@ -1,5 +1,7 @@
1
1
  const debug = require('ghost-ignition').debug('web:admin:controller');
2
2
  const path = require('path');
3
+ const fs = require('fs');
4
+ const crypto = require('crypto');
3
5
  const config = require('../../../shared/config');
4
6
  const updateCheck = require('../../update-check');
5
7
  const logging = require('../../../shared/logging');
@@ -25,6 +27,15 @@ module.exports = function adminController(req, res) {
25
27
  const templatePath = path.resolve(config.get('paths').adminViews, defaultTemplate);
26
28
  const headers = {};
27
29
 
30
+ // Generate our own ETag header
31
+ // `sendFile` by default uses filesize+lastmod date to generate an etag.
32
+ // That doesn't work for admin templates because the filesize doesn't change between versions
33
+ // and `npm pack` sets a fixed lastmod date for every file meaning the default etag never changes
34
+ const fileBuffer = fs.readFileSync(templatePath);
35
+ const hashSum = crypto.createHash('md5');
36
+ hashSum.update(fileBuffer);
37
+ headers.ETag = hashSum.digest('hex');
38
+
28
39
  if (config.get('adminFrameProtection')) {
29
40
  headers['X-Frame-Options'] = 'sameorigin';
30
41
  }
@@ -53,7 +53,7 @@
53
53
 
54
54
 
55
55
  <script src="assets/vendor.min-1ea21c7abed44258b1662cf1b103c007.js"></script>
56
- <script src="assets/ghost.min-4afc9844644b2b1c1f0461f106592e9c.js"></script>
56
+ <script src="assets/ghost.min-c2286c1da1671730ae28b70205449d2f.js"></script>
57
57
 
58
58
  </body>
59
59
  </html>
@@ -53,7 +53,7 @@
53
53
 
54
54
 
55
55
  <script src="assets/vendor.min-1ea21c7abed44258b1662cf1b103c007.js"></script>
56
- <script src="assets/ghost.min-4afc9844644b2b1c1f0461f106592e9c.js"></script>
56
+ <script src="assets/ghost.min-c2286c1da1671730ae28b70205449d2f.js"></script>
57
57
 
58
58
  </body>
59
59
  </html>
@@ -18,6 +18,9 @@ module.exports = function setupMembersApp() {
18
18
  // Entire app is behind labs flag
19
19
  membersApp.use(shared.middlewares.labs.members);
20
20
 
21
+ // Members API shouldn't be cached
22
+ membersApp.use(shared.middlewares.cacheControl('private'));
23
+
21
24
  // Support CORS for requests from the frontend
22
25
  const siteUrl = new URL(urlUtils.getSiteUrl());
23
26
  membersApp.use(cors(siteUrl.origin));
@@ -34,6 +37,7 @@ module.exports = function setupMembersApp() {
34
37
  // We don't want to add global bodyParser middleware as that interfers with stripe webhook requests on - `/webhooks`.
35
38
  membersApp.get('/api/member', middleware.getMemberData);
36
39
  membersApp.put('/api/member', bodyParser.json({limit: '1mb'}), middleware.updateMemberData);
40
+ membersApp.post('/api/member/email', bodyParser.json({limit: '1mb'}), (req, res) => membersService.api.middleware.updateEmailAddress(req, res));
37
41
  membersApp.get('/api/session', middleware.getIdentityToken);
38
42
  membersApp.delete('/api/session', middleware.deleteSession);
39
43
  membersApp.get('/api/site', middleware.getMemberSiteData);
@@ -1,5 +1,6 @@
1
1
  const _ = require('lodash');
2
2
  const path = require('path');
3
+ const {GhostError} = require('@tryghost/errors');
3
4
  const imageTransform = require('@tryghost/image-transform');
4
5
  const storage = require('../../../adapters/storage');
5
6
  const activeTheme = require('../../../../frontend/services/themes/active');
@@ -100,6 +101,12 @@ module.exports = function (req, res, next) {
100
101
  return storageInstance.read({path: storagePath});
101
102
  })
102
103
  .then((originalImageBuffer) => {
104
+ if (originalImageBuffer.length <= 0) {
105
+ throw new GhostError({
106
+ errorType: 'NoContentError',
107
+ statusCode: 204
108
+ });
109
+ }
103
110
  return imageTransform.resizeFromBuffer(originalImageBuffer, imageDimensionConfig);
104
111
  })
105
112
  .then((resizedImageBuffer) => {
@@ -108,7 +115,7 @@ module.exports = function (req, res, next) {
108
115
  }).then(() => {
109
116
  next();
110
117
  }).catch(function (err) {
111
- if (err.code === 'SHARP_INSTALLATION') {
118
+ if (err.code === 'SHARP_INSTALLATION' || err.code === 'IMAGE_PROCESSING' || err.errorType === 'NoContentError') {
112
119
  return redirectToOriginal();
113
120
  }
114
121
  next(err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "3.42.5",
3
+ "version": "3.42.9",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -56,7 +56,7 @@
56
56
  "@tryghost/kg-markdown-html-renderer": "3.0.0",
57
57
  "@tryghost/kg-mobiledoc-html-renderer": "3.0.1",
58
58
  "@tryghost/magic-link": "0.6.4",
59
- "@tryghost/members-api": "0.37.12",
59
+ "@tryghost/members-api": "0.37.13",
60
60
  "@tryghost/members-csv": "0.4.2",
61
61
  "@tryghost/members-ssr": "0.8.8",
62
62
  "@tryghost/mw-session-from-token": "0.1.14",
package/yarn.lock CHANGED
@@ -553,10 +553,10 @@
553
553
  jsonwebtoken "^8.5.1"
554
554
  lodash "^4.17.15"
555
555
 
556
- "@tryghost/members-api@0.37.12":
557
- version "0.37.12"
558
- resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-0.37.12.tgz#53660d77b2116b991b3e2e9633ec0d9d01d9249a"
559
- integrity sha512-16yLqRLjInmwgEnQe0mSeGj6aM8wch2ZoZEMCuj1aaTdwZExtvtB3qbgX+zYz3Nblr53VdQe9Sz0J4U4IwXDAA==
556
+ "@tryghost/members-api@0.37.13":
557
+ version "0.37.13"
558
+ resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-0.37.13.tgz#fa43449b64ceab645195649066b1fdb748d89f23"
559
+ integrity sha512-6d3QDbXaRW4eTnoX5FOqb7JlSiVmm99QHlaygsb3dNYcrT3/q75Ro0TA5KgoTp9x3vde1Gtwr+U76plwGExapQ==
560
560
  dependencies:
561
561
  "@tryghost/magic-link" "^0.6.7"
562
562
  bluebird "^3.5.4"