Apache2 permissions “hack”

(Errors are fixed ^^)

It’s not stupid if [the last part] works, right? Right?

1. We need a new group: website
2. We need a user: frank
3. Simple website where everything is put into /var/www/html/

sudo addgroup website
sudo adduser frank website
sudo adduser frank www-data

Let’s see if Frank belongs to the right groups:

groups frank

The result should look something like

frank : frank cdrom floppy sudo audio dip website www-data video plugdev netdev

Let’s change some ownerships, directory first.

sudo chown -vR :website /var/www/html/

Now set the permissions right.

sudo chmod -vR g+w /var/www/html/

You should do a test now by doing the following:

cd /var/www/html/
echo "My server bring all the boys to the yard" > index.html

If you get an error, enter the following:

newgrp - website

This is, in my experience not permanent though, so if you keep having issues, just yeet it into the bash.bashrc file, at the bottom:

sudo nano /etc/bash.bashrc

add at the bottom:

if [[ -n $SSH_CONNECTION ]] ; then
newgrp - www-data
fi

 

Loading

Client didn’t pay? Make their website go away.

Something I need to test still, but adding it here for later use, maybe. If you find a bug, please let me know! And I’m halfways sure that the author shown in this link does  it less complicated, but it’s fun to learn and play around with code. https://github.com/kleampa/not-paid


GOAL: Let the website fade away, one step per day.

Define the initial opacity as 1 (fully opaque).

<style>
    body {
        opacity: 1; /* Initial opacity */
        transition: opacity 1s ease; /* Smooth transition */
    }
</style>

Modify the function to decrement the opacity by a step (e.g., 0.1).

<script>
    function decreaseOpacity() {
        let body = document.body;
        let currentOpacity = parseFloat(window.getComputedStyle(body).opacity);
        if (currentOpacity > 0) {
            body.style.opacity = (currentOpacity - 0.1).toFixed(1);
        }
    }
</script>

Adjust the local storage logic accordingly.

<script>
    document.addEventListener("DOMContentLoaded", function() {
        let storedOpacity = localStorage.getItem('bodyOpacity');
        if (storedOpacity) {
            document.body.style.opacity = storedOpacity;
        } else {
            localStorage.setItem('bodyOpacity', '1');
        }
    });

    function decreaseOpacity() {
        let body = document.body;
        let currentOpacity = parseFloat(window.getComputedStyle(body).opacity);
        if (currentOpacity > 0) {
            let newOpacity = (currentOpacity - 0.1).toFixed(1);
            body.style.opacity = newOpacity;
            localStorage.setItem('bodyOpacity', newOpacity);
        }
    }
</script>

Modify the date-checking logic to call the decreaseOpacity function.

<script>
    document.addEventListener("DOMContentLoaded", function() {
        let storedOpacity = localStorage.getItem('bodyOpacity');
        let lastIncrementDate = localStorage.getItem('lastIncrementDate');
        let today = new Date().toDateString();

        if (storedOpacity) {
            document.body.style.opacity = storedOpacity;
        } else {
            localStorage.setItem('bodyOpacity', '1');
            localStorage.setItem('lastIncrementDate', today);
        }

        if (lastIncrementDate !== today) {
            decreaseOpacity();
            localStorage.setItem('lastIncrementDate', today);
        }
    });

    function decreaseOpacity() {
        let body = document.body;
        let currentOpacity = parseFloat(window.getComputedStyle(body).opacity);
        if (currentOpacity > 0) {
            let newOpacity = (currentOpacity - 0.1).toFixed(1);
            body.style.opacity = newOpacity;
            localStorage.setItem('bodyOpacity', newOpacity);
        }
    }
</script>

Here is how the complete HTML file might look for the fading away effect:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Decrease Opacity</title>
    <style>
        body {
            opacity: 1; /* Initial opacity */
            transition: opacity 1s ease; /* Smooth transition */
        }
    </style>
</head>
<body>
    <h1>Hello, World!</h1>

    <script>
        document.addEventListener("DOMContentLoaded", function() {
            let storedOpacity = localStorage.getItem('bodyOpacity');
            let lastIncrementDate = localStorage.getItem('lastIncrementDate');
            let today = new Date().toDateString();

            if (storedOpacity) {
                document.body.style.opacity = storedOpacity;
            } else {
                localStorage.setItem('bodyOpacity', '1');
                localStorage.setItem('lastIncrementDate', today);
            }

            if (lastIncrementDate !== today) {
                decreaseOpacity();
                localStorage.setItem('lastIncrementDate', today);
            }
        });

        function decreaseOpacity() {
            let body = document.body;
            let currentOpacity = parseFloat(window.getComputedStyle(body).opacity);
            if (currentOpacity > 0) {
                let newOpacity = (currentOpacity - 0.1).toFixed(1);
                body.style.opacity = newOpacity;
                localStorage.setItem('bodyOpacity', newOpacity);
            }
        }
    </script>
</body>
</html>

So with this setup, the opacity of the body tag will start at 1 (fully opaque) and decrease by 0.1 each day until it reaches 0 (fully transparent). The localStorage ensures that the opacity persists across browser sessions and days.

Have you tried it? Let me know!

Loading

Script Dump: Live Epoch Time QR Code

This is a script that I needed to investigate a certain security method. Not needed any more, so here ya go!

<!DOCTYPE html>
<html>
<head>
    <title>Live Epoch Time QR Code</title>
    <style>
        .qr-code {
            display: inline-block;
            width: 128px;
            height: 128px;
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <h1>Live Epoch Time QR Code</h1>
    <div id="epochTime"></div>
    <div id="qrcode" class="qr-code"></div>

    <script>
        // Function to update the epoch time and QR code
        function updateTimeAndQRCode() {
            var epochTime = Math.floor(Date.now() / 1000); // Current epoch time in seconds
            document.getElementById('epochTime').innerHTML = 'Epoch Time: ' + epochTime;

            // Generate QR code using CSS
            var qrCodeElement = document.getElementById("qrcode");
            qrCodeElement.style.backgroundImage = "url('https://api.qrserver.com/v1/create-qr-code/?data=" + epochTime + "&size=128x128')";
        }

        // Update the time and QR code every second
        setInterval(updateTimeAndQRCode, 1000);

        // Initial call to display time and QR code
        updateTimeAndQRCode();
    </script>
</body>
</html>

 

Loading

Script Dump: Bogosort Musical Notes

I’m done playing with this so grab some notes in MP3 format and run the script. Do adapt it to your own likings and have fun!

<html>
<head>
    <title>Music Bogosort</title>
    <script>
        function bogosortAndPlay() {
            var notes = ["C", "D", "E", "F", "G", "A", "B"];
            var sortedNotes = [];
            while (sortedNotes.length < 6) {
                var randomIndex = Math.floor(Math.random() * notes.length);
                var randomNote = notes[randomIndex];
                if (!sortedNotes.includes(randomNote)) {
                    sortedNotes.push(randomNote);
                }
            }
            document.getElementById("unsorted_notes").innerHTML = "Unsorted notes: " + sortedNotes.join(", ");

            // Bogosort (this is extremely inefficient)
            while (!isSorted(sortedNotes)) {
                shuffleArray(sortedNotes);
            }

            document.getElementById("sorted_notes").innerHTML = "Sorted notes: " + sortedNotes.join(", ");
            playNotes(sortedNotes);
        }

        function isSorted(array) {
            for (var i = 0; i < array.length - 1; i++) {
                if (array[i] > array[i + 1]) {
                    return false;
                }
            }
            return true;
        }

        function shuffleArray(array) {
            for (var i = array.length - 1; i > 0; i--) {
                var j = Math.floor(Math.random() * (i + 1));
                var temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }

        function playNotes(notes) {
            var index = 0;
            function playNextNote() {
                if (index < notes.length) {
                    var audio = new Audio("notes/" + notes[index] + ".mp3");
                    audio.play();
                    index++;
                    // Delay between notes (adjust as needed)
                    setTimeout(playNextNote, 1000); // Delay of 1 second between notes
                }
            }
            playNextNote();
        }
    </script>
</head>
<body>
    <h1>Music Bogosort</h1>
    <button onclick="bogosortAndPlay()">Sort and Play</button>
    <p id="unsorted_notes"></p>
    <p id="sorted_notes"></p>
</body>
</html>

 

Loading