Files
nexus/sreweekly/articles/387/06-authentication-slowness-or-failure-to-load-duo-prompt-on-duo1.html
2026-09-12 17:23:01 +08:00

1947 lines
95 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- force IE browsers in compatibility mode to use their most aggressive rendering engine -->
<meta charset="utf-8">
<title>Duo Status - Authentication slowness or failure to load Duo Prompt on DUO1</title>
<meta name="description" content="Duo&#39;s Status Page - Authentication slowness or failure to load Duo Prompt on DUO1.">
<!-- Mobile viewport optimization -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
<!-- Time this page was rendered - http://purl.org/dc/terms/issued -->
<meta name="issued" content="1789192342">
<!-- Mobile IE allows us to activate ClearType technology for smoothing fonts for easy reading -->
<meta http-equiv="cleartype" content="on">
<!-- Atlassian Sans & Mono Fonts -->
<link
rel="preconnect"
href="https://ds-cdn.prod-east.frontend.public.atl-paas.net" />
<link
rel="preload"
href="https://ds-cdn.prod-east.frontend.public.atl-paas.net/assets/fonts/atlassian-sans/v3/AtlassianSans-latin.woff2"
as="font" type="font/woff2" crossorigin />
<link
rel="preload"
href="https://ds-cdn.prod-east.frontend.public.atl-paas.net/assets/font-rules/v5/atlassian-fonts.css"
as="style" crossorigin />
<style>
/* Dynamic Font Stack based on Feature Flag */
/* Using Atlassian Sans & Mono */
:root {
--font-stack-a: "Atlassian Sans", "Helvetica Neue", Helvetica, Arial, Sans-Serif;
--font-stack-b: "Atlassian Mono", "SFMono-Medium", "SF Mono", "Segoe UI Mono", "Roboto Mono", "Ubuntu Mono", Menlo, Consolas, Courier, monospace;
}
</style>
<link rel="shortcut icon" type="image/x-icon" href="//dka575ofm4ao0.cloudfront.net/pages-favicon_logos/original/2107/stringio.txt" />
<link rel="shortcut icon" href='//dka575ofm4ao0.cloudfront.net/pages-favicon_logos/original/2107/stringio.txt'>
<link rel="alternate" type="application/atom+xml" href="https://status.duo.com/history.atom" title="Duo Status History - Atom Feed">
<link rel="alternate" type="application/rss+xml" href="https://status.duo.com/history.rss" title="Duo Status History - RSS Feed">
<!-- Canonical Link to ensure that only the custom domain is indexed when present -->
<link rel="canonical" href="https://status.duo.com/incidents/rw7g0q7ztj8f">
<meta name="_globalsign-domain-verification" content="y_VzfckMy4iePo5oDJNivyYIjh8LffYa4jzUndm_bZ"/>
<link rel="alternate" type="application/atom+xml" title="ATOM" href="https://status.duo.com/history.atom" />
<!-- Le styles -->
<link rel="stylesheet" media="screen" href="https://dka575ofm4ao0.cloudfront.net/packs/0.6d587e2c8ae0df459ecd.css" />
<link rel="stylesheet" media="all" href="https://dka575ofm4ao0.cloudfront.net/assets/status/status_manifest-3975cac43f498cd81d991d1abc986307c014f9c6ec29a9abfeb3b0882674850a.css" />
<script src="https://dka575ofm4ao0.cloudfront.net/assets/jquery-3.5.1.min-729e416557a365062a8a20f0562f18aa171da57298005d392312670c706c68de.js"></script>
<script>
window.pageColorData = {"blue":"#3498DB","border":"#E0E0E0","body_background":"#F7F7F7","font":"#363F44","graph":"#3498DB","green":"#6BBF4E","light_font":"#54626A","link":"#1D69CC","orange":"#F26722","red":"#C24632","yellow":"#D9B216","no_data":"#B3BAC5"};
</script>
<style>
/* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */
body,
.layout-content.status.status-api .section .example-container .example-opener .color-secondary,
.grouped-items-selector,
.layout-content.status.status-full-history .history-nav a.current,
div[id^="subscribe-modal"] .modal-footer,
div[id^="subscribe-modal"],
div[id^="updates-dropdown"] .updates-dropdown-section,
#uptime-tooltip .tooltip-box {
background-color:#F7F7F7;
}
#uptime-tooltip .pointer-container .pointer-smaller {
border-bottom-color:#F7F7F7;
}
/* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */
body.status,
.color-primary,
.color-primary:hover,
.layout-content.status-index .status-day .update-title.impact-none a,
.layout-content.status-index .status-day .update-title.impact-none a:hover,
.layout-content.status-index .timeframes-container .timeframe.active,
.layout-content.status-full-history .month .incident-container .impact-none,
.layout-content.status.status-index .incidents-list .incident-title.impact-none a,
.incident-history .impact-none,
.layout-content.status .grouped-items-selector.inline .grouped-item.active,
.layout-content.status.status-full-history .history-nav a.current,
.layout-content.status.status-full-history .history-nav a:not(.current):hover,
div[id^="subscribe-modal"] .modal-header .close,
.grouped-item-label,
#uptime-tooltip .tooltip-box .tooltip-content .related-events .related-event a.related-event-link {
color:#363F44;
}
.layout-content.status.status-index .components-statuses .component-container .name {
color:#363F44;
color:rgba(54,63,68,.8);
}
/* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */
small,
.layout-content.status .table-row .date,
.color-secondary,
.layout-content.status .grouped-items-selector.inline .grouped-item,
.layout-content.status.status-full-history .history-footer .pagination a.disabled,
.layout-content.status.status-full-history .history-nav a,
#uptime-tooltip .tooltip-box .tooltip-content .related-events #related-event-header {
color:#54626A;
}
/* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */
body.status .layout-content.status .border-color,
hr,
.tooltip-base,
.markdown-display table,
div[id^="subscribe-modal"],
#uptime-tooltip .tooltip-box {
border-color:#E0E0E0;
}
div[id^="subscribe-modal"] .modal-footer,
.markdown-display table td {
border-top-color:#E0E0E0;
}
.markdown-display table td + td, .markdown-display table th + th {
border-left-color:#E0E0E0;
}
div[id^="subscribe-modal"] .modal-header,
#uptime-tooltip .pointer-container .pointer-larger {
border-bottom-color:#E0E0E0;
}
#uptime-tooltip .tooltip-box .outage-field {
/*
Generate the background-color for the outage-field from the css_body_background_color and css_border_color.
For the default background (#ffffff) and default css_border_color (#e0e0e0), use the luminosity of the default background with a magic number to arrive at
the original outage-field background color (#f4f5f7). I used the formula Target Color = Color * alpha + Background * (1 - alpha) to find the magic number of ~0.08.
For darker css_body_background_color, luminosity values are lower so alpha trends toward becoming transparent (thus outage-field background becomes same as css_body_background_color).
*/
background-color: rgba(224,224,224,0.3);
/*
outage-field border-color alpha is inverse to the luminosity of css_body_background_color.
That is to say, with a default white background this border is transparent, but on a black background, it's opaque css_border_color.
*/
border-color: rgba(224,224,224,0.0);
}
/* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */
.layout-content.status.status-index .status-day .update-title.impact-critical a,
.layout-content.status.status-index .status-day .update-title.impact-critical a:hover,
.layout-content.status.status-index .page-status.status-critical,
.layout-content.status.status-index .unresolved-incident.impact-critical .incident-title,
.flat-button.background-red {
background-color:#C24632;
}
.layout-content.status-index .components-statuses .component-container.status-red:after,
.layout-content.status-full-history .month .incident-container .impact-critical,
.layout-content.status-incident .incident-name.impact-critical,
.layout-content.status.status-index .incidents-list .incident-title.impact-critical a,
.status-red .icon-indicator,
.incident-history .impact-critical,
.components-container .component-inner-container.status-red .component-status,
.components-container .component-inner-container.status-red .icon-indicator {
color:#C24632;
}
.layout-content.status.status-index .unresolved-incident.impact-critical .updates {
border-color:#C24632;
}
/* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */
.layout-content.status.status-index .status-day .update-title.impact-major a,
.layout-content.status.status-index .status-day .update-title.impact-major a:hover,
.layout-content.status.status-index .page-status.status-major,
.layout-content.status.status-index .unresolved-incident.impact-major .incident-title {
background-color:#F26722;
}
.layout-content.status-index .components-statuses .component-container.status-orange:after,
.layout-content.status-full-history .month .incident-container .impact-major,
.layout-content.status-incident .incident-name.impact-major,
.layout-content.status.status-index .incidents-list .incident-title.impact-major a,
.status-orange .icon-indicator,
.incident-history .impact-major,
.components-container .component-inner-container.status-orange .component-status,
.components-container .component-inner-container.status-orange .icon-indicator {
color:#F26722;
}
.layout-content.status.status-index .unresolved-incident.impact-major .updates {
border-color:#F26722;
}
/* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */
.layout-content.status.status-index .status-day .update-title.impact-minor a,
.layout-content.status.status-index .status-day .update-title.impact-minor a:hover,
.layout-content.status.status-index .page-status.status-minor,
.layout-content.status.status-index .unresolved-incident.impact-minor .incident-title,
.layout-content.status.status-index .scheduled-incidents-container .tab {
background-color:#D9B216;
}
.layout-content.status-index .components-statuses .component-container.status-yellow:after,
.layout-content.status-full-history .month .incident-container .impact-minor,
.layout-content.status-incident .incident-name.impact-minor,
.layout-content.status.status-index .incidents-list .incident-title.impact-minor a,
.status-yellow .icon-indicator,
.incident-history .impact-minor,
.components-container .component-inner-container.status-yellow .component-status,
.components-container .component-inner-container.status-yellow .icon-indicator,
.layout-content.status.manage-subscriptions .confirmation-infobox .fa {
color:#D9B216;
}
.layout-content.status.status-index .unresolved-incident.impact-minor .updates,
.layout-content.status.status-index .scheduled-incidents-container {
border-color:#D9B216;
}
/* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */
.layout-content.status.status-index .status-day .update-title.impact-maintenance a,
.layout-content.status.status-index .status-day .update-title.impact-maintenance a:hover,
.layout-content.status.status-index .page-status.status-maintenance,
.layout-content.status.status-index .unresolved-incident.impact-maintenance .incident-title,
.layout-content.status.status-index .scheduled-incidents-container .tab {
background-color:#3498DB;
}
.layout-content.status-index .components-statuses .component-container.status-blue:after,
.layout-content.status-full-history .month .incident-container .impact-maintenance,
.layout-content.status-incident .incident-name.impact-maintenance,
.layout-content.status.status-index .incidents-list .incident-title.impact-maintenance a,
.status-blue .icon-indicator,
.incident-history .impact-maintenance,
.components-container .component-inner-container.status-blue .component-status,
.components-container .component-inner-container.status-blue .icon-indicator {
color:#3498DB;
}
.layout-content.status.status-index .unresolved-incident.impact-maintenance .updates,
.layout-content.status.status-index .scheduled-incidents-container {
border-color:#3498DB;
}
/* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */
.layout-content.status.status-index .page-status.status-none {
background-color:#6BBF4E;
}
.layout-content.status-index .components-statuses .component-container.status-green:after,
.status-green .icon-indicator,
.components-container .component-inner-container.status-green .component-status,
.components-container .component-inner-container.status-green .icon-indicator {
color:#6BBF4E;
}
/* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */
a,
a:hover,
.layout-content.status-index .page-footer span a:hover,
.layout-content.status-index .timeframes-container .timeframe:not(.active):hover,
.layout-content.status-incident .subheader a:hover {
color:#1D69CC;
}
.flat-button,
.masthead .updates-dropdown-container .show-updates-dropdown,
.layout-content.status-full-history .show-filter.open {
background-color:#1D69CC;
}
/* CUSTOM COLOR OVERRIDES FOR UPTIME SHOWCASE */
.components-section .components-uptime-link {
color: #54626a;
}
.layout-content.status .shared-partial.uptime-90-days-wrapper .legend .legend-item {
color: #54626a;
opacity: 1;
}
.layout-content.status .shared-partial.uptime-90-days-wrapper .legend .legend-item.light {
color: #54626a;
opacity: 1;
}
.layout-content.status .shared-partial.uptime-90-days-wrapper .legend .spacer {
background: #54626a;
opacity: 1;
}
</style>
<!-- custom css -->
<link rel="stylesheet" type="text/css" href="//dka575ofm4ao0.cloudfront.net/page_display_customizations-custom_css_externals/1882/external20241009-50-pui2ns.css">
<!-- polyfills -->
<script crossorigin="anonymous" src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.js"></script>
<!-- Le HTML5 shim -->
<!--[if lt IE 9]>
<script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- injection for static -->
<meta name="twitter:card" content="summary">
<meta name="twitter:site">
<meta name="twitter:creator">
<meta name="robots" content="noindex,nofollow">
<meta property="og:type" content="article">
<meta property="og:url" content="https://status.duo.com/incidents/rw7g0q7ztj8f">
<meta property="og:image" content="https://dka575ofm4ao0.cloudfront.net/assets/logos/favicon-2b86ed00cfa6258307d4a3d0c482fd733c7973f82de213143b24fc062c540367.png">
<meta property="og:title" content="Authentication slowness or failure to load Duo Prompt on DUO1">
<meta property="og:description">
</head>
<body class="status incident status-none sp-a11y-status-focus-visibility a11y-focus-indicators">
<style>
/* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */
body,
.layout-content.status.status-api .section .example-container .example-opener .color-secondary,
.grouped-items-selector,
.layout-content.status.status-full-history .history-nav a.current,
div[id^="subscribe-modal"] .modal-footer,
div[id^="subscribe-modal"],
div[id^="updates-dropdown"] .updates-dropdown-section,
#uptime-tooltip .tooltip-box {
background-color:#F7F7F7;
}
#uptime-tooltip .pointer-container .pointer-smaller {
border-bottom-color:#F7F7F7;
}
/* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */
body.status,
.color-primary,
.color-primary:hover,
.layout-content.status-index .status-day .update-title.impact-none a,
.layout-content.status-index .status-day .update-title.impact-none a:hover,
.layout-content.status-index .timeframes-container .timeframe.active,
.layout-content.status-full-history .month .incident-container .impact-none,
.layout-content.status.status-index .incidents-list .incident-title.impact-none a,
.incident-history .impact-none,
.layout-content.status .grouped-items-selector.inline .grouped-item.active,
.layout-content.status.status-full-history .history-nav a.current,
.layout-content.status.status-full-history .history-nav a:not(.current):hover,
div[id^="subscribe-modal"] .modal-header .close,
.grouped-item-label,
#uptime-tooltip .tooltip-box .tooltip-content .related-events .related-event a.related-event-link {
color:#363F44;
}
.layout-content.status.status-index .components-statuses .component-container .name {
color:#363F44;
color:rgba(54,63,68,.8);
}
/* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */
small,
.layout-content.status .table-row .date,
.color-secondary,
.layout-content.status .grouped-items-selector.inline .grouped-item,
.layout-content.status.status-full-history .history-footer .pagination a.disabled,
.layout-content.status.status-full-history .history-nav a,
#uptime-tooltip .tooltip-box .tooltip-content .related-events #related-event-header {
color:#54626A;
}
/* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */
body.status .layout-content.status .border-color,
hr,
.tooltip-base,
.markdown-display table,
div[id^="subscribe-modal"],
#uptime-tooltip .tooltip-box {
border-color:#E0E0E0;
}
div[id^="subscribe-modal"] .modal-footer,
.markdown-display table td {
border-top-color:#E0E0E0;
}
.markdown-display table td + td, .markdown-display table th + th {
border-left-color:#E0E0E0;
}
div[id^="subscribe-modal"] .modal-header,
#uptime-tooltip .pointer-container .pointer-larger {
border-bottom-color:#E0E0E0;
}
#uptime-tooltip .tooltip-box .outage-field {
/*
Generate the background-color for the outage-field from the css_body_background_color and css_border_color.
For the default background (#ffffff) and default css_border_color (#e0e0e0), use the luminosity of the default background with a magic number to arrive at
the original outage-field background color (#f4f5f7). I used the formula Target Color = Color * alpha + Background * (1 - alpha) to find the magic number of ~0.08.
For darker css_body_background_color, luminosity values are lower so alpha trends toward becoming transparent (thus outage-field background becomes same as css_body_background_color).
*/
background-color: rgba(224,224,224,0.3);
/*
outage-field border-color alpha is inverse to the luminosity of css_body_background_color.
That is to say, with a default white background this border is transparent, but on a black background, it's opaque css_border_color.
*/
border-color: rgba(224,224,224,0.0);
}
/* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */
.layout-content.status.status-index .status-day .update-title.impact-critical a,
.layout-content.status.status-index .status-day .update-title.impact-critical a:hover,
.layout-content.status.status-index .page-status.status-critical,
.layout-content.status.status-index .unresolved-incident.impact-critical .incident-title,
.flat-button.background-red {
background-color:#C24632;
}
.layout-content.status-index .components-statuses .component-container.status-red:after,
.layout-content.status-full-history .month .incident-container .impact-critical,
.layout-content.status-incident .incident-name.impact-critical,
.layout-content.status.status-index .incidents-list .incident-title.impact-critical a,
.status-red .icon-indicator,
.incident-history .impact-critical,
.components-container .component-inner-container.status-red .component-status,
.components-container .component-inner-container.status-red .icon-indicator {
color:#C24632;
}
.layout-content.status.status-index .unresolved-incident.impact-critical .updates {
border-color:#C24632;
}
/* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */
.layout-content.status.status-index .status-day .update-title.impact-major a,
.layout-content.status.status-index .status-day .update-title.impact-major a:hover,
.layout-content.status.status-index .page-status.status-major,
.layout-content.status.status-index .unresolved-incident.impact-major .incident-title {
background-color:#F26722;
}
.layout-content.status-index .components-statuses .component-container.status-orange:after,
.layout-content.status-full-history .month .incident-container .impact-major,
.layout-content.status-incident .incident-name.impact-major,
.layout-content.status.status-index .incidents-list .incident-title.impact-major a,
.status-orange .icon-indicator,
.incident-history .impact-major,
.components-container .component-inner-container.status-orange .component-status,
.components-container .component-inner-container.status-orange .icon-indicator {
color:#F26722;
}
.layout-content.status.status-index .unresolved-incident.impact-major .updates {
border-color:#F26722;
}
/* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */
.layout-content.status.status-index .status-day .update-title.impact-minor a,
.layout-content.status.status-index .status-day .update-title.impact-minor a:hover,
.layout-content.status.status-index .page-status.status-minor,
.layout-content.status.status-index .unresolved-incident.impact-minor .incident-title,
.layout-content.status.status-index .scheduled-incidents-container .tab {
background-color:#D9B216;
}
.layout-content.status-index .components-statuses .component-container.status-yellow:after,
.layout-content.status-full-history .month .incident-container .impact-minor,
.layout-content.status-incident .incident-name.impact-minor,
.layout-content.status.status-index .incidents-list .incident-title.impact-minor a,
.status-yellow .icon-indicator,
.incident-history .impact-minor,
.components-container .component-inner-container.status-yellow .component-status,
.components-container .component-inner-container.status-yellow .icon-indicator,
.layout-content.status.manage-subscriptions .confirmation-infobox .fa {
color:#D9B216;
}
.layout-content.status.status-index .unresolved-incident.impact-minor .updates,
.layout-content.status.status-index .scheduled-incidents-container {
border-color:#D9B216;
}
/* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */
.layout-content.status.status-index .status-day .update-title.impact-maintenance a,
.layout-content.status.status-index .status-day .update-title.impact-maintenance a:hover,
.layout-content.status.status-index .page-status.status-maintenance,
.layout-content.status.status-index .unresolved-incident.impact-maintenance .incident-title,
.layout-content.status.status-index .scheduled-incidents-container .tab {
background-color:#3498DB;
}
.layout-content.status-index .components-statuses .component-container.status-blue:after,
.layout-content.status-full-history .month .incident-container .impact-maintenance,
.layout-content.status-incident .incident-name.impact-maintenance,
.layout-content.status.status-index .incidents-list .incident-title.impact-maintenance a,
.status-blue .icon-indicator,
.incident-history .impact-maintenance,
.components-container .component-inner-container.status-blue .component-status,
.components-container .component-inner-container.status-blue .icon-indicator {
color:#3498DB;
}
.layout-content.status.status-index .unresolved-incident.impact-maintenance .updates,
.layout-content.status.status-index .scheduled-incidents-container {
border-color:#3498DB;
}
/* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */
.layout-content.status.status-index .page-status.status-none {
background-color:#6BBF4E;
}
.layout-content.status-index .components-statuses .component-container.status-green:after,
.status-green .icon-indicator,
.components-container .component-inner-container.status-green .component-status,
.components-container .component-inner-container.status-green .icon-indicator {
color:#6BBF4E;
}
/* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */
a,
a:hover,
.layout-content.status-index .page-footer span a:hover,
.layout-content.status-index .timeframes-container .timeframe:not(.active):hover,
.layout-content.status-incident .subheader a:hover {
color:#1D69CC;
}
.flat-button,
.masthead .updates-dropdown-container .show-updates-dropdown,
.layout-content.status-full-history .show-filter.open {
background-color:#1D69CC;
}
/* CUSTOM COLOR OVERRIDES FOR UPTIME SHOWCASE */
.components-section .components-uptime-link {
color: #54626a;
}
.layout-content.status .shared-partial.uptime-90-days-wrapper .legend .legend-item {
color: #54626a;
opacity: 1;
}
.layout-content.status .shared-partial.uptime-90-days-wrapper .legend .legend-item.light {
color: #54626a;
opacity: 1;
}
.layout-content.status .shared-partial.uptime-90-days-wrapper .legend .spacer {
background: #54626a;
opacity: 1;
}
</style>
<div class="layout-content status status-incident">
<div class="container">
<div class="page-title">
<h1 class="color-primary incident-name whitespace-pre-wrap impact-critical">Authentication slowness or failure to load Duo Prompt on DUO1</h1>
<div class="font-largest color-secondary subheader ">
Incident
Report for <a class="color-secondary" href="/">Duo</a>
</div>
</div>
<div class="incident-updates-container">
<!-- postmortem if it's published -->
<div class="row update-row">
<h2 class="update-title span3 font-large">
Postmortem
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<div class="markdown-display">
<p><strong>Authentication Failures on DUO1</strong></p>
<p>Incident Report - 2023-08-21‌</p>
<h3>‌Updated Root Cause 2023-09-01</h3>
<p>Duo Engineering recreated the outage in a test environment, and then successfully validated a fix under load conditions, to the underlying root cause of the outage. The root cause was a specific database query pattern that had a higher probability of deadlocks, getting exacerbated under heavy load. A combination of increased activity, deadlocks, and retries overwhelmed certain shards, causing DUO1 to be unresponsive. The performance test that reproduced this scenario will now be part of our non-functional testing to better gate future releases.</p>
<h3>Summary</h3>
<p>From 9:03 EDT to 14:16 EDT on Aug 21, 2023, the DUO1 deployment experienced increased authentication latency that caused authentication failures for some customer applications protected by the Duo Service. At 9:03 AM Duo’s automated monitoring systems detected and alerted engineering team members to a database latency that was elevated but that did not impact service. Within minutes, while engineering team members investigated and triaged related issues, latency increased to service-impacting levels. A detailed investigation by Duo Engineering identified the application layer as the bottleneck. The team began horizontally scaling the application layer to absorb the increased load. The Duo team began to see recovery around 12:50 EDT, fully resolving by 16:01 EDT. Duo Engineering continues to monitor.</p>
<h3>Deployments Impacted</h3>
<ul>
<li>DUO1</li>
</ul>
<h3>Timeline of Events EDT</h3>
<h4>2023-08-21</h4>
<p>‌</p>
<p><strong>09:03</strong> Duo Engineering received an alert indicating Authentication Latency on DUO1.</p>
<p><strong>09:11</strong> Duo Engineering received a Database Backlog Depth alert, indicating replication latency.</p>
<p><strong>09:14</strong> Duo Engineering started investigating, confirming latency reports via our monitoring tools.</p>
<p><strong>09:22</strong> Duo Engineering initiated a full incident response process bringing in Customer Support (CS) and other stakeholders to assist with the investigation and communication.<strong>09:34</strong> Status Updated to <code>Investigating. </code></p>
<p><strong>09:28</strong> Determined only DUO1 deployment was affected, investigative efforts continue.</p>
<p><strong>09:36</strong> Back pressure, an automated mechanism that allows our systems to recover safely, came into play, rejecting requests.</p>
<p><strong>09:40</strong> Duo Engineering verified alerts that pointed to latency in the database layer, validating performance metrics and investigating any slow queries.</p>
<p><strong>10:01</strong> Duo Engineering also investigated the load balancer and application layer for performance insights.</p>
<p><strong>10:26</strong> Back pressure began to subside.</p>
<p><strong>10:44</strong> Multiple impacted customers identified, investigative efforts continued.</p>
<p><strong>10:45</strong> Options for mitigation were being considered for easing load on service and the potential impact of each option.</p>
<p><strong>10:45</strong> Additional alerts received, around our AzureAuth service. An investigation was spun up for this alert, to ascertain if they were related.</p>
<p><strong>11:16</strong> Duo Engineering determined that the AzureAuth incident was caused by the current ongoing incident impacting DUO1.</p>
<p><strong>11:45</strong> All AzureAuth instances had self-healed.</p>
<p><strong>12:11</strong> Duo Engineering considered options for scaling DB layer, until investigation pointed to application layer being the bottleneck (at <strong>12:24</strong> EDT).</p>
<p><strong>12:42</strong> Duo Engineering began increasing application capacity by scaling horizontally.</p>
<p><strong>12:54</strong> Some customers began recovering as a result of capacity increases.</p>
<p><strong>13:47</strong> Duo Engineering continued to monitor after the rollout of additional capacity.</p>
<p><strong>14:16</strong> Additional capacity was in place and taking traffic &lt;- Issue resolved at this point and we entered the observation phase before reporting back to customers.</p>
<p><strong>14:33</strong> Duo Engineering requested that customers be notified of the update, and asked to re-enable MFA if turned off.</p>
<p><strong>14:37</strong> Status changed to <code>Monitoring. </code></p>
<p><strong>14:58</strong> Duo Engineering identified additional preventative measures to balance load, to prevent recurrence.</p>
<p><strong>16:01</strong> Status updated to <code>Resolved.</code></p>
<h3>Details</h3>
<p>Increased load on DUO1 due to significantly increased adoption and simultaneous peak usage across multiple larger customers led to authentication failures. Our monitoring system picked up on latency metrics that alerted Duo Engineering. During this time our automated back-pressure system became active. This system tracks request volume and latency, and if latency is increasing, returns a HTTP Status Code 429 to clients, requesting a retry. This back-pressure mechanism is enabled on all deployments to allow our systems to recover safely and prevent them from being overwhelmed. The team’s investigation considered, evaluated, and ruled out multiple potential causes. This outage was not due to an attack, but the root cause being a significant spike in traffic with a surge of overlapping peak usage, causing capacity issues at the application server tier. Duo Engineering responded by adding more application servers to the load balancer. As a result, the back-pressure began to release and our systems began processing authentications within normal response time ranges.</p>
<p>‌</p>
<p>After service was restored, Duo Engineering continued to investigate and identified overlapping peak usage across multiple customers, with similar usage patterns, leading to contention for shared resources.</p>
<p>‌</p>
<p>Based on peak usage patterns observed during the outage, the team made additional capacity increases to avoid a recurrence. This was completed on Aug 21 at 04:09 EDT. Duo Engineering monitored DUO1 closely the following day, Aug 22nd, between 7:30 EDT and 12:00 EDT, and confirmed that these capacity levels handled the elevating volume experienced, without triggering additional alerts.</p>
<h3>What is Duo doing to prevent this in the future?</h3>
<p>Data collected during and after the incident will be used to influence near-term and future capacity-related decisions to ensure that appropriate headroom is available and to improve load distribution with no downtime for customers. Careful capacity planning has been one of pillars of Duo’s service management and that will continue with lessons learned from this incident.</p>
<p>‌</p>
<p>Duo Engineering is in the midst of a multi-quarter re-architecture of our services, which upon completion will enable our services to scale automatically in response to load and be more resilient. The team will also evaluate and enhance current load testing methodologies to better understand system performance and recovery under duress.</p>
<p>‌</p>
<p>Duo Engineering, continuing post incident analysis, identified an excessive write to the database on August 22nd at 01:56 AM, that when eliminated will ease table locking and improve shard performance.</p>
<p>‌</p>
<p>Duo Engineering has identified a number of measures to be integrated to our response runbooks and is implementing additional automation to ensure easy access to these, during an outage, to decrease our response time. Additional training is being added to our training program for current and new engineers, to decrease our response time.</p>
<p>‌</p>
<p>At Duo Engineering, we are committed to learning and improving our service every day, as we go about the business of securing our customers. We will continue to study other observed symptoms and update this document with additional details as they become available.</p>
</div>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692808932000"></span>Aug <var data-var='date'>23</var>, <var data-var='year'>2023</var> - <var data-var='time'>12:42</var> EDT
</div>
</div>
</div>
<hr>
<!-- incident updates in reverse order -->
<div class="row update-row">
<h2 class="update-title span3 font-large">
Resolved
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<span class="whitespace-pre-wrap">The issue causing authentication failures on DUO1 has been fully resolved. All authentications are working as expected.<br /><br />We will be posting a root-cause analysis (RCA) here once our engineering team has finished its thorough investigation of the issue.<br /><br />Please check back or subscribe to be notified when the RCA is posted.</span>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692655267000"></span>Aug <var data-var='date'>21</var>, <var data-var='year'>2023</var> - <var data-var='time'>18:01</var> EDT
</div>
</div>
</div>
<div class="row update-row">
<h2 class="update-title span3 font-large">
Monitoring
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<span class="whitespace-pre-wrap">A fix has been implemented for the authentication failures on DUO1 and we are monitoring the results.<br /><br />Please check back here or subscribe to updates for any changes.</span>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692643070000"></span>Aug <var data-var='date'>21</var>, <var data-var='year'>2023</var> - <var data-var='time'>14:37</var> EDT
</div>
</div>
</div>
<div class="row update-row">
<h2 class="update-title span3 font-large">
Update
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<span class="whitespace-pre-wrap">We are continuing to increase capacity to resolve the authentication failures on DUO1. Systems have started to recover.<br /><br />Please check back here or subscribe to updates for any changes.</span>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692640842000"></span>Aug <var data-var='date'>21</var>, <var data-var='year'>2023</var> - <var data-var='time'>14:00</var> EDT
</div>
</div>
</div>
<div class="row update-row">
<h2 class="update-title span3 font-large">
Update
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<span class="whitespace-pre-wrap">We are continuing to work on a fix to resolve the authentication failures on DUO1. <br /><br />Please check back here or subscribe to updates for any changes.</span>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692636413000"></span>Aug <var data-var='date'>21</var>, <var data-var='year'>2023</var> - <var data-var='time'>12:46</var> EDT
</div>
</div>
</div>
<div class="row update-row">
<h2 class="update-title span3 font-large">
Update
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<span class="whitespace-pre-wrap">We are continuing to work towards a resolution for these errors.<br /><br />Please check back here or subscribe to updates for any changes.</span>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692632136000"></span>Aug <var data-var='date'>21</var>, <var data-var='year'>2023</var> - <var data-var='time'>11:35</var> EDT
</div>
</div>
</div>
<div class="row update-row">
<h2 class="update-title span3 font-large">
Identified
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<span class="whitespace-pre-wrap">We have identified the issue causing authentication slowness and failures to load the Duo Prompt and are working toward resolution. <br /><br />Please check back here or subscribe to updates for any changes.</span>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692627341000"></span>Aug <var data-var='date'>21</var>, <var data-var='year'>2023</var> - <var data-var='time'>10:15</var> EDT
</div>
</div>
</div>
<div class="row update-row">
<h2 class="update-title span3 font-large">
Update
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<span class="whitespace-pre-wrap">We are continuing to investigate authentication errors on DUO1 and are working to correct the issue as soon as possible.<br /><br />Please check back here or subscribe to updates for any changes.</span>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692625167000"></span>Aug <var data-var='date'>21</var>, <var data-var='year'>2023</var> - <var data-var='time'>09:39</var> EDT
</div>
</div>
</div>
<div class="row update-row">
<h2 class="update-title span3 font-large">
Investigating
</h2>
<div class="update-container span9">
<div class="update-body font-regular">
<span class="whitespace-pre-wrap">We are currently investigating authentication errors on DUO1 and are working to correct the issue as soon as possible.<br /><br />Please check back here or subscribe to updates for any changes.</span>
</div>
<div class="update-timestamp font-small color-secondary">
Posted <span class="ago" data-datetime-unix="1692624893000"></span>Aug <var data-var='date'>21</var>, <var data-var='year'>2023</var> - <var data-var='time'>09:34</var> EDT
</div>
</div>
</div>
<!-- affected components -->
<div class="components-affected font-small color-secondary border-color">
This incident affected: DUO1 (Core Authentication Service, Push Delivery, SSO).
</div>
</div>
<div class="page-footer border-color font-small">
<a href="/"><span style="font-family:arial">&larr;</span> Current Status</a>
<span class="color-secondary powered-by"><a class="color-secondary" target="_blank" rel="noopener noreferrer nofollow" href="https://www.atlassian.com/software/statuspage?utm_campaign=status.duo.com&amp;utm_content=SP-notifications&amp;utm_medium=powered-by&amp;utm_source=inapp">Powered by Atlassian Statuspage</a></span>
</div>
</div>
<div class="custom-footer-container">
<!-- Paste the following into your Custom Footer section -->
<script>
$('.logo-container').wrap("<a href='/' aria-label='Duo Status Homepage'></a>");
</script>
<script>
$('.component-status').wrapInner('<span class="status"></span>');
</script>
<!-- remove old open close icons -->
<script>
$(function() {
var parentContainer = $('.component-inner-container');
var oldOpenCloseIcons = parentContainer.find('span.fa.group-parent-indicator.color-secondary.font-small');
oldOpenCloseIcons.remove();
});
</script>
<script>
// adds additional menu-button class to the subscribe button for styling
$(function() {
var oldIcons = $('.component-inner-container').find('span.fa.group-parent-indicator.color-secondary.font-small');
oldIcons.remove();
var menuButton = $('.updates-dropdown-container');
menuButton.addClass('menu-button');
// adds icon to subscribe button
menuButton.prepend("<svg class='menu-icon' xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'> <path fill-rule='evenodd' clip-rule='evenodd' d='M4.59069 19.1249C4.55842 19.1248 4.52621 19.1239 4.49408 19.1221C4.19876 19.106 3.91094 19.0202 3.6544 18.8712C3.37029 18.7061 3.13453 18.4693 2.97074 18.1845C2.80696 17.8997 2.7209 17.5768 2.72119 17.2482C2.72148 16.9196 2.80811 16.5969 2.9724 16.3124L2.97307 16.3112C3.47496 15.4443 4.14355 13.6968 4.14355 10.4999V9.75062L4.14511 9.7483C4.17963 6.49445 6.17107 3.65756 9.02224 2.46902L9.02692 2.46204C9.44364 2.29129 9.87323 2.15706 10.3109 2.06029C10.8371 1.94304 11.3838 1.87921 11.9455 1.87495L11.9478 1.875C11.9828 1.87472 12.0179 1.87468 12.0529 1.87488L12.0552 1.87489C16.4059 1.90785 19.8561 5.5148 19.8561 9.83424V10.4999C19.8561 13.6968 20.5246 15.4443 21.0265 16.3112L21.0272 16.3124C21.1915 16.5969 21.2781 16.9196 21.2784 17.2482C21.2787 17.5768 21.1926 17.8997 21.0289 18.1845C20.8651 18.4693 20.6293 18.7061 20.3452 18.8712C20.0611 19.0362 19.7386 19.1237 19.41 19.1249L19.4061 19.1249L16.1078 19.1249C16.0205 20.0814 15.6014 20.982 14.9167 21.6668C14.1431 22.4403 13.0939 22.8749 11.9999 22.8749C10.9059 22.8749 9.85665 22.4403 9.08306 21.6668C8.39836 20.982 7.97922 20.0814 7.89195 19.1249L4.59465 19.1249L4.59069 19.1249ZM10.1627 19.1249C10.2357 19.4825 10.4121 19.8139 10.6741 20.0758C11.0257 20.4274 11.5026 20.6249 11.9999 20.6249C12.4972 20.6249 12.9741 20.4274 13.3257 20.0758C13.5876 19.8139 13.764 19.4824 13.837 19.1249L10.1627 19.1249ZM12.0393 4.12484C11.7917 4.12351 11.5449 4.13855 11.3004 4.16966C8.53806 4.52454 6.39465 6.93767 6.39465 9.8343V10.4999C6.39465 13.5411 5.84264 15.5623 5.21747 16.8749H18.7833C18.1581 15.5623 17.6061 13.5411 17.6061 10.4999V9.83424C17.6061 6.7103 15.1131 4.14874 12.0393 4.12484Z' fill='#F7F7F7'/></svg>");
});
</script>
<!-- Adds the remaining custom header buttons -->
<script>
$(function() {
var menuButton = $('.updates-dropdown-container');
menuButton.wrapAll("<div class='menu-buttons'/>");
menuButton.before('<div class="knowledge-base menu-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M12 8.25C12 7.45435 12.3161 6.69129 12.8787 6.12868C13.4413 5.56607 14.2044 5.25 15 5.25H21C21.1989 5.25 21.3897 5.32902 21.5303 5.46967C21.671 5.61032 21.75 5.80109 21.75 6V18C21.75 18.1989 21.671 18.3897 21.5303 18.5303C21.3897 18.671 21.1989 18.75 21 18.75H15C14.2044 18.75 13.4413 19.0661 12.8787 19.6287C12.3161 20.1913 12 20.9544 12 21.75" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/><path d="M2.25 18C2.25 18.1989 2.32902 18.3897 2.46967 18.5303C2.61032 18.671 2.80109 18.75 3 18.75H9C9.79565 18.75 10.5587 19.0661 11.1213 19.6287C11.6839 20.1913 12 20.9544 12 21.75V8.25C12 7.45435 11.6839 6.69129 11.1213 6.12868C10.5587 5.56607 9.79565 5.25 9 5.25H3C2.80109 5.25 2.61032 5.32902 2.46967 5.46967C2.32902 5.61032 2.25 5.80109 2.25 6V18Z" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/></svg><a href="https://help.duo.com/">Knowledge Base</a></div><!--Start Community Button--><div class="community menu-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M6.7125 13.5L3 16.5V4.5C3 4.30109 3.07902 4.11032 3.21967 3.96967C3.36032 3.82902 3.55109 3.75 3.75 3.75H15.75C15.9489 3.75 16.1397 3.82902 16.2803 3.96967C16.421 4.11032 16.5 4.30109 16.5 4.5V12.75C16.5 12.9489 16.421 13.1397 16.2803 13.2803C16.1397 13.421 15.9489 13.5 15.75 13.5H6.7125Z" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/><path d="M7.5 13.5V17.25C7.5 17.4489 7.57902 17.6397 7.71967 17.7803C7.86032 17.921 8.05109 18 8.25 18H17.2875L21 21V9C21 8.80109 20.921 8.61032 20.7803 8.46967C20.6397 8.32902 20.4489 8.25 20.25 8.25H16.5" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/></svg><a href="https://community.cisco.com/t5/duo-security/ct-p/duo-security">Community</a></div><!--Start open Ticket Button--><div class="open-ticket menu-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M9 11.625H15" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/><path d="M9 15.375H15" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/><path d="M5.25 3.75H18.75C18.9489 3.75 19.1397 3.82902 19.2803 3.96967C19.421 4.11032 19.5 4.30109 19.5 4.5V18.75C19.5 19.3467 19.2629 19.919 18.841 20.341C18.419 20.7629 17.8467 21 17.25 21H6.75C6.15326 21 5.58097 20.7629 5.15901 20.341C4.73705 19.919 4.5 19.3467 4.5 18.75V4.5C4.5 4.30109 4.57902 4.11032 4.71967 3.96967C4.86032 3.82902 5.05109 3.75 5.25 3.75V3.75Z" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/><path d="M7.875 2.25V5.25" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/><path d="M12 2.25V5.25" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/><path d="M16.125 2.25V5.25" stroke="#F7F7F7" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"/></svg><a href="https://duo.com/support">Open a Ticket</a></div>');
});
</script>
<!-- Duo custom Footer -->
<script>
$('.page-footer').replaceWith('<footer class="footer"><p>© 2024 Cisco Systems, Inc.</p><div class="footer-links"><a href="">Privacy Policy</a><a href="">Terms of Service</a></div></footer>');
</script>
<!-- Replace default 'about this page' with custom Header -->
<script>
$('.text-section').find('h4').replaceWith('<div class="service-health">Service Health</div>');
</script>
<script>
$(function() {
var incidentFree = $('.status-none');
var degradedPerformance = $('.status-minor');
var partialOutage = $('.status-major');
var majorOutage = $('.status-critical');
var scheduledMaintenance = $('.status-maintenance');
/**
* Displays appropriate status badge based on
* statusPage.io overall status
*
* Note: StatusPage considers one outage 'minor'
* it takes multiple outages to be considered
* a 'major' critical outage
*/
if (incidentFree.length > 0) {
$('.service-health').append("<div class='service-operational'></div>");
}
else if (degradedPerformance.length > 0) {
$('.service-health').append("<div class='degraded-performance'></div>");
}
else if (partialOutage.length > 0) {
$('.service-health').append("<div class='partial-outage'></div>");
}
else if (majorOutage.length > 0) {
$('.service-health').append("<div class='major-outage'></div>");
}
else if (scheduledMaintenance.length > 0) {
$('.service-health').append("<div class='scheduled-maintenance'></div>");
}
});
</script>
<!-- adding status section -->
<script>
$(function() {
//finds all the deployment components and adds class deployment
var deployments = $('.is-group');
deployments.addClass('deployment');
// wraps deployment components in new div
$('.deployment').wrapAll('<div class="deployment-components"></div>');
var deploymentComponents = $('.deployment-components');
deploymentComponents.prepend('<p class="font-largest deployments-title">Deployments</p>');
// Uncomment above and comment below once the DUO1 maintenance schedule is completed
//deploymentComponents.prepend('<p class="font-largest deployments-title">Deployments</p><div class="links-section-box"> <div class="links-section-header">DUO1: Scheduled Maintenance<div class="links-section">The Duo Site Reliability Engineering (SRE) team will be performing regular maintenance on the DUO1 deployment from June 14, 2024, to September 30, 2024. For more information please see this <a href="https://help.duo.com/s/article/DUO1-Scheduled-Maintenance"> page</a>.<BR><BR></div></div></div>');
deploymentComponents.append('<div class="clear"></div>');
});
</script>
<!-- adding uptime section -->
<script>
$(function() {
var currentURL = window.location.href;
var isDeployment = $('.deployment');
//finds all the uptime components and adds class uptime
if (!currentURL.includes('uptime')) {
var showcased = $('.showcased');
showcased.parent().addClass('uptime');
// wraps uptime components in new div
$('.uptime').wrapAll('<div class="uptime-components"></div>');
var uptimeComponents = $('.uptime-components');
uptimeComponents.prepend('<p class="font-largest uptime-title">Uptime</p>');
}
});
</script>
<!-- replacing plus sign open close elements with dropdown arrow -->
<script>
$(function() {
// add arrows to components on load
var componentStatus = $('.component-status');
componentStatus.append('<svg class="closed-arrow" tabindex="0" aria-expanded="false" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M3.08709 6.83709C3.4532 6.47097 4.0468 6.47097 4.41291 6.83709L10 12.4242L15.5871 6.83709C15.9532 6.47097 16.5468 6.47097 16.9129 6.83709C17.279 7.2032 17.279 7.7968 16.9129 8.16291L10.6629 14.4129C10.2968 14.779 9.7032 14.779 9.33709 14.4129L3.08709 8.16291C2.72097 7.7968 2.72097 7.2032 3.08709 6.83709Z" fill="#7E868F"/></svg>');
componentStatus.append('<svg class="open-arrow" aria-expanded="true" tabindex="0" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.33709 5.58709C9.7032 5.22097 10.2968 5.22097 10.6629 5.58709L16.9129 11.8371C17.279 12.2032 17.279 12.7968 16.9129 13.1629C16.5468 13.529 15.9532 13.529 15.5871 13.1629L10 7.57583L4.41291 13.1629C4.0468 13.529 3.4532 13.529 3.08709 13.1629C2.72097 12.7968 2.72097 12.2032 3.08709 11.8371L9.33709 5.58709Z" fill="#7E868F"/></svg>');
$(document).on('keydown click', '.component-inner-container', function(event) {
if ((event.type === 'keydown' && event.key === 'Enter') || event.type === 'click') {
var openCards = $('.open');
//clear open arrow when closed
var openArrow = $('.open-arrow');
openArrow.remove();
var closedArrow = $('.closed-arrow');
// create open arrow when opened
closedArrow.replaceWith('<svg class="open-arrow" aria-expanded="true" tabindex="0" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.33709 5.58709C9.7032 5.22097 10.2968 5.22097 10.6629 5.58709L16.9129 11.8371C17.279 12.2032 17.279 12.7968 16.9129 13.1629C16.5468 13.529 15.9532 13.529 15.5871 13.1629L10 7.57583L4.41291 13.1629C4.0468 13.529 3.4532 13.529 3.08709 13.1629C2.72097 12.7968 2.72097 12.2032 3.08709 11.8371L9.33709 5.58709Z" fill="#7E868F"/></svg>');
var componentStatus = $('.component-status');
componentStatus.append('<svg class="closed-arrow" tabindex="0" aria-expanded="false" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M3.08709 6.83709C3.4532 6.47097 4.0468 6.47097 4.41291 6.83709L10 12.4242L15.5871 6.83709C15.9532 6.47097 16.5468 6.47097 16.9129 6.83709C17.279 7.2032 17.279 7.7968 16.9129 8.16291L10.6629 14.4129C10.2968 14.779 9.7032 14.779 9.33709 14.4129L3.08709 8.16291C2.72097 7.7968 2.72097 7.2032 3.08709 6.83709Z" fill="#7E868F"/></svg>');
var newClosedArrow = $('.closed-arrow');
closedArrow.remove();
}
});
});
</script>
</div>
</div>
<div class="modal hide fade modal-open-incident-subscribe" id="subscribe-modal-rw7g0q7ztj8f" style="display: none"
data-js-hook="incident-subscription-modal" role="dialog" aria-labelledby="incident-subscription-dialog-header"
aria-describedby="incident-subscription-dialog-description" aria-modal="true">
<form class="modal-content" id="subscribe-form-rw7g0q7ztj8f" action="/subscriptions/incident.json" accept-charset="UTF-8" data-remote="true" method="post">
<input type="hidden" name="incident_code" id="incident_code" value="rw7g0q7ztj8f" autocomplete="off" />
<div class="modal-header">
<a href="#" data-dismiss="modal" class="close" data-js-hook="incident-modal-close" aria-label="close" role="button">×</a>
<h1 id="incident-subscription-dialog-header"> Subscribe to Incident </h1>
</div>
<div class="modal-body">
<p style="margin-bottom:25px" id="incident-subscription-dialog-description">
Subscribe to updates for <strong>Authentication slowness or failure to load Duo Prompt on DUO1</strong> via email and/or text message. You'll receive email notifications when incidents are updated, and text message notifications whenever Duo <strong>creates</strong> or <strong>resolves</strong> an incident.
</p>
<div class="control-group">
<label for="email-rw7g0q7ztj8f">VIA EMAIL:</label>
<div class="controls">
<input type="text" name="email" id="email-rw7g0q7ztj8f" data-js-hook="email" class="full-width" />
</div>
</div>
<div class="control-group">
<label class="phone-country-code" for=phone-country-rw7g0q7ztj8f>VIA SMS:</label>
<div class="controls phone-number">
<div class="row">
<div id='phone-number-code-rw7g0q7ztj8f' class="phone-country-wrapper">
<select name="phone_country" id="phone-country-rw7g0q7ztj8f" data-js-hook="phone-country" class="span6 phone-country-dropdown"><option value="af" data-otp-enabled="false" >Afghanistan (+93)</option>
<option value="al" data-otp-enabled="false" >Albania (+355)</option>
<option value="dz" data-otp-enabled="false" >Algeria (+213)</option>
<option value="as" data-otp-enabled="false" >American Samoa (+1)</option>
<option value="ad" data-otp-enabled="false" >Andorra (+376)</option>
<option value="ao" data-otp-enabled="false" >Angola (+244)</option>
<option value="ai" data-otp-enabled="false" >Anguilla (+1)</option>
<option value="ag" data-otp-enabled="false" >Antigua and Barbuda (+1)</option>
<option value="ar" data-otp-enabled="false" >Argentina (+54)</option>
<option value="am" data-otp-enabled="false" >Armenia (+374)</option>
<option value="aw" data-otp-enabled="false" >Aruba (+297)</option>
<option value="au" data-otp-enabled="false" >Australia/Cocos/Christmas Island (+61)</option>
<option value="at" data-otp-enabled="false" >Austria (+43)</option>
<option value="az" data-otp-enabled="false" >Azerbaijan (+994)</option>
<option value="bs" data-otp-enabled="false" >Bahamas (+1)</option>
<option value="bh" data-otp-enabled="false" >Bahrain (+973)</option>
<option value="bd" data-otp-enabled="false" >Bangladesh (+880)</option>
<option value="bb" data-otp-enabled="false" >Barbados (+1)</option>
<option value="by" data-otp-enabled="false" >Belarus (+375)</option>
<option value="be" data-otp-enabled="false" >Belgium (+32)</option>
<option value="bz" data-otp-enabled="false" >Belize (+501)</option>
<option value="bj" data-otp-enabled="false" >Benin (+229)</option>
<option value="bm" data-otp-enabled="false" >Bermuda (+1)</option>
<option value="bo" data-otp-enabled="false" >Bolivia (+591)</option>
<option value="ba" data-otp-enabled="false" >Bosnia and Herzegovina (+387)</option>
<option value="bw" data-otp-enabled="false" >Botswana (+267)</option>
<option value="br" data-otp-enabled="false" >Brazil (+55)</option>
<option value="bn" data-otp-enabled="false" >Brunei (+673)</option>
<option value="bg" data-otp-enabled="false" >Bulgaria (+359)</option>
<option value="bf" data-otp-enabled="false" >Burkina Faso (+226)</option>
<option value="bi" data-otp-enabled="false" >Burundi (+257)</option>
<option value="kh" data-otp-enabled="false" >Cambodia (+855)</option>
<option value="cm" data-otp-enabled="false" >Cameroon (+237)</option>
<option value="ca" data-otp-enabled="false" >Canada (+1)</option>
<option value="cv" data-otp-enabled="false" >Cape Verde (+238)</option>
<option value="ky" data-otp-enabled="false" >Cayman Islands (+1)</option>
<option value="cf" data-otp-enabled="false" >Central Africa (+236)</option>
<option value="td" data-otp-enabled="false" >Chad (+235)</option>
<option value="cl" data-otp-enabled="false" >Chile (+56)</option>
<option value="cn" data-otp-enabled="false" >China (+86)</option>
<option value="co" data-otp-enabled="false" >Colombia (+57)</option>
<option value="km" data-otp-enabled="false" >Comoros (+269)</option>
<option value="cg" data-otp-enabled="false" >Congo (+242)</option>
<option value="cd" data-otp-enabled="false" >Congo, Dem Rep (+243)</option>
<option value="cr" data-otp-enabled="false" >Costa Rica (+506)</option>
<option value="hr" data-otp-enabled="false" >Croatia (+385)</option>
<option value="cy" data-otp-enabled="false" >Cyprus (+357)</option>
<option value="cz" data-otp-enabled="false" >Czech Republic (+420)</option>
<option value="dk" data-otp-enabled="false" >Denmark (+45)</option>
<option value="dj" data-otp-enabled="false" >Djibouti (+253)</option>
<option value="dm" data-otp-enabled="false" >Dominica (+1)</option>
<option value="do" data-otp-enabled="false" >Dominican Republic (+1)</option>
<option value="eg" data-otp-enabled="false" >Egypt (+20)</option>
<option value="sv" data-otp-enabled="false" >El Salvador (+503)</option>
<option value="gq" data-otp-enabled="false" >Equatorial Guinea (+240)</option>
<option value="ee" data-otp-enabled="false" >Estonia (+372)</option>
<option value="et" data-otp-enabled="false" >Ethiopia (+251)</option>
<option value="fo" data-otp-enabled="false" >Faroe Islands (+298)</option>
<option value="fj" data-otp-enabled="false" >Fiji (+679)</option>
<option value="fi" data-otp-enabled="false" >Finland/Aland Islands (+358)</option>
<option value="fr" data-otp-enabled="false" >France (+33)</option>
<option value="gf" data-otp-enabled="false" >French Guiana (+594)</option>
<option value="pf" data-otp-enabled="false" >French Polynesia (+689)</option>
<option value="ga" data-otp-enabled="false" >Gabon (+241)</option>
<option value="gm" data-otp-enabled="false" >Gambia (+220)</option>
<option value="ge" data-otp-enabled="false" >Georgia (+995)</option>
<option value="de" data-otp-enabled="false" >Germany (+49)</option>
<option value="gh" data-otp-enabled="false" >Ghana (+233)</option>
<option value="gi" data-otp-enabled="false" >Gibraltar (+350)</option>
<option value="gr" data-otp-enabled="false" >Greece (+30)</option>
<option value="gl" data-otp-enabled="false" >Greenland (+299)</option>
<option value="gd" data-otp-enabled="false" >Grenada (+1)</option>
<option value="gp" data-otp-enabled="false" >Guadeloupe (+590)</option>
<option value="gu" data-otp-enabled="false" >Guam (+1)</option>
<option value="gt" data-otp-enabled="false" >Guatemala (+502)</option>
<option value="gn" data-otp-enabled="false" >Guinea (+224)</option>
<option value="gy" data-otp-enabled="false" >Guyana (+592)</option>
<option value="ht" data-otp-enabled="false" >Haiti (+509)</option>
<option value="hn" data-otp-enabled="false" >Honduras (+504)</option>
<option value="hk" data-otp-enabled="false" >Hong Kong (+852)</option>
<option value="hu" data-otp-enabled="false" >Hungary (+36)</option>
<option value="is" data-otp-enabled="false" >Iceland (+354)</option>
<option value="in" data-otp-enabled="false" >India (+91)</option>
<option value="id" data-otp-enabled="false" >Indonesia (+62)</option>
<option value="iq" data-otp-enabled="false" >Iraq (+964)</option>
<option value="ie" data-otp-enabled="false" >Ireland (+353)</option>
<option value="il" data-otp-enabled="false" >Israel (+972)</option>
<option value="it" data-otp-enabled="false" >Italy (+39)</option>
<option value="jm" data-otp-enabled="false" >Jamaica (+1)</option>
<option value="jp" data-otp-enabled="false" >Japan (+81)</option>
<option value="jo" data-otp-enabled="false" >Jordan (+962)</option>
<option value="ke" data-otp-enabled="false" >Kenya (+254)</option>
<option value="kr" data-otp-enabled="false" >Korea, Republic of (+82)</option>
<option value="xk" data-otp-enabled="false" >Kosovo (+383)</option>
<option value="kw" data-otp-enabled="false" >Kuwait (+965)</option>
<option value="kg" data-otp-enabled="false" >Kyrgyzstan (+996)</option>
<option value="la" data-otp-enabled="false" >Laos (+856)</option>
<option value="lv" data-otp-enabled="false" >Latvia (+371)</option>
<option value="lb" data-otp-enabled="false" >Lebanon (+961)</option>
<option value="ls" data-otp-enabled="false" >Lesotho (+266)</option>
<option value="lr" data-otp-enabled="false" >Liberia (+231)</option>
<option value="ly" data-otp-enabled="false" >Libya (+218)</option>
<option value="li" data-otp-enabled="false" >Liechtenstein (+423)</option>
<option value="lt" data-otp-enabled="false" >Lithuania (+370)</option>
<option value="lu" data-otp-enabled="false" >Luxembourg (+352)</option>
<option value="mo" data-otp-enabled="false" >Macao (+853)</option>
<option value="mk" data-otp-enabled="false" >Macedonia (+389)</option>
<option value="mg" data-otp-enabled="false" >Madagascar (+261)</option>
<option value="mw" data-otp-enabled="false" >Malawi (+265)</option>
<option value="my" data-otp-enabled="false" >Malaysia (+60)</option>
<option value="mv" data-otp-enabled="false" >Maldives (+960)</option>
<option value="ml" data-otp-enabled="false" >Mali (+223)</option>
<option value="mt" data-otp-enabled="false" >Malta (+356)</option>
<option value="mq" data-otp-enabled="false" >Martinique (+596)</option>
<option value="mr" data-otp-enabled="false" >Mauritania (+222)</option>
<option value="mu" data-otp-enabled="false" >Mauritius (+230)</option>
<option value="mx" data-otp-enabled="false" >Mexico (+52)</option>
<option value="mc" data-otp-enabled="false" >Monaco (+377)</option>
<option value="mn" data-otp-enabled="false" >Mongolia (+976)</option>
<option value="me" data-otp-enabled="false" >Montenegro (+382)</option>
<option value="ms" data-otp-enabled="false" >Montserrat (+1)</option>
<option value="ma" data-otp-enabled="false" >Morocco/Western Sahara (+212)</option>
<option value="mz" data-otp-enabled="false" >Mozambique (+258)</option>
<option value="na" data-otp-enabled="false" >Namibia (+264)</option>
<option value="np" data-otp-enabled="false" >Nepal (+977)</option>
<option value="nl" data-otp-enabled="false" >Netherlands (+31)</option>
<option value="nz" data-otp-enabled="false" >New Zealand (+64)</option>
<option value="ni" data-otp-enabled="false" >Nicaragua (+505)</option>
<option value="ne" data-otp-enabled="false" >Niger (+227)</option>
<option value="ng" data-otp-enabled="false" >Nigeria (+234)</option>
<option value="no" data-otp-enabled="false" >Norway (+47)</option>
<option value="om" data-otp-enabled="false" >Oman (+968)</option>
<option value="pk" data-otp-enabled="false" >Pakistan (+92)</option>
<option value="ps" data-otp-enabled="false" >Palestinian Territory (+970)</option>
<option value="pa" data-otp-enabled="false" >Panama (+507)</option>
<option value="py" data-otp-enabled="false" >Paraguay (+595)</option>
<option value="pe" data-otp-enabled="false" >Peru (+51)</option>
<option value="ph" data-otp-enabled="false" >Philippines (+63)</option>
<option value="pl" data-otp-enabled="false" >Poland (+48)</option>
<option value="pt" data-otp-enabled="false" >Portugal (+351)</option>
<option value="pr" data-otp-enabled="false" >Puerto Rico (+1)</option>
<option value="qa" data-otp-enabled="false" >Qatar (+974)</option>
<option value="re" data-otp-enabled="false" >Reunion/Mayotte (+262)</option>
<option value="ro" data-otp-enabled="false" >Romania (+40)</option>
<option value="ru" data-otp-enabled="false" >Russia/Kazakhstan (+7)</option>
<option value="rw" data-otp-enabled="false" >Rwanda (+250)</option>
<option value="ws" data-otp-enabled="false" >Samoa (+685)</option>
<option value="sm" data-otp-enabled="false" >San Marino (+378)</option>
<option value="sa" data-otp-enabled="false" >Saudi Arabia (+966)</option>
<option value="sn" data-otp-enabled="false" >Senegal (+221)</option>
<option value="rs" data-otp-enabled="false" >Serbia (+381)</option>
<option value="sc" data-otp-enabled="false" >Seychelles (+248)</option>
<option value="sl" data-otp-enabled="false" >Sierra Leone (+232)</option>
<option value="sg" data-otp-enabled="false" >Singapore (+65)</option>
<option value="sk" data-otp-enabled="false" >Slovakia (+421)</option>
<option value="si" data-otp-enabled="false" >Slovenia (+386)</option>
<option value="za" data-otp-enabled="false" >South Africa (+27)</option>
<option value="es" data-otp-enabled="false" >Spain (+34)</option>
<option value="lk" data-otp-enabled="false" >Sri Lanka (+94)</option>
<option value="kn" data-otp-enabled="false" >St Kitts and Nevis (+1)</option>
<option value="lc" data-otp-enabled="false" >St Lucia (+1)</option>
<option value="vc" data-otp-enabled="false" >St Vincent Grenadines (+1)</option>
<option value="sd" data-otp-enabled="false" >Sudan (+249)</option>
<option value="sr" data-otp-enabled="false" >Suriname (+597)</option>
<option value="sz" data-otp-enabled="false" >Swaziland (+268)</option>
<option value="se" data-otp-enabled="false" >Sweden (+46)</option>
<option value="ch" data-otp-enabled="false" >Switzerland (+41)</option>
<option value="tw" data-otp-enabled="false" >Taiwan (+886)</option>
<option value="tj" data-otp-enabled="false" >Tajikistan (+992)</option>
<option value="tz" data-otp-enabled="false" >Tanzania (+255)</option>
<option value="th" data-otp-enabled="false" >Thailand (+66)</option>
<option value="tg" data-otp-enabled="false" >Togo (+228)</option>
<option value="to" data-otp-enabled="false" >Tonga (+676)</option>
<option value="tt" data-otp-enabled="false" >Trinidad and Tobago (+1)</option>
<option value="tn" data-otp-enabled="false" >Tunisia (+216)</option>
<option value="tr" data-otp-enabled="false" >Turkey (+90)</option>
<option value="tc" data-otp-enabled="false" >Turks and Caicos Islands (+1)</option>
<option value="ug" data-otp-enabled="false" >Uganda (+256)</option>
<option value="ua" data-otp-enabled="false" >Ukraine (+380)</option>
<option value="ae" data-otp-enabled="false" >United Arab Emirates (+971)</option>
<option value="gb" data-otp-enabled="false" >United Kingdom (+44)</option>
<option value="us" data-otp-enabled="false" selected>United States (+1)</option>
<option value="uy" data-otp-enabled="false" >Uruguay (+598)</option>
<option value="uz" data-otp-enabled="false" >Uzbekistan (+998)</option>
<option value="ve" data-otp-enabled="false" >Venezuela (+58)</option>
<option value="vn" data-otp-enabled="false" >Vietnam (+84)</option>
<option value="vg" data-otp-enabled="false" >Virgin Islands, British (+1)</option>
<option value="vi" data-otp-enabled="false" >Virgin Islands, U.S. (+1)</option>
<option value="ye" data-otp-enabled="false" >Yemen (+967)</option>
<option value="zm" data-otp-enabled="false" >Zambia (+260)</option>
<option value="zw" data-otp-enabled="false" >Zimbabwe (+263)</option></select>
</div>
</div>
</div>
<label class="sub-label" for="phone-number-rw7g0q7ztj8f">Enter mobile number</label>
<div class="controls phone-number" data-js-hook="modal-open-incident-subscribe-phone-number">
<div class="flex-container">
<input type="text" name="phone_number" id="phone-number-rw7g0q7ztj8f" data-js-hook="phone-number" />
<input type="hidden" name="incident-code-rw7g0q7ztj8f" id="incident-code-rw7g0q7ztj8f" value="rw7g0q7ztj8f" autocomplete="off" />
<a class="btn-change-number-incident" id="btn-change-number-incident-rw7g0q7ztj8f" style="display: none;" data-incident-code="rw7g0q7ztj8f" href="#">
Edit number
</a> <a class="btn-subcriber-send-otp" id="btn-subcriber-send-otp-rw7g0q7ztj8f" style="display: none;" data-incident-code="rw7g0q7ztj8f" href="#">
Send OTP
</a> </div>
</div>
<div class="sms-atl-error" id='sms-atl-error-rw7g0q7ztj8f'></div>
<div class="opt-container-section" id='otp-container-incident-rw7g0q7ztj8f' style="display:none">
<label class="sub-label" for="otp">Enter the OTP sent</label>
<div class="flex-container">
<input name="otp" id='otp-field-rw7g0q7ztj8f' type="text" class="prepend" disabled>
<a class="resend-otp" id="resend-otp-rw7g0q7ztj8f" style="display: none;" data-incident-code="rw7g0q7ztj8f" href="#">
Resend OTP
</a> <span class="timer-incident" id='timer-incident-rw7g0q7ztj8f' style="display:none">&nbsp;in <span id='countdown-incident-rw7g0q7ztj8f'>30</span> seconds</span>
</div>
<div class="info-row flex-container">
<div class="info-icon"><svg width="2vh" height="2vh" viewBox="0 0 21 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="status-embed-svg-info-icon">
<defs>
<path d="M2,12 C2,6.47666667 6.47666667,2 12,2 C17.5233333,2 22,6.47666667 22,12 C22,17.5233333 17.5233333,22 12,22 C6.47666667,22 2,17.5233333 2,12 Z M4,12 C4,16.4187638 7.58123617,20 12,20 C16.4187638,20 20,16.4187638 20,12 C20,7.58123617 16.4187638,4 12,4 C7.58123617,4 4,7.58123617 4,12 Z M11,11.0029293 C11,10.4490268 11.4438648,10 12,10 C12.5522847,10 13,10.4378814 13,11.0029293 L13,15.9970707 C13,16.5509732 12.5561352,17 12,17 C11.4477153,17 11,16.5621186 11,15.9970707 L11,11.0029293 Z M12,9 C11.4477153,9 11,8.55228475 11,8 C11,7.44771525 11.4477153,7 12,7 C12.5522847,7 13,7.44771525 13,8 C13,8.55228475 12.5522847,9 12,9 Z" id="path-info"></path>
</defs>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g transform="translate(-702.000000, -945.000000)">
<g id="global/info" transform="translate(700.500000, 943.500000)">
<mask id="mask-info" fill="white">
<use xlink:href="#path-info"></use>
</mask>
<use id="Combined-Shape" fill="#42526E" fill-rule="nonzero" xlink:href="#path-info"></use>
<g id="Neutral-/-N000" mask="url(#mask-info)" fill-rule="evenodd">
<polygon points="0 24 24 24 24 0 0 0"></polygon>
</g>
</g>
</g>
</g>
</svg>
</div>
<div>To receive SMS updates, please verify your number. To proceed with just email click ‘Subscribe’ </div>
</div>
</div>
</div>
</div>
<div class="modal-footer incident-subscribe">
<!-- tests fail if static width isn't present ¯\_(ツ)_/¯ -->
<button name="button" type="submit" class="flat-button cpt-button incident-subscribe-btn-captcha" id="subscribe-btn-rw7g0q7ztj8f" onclick="submitCaptchaIncidentSubscribe(event)">Subscribe to Incident</button>
<input type="hidden" name="captcha_error" id="captcha_error" value="false" autocomplete="off" />
<input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response" value="false" autocomplete="off" />
<div class="terms_and_privacy_information left small">Message and data rates may apply. By subscribing you agree to the Atlassian <a target="_blank" rel="noopener" class="accessible-link" href="https://www.atlassian.com/legal/product-specific-terms#statuspage-specific-terms">Terms of Service</a>, and the Atlassian <a target="_blank" rel="noopener" class="accessible-link" href="https://www.atlassian.com/legal/privacy-policy">Privacy Policy</a>. This site is protected by reCAPTCHA and the Google <a target="_blank" rel="noopener" class="accessible-link" href="https://policies.google.com/privacy">Privacy Policy</a> and <a target="_blank" rel="noopener" class="accessible-link" data-js-hook="captcha-terms-of-service-link" href="https://policies.google.com/terms">Terms of Service</a> apply.</div>
</div>
</form> </div>
<script>
$(function () {
const phoneNumberInputIncident = $('#phone-number-rw7g0q7ztj8f');
const phoneCountrySelect = $('#phone-country-rw7g0q7ztj8f');
const errorDiv = $('#sms-atl-error-rw7g0q7ztj8f');
const phoneCountryDiv = $('#phone-number-code-rw7g0q7ztj8f');
if(errorDiv.length){
function checkSelectedCountry() {
const selectedCountry = phoneCountrySelect.val();
const isOtpEnabled = phoneCountryDiv.attr('data-otp-enabled') === 'true';
if(false && selectedCountry === 'sg') { // Replace 'SG' with the actual value representing Singapore in your select tag
phoneNumberInputIncident.prop('disabled', true);
errorDiv.html(`Due to new Singapore government regulations, we're currently not supporting text subscriptions in Singapore.<a href="https://community.atlassian.com/t5/Statuspage-articles/Attention-SMS-notifications-will-be-disabled-on-August-1st-2023/ba-p/2424398" target="_blank"> Learn more.</a> <br> Select another method to subscribe.`);
} else {
phoneNumberInputIncident.prop('readOnly', false);
errorDiv.html('');
if(false){
$('#btn-change-number-incident-rw7g0q7ztj8f').css('display', 'none');
$('#resend-otp-rw7g0q7ztj8f').css('display', 'none');
$('#timer-incident-rw7g0q7ztj8f').css('display', 'none');
if(isOtpEnabled){
$('#otp-container-incident-rw7g0q7ztj8f').css('display', 'block');
$('#btn-subcriber-send-otp-rw7g0q7ztj8f').css('display', 'block');
}
else {
$('#otp-container-incident-rw7g0q7ztj8f').css('display', 'none');
$('#btn-subcriber-send-otp-rw7g0q7ztj8f').css('display', 'none');
}
}
}
}
phoneCountrySelect.on('change', checkSelectedCountry);
checkSelectedCountry();
}
});
document.addEventListener('DOMContentLoaded', function() {
const dropdowns = document.querySelectorAll('.phone-country-dropdown');
if (dropdowns.length > 0) {
dropdowns.forEach(function(dropdown) {
const dropdownId = dropdown.id;
const incidentCode = dropdownId.split('-').pop();
const wrapperDiv = $('#phone-number-code-' + incidentCode);
function updateOtpEnabledAttribute() {
const selectedOption = dropdown.options[dropdown.selectedIndex];
const otpEnabled = selectedOption.getAttribute('data-otp-enabled');
wrapperDiv.attr('data-otp-enabled', otpEnabled);
}
dropdown.addEventListener('change', updateOtpEnabledAttribute);
updateOtpEnabledAttribute();
});
}
});
var countdownTimers = {};
var phoneNumberInputIncident = $('#phone-number-rw7g0q7ztj8f');
var RESEND_TIMER = 30;
$(function() {
$('#subscribe-form-rw7g0q7ztj8f').on('ajax:success', function(e, data, status, xhr){
var $form = $(this);
var formId = $form.attr('id');
var incidentCode = formId.split('-').pop();
$('#btn-change-number-incident-' + incidentCode).css('display', 'block');
if ( $('#btn-change-number-incident-'+ incidentCode).css('display') !== 'none') {
$('#btn-change-number-incident-'+ incidentCode).css('display', 'none');
$('#btn-subcriber-send-otp-'+ incidentCode).css('display', 'block');
$('#otp-container-incident-'+ incidentCode).css('display', 'block');
$('#resend-otp-'+ incidentCode).css('display', 'none');
$('#timer-incident-'+ incidentCode).css('display', 'none');
$('#phone-number-' + incidentCode).prop('readOnly', false);
$('#otp-field-' + incidentCode).val('').prop('disabled', true);
}
if(countdownTimers){
clearInterval(countdownTimers[incidentCode]);
}
});
$('#btn-change-number-incident-rw7g0q7ztj8f').on('click', function (e) {
var incidentCode = $(this).data('incident-code');
showSendOTP(incidentCode);
return false;
});
$('#btn-subcriber-send-otp-rw7g0q7ztj8f').on('click', function (e) {
let incidentCode = $(this).data('incident-code');
let phoneNumber = $('#phone-number-' + incidentCode).val();
let countryCode = $('#phone-country-' + incidentCode).val();
let incidentCodeField = $('#incident-code-' + incidentCode).val();
sendOtpRequest(phoneNumber, countryCode, incidentCodeField, function (data, status) {
var messageOptions = (data.type !== undefined && data.type !== null) ? { cssClass: data.type } : {};
HRB.utils.notify(data.text, messageOptions);
e.preventDefault();
if (data.type === 'success') {
showChangeNumber(incidentCode);
}
});
});
$('#resend-otp-rw7g0q7ztj8f').on('click', function(e) {
let incidentCode = $(this).data('incident-code');
let phoneNumber = $('#phone-number-' + incidentCode).val();
let countryCode = $('#phone-country-' + incidentCode).val();
let incidentCodeField = $('#incident-code-' + incidentCode).val();
sendOtpRequest(phoneNumber, countryCode, incidentCodeField, function (data, status) {
var messageOptions = (data.type !== undefined && data.type !== null) ? { cssClass: data.type } : {};
HRB.utils.notify(data.text, messageOptions);
e.preventDefault();
disableResendIncident(incidentCode);
if (data.type === 'success') {
var display = $('#countdown-incident-' + incidentCode);
startTimerIncident(RESEND_TIMER, display, incidentCode );
}
});
});
})
function sendOtpRequest(phoneNumber, countryCode, incidentCode, onSuccess) {
$.ajax({
type: 'POST',
url: "/subscriptions/new-sms",
data: {
phone_number: phoneNumber,
phone_country: countryCode,
incident_code: incidentCode,
type: 'resend'
},
}).done(onSuccess);
}
function showChangeNumber(incidentCode) {
$('#btn-change-number-incident-' + incidentCode).css('display', 'block');
$('#btn-subcriber-send-otp-' + incidentCode).css('display', 'none');
$('#otp-field-' + incidentCode).val('').prop('disabled', false);
$('#phone-number-' + incidentCode).prop('readOnly', true);
$('#resend-otp-'+ incidentCode).css('display', 'block');
var display = $('#countdown-incident-' + incidentCode);
startTimerIncident(RESEND_TIMER, display, incidentCode)
}
function showSendOTP(incidentCode) {
$('#btn-change-number-incident-' + incidentCode).css('display', 'none');
$('#btn-subcriber-send-otp-' + incidentCode).css('display', 'block');
$('#otp-field-' + incidentCode).val('').prop('disabled', true);
$('#phone-number-' + incidentCode).prop('readOnly', false);
$('#resend-otp-'+ incidentCode).css('display', 'none');
$('#timer-incident-'+ incidentCode).css('display', 'none');
clearInterval(countdownTimers[incidentCode]);
}
function startTimerIncident(duration, display, incidentCode){
var timerIncident = duration, seconds;
clearInterval(countdownTimers[incidentCode]);
countdownTimers[incidentCode] = setInterval(function () {
seconds = parseInt(timerIncident % 60, 10);
display.text(seconds);
$('#timer-incident-'+ incidentCode).css('display', 'block');
if(--timerIncident < 0){
enableResendIncident(incidentCode);
clearInterval(countdownTimers[incidentCode]);
}
}, 1000);
disableResendIncident(incidentCode);
}
function enableResendIncident(incidentCode){
$('#resend-otp-' + incidentCode).css('color', '');
$('#resend-otp-' + incidentCode).css('pointer-events', '');
$('#timer-incident-'+ incidentCode).css('display', 'none');
}
function disableResendIncident(incidentCode){
$('#resend-otp-' + incidentCode).css('color', 'grey');
$('#resend-otp-' + incidentCode).css('pointer-events', 'none');
}
</script>
<script src="https://dka575ofm4ao0.cloudfront.net/assets/status_manifest-9446cbd3af4b0e3706e85200ffeb5f09d6410458c7aea582354bfd4bc5546b5e.js"></script>
<div id="cpt-notification-container" role="status" aria-live="polite" aria-atomic="true"></div>
<!-- all of the content_for stuff -->
<script src="https://dka575ofm4ao0.cloudfront.net/assets/register_subscription_form-589b657fec607087fc5c740c568270907310bc4f6aaa20256e70f01b103025ca.js"></script>
<script type="text/javascript">
$(function() {
SP.currentPage.registerSubscriptionForm('email');
SP.currentPage.registerSubscriptionForm('sms');
});
$(function() {
SP.currentPage.registerSubscriptionForm('rw7g0q7ztj8f');
});
</script>
<script src="https://dka575ofm4ao0.cloudfront.net/assets/status_common-a86dffb81955091741c3de8bded6ce66ae0c6d8f736b57b580f853d9f892727e.js"></script>
<script>
$(function() { // docks custom footer
var content = $('.layout-content > .container')
, header = $('.custom-header-container')
, footer = $('.custom-footer-container')
if (!footer.length) {
content.addClass('default-spacing');
}
else {
var screenHeight = $(window).outerHeight()
, containerHeight = $('.layout-content > .container').outerHeight(true) || null
, headerHeight = $('.custom-header-container').outerHeight(true) || null
, footerHeight = $('.custom-footer-container').outerHeight(true) || null;
if (screenHeight > containerHeight + footerHeight + headerHeight) {
$('.layout-content > .container').css('padding-bottom', screenHeight - containerHeight - footerHeight - headerHeight);
}
}
});
$(function() {
$(document).on('ajax:complete', '.modal.in', function(e) {
// Close the active modal.
$('.modal.in').modal('hide');
});
});
$(function() {
var timeDifference = function(previous) {
var msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
var now = Date.now();
var elapsedMs = now - previous;
var elapsed = Math.round(elapsedMs/msPerMinute);
if (elapsed === 0) {
return elapsedString(1) + ' minute ago. ';
}
else if (elapsed < 60) {
return elapsedString(elapsed) + ' minute' + plural(elapsed) + ' ago. ';
}
elapsed = Math.round(elapsedMs/msPerHour);
if (elapsed < 24) {
return elapsedString(elapsed) + ' hour' + plural(elapsed) + ' ago. ';
}
elapsed = Math.round(elapsedMs/msPerDay);
if (elapsed < 31) {
return elapsedString(elapsed) + ' day' + plural(elapsed) + ' ago. ';
}
elapsed = Math.round(elapsedMs/msPerMonth);
if (elapsed < 12) {
return elapsedString(elapsed) + ' month' + plural(elapsed) + ' ago. ';
}
elapsed = Math.round(elapsedMs/msPerYear);
return elapsedString(elapsed) + ' year' + plural(elapsed) + ' ago. ';
};
var elapsedString = function(elapsed) {
return '<var data-var="num">' + elapsed + '</var>'
};
var plural = function(x) {
return (x <= 1) ? '' : 's';
};
var relative_dates = $('span.ago');
relative_dates.each(function() {
var $el = $(this);
var time = $el.data("datetime-unix");
$el.html(timeDifference(time));
})
});
</script>
<script>
/** INITIALIZATION **/
var recaptchaIds = {}
// Unfortunately there's no unique selectors on the parent divs that recaptcha adds. The first unique selector
// is the iframe rendered 2 levels deep. So this waits until the iframes are added to the page, then finds
// the parent div and sets the z index so that it'll render above our modals & dropdowns from the start.
function setZIndex(captchaCount, startTime) {
// bail after 10s just in case so we don't do this forever if something whaky happens
if (new Date() - startTime > 10000) {
return;
}
var iframes = document.querySelectorAll('iframe[title="recaptcha challenge"]');
if (iframes.length != captchaCount) {
setTimeout(function() {
setZIndex(captchaCount, startTime);
}, 500);
}
for (var i = 0; i < iframes.length; i++) {
// incident subscribe modal is 1050, so this has to be above that
iframes[i].parentElement.parentElement.style.zIndex = "1100";
}
}
function updateCaptchaIframeTitle(captchaCount, startTime, updates=0) {
if (new Date() - startTime > 10000 || captchaCount === updates) {
return;
}
var iframesWithTitle = document.querySelectorAll('iframe[title="recaptcha challenge expires in two minutes"]');
if (iframesWithTitle.length != captchaCount) {
setTimeout(function() {
updateCaptchaIframeTitle(captchaCount, startTime, iframesWithTitle.length + updates);
}, 500);
}
for (var i = 0; i < iframesWithTitle.length; i++) {
iframesWithTitle[i].title = "recaptcha";
}
}
function addIncidentCaptcha() {
var incidentCaptcha = document.createElement('div');
incidentCaptcha.setAttribute('id', 'subscribe-incident-recaptcha');
incidentCaptcha.setAttribute('class', 'g-recaptcha');
incidentCaptcha.setAttribute('data-sitekey', '6LcZ-b0UAAAAAENi956aWzynTT2ZJ80dGU3F80Op');
incidentCaptcha.setAttribute('data-callback', 'submitIncidentSubscriberSuccess');
incidentCaptcha.setAttribute('data-error-callback', 'submitIncidentSubscriberError');
incidentCaptcha.setAttribute('data-size', 'invisible');
document.body.appendChild(incidentCaptcha);
var incidentCode = document.createElement('input');
incidentCode.setAttribute('type', 'hidden');
incidentCode.setAttribute('id', 'submit_incident_code');
document.body.appendChild(incidentCode);
}
var onloadCallback = function() {
// if there is an incident, then add incident captcha element
if (document.getElementsByClassName('modal-open-incident-subscribe').length > 0) {
addIncidentCaptcha();
}
var captchas = document.getElementsByClassName("g-recaptcha");
for(var i = 0; i < captchas.length; i++) {
var elId = captchas[i].id;
recaptchaIds[elId] = grecaptcha.enterprise.render(elId);
}
setZIndex(captchas.length, new Date());
updateCaptchaIframeTitle(captchas.length, new Date());
}
/** SUBSCRIBE DROPDOWN */
// callbacks for captcha success
function submitNewSubscriber(type, error) {
if (error) document.querySelector('#subscribe-form-' + type + ' #captcha_error').value = 'true';
document.getElementById('subscribe-form-' + type).dispatchEvent(new Event('submit', {bubbles: true, cancelable: true}));
grecaptcha.enterprise.reset(recaptchaIds['subscribe-btn-' + type]);
}
function submitNewEmailSubscriber(token) {
submitNewSubscriber('email');
}
function submitNewSmsSubscriber(token) {
submitNewSubscriber('sms');
}
function submitNewWebhookSubscriber(token) {
submitNewSubscriber('webhook');
}
function submitIncidentSubscriber(token, error) {
var incidentCode = document.getElementById('submit_incident_code').value;
var incidentForm = document.getElementById('subscribe-form-' + incidentCode);
incidentForm.querySelector('input[name="captcha_error"]').value = error;
incidentForm.querySelector('input[name="g-recaptcha-response"]').value = token;
incidentForm.dispatchEvent(new Event('submit', {bubbles: true, cancelable: true}));
grecaptcha.enterprise.reset(recaptchaIds['subscribe-incident-recaptcha']);
}
function submitIncidentSubscriberSuccess(token) {
submitIncidentSubscriber(token, 'false');
}
// callbacks if we get captcha network errors
function emailSubscriberCaptchaError(token) {
submitNewSubscriber('email', true);
}
function smsSubscriberCaptchaError(token) {
submitNewSubscriber('sms', true);
}
function webhookSubscriberCaptchaError(token) {
submitNewSubscriber('webhook', true);
}
function submitIncidentSubscriberError(token) {
submitIncidentSubscriber(token, 'true');
}
// tracking clicks
['email', 'sms', 'webhook'].forEach(function(type) {
var el = document.getElementById('subscribe-btn-' + type);
el && el.addEventListener("click", function() {
$.ajax({
type: "POST",
url: "/subscriptions/track_attempt",
data: {
type: type
}
})
})
})
// form submission success callbacks
$('#subscribe-form-email').on('ajax:success', function(e, data, status, xhr){
if (data.type === 'success') {
SP.currentPage.updatesDropdown.hide();
var emailField = document.getElementById('email');
if (emailField) {
emailField.value = '';
}
}
});
$('#subscribe-form-sms').on('ajax:success', function(e, data, status, xhr){
if (data.type === 'success' && data.otp_flow !== true) {
SP.currentPage.updatesDropdown.hide();
var phoneField = document.getElementById('phone-number');
if (phoneField) {
phoneField.value = '';
}
}
});
$('#subscribe-form-webhook').on('ajax:success', function(e, data, status, xhr){
if (data.type === 'success') {
SP.currentPage.updatesDropdown.hide();
document.getElementById('endpoint-webhooks').value = '';
document.getElementById('email-webhooks').value = '';
}
});
$('a.subscribe').on('click', function() {
document.body.style.overflow = "hidden";
document.body.style.height = "100vh";
});
$('div.modal-open-incident-subscribe').on('hidden', function(){
document.body.style.overflow = "";
document.body.style.height = "";
});
function submitCaptchaIncidentSubscribe(event) {
var incidentCode = event.target.id.split('-')[2];
event.preventDefault();
$.ajax({
type: "POST",
url: "/subscriptions/track_attempt",
data: {
type: 'incident'
}
})
document.getElementById('submit_incident_code').value = incidentCode;
grecaptcha.enterprise.execute(recaptchaIds['subscribe-incident-recaptcha']);
}
</script>
<script src='https://www.recaptcha.net/recaptcha/enterprise.js?onload=onloadCallback&render=explicit' async defer></script>
<script src="https://dka575ofm4ao0.cloudfront.net/packs/common-3e6e8c878eea26f45b29.chunk.js"></script>
<script src="https://dka575ofm4ao0.cloudfront.net/packs/globals-f12471d5e878ec0f0705.chunk.js"></script>
<script src="https://dka575ofm4ao0.cloudfront.net/packs/runtime-33399279767e29d9b814.js"></script>
<script>
window.addEventListener('load', function () {
const urlParams = new URLSearchParams(window.location.search);
const messageToken = urlParams.get('slack_message_token');
const channelName = escape(urlParams.get('channel_name'));
if(!!messageToken) {
switch(messageToken) {
case 'slack_auth_error':
HRB.utils.notify('The Slack authorization attempt was unsuccessful. Try again.', {cssClass:'error'});
break;
case 'subscribers_disabled_error':
HRB.utils.notify('Slack subscriptions are not enabled on this page.', {cssClass:'error'});
break;
case 'direct_message_channel_error':
HRB.utils.notify('Subscriptions aren’t supported in direct messages. Try subscribing again and choose a channel instead.', {cssClass:'error'});
break
case 'duplicate_error':
HRB.utils.notify("You're already subscribed to get Slack notifications in that channel.", {cssClass:'error'});
break;
case 'duplicate_private_channel_error':
HRB.utils.notify(`You're already subscribed to get Slack notifications in #${channelName}. Invite the @Statuspage app to that channel to start getting status updates.`, {cssClass: 'error'});
break;
case 'default_success':
HRB.utils.notify("You're now subscribed to get Statuspage updates in Slack!", {cssClass:'success'});
break;
case 'private_channel_success':
HRB.utils.notify(`IMPORTANT: Invite the @Statuspage app to your Slack channel #${channelName} to start getting status updates.`, {cssClass:'success'});
break;
}
}
});
</script>
<!-- FOR FLASH NOTICES -->
<!-- FOR ERROR -->
<script>
$(function() {
var $link = $('<span class="color-secondary powered-by"><a class="color-secondary" target="_blank" rel="noopener noreferrer nofollow" href="https://www.atlassian.com/software/statuspage?utm_campaign=status.duo.com&amp;utm_content=SP-notifications&amp;utm_medium=powered-by&amp;utm_source=inapp">Powered by Atlassian Statuspage</a></span>');
var setPoweredByStyles = function() {
if (!$('.powered-by').length) {
$link.appendTo($('.page-footer'))
}
$('.powered-by').attr('style', 'display: inline !important; visibility:visible !important; opacity: 1 !important; position:static !important; text-indent:0px !important; transform:scale(1) !important');
}
setInterval(setPoweredByStyles, 1000);
});
</script>
</body>
</html>