Nowy user

# adduser nowy_user

// User nowy_user dodany do grupy sudo - uprawnienia roota
# usermod -aG sudo nowy_user

Debian certyfikaty

Różne operacje na certyfikatach:

1. Wgrywamy wszystkie wymagane certyfikaty do /tmp/gus-cert
2. Przygotowujemy tylko certyfikaty w formacie PEM
3. Mogą mieć rozszerzenia .pem lub .crt
4. Zamieniamy rozszerzenia na .crt
# file *

certum_ov_tls_g2_r39_CA.crt: PEM certificate
certum_root.crt:             PEM certificate
rootca.crt:                  PEM certificate
statca.crt:                  PEM certificate
stat_gov_pl.crt:             PEM certificate

Kopiujemy wszystkie certyfikaty do katalogu: /usr/local/share/ca-certificates

# cp certum_ov_tls_g2_r39_CA.crt  /usr/local/share/ca-certificates/
......

# update-ca-certificates --fresh

Clearing symlinks in /etc/ssl/certs...
done.
Updating certificates in /etc/ssl/certs...
142 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

# systemctl restart apache2

Katalogi:

/etc/ssl/certs/                      - z tego korzystają usługi

/etc/ssl/certs/ca-certificates.crt   - plik wynikowy

/usr/local/share/ca-certificates/    - roboczy dla update-ca-certificates

Czytaj dalej Debian certyfikaty

KSEF

https://web2tr-ksef.mf.gov.pl/web/  – strona logowania

– uwierzytelnienie za pomocą podpisu zaufanego, podpisanie dokumentu

// ============================================
// KROK 2: IMPLEMENTACJA KSEFCLIENT I AUTORYZACJA 
// ============================================
//
// W KSeF API 2.0 proces uwierzytelniania składa się z 3 kroków:
// 1. Pobranie challenge (POST /auth/challenge)
// 2. Przygotowanie żądania autoryzacyjnego z tokenem i challenge
// 3. Uzyskanie JWT accessToken

// ============================================
// Plik: src/KSeF/KSeFClient.php
// ============================================
# composer require guzzlehttp/guzzle: ^7.10
# composer require phpseclib/phpseclib:~3.0
Upewnij się że PHP ma włączone rozszerzenie OpenSSL:
# php -m | grep openssl
(powinno pokazać "openssl")

odsumowanie Kroku 2:

Co zbudowaliśmy:

  • KSeFClient.php – pełna implementacja uwierzytelnienia
  • Szyfrowanie RSA-OAEP SHA-256 (phpseclib + OpenSSL fallback)
  • Proces 3-krokowy KSeF 2.0:
    1. POST /auth/challenge
    2. POST /auth/ksef-token
    3. GET /auth/{referenceNumber} (polling)
    4. POST /auth/token/redeem
  • Zarządzanie JWT tokenami
  • Kontroler testowy do łatwego testowania: src/Controller/KsefTestController.php

Kluczowe nauki:

  • KSeF 2.0 wymaga RSA-OAEP z SHA-256 (nie SHA-1!)
  • Format szyfrowania: token|timestampMs (bez challenge)
  • Struktura JSON: płaska (bez credentials)
  • Proces jest asynchroniczny – wymaga pollingu

CO DALEJ? – KROK 3

Teraz mamy accessToken i możemy przejść do wysyłania faktur!

Krok 3 będzie obejmował:

  1. Budowanie faktury w formacie FA(3) XML
  2. Szyfrowanie faktury (AES-256-CBC)
  3. Otwarcie sesji online
  4. Wysłanie faktury do KSeF
  5. Pobranie UPO (Urzędowego Poświadczenia Odbioru)
  6. Pobieranie faktur z KSeF

Moduł wysyłania faktur!

To będzie obejmowało:

  • Klasę FakturaBuilder do tworzenia XML FA(3)
  • Szyfrowanie AES-256-CBC
  • Sesje online
  • Wysyłkę faktur

Dostęp do innej tabeli z Modelu

W modelu Table nie można użyć metody $this->fetchTable(„Projects”)  – ta metoda dostępna jest tylko dla Controllers.

src/Model/Table/InvoicesTable.php

use Cake\ORM\TableRegistry;

class InvoicesTable extends Table
{

  public function getProjects() { 
    
    $projects = TableRegistry::getTableLocator()->get('Projects')
                  ->find()
                  ->where(['is_active' => 1])
                  ->all();
    ....
  } // getProjects()
...

} // class

Rsync

Wszystkie pliki i podkatalogi /home/john/my_app/ zostaną wgrane do  roboczego katalogu .

# rsync -av johnny@194.127.230.100:/home/johnny/my_app/ .

Backup zostanie wgrany ze zdalnego systemu do katalogu roboczego

# rsync -av johnny@194.137.231.100:/home/johnny/backup/myapp-20251120.sql .

CakePHP 5 – Formularz – Powiązania modeli

$this->Form->create($article);

// Article controls.
echo $this->Form->control('title');

// Author controls (belongsTo)
echo $this->Form->control('author.id');
echo $this->Form->control('author.first_name');
echo $this->Form->control('author.last_name');

// Author profile (belongsTo + hasOne)
echo $this->Form->control('author.profile.id');
echo $this->Form->control('author.profile.username');

// Tags controls (belongsToMany)
// as separate inputs
echo $this->Form->control('tags.0.id');
echo $this->Form->control('tags.0.name');
echo $this->Form->control('tags.1.id');
echo $this->Form->control('tags.1.name');

// Inputs for the joint table (articles_tags)
echo $this->Form->control('tags.0._joinData.starred');
echo $this->Form->control('tags.1._joinData.starred');

// Comments controls (hasMany)
echo $this->Form->control('comments.0.id');
echo $this->Form->control('comments.0.comment');
echo $this->Form->control('comments.1.id');
echo $this->Form->control('comments.1.comment');

$this->Form->end();

Czytaj dalej CakePHP 5 – Formularz – Powiązania modeli

css spiner

.spinner {
  /* ... */
  opacity: 0;
  animation:
    fadeIn 500ms 100ms forwards,
    rotate 1s linear infinite;
}

@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes rotate {
  to {
    transform: rotate(360deg);
  }
}

PHP – Zwraca datę początku i końca tygodnia – na podstawie Roku i nr tygodnia

 private function getWeekDateRange($year, $week) {

// Utworzenie obiektu DateTime dla pierwszego dnia określonego tygodnia
$dto = new DateTime();
$dto->setISODate($year, $week);

// Pierwszy dzień tygodnia (poniedziałek)
$start_date = $dto->format('Y-m-d');

// Dodanie 6 dni aby otrzymać ostatni dzień tygodnia (niedziela)
$dto->modify('+6 days');
$end_date = $dto->format('Y-m-d');

  return [
    'start_date' => $start_date,
    'end_date' => $end_date
  ];
}

JS – $.ajax – console.error

$.ajax({
        url: '/api/products/get-all.json',
        type: 'GET',
        dataType: 'json',
        success(resp) {
            if(resp.resp.error) {
                $("#feedback").text(resp.resp.error).addClass('text-danger');
                return;
            }
            $("#feedback").text(resp.resp.success).addClass('text-success');
        },
        error(e){
           var message = "";
           if(e.responseJSON !== 'undefined') message = e.responseJSON.message;
           if(e.responseText !== 'undefined') message = e.responseText.message;
           console.log(message ); 
        }
    });

Docker Desktop – options

Przy dodawaniu nowego kontenera:

        Komputer lokalny       Docker
---------------------------------------------------
Port   :  5678 | 5679       :  5678

Volume : C:\...\n8n-data1   : /home/node/.n8n
Volume : C:\...\n8n-pliki   : /pliki_n8n

Zmienne:

GENERIC_TIMEZONE : Europe/Warsaw

TS               : Europe/Warsaw