Files
2025-08-21 16:14:09 +02:00

93 lines
1.8 KiB
Go

package controller
import (
"image/png"
"net/http"
"github.com/boombuler/barcode"
"github.com/boombuler/barcode/qr"
"github.com/gin-gonic/gin"
"github.com/phishingclub/phishingclub/service"
)
// QRCodeRequest is the request to generate a QR code from a TOTP URL
type QRCodeRequest struct {
URL string `json:"url"`
DotSize int `json:"dotSize"`
}
// QRGenerator is the QR controller
type QRGenerator struct {
Common
}
// QRGenerator creates a HTML QR code
// It is returned in an JSON response
func (q *QRGenerator) ToHTML(g *gin.Context) {
_, _, ok := q.handleSession(g)
if !ok {
return
}
// parse request
var req QRCodeRequest
if ok := q.handleParseRequest(g, &req); !ok {
return
}
// generate QR code
qrCodeBuf, err := service.GenerateQRCode(req.URL, req.DotSize)
if err != nil {
q.Logger.Debugw("failed to genereate QR code",
"error", err,
)
q.Response.ServerError(g)
return
}
q.Response.OK(g, qrCodeBuf)
}
// ToTOTPURL generates a QR code from a TOTP URL
func (q *QRGenerator) ToTOTPURL(g *gin.Context) {
_, _, ok := q.handleSession(g)
if !ok {
return
}
// parse request
var req QRCodeRequest
if ok := q.handleParseRequest(g, &req); !ok {
return
}
// generate QR code
qrCode, err := qr.Encode(
req.URL,
qr.M,
qr.Auto,
)
if err != nil {
q.Logger.Debugw("failed to generate QR code",
"error", err,
)
q.Response.ServerError(g)
return
}
qrCode, err = barcode.Scale(qrCode, 200, 200)
if err != nil {
q.Logger.Debugw("failed to scale QR code",
"error", err,
)
q.Response.ServerError(g)
return
}
// output QR code as png
g.Writer.Header().Set("Content-Type", "image/png")
err = png.Encode(g.Writer, qrCode)
if err == nil {
q.Logger.Debugw("failed to encode QR code",
"error", err,
)
q.Response.ServerError(g)
return
}
// respond
g.Status(http.StatusOK)
}