1<!DOCTYPE html> 2<html> 3<head> 4 <title>Constant Contact Login</title> 5 <meta charset="UTF-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/> 7 <link rel="icon" type="image/png" href="https://marketingautomation.services/includes/img/favicon-ctct.png"/> 8 9 <link rel="stylesheet" href="/includes/css/bootstrap.css"> 10 11 <link href="/includes/css/auth.css?ver=1.0" rel="stylesheet" type="text/css"> 12 13 <link href="/plugins/okta/css/okta-sign-in.min.css" rel="stylesheet" type="text/css"> 14 <link href="/includes/css/okta.css" rel="stylesheet" type="text/css"> 15 16</head> 17 18<body class="modern-body"> 19 <sharplegacy class="auth-page"> 20 21
22<script type="text/javascript" src="/plugins/okta/js/okta-sign-in.min.js"></script>
22 23 <div id="okta_login" class="ctct-login"></div> 24 <div id="forgotPasswordForm" style="display: none;"> 25 <form action="https://marketingautomation.services/auth/sendForgetEmail" autocomplete="off" id="legacyForgotForm" method="post" accept-charset="utf-8"> 26 <input type="hidden" name="csrf" value="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJjaWQiOjAsImNzcmYiOjEsImlhdCI6MTc5MDkxMzMwMCwiZXhwIjoxNzkwOTEzNDgwfQ.xDQenpeBUOCKmei-tR-VCpre8U20DhrCDPhWpFQjC0PYylpwhuu1UaIqO1CoV2F74eA2EUK4aDjlYHbYAoBcCQ"> 27 <input type="hidden" name="skipRedirect" value="1"> 28 <h1 class="center">Forgot Your Password?</h1> 29 30 <ul class="login-form"> 31 <li><label>Enter your account email below to receive a password reset link.</label> 32 <input type="text" id="legacyForgotEmail" name="email" value="" /> 33 </li> 34 </ul> 35 <div class="clear"></div> 36 37 <button id="FormSubmitbtn" class="btn btn-success" type="submit"> 38 <span>Send Email</span> 39 </button> 40 41 </form> 42 </div> 43 44 <div id="oktaPasswordForm"> 45 <div class="auth-content okta-override" style="display: none"> 46 <div class="auth-content-inner"> 47 <div class="forgot-password"> 48 <form 49 method="POST" 50 action="/" 51 id="forgot-password-form" 52 class="o-form forgot-password-email-enabled o-form-edit-mode"> 53 <div data-se="o-form-content" class="o-form-content o-form-theme clearfix"> 54 <h2 data-se="o-form-head" class="okta-form-title">Forgot Your Password?</h2> 55 <div class="o-form-error-container" data-se="o-form-error-container"></div> 56 <div class="o-form-fieldset-container" data-se="o-form-fieldset-container"> 57 <div data-se="o-form-fieldset" class="o-form-fieldset o-form-label-top"> 58 <div data-se="o-form-label" class="label-recovery-username"> 59 <label for="account-recovery-username">Enter your account email below to receive a password reset link.</label> 60 </div> 61 <div data-se="o-form-input-container" class="o-form-input"> 62 <span 63 data-se="o-form-input-username" 64 class="o-form-input-name-username o-form-control okta-form-input-field input-fix"> 65 <input 66 type="text" 67 placeholder="" 68 name="username" 69 id="account-recovery-username" 70 value="" 71 aria-label="" 72 autocomplete="username"> 73 </span> 74 </div> 75 </div> 76 <a class="button button-primary button-wide email-button-ctct" href="#"> 77 Reset via Email 78 </a> 79 </div> 80 </div> 81 82 <div id="forgotPasswordFooter"> 83 <a href="#" class="display-block text-right link help js-back" data-se="back-link">Back to sign in</a> 84 </div> 85 </form> 86 <div class="o-form-content o-form-theme clearfix" id="successMessage" style="display:none;"> 87 <div class="infobox infobox-info"> 88 <span class="info info-16" style="top: 50px !important"></span> 89 <h2>Check your email</h2> 90 <p id="forgotPasswordMessage"></p> 91 </div> 92 <div class="o-form-fieldset-container text-right display-block" style="margin-top: 5px"> 93 Remember?
94 <a data-se="back-button" class="link js-back"> 95 Sign in 96 </a> 97 </div> 98 </div> 99 <div class="o-form-content o-form-theme clearfix" id="CTCTErrorMessage" style="display:none;"> 100 <div class="infobox infobox-info"> 101 <span class="info info-16" style="top: 50px !important"></span> 102 <h2>You don't have an account</h2> 103 <p id="CTCTErrorText"> 104 It looks like you have a Constant Contact account. <a href="https://login.constantcontact.com/">Sign in to Constant Contact</a>.<br /> 105 <br /> 106 Learn more about <a href="https://sharpspring.com/">SharpSpring</a>. 107 </p> 108 </div> 109 </div> 110 <div class="o-form-content o-form-theme clearfix" id="flashErrorMessage" style="display:none;"> 111 <div class="infobox infobox-error"> 112 <span class="icon error-16" id="flashIcon"></span> 113 <p id="flashErrorText"> 114 An unexpected error has occurred. Try again later. </p> 115 </div> 116 </div> 117 </div> 118 </div> 119 </div> 120 </div> 121 122
122<script type="text/javascript" src="/plugins/okta/js/okta-sign-in.min.js"></script>
122 123 124 125 <div id="login-footer"> 126 <ul> 127 <li><a href="https://www.constantcontact.com/legal/terms" target="_blank">Terms of Service</a></li> 128 <li><a href="https://www.constantcontact.com/legal/privacy-notice" target="_blank">Privacy Policy</a></li> 129 <li> 130 <a href="https://status.sharpspring.com" target="_blank"> 131 System Status </a> 132 </li> 133 </ul> 134 135 <p>Copyright © 2012 - 2026 </p> 136 </div> 137 </sharplegacy> 138 139 <!-- JS CORE --> 140
140<script type="text/javascript" src="/includes/js/dist/core.min.js?ver=5.75-35"></script>
140 141
141<script type="text/javascript" src="/includes/js/core/jquery.validate.min.js?ver=5.75-35"></script>
141 142
142<script type="text/javascript" src="/includes/js/core/jquery.maskedinput.js?ver=5.75-35"></script>
142 143
143<script type="text/javascript" src="/includes/js/dist/plugin.min.js?ver=5.75-35"></script>
143 144
144<script type="text/javascript" src="/includes/js/core/require.js?ver=5.75-35"></script>
144 145
145<script type="text/javascript" src="/includes/js/app/underscore.js?ver=5.758d2504781a"></script>
145 146 147 <!-- LANGUAGE --> 148
148<script type="text/javascript" src="/includes/js/app/lang/en_US.js?ver=5.758d2504781a"></script>
148 149
149<script type="text/javascript" src="/includes/js/app/lang/locales.js?ver=5.758d2504781a"></script>
149 150 151
151<script> 152 var forgotPasswordForm = document.getElementById('oktaPasswordForm'); 153 154 var username = ''; 155 var password = ''; 156 157 const tStrings = { 158 greeting: 'Welcome Back!', 159 username: 'Username', 160 password: 'Password', 161 forgotPasswordMessage: 'If there is an account associated with this email address or username, we will send instructions to reset your password.', 162 }; 163 const signIn = new OktaSignIn({ 164 useClassicEngine: true, 165 baseUrl: 'https://identity.constantcontact.com', 166 logo: '/includes/img/CTCT_Logo_H_FC_RGB.png', 167 features: { 168 showPasswordToggleOnSignInPage: true 169 }, 170 authParams: { 171 pkce: true, 172 issuer: 'https://identity.constantcontact.com/oauth2/default', 173 }, 174 cookies: { 175 secure: true, 176 }, 177 i18n: { 178 'en': { 179 'primaryauth.title': tStrings.greeting, 180 'primaryauth.username.placeholder': tStrings.username, 181 'primaryauth.password.placeholder': tStrings.password, 182 'errors.E0000004': 'Invalid username and/or password.', 183 'enroll.choices.title': 'Select an option below to continue setting up two-factor authentication.', 184 'enroll.choices.description.generic': ' ', 185 }, 186 }, 187 processCreds: function(creds, callback) { 188 $.ajax({ 189 method: "POST", 190 url: "/auth/oktaAuthFlag/" + encodeURIComponent(creds.username), 191 success: function(legacy) { 192 let response = JSON.parse(legacy); 193 if (response.oktaID) { 194 callback(); 195 } else { 196 window.console.error('Legacy login no longer supported.'); 197 } 198 } 199 }); 200 } 201 }); 202 signIn.on('afterError', function (context, error) { 203 $.ajax({ 204 method: "POST", 205 url: "/auth/oktaErrorLog", 206 data: { username: username, error: error, href: window.location.href }, 207 }); 208 }); 209 signIn.renderEl({ 210 el: '#okta_login' 211 }, function success(res) { 212 if (res.status === 'SUCCESS' && res.session && res.session.token) { 213 var params = new URLSearchParams({ 214 client_id: '0oa1nweaob2xdDyXn0h8', 215 response_type: 'code', 216 scope: 'openid email', 217 redirect_uri: 'https://cst2.marketingautomation.services/auth/oktaPkceCallback', 218 state: '891bdc49afc5d4df11bb138fbc1a23fd', 219 code_challenge: 'WsG2B6Xluww1Q8bYAuxY5fyeP-scscdvKnuUvPg6Pbc', 220 code_challenge_method: 'S256', 221 sessionToken: res.session.token, 222 }); 223 window.location.href = 'https://identity.constantcontact.com/oauth2/default/v1/authorize?' + params.toString(); 224 } 225 }, function error(res) {}); 226 227 signIn.on('afterRender', function(context) { 228 const parentDiv = document.querySelector('#okta_login'); 229 230 const usernameField = parentDiv.querySelector('#okta-signin-username'); 231 if (usernameField) { 232 usernameField.placeholder = tStrings.username; 233 234 usernameField.addEventListener('focusout', function(e) { 235 if (usernameField.value === '') { 236 parentDiv.querySelector('.o-form-input-name-username').classList.add('error-input'); 237 } else { 238 parentDiv.querySelector('.o-form-input-name-username').classList.remove('error-input'); 239 } 240 }); 241 } 242 243 const passwordField = parentDiv.querySelector('#okta-signin-password'); 244 if (passwordField) { 245 passwordField.placeholder = tStrings.password; 246 247 passwordField.addEventListener('focusout', function(e) { 248 if (passwordField.value === '') { 249 parentDiv.querySelector('.o-form-input-name-password').classList.add('error-input'); 250 } else { 251 parentDiv.querySelector('.o-form-input-name-password').classList.remove('error-input'); 252 } 253 }); 254 } 255 256 const rememberGroup = parentDiv.querySelector('.o-form-input-name-remember'); 257 if (rememberGroup) { 258 const rememberLabel = parentDiv.querySelector('label[for=input7]'); 259 if (rememberLabel) { 260 rememberLabel.textContent = 'Remember ' + tStrings.username; 261 } 262
263 const signInButton = parentDiv.querySelector('form#form1'); 264 if (signInButton) { 265 signInButton.append(rememberGroup); 266 } 267 const helpList = document.createElement('div'); 268 269 helpList.classList.add('help-list'); 270 271 const forgotPassword = document.createElement('a'); 272 forgotPassword.href = '#'; 273 forgotPassword.textContent = `Forgot ${tStrings.password}?`; 274 forgotPassword.className = 'js-forgot-password'; 275 276 helpList.append(forgotPassword); 277 rememberGroup.append(helpList); 278 279 // Only hide the "Need help signing in?" on initial login screen 280 const oldFooter = parentDiv.querySelector('.auth-footer'); 281 if (oldFooter) { 282 parentDiv.querySelector('.auth-footer').remove(); 283 } 284 } 285 286 const verifyBanner = parentDiv.querySelector('.okta-form-title.o-form-head'); 287 if (verifyBanner && verifyBanner.textContent.includes('SMS')) { 288 const pSubtitle = parentDiv.querySelector('.okta-form-subtitle.o-form-explain'); 289 290 const ratesMsg = document.createElement('p'); 291 ratesMsg.classList.add('okta-form-subtitle'); 292 ratesMsg.innerText = '*Standard rates may apply'; 293 294 pSubtitle.before(ratesMsg); 295 } 296 297 const beacon = parentDiv.querySelector('.beacon-container'); 298 if (beacon.childElementCount > 0) { 299 parentDiv.querySelector('.auth-header').classList.add('include-beacon'); 300 } 301 302 const smsRequest = parentDiv.querySelector('.sms-request-button'); 303 if (smsRequest) { 304 smsRequest.classList.add('button-primary'); 305 parentDiv.querySelector('input[value="Verify"]').classList.remove('button-primary'); 306 307 const errorContainer = parentDiv.querySelector('.o-form-error-container'); 308 const infoSMS = document.createElement('div'); 309 const infoIcon = document.createElement('span'); 310 infoSMS.classList.add('infobox-info', 'infobox'); 311 infoSMS.innerText = 'Click the Send Code Button below to receive your SMS code.'; 312 errorContainer.prepend(infoSMS); 313 infoIcon.classList.add('info', 'info-16'); 314 infoSMS.appendChild(infoIcon); 315 } 316 317 318 const sendSMS = parentDiv.querySelector('a[data-se="sms-send-code"]'); 319 if (sendSMS) { 320 sendSMS.addEventListener('click', function(e) { 321 e.preventDefault(); 322 smsRequest.classList.remove('button-primary'); 323 parentDiv.querySelector('input[value="Verify"]').classList.add('button-primary'); 324 }); 325 } 326 327 const smsFactor = parentDiv.querySelector('form.mfa-verify-passcode'); 328 if (smsFactor && smsFactor.getAttribute('data-se') === 'factor-sms') { 329 parentDiv.querySelector('.auth-passcode').classList.add('fix-input'); 330 } 331 332 $('.js-forgot-password').click(function (e) { 333 e.preventDefault(); 334 e.stopImmediatePropagation(); 335 $('#successMessage').hide(); 336 $('#forgot-password-form').show(); 337 $('#okta-sign-in').append(forgotPasswordForm); 338 $('#form1').hide(); 339 $('.auth-content').hide(); 340 $('.auth-content.okta-override').show(); 341 }); 342 343 $('.js-back').click(function() { 344 $('#form1').show(); 345 $('.auth-content').show(); 346 $('.auth-content.okta-override').hide(); 347 }); 348 349 $('#forgot-password-form').on('submit', function (e) { 350 e.preventDefault(); 351 handleForgotEmail(); 352 }) 353 354 $('.email-button, .email-button-ctct').click(handleForgotEmail); 355 356 function handleForgotEmail() { 357 var email = $('#account-recovery-username').val() 358 $.ajax({ 359 method: "POST", 360 url: "/auth/sendForgetEmail", 361 data: {skipRedirect: 1, email: email, csrf: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJjaWQiOjAsImNzcmYiOjEsImlhdCI6MTc5MDkxMzMwMCwiZXhwIjoxNzkwOTEzNDgwfQ.xDQenpeBUOCKmei-tR-VCpre8U20DhrCDPhWpFQjC0PYylpwhuu1UaIqO1CoV2F74eA2EUK4aDjlYHbYAoBcCQ' }, 362 success: function (response) { 363 response = JSON.parse(response); 364 $('#forgot-password-form').hide();
365 $('#forgotPasswordMessage').text(tStrings.forgotPasswordMessage); 366 $('#successMessage').show(); 367 } 368 }); 369 } 370 let formLabelTop = parentDiv.querySelector('.o-form-label-top.margin-btm-30'); 371 if (formLabelTop) { 372 formLabelTop.classList.remove('margin-btm-30'); 373 } 374 }); 375 376</script>
376 377</body> 378</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.