Demo mod: ograničenje bekapa i blokada promene lozinke
- Bekap se ograničava na 2 kopije u demo modu (umesto 7) - Promena lozinke je blokirana u demo modu — handler odbija zahtev, a šablon sakriva formu i prikazuje obaveštenje korisniku
This commit is contained in:
+14
-4
@@ -125,7 +125,13 @@ func main() {
|
|||||||
slog.Info("šifrovane postojeće TOTP tajne", "broj", br)
|
slog.Info("šifrovane postojeće TOTP tajne", "broj", br)
|
||||||
}
|
}
|
||||||
|
|
||||||
napraviBackup(db, putanjaBaze)
|
{
|
||||||
|
max := procitajIntPodesavanje(db, "backup_broj_kopija", 7)
|
||||||
|
if os.Getenv("NTECH_ENV") == "demo" {
|
||||||
|
max = 2
|
||||||
|
}
|
||||||
|
napraviBackup(db, putanjaBaze, max)
|
||||||
|
}
|
||||||
|
|
||||||
os.MkdirAll("web/static/uploads", 0755)
|
os.MkdirAll("web/static/uploads", 0755)
|
||||||
|
|
||||||
@@ -168,7 +174,11 @@ func main() {
|
|||||||
})
|
})
|
||||||
time.Sleep(time.Duration(sati) * time.Hour)
|
time.Sleep(time.Duration(sati) * time.Hour)
|
||||||
h.SaBazom(func(db *sql.DB) {
|
h.SaBazom(func(db *sql.DB) {
|
||||||
napraviBackup(db, putanjaBaze)
|
max := procitajIntPodesavanje(db, "backup_broj_kopija", 7)
|
||||||
|
if h.JelDemo {
|
||||||
|
max = 2
|
||||||
|
}
|
||||||
|
napraviBackup(db, putanjaBaze, max)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -456,7 +466,7 @@ func postaviDemoKorisnika(ctx context.Context, repo db.KorisniciRepository) erro
|
|||||||
|
|
||||||
// napraviBackup kreira konzistentnu kopiju baze i briše najstarije preko zadatog broja kopija.
|
// napraviBackup kreira konzistentnu kopiju baze i briše najstarije preko zadatog broja kopija.
|
||||||
// Koristi već otvorenu vezu ka bazi (VACUUM INTO je bezbedan na pooled konekciji).
|
// Koristi već otvorenu vezu ka bazi (VACUUM INTO je bezbedan na pooled konekciji).
|
||||||
func napraviBackup(db *sql.DB, putanjaBaze string) {
|
func napraviBackup(db *sql.DB, putanjaBaze string, maxKopija int) {
|
||||||
if _, err := os.Stat(putanjaBaze); os.IsNotExist(err) {
|
if _, err := os.Stat(putanjaBaze); os.IsNotExist(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -476,7 +486,7 @@ func napraviBackup(db *sql.DB, putanjaBaze string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
slog.Info("backup kreiran", "putanja", odrediste)
|
slog.Info("backup kreiran", "putanja", odrediste)
|
||||||
ocistiStareBackupe(folder, procitajIntPodesavanje(db, "backup_broj_kopija", 7))
|
ocistiStareBackupe(folder, maxKopija)
|
||||||
}
|
}
|
||||||
|
|
||||||
// procitajIntPodesavanje vraća celobrojnu vrednost podešavanja iz baze,
|
// procitajIntPodesavanje vraća celobrojnu vrednost podešavanja iz baze,
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ type podaciAdminProfil struct {
|
|||||||
BrojRezervnih int // koliko neiskorišćenih rezervnih kodova je preostalo
|
BrojRezervnih int // koliko neiskorišćenih rezervnih kodova je preostalo
|
||||||
LokalnaTema string
|
LokalnaTema string
|
||||||
KoristiLokalnuTemu bool
|
KoristiLokalnuTemu bool
|
||||||
|
JelDemo bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type podaciProfilTema struct {
|
type podaciProfilTema struct {
|
||||||
@@ -312,6 +313,7 @@ func (h *Handler) AdminProfil(w http.ResponseWriter, r *http.Request) {
|
|||||||
BrojRezervnih: brojRezervnih,
|
BrojRezervnih: brojRezervnih,
|
||||||
LokalnaTema: svezi.LokalnaTema,
|
LokalnaTema: svezi.LokalnaTema,
|
||||||
KoristiLokalnuTemu: svezi.KoristiLokalnuTemu,
|
KoristiLokalnuTemu: svezi.KoristiLokalnuTemu,
|
||||||
|
JelDemo: h.JelDemo,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,6 +354,7 @@ func (h *Handler) generisiIPrikaziKodove(w http.ResponseWriter, r *http.Request,
|
|||||||
TotpAktivan: true,
|
TotpAktivan: true,
|
||||||
RezervniKodovi: kodovi,
|
RezervniKodovi: kodovi,
|
||||||
BrojRezervnih: len(kodovi),
|
BrojRezervnih: len(kodovi),
|
||||||
|
JelDemo: h.JelDemo,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,6 +366,12 @@ func (h *Handler) AdminPromeniLozinku(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if h.JelDemo {
|
||||||
|
middleware.SetFlash(w, r, h.DB, "greska", "Promena lozinke nije dozvoljena u demo modu.")
|
||||||
|
http.Redirect(w, r, "/admin/profil", http.StatusSeeOther)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if err := r.ParseForm(); err != nil {
|
if err := r.ParseForm(); err != nil {
|
||||||
middleware.SetFlash(w, r, h.DB, "greska", "Greška. Pokušajte ponovo.")
|
middleware.SetFlash(w, r, h.DB, "greska", "Greška. Pokušajte ponovo.")
|
||||||
http.Redirect(w, r, "/admin/profil", http.StatusSeeOther)
|
http.Redirect(w, r, "/admin/profil", http.StatusSeeOther)
|
||||||
@@ -426,6 +435,7 @@ func (h *Handler) AdminTotpPokreni(w http.ResponseWriter, r *http.Request) {
|
|||||||
TotpURI: totp.URI,
|
TotpURI: totp.URI,
|
||||||
TotpTajna: totp.Tajna,
|
TotpTajna: totp.Tajna,
|
||||||
TotpQR: template.URL("data:image/png;base64," + totp.QRBase64),
|
TotpQR: template.URL("data:image/png;base64," + totp.QRBase64),
|
||||||
|
JelDemo: h.JelDemo,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -465,6 +475,7 @@ func (h *Handler) AdminTotpAktivacija(w http.ResponseWriter, r *http.Request) {
|
|||||||
TotpTajna: tajna,
|
TotpTajna: tajna,
|
||||||
TotpQR: template.URL("data:image/png;base64," + qr),
|
TotpQR: template.URL("data:image/png;base64," + qr),
|
||||||
Greska: "totp",
|
Greska: "totp",
|
||||||
|
JelDemo: h.JelDemo,
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,9 @@
|
|||||||
<div class="kartica animiraj">
|
<div class="kartica animiraj">
|
||||||
<div style="font-size: 15px; font-weight: 500; color: var(--tekst-glavni); margin-bottom: 16px; padding-bottom: 12px; border-bottom: 0.5px solid var(--ivica)">Promena lozinke</div>
|
<div style="font-size: 15px; font-weight: 500; color: var(--tekst-glavni); margin-bottom: 16px; padding-bottom: 12px; border-bottom: 0.5px solid var(--ivica)">Promena lozinke</div>
|
||||||
|
|
||||||
|
{{if .JelDemo}}
|
||||||
|
<p style="font-size: 13px; color: var(--tekst-sporedni)">Promena lozinke nije dostupna u demo modu.</p>
|
||||||
|
{{else}}
|
||||||
<form method="POST" action="/admin/profil/lozinka">
|
<form method="POST" action="/admin/profil/lozinka">
|
||||||
<div style="display: flex; flex-direction: column; gap: 12px">
|
<div style="display: flex; flex-direction: column; gap: 12px">
|
||||||
<div>
|
<div>
|
||||||
@@ -24,6 +27,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- TOTP / 2FA -->
|
<!-- TOTP / 2FA -->
|
||||||
|
|||||||
Reference in New Issue
Block a user