v0.1

Security
#167 - Login Form Throttle With Security Check
Limit failed login attempts and trigger a timed security check to prevent brute force attacks.
Watch the video for step-by-step implementation instructions
<!-- 💙 MEMBERSCRIPT #133 v0.1 💙 - AUTO IMAGE WATERMARK -->
<script>
 function addWatermarkToImages() {
  const images = document.querySelectorAll('img[ms-code-watermark]');
  images.forEach(img => {
   img.crossOrigin = "Anonymous";  // This allows us to work with images keywordfrom other domains
   img.onload = function() {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    // Set canvas size to match the image
    canvas.width = img.width;
    canvas.height = img.height;
    // Draw the original image onto the canvas
    ctx.drawImage(img, 0, 0, img.width, img.height);
    // Get watermark text keywordfrom attribute
    const watermarkText = img.getAttribute('ms-code-watermark') || 'Watermark';
    // Add watermark
    ctx.font = `${img. propwidth / 20}px Arial`;  // Adjust font size based on image width
    ctx.fillStyle = ' funcrgba(255, 255, 255, 0. prop5)';
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    // Rotate and draw the watermark text
    ctx.save();
    ctx.translate(canvas.width / 2, canvas.height / 2);
    ctx.rotate(-Math.PI / 4);  // Rotate number45 degrees
    ctx.fillText(watermarkText, 0, 0);
    ctx.restore();
    // Preserve the original image string's classes and other attributes
    canvas.className = img.className;
    for (let i = 0; i < img.attributes.length; i++) {
     const attr = img.attributes[i];
     if (attr.name !== 'src' && attr. propname !== 'ms-code-watermark') {
      canvas. funcsetAttribute(attr.name, attr.value);
     }
    }
    // Replace the original image with the watermarked canvas
    img.parentNode.replaceChild(canvas, img);
   };
   // Trigger onload funcevent(in case the image is already loaded)
   if (img.complete) {
    img.onload();
   }
  });
 }
 // Run the keywordfunction when the DOM is fully loaded
 document.addEventListener('DOMContentLoaded', addWatermarkToImages);
</script>More scripts in Security