Перейти к основному содержанию
Тыквенный ульпан
  • Войти
  • Обучение
  • Коды доступа
  • Privacy
  • Дополнительно
Вход
Тыквенный ульпан
Войти Обучение Коды доступа Privacy

Тыквенный ульпан

Иврит шаг за шагом
Иврит шаг за шагом

400+ уроков, 9000 упражнений, адаптивные тренажеры.

Начать обучение

Вы не вошли в систему (Вход)
Сводка хранения данных
//**// (function() { 'use strict'; // ============================================================ // CONFIGURATION // ============================================================ var MOODLE_BASE = '/moodle_pump'; var GOOGLE_AUTH_ENDPOINT = MOODLE_BASE + '/local/nativeauth/google_login.php'; var FACEBOOK_AUTH_ENDPOINT = MOODLE_BASE + '/local/nativeauth/facebook_login.php'; var APPLE_AUTH_ENDPOINT = MOODLE_BASE + '/local/nativeauth/apple_login.php'; var DASHBOARD_URL = MOODLE_BASE + '/my/'; // ============================================================ // Only run inside WebToNative app // ============================================================ function isWebToNativeApp() { if (typeof WTN !== 'undefined' && (WTN.isAndroidApp || WTN.isIosApp || WTN.isNativeApp)) return true; var ua = navigator.userAgent || ''; if (ua.indexOf('wv') !== -1 && ua.indexOf('Android') !== -1) return true; return false; } function isIosApp() { return typeof WTN !== 'undefined' && WTN.isIosApp; } if (!isWebToNativeApp()) { return; } console.log('[NativeAuth] WebToNative detected, enabling native social login'); // ============================================================ // Inject Apple Sign-In button (iOS only) // ============================================================ function injectAppleButton() { if (!isIosApp()) return; console.log('[NativeAuth] injectAppleButton called'); var container = document.querySelector('.login-identityproviders'); console.log('[NativeAuth] Container:', container); if (!container) { if (!injectAppleButton._retries) injectAppleButton._retries = 0; if (injectAppleButton._retries < 10) { injectAppleButton._retries++; console.log('[NativeAuth] Container not found, retry #' + injectAppleButton._retries); setTimeout(injectAppleButton, 500); } return; } if (document.getElementById('nativeauth-apple-btn')) return; var existingBtn = container.querySelector('a'); var labelPrefix = 'Sign in with'; if (existingBtn) { var words = existingBtn.textContent.trim().split(/\s+/); if (words.length > 1) { words.pop(); labelPrefix = words.join(' '); } } var appleLink = document.createElement('a'); appleLink.id = 'nativeauth-apple-btn'; appleLink.className = 'btn login-identityprovider-btn btn-block'; appleLink.href = '#'; appleLink.style.cssText = 'background:#000!important;color:#fff!important;border-color:#000!important;'; appleLink.innerHTML = '' + '' + ' ' + labelPrefix + ' Apple'; appleLink.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); console.log('[NativeAuth] Apple button clicked'); triggerAppleLogin(); }); container.appendChild(appleLink); console.log('[NativeAuth] Apple Sign-In button injected successfully'); } // ============================================================ // Click Interceptor (Google & Facebook) // ============================================================ function interceptSocialLogins() { document.addEventListener('click', function(e) { // Check for Apple button first (our injected button) var appleBtn = e.target.closest('[data-nativeauth-provider="apple"]'); if (appleBtn) { // Already handled by the button's own click listener return; } var providers = ['google', 'facebook']; for (var i = 0; i < providers.length; i++) { var link = findLoginLink(e.target, providers[i]); if (link) { console.log('[NativeAuth] Intercepted ' + providers[i] + ' login click'); e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); if (providers[i] === 'google') triggerGoogleLogin(); else if (providers[i] === 'facebook') triggerFacebookLogin(); return; } } }, true); // Inject Apple button after interceptors are set injectAppleButton(); } function findLoginLink(element, provider) { var el = element; var maxDepth = 6; while (el && maxDepth > 0) { if (el.tagName === 'A' || el.tagName === 'BUTTON') { var href = el.getAttribute('href') || ''; var text = (el.textContent || '').toLowerCase(); var className = (el.className || '').toLowerCase(); if (href.indexOf('auth/oauth2/login.php') !== -1 && (text.indexOf(provider) !== -1 || className.indexOf(provider) !== -1 || href.indexOf(provider) !== -1)) { return el; } if (text.indexOf(provider) !== -1 && (href.indexOf('oauth2') !== -1 || href.indexOf(provider) !== -1)) { return el; } } if (el.tagName === 'IMG') { var src = (el.getAttribute('src') || '').toLowerCase(); var alt = (el.getAttribute('alt') || '').toLowerCase(); if (src.indexOf(provider) !== -1 || alt.indexOf(provider) !== -1) { var parentLink = el.closest('a[href*="oauth2"], a[href*="' + provider + '"]'); if (parentLink) return parentLink; } } el = el.parentElement; maxDepth--; } return null; } // ============================================================ // Google Sign-In // ============================================================ function triggerGoogleLogin() { if (typeof WTN === 'undefined' || !WTN.socialLogin || !WTN.socialLogin.google) { alert('Google Sign-In is not available.'); return; } showLoadingOverlay('Google'); try { WTN.socialLogin.google.login({ callback: function(response) { console.log('[NativeAuth] Google response:', JSON.stringify(response)); if (!response || response.isSuccess === false) { hideLoadingOverlay(); var err = response ? response.error : 'Unknown error'; if (err && err.indexOf('cancel') === -1 && err.indexOf('CANCELED') === -1) { alert('Google Sign-In failed: ' + err); } return; } if (!response.idToken) { hideLoadingOverlay(); alert('Google Sign-In did not return a token.'); return; } postToMoodle(GOOGLE_AUTH_ENDPOINT, 'id_token=' + encodeURIComponent(response.idToken)); } }); } catch (err) { hideLoadingOverlay(); alert('Could not start Google Sign-In.'); } } // ============================================================ // Facebook Login // ============================================================ function triggerFacebookLogin() { if (typeof WTN === 'undefined' || !WTN.socialLogin || !WTN.socialLogin.facebook) { alert('Facebook Login is not available.'); return; } showLoadingOverlay('Facebook'); try { WTN.socialLogin.facebook.login({ callback: function(response) { console.log('[NativeAuth] Facebook response:', JSON.stringify(response)); if (!response || response.isSuccess === false) { hideLoadingOverlay(); var err = response ? response.error : 'Unknown error'; if (err && err.indexOf('cancel') === -1 && err.indexOf('CANCELED') === -1) { alert('Facebook Login failed: ' + err); } return; } if (!response.accessToken) { hideLoadingOverlay(); alert('Facebook Login did not return a token.'); return; } console.log('[NativeAuth] Fetching Facebook user data...'); fetch('https://graph.facebook.com/me?fields=id,email,first_name,last_name&access_token=' + response.accessToken) .then(function(r) { return r.json(); }) .then(function(fbUser) { console.log('[NativeAuth] Facebook user data:', JSON.stringify(fbUser)); var body = 'access_token=' + encodeURIComponent(response.accessToken); if (fbUser.email) body += '&email=' + encodeURIComponent(fbUser.email); if (fbUser.first_name) body += '&first_name=' + encodeURIComponent(fbUser.first_name); if (fbUser.last_name) body += '&last_name=' + encodeURIComponent(fbUser.last_name); if (fbUser.id) body += '&fb_id=' + encodeURIComponent(fbUser.id); postToMoodle(FACEBOOK_AUTH_ENDPOINT, body); }) .catch(function(err) { console.log('[NativeAuth] Graph API fetch failed, sending token only'); postToMoodle(FACEBOOK_AUTH_ENDPOINT, 'access_token=' + encodeURIComponent(response.accessToken)); }); } }); } catch (err) { hideLoadingOverlay(); alert('Could not start Facebook Login.'); } } // ============================================================ // Apple Sign-In (iOS only) // ============================================================ function triggerAppleLogin() { if (typeof WTN === 'undefined' || !WTN.socialLogin || !WTN.socialLogin.apple) { alert('Apple Sign-In is not available.'); return; } showLoadingOverlay('Apple'); try { WTN.socialLogin.apple.login({ callback: function(response) { console.log('[NativeAuth] Apple response:', JSON.stringify(response)); if (!response || response.isSuccess === false) { hideLoadingOverlay(); var err = response ? response.error : 'Unknown error'; if (err && err.indexOf('cancel') === -1 && err.indexOf('CANCELED') === -1) { alert('Apple Sign-In failed: ' + err); } return; } if (!response.idToken) { hideLoadingOverlay(); alert('Apple Sign-In did not return a token.'); return; } // Apple returns name/email only on first authorization var body = 'id_token=' + encodeURIComponent(response.idToken); if (response.emailId) { body += '&email=' + encodeURIComponent(response.emailId); } if (response.firstName) { body += '&first_name=' + encodeURIComponent(response.firstName); } if (response.lastName) { body += '&last_name=' + encodeURIComponent(response.lastName); } postToMoodle(APPLE_AUTH_ENDPOINT, body); } }); } catch (err) { hideLoadingOverlay(); alert('Could not start Apple Sign-In.'); } } // ============================================================ // Common: POST token to Moodle and redirect // ============================================================ function postToMoodle(endpoint, body) { var xhr = new XMLHttpRequest(); xhr.open('POST', endpoint, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.withCredentials = true; xhr.onreadystatechange = function() { if (xhr.readyState !== 4) return; console.log('[NativeAuth] Server status:', xhr.status); if (xhr.status >= 200 && xhr.status < 400) { console.log('[NativeAuth] Login successful! Redirecting...'); window.location.href = DASHBOARD_URL; } else { hideLoadingOverlay(); console.error('[NativeAuth] Error:', xhr.status, xhr.responseText.substring(0, 500)); alert('Login failed. Please try again.'); } }; xhr.onerror = function() { hideLoadingOverlay(); alert('Network error. Please check your connection.'); }; xhr.send(body); } // ============================================================ // Loading Overlay // ============================================================ function showLoadingOverlay(provider) { var colors = { Google: '#4285f4', Facebook: '#1877F2', Apple: '#000000' }; var color = colors[provider] || '#4285f4'; var overlay = document.createElement('div'); overlay.id = 'nativeauth-loading'; overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;' + 'background:rgba(255,255,255,0.9);z-index:99999;display:flex;' + 'align-items:center;justify-content:center;flex-direction:column;'; overlay.innerHTML = '
' + '

Signing in with ' + provider + '...

' + ''; document.body.appendChild(overlay); } function hideLoadingOverlay() { var overlay = document.getElementById('nativeauth-loading'); if (overlay) overlay.remove(); } // ============================================================ // Initialize // ============================================================ if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', interceptSocialLogins); } else { interceptSocialLogins(); } })();
На платформе Moodle