{"version":3,"file":"RubyGemsCacheDiagram.DSZv9KWD.mjs","names":["useState"],"sources":["https:/framerusercontent.com/modules/i7dFb4H5tjTU2UKXrahW/yxnyJaCjivfvDNr0hLmu/RubyGemsCacheDiagram.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useState}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";const FONT=\"'National Park', Inter, 'Helvetica Neue', sans-serif\";const W=740;const H=404;// lifelines (sequence-diagram actors), left -> right\nconst ACTORS=[{key:\"a\",label:\"User A\",sub:\"victim\",x:96},{key:\"edge\",label:\"Fastly edge\",sub:\"cache\",x:286},{key:\"origin\",label:\"rubygems.org\",sub:\"origin\",x:476},{key:\"b\",label:\"User B\",sub:\"attacker\",x:648}];// one message (arrow) per step\nconst STEPS=[{msg:{from:0,to:2,y:96,label:\"gem signin — GET /api/v1/api_key\"},title:\"User A signs in\",body:\"The gem CLI sends an authenticated GET for the API key.\"},{msg:{from:2,to:0,y:152,label:\"200 — responds with API key\"},note:{actor:1,y:200,w:176,text:\"cached \\xb7 keyed on URL\"},title:\"The edge caches the response\",body:\"Fastly caches the token response — keyed on the URL, ignoring the auth header.\"},{msg:{from:3,to:1,y:252,label:\"GET /api/v1/api_key (same URL)\",danger:true},title:\"User B hits the same edge\",body:\"From the same region, User B requests the exact same URL.\"},{msg:{from:1,to:3,y:304,label:\"200 (cache HIT) — victim's token\",danger:true},title:\"Cache hit — no auth check\",body:\"The edge replays User A's cached response to User B. No credentials.\"},{note:{actor:3,y:356,w:208,text:\"valid token → push / yank gems\",danger:true},title:\"User B holds a live token\",body:\"A valid supply-chain credential, obtained with an anonymous request.\"}];/**\n * RubyGems Cache Attack\n *\n * Click-through sequence diagram of the RubyGems edge-cache token leak.\n *\n * @framerIntrinsicWidth 680\n * @framerIntrinsicHeight 480\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight auto\n */export default function RubyGemsCacheDiagram(props){const{ink=\"#42332A\",accent=\"#E77543\",danger=\"#B44441\",background=\"rgba(0,0,0,0)\"}=props;const isStatic=useIsStaticRenderer();const[step,setStep]=useState(0);const active=isStatic?STEPS.length-1:step;const hair=`${ink}33`;const T=\"all 350ms ease\";const actorActive=i=>{const s=STEPS[active];if(s.msg&&(s.msg.from===i||s.msg.to===i))return true;if(s.note&&s.note.actor===i)return true;return false;};const arrow=(m,on,revealed)=>{const x1=ACTORS[m.from].x;const x2=ACTORS[m.to].x;const dir=x2>x1?1:-1;const color=on?m.danger?danger:accent:ink;const opacity=revealed?on?1:.3:0;const w=on?2.4:1.2;const head=8;return /*#__PURE__*/_jsxs(\"g\",{style:{opacity,transition:T},children:[/*#__PURE__*/_jsx(\"line\",{x1:x1,y1:m.y,x2:x2-dir*3,y2:m.y,style:{stroke:color,strokeWidth:w,transition:T},strokeLinecap:\"round\"}),/*#__PURE__*/_jsx(\"path\",{d:`M ${x2} ${m.y} L ${x2-dir*head} ${m.y-head*.66} L ${x2-dir*head} ${m.y+head*.66} Z`,style:{fill:color,transition:T}}),/*#__PURE__*/_jsx(\"text\",{x:(x1+x2)/2,y:m.y-10,textAnchor:\"middle\",style:{fill:ink,opacity:on?1:.5,fontFamily:FONT,fontSize:13,fontWeight:on?600:400,transition:T},children:m.label})]});};const note=(n,on,revealed)=>{const cx=ACTORS[n.actor].x;const w=n.w;const boxX=Math.max(8,Math.min(cx-w/2,W-w-8));const textX=boxX+w/2;const color=n.danger?danger:accent;return /*#__PURE__*/_jsxs(\"g\",{style:{opacity:revealed?on?1:.3:0,transition:T},children:[/*#__PURE__*/_jsx(\"rect\",{x:boxX,y:n.y-16,width:w,height:32,rx:9,style:{fill:on?`${color}14`:\"none\",stroke:on?color:hair,strokeWidth:on?1.75:1,transition:T}}),/*#__PURE__*/_jsx(\"text\",{x:textX,y:n.y+5,textAnchor:\"middle\",style:{fill:ink,opacity:on?1:.55,fontFamily:FONT,fontSize:12.5,fontWeight:on?600:400,transition:T},children:n.text})]});};return /*#__PURE__*/_jsxs(\"div\",{style:{...props.style,position:\"relative\",width:\"100%\",background,padding:\"8px 0 4px\",boxSizing:\"border-box\"},children:[/*#__PURE__*/_jsxs(\"svg\",{viewBox:`0 0 ${W} ${H}`,width:\"100%\",role:\"img\",\"aria-label\":`${STEPS[active].title}. ${STEPS[active].body}`,style:{display:\"block\"},children:[ACTORS.map((a,i)=>{const on=actorActive(i);return /*#__PURE__*/_jsxs(\"g\",{children:[/*#__PURE__*/_jsx(\"line\",{x1:a.x,y1:60,x2:a.x,y2:H-26,style:{stroke:hair,strokeWidth:1,strokeDasharray:\"3 5\"}}),/*#__PURE__*/_jsx(\"text\",{x:a.x,y:28,textAnchor:\"middle\",style:{fill:ink,opacity:on?1:.6,fontFamily:FONT,fontSize:15,fontWeight:700,transition:T},children:a.label}),/*#__PURE__*/_jsx(\"text\",{x:a.x,y:45,textAnchor:\"middle\",style:{fill:ink,opacity:on?.7:.4,fontFamily:FONT,fontSize:11.5,transition:T},children:a.sub})]},a.key);}),STEPS.map((s,i)=>{const revealed=i<=active;const on=!isStatic&&i===active;return /*#__PURE__*/_jsxs(\"g\",{children:[s.msg&&arrow(s.msg,on,revealed),s.note&&note(s.note,on,revealed)]},i);})]}),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:8,marginTop:12,padding:\"0 4px\",flexWrap:\"wrap\"},children:[STEPS.map((_,i)=>{const on=!isStatic&&i===step;return /*#__PURE__*/_jsx(\"button\",{onClick:isStatic?undefined:()=>setStep(i),\"aria-label\":`Step ${i+1}`,style:{width:30,height:30,borderRadius:\"50%\",cursor:isStatic?\"default\":\"pointer\",fontFamily:FONT,fontSize:13,fontWeight:700,color:on?\"#FFFFFF\":ink,background:on?accent:\"transparent\",border:`1.5px solid ${on?accent:hair}`,transition:T},children:i+1},i);}),/*#__PURE__*/_jsx(\"div\",{style:{flex:1}}),/*#__PURE__*/_jsx(\"button\",{onClick:isStatic?undefined:()=>setStep(s=>Math.max(0,s-1)),\"aria-label\":\"Previous step\",style:{height:30,padding:\"0 13px\",borderRadius:15,cursor:isStatic?\"default\":\"pointer\",fontFamily:FONT,fontSize:15,color:ink,background:\"transparent\",border:`1.5px solid ${hair}`},children:\"‹\"}),/*#__PURE__*/_jsx(\"button\",{onClick:isStatic?undefined:()=>setStep(s=>Math.min(STEPS.length-1,s+1)),\"aria-label\":\"Next step\",style:{height:30,padding:\"0 13px\",borderRadius:15,cursor:isStatic?\"default\":\"pointer\",fontFamily:FONT,fontSize:15,color:ink,background:\"transparent\",border:`1.5px solid ${hair}`},children:\"›\"})]}),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",alignItems:\"baseline\",gap:10,marginTop:14,padding:\"0 4px\"},children:[/*#__PURE__*/_jsx(\"span\",{style:{fontFamily:FONT,color:accent,fontSize:12,fontWeight:700,letterSpacing:\"0.08em\"},children:`0${active+1}`}),/*#__PURE__*/_jsx(\"span\",{style:{fontFamily:FONT,color:ink,fontSize:15,fontWeight:700},children:STEPS[active].title})]}),/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:FONT,color:ink,opacity:.62,fontSize:13.5,marginTop:3,padding:\"0 4px\"},children:STEPS[active].body})]});}addPropertyControls(RubyGemsCacheDiagram,{ink:{type:ControlType.Color,title:\"Ink\",defaultValue:\"#42332A\"},accent:{type:ControlType.Color,title:\"Accent\",defaultValue:\"#E77543\"},danger:{type:ControlType.Color,title:\"Attacker\",defaultValue:\"#B44441\"},background:{type:ControlType.Color,title:\"Background\",defaultValue:\"rgba(0,0,0,0)\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"RubyGemsCacheDiagram\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"480\",\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"680\",\"framerSupportedLayoutHeight\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./RubyGemsCacheDiagram.map"],"mappings":"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"}