From e6d00f66d9d0c45969330d9cf26e4b4e23d526db Mon Sep 17 00:00:00 2001 From: Stephen von Takach Date: Fri, 13 Sep 2024 15:46:06 +1000 Subject: [PATCH 1/2] feat(place/visitor_mailer): provide a QR code for building access --- drivers/place/smtp.cr | 39 ++++++++++++++++++++++++++++----- drivers/place/visitor_mailer.cr | 5 +++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/drivers/place/smtp.cr b/drivers/place/smtp.cr index 382951316b8..817eaeb4e98 100644 --- a/drivers/place/smtp.cr +++ b/drivers/place/smtp.cr @@ -1,10 +1,12 @@ -require "qr-code" -require "qr-code/export/png" +require "placeos-driver" +require "placeos-driver/interface/mailer" + +require "goban" +require "goban/exporters/png" +require "goban/exporters/svg" require "base64" require "email" require "uri" -require "placeos-driver" -require "placeos-driver/interface/mailer" class Place::Smtp < PlaceOS::Driver include PlaceOS::Driver::Interface::Mailer @@ -14,6 +16,11 @@ class Place::Smtp < PlaceOS::Driver uri_base "https://smtp.host.com" description %(sends emails via SMTP) + enum BinaryFormatQR + Hex + Base64 + end + default_settings({ sender: "support@place.tech", # host: "smtp.host", @@ -23,6 +30,8 @@ class Place::Smtp < PlaceOS::Driver username: "", # Username/Password for SMTP servers with basic authorization password: "", + qr_binary_format: BinaryFormatQR::Hex, + email_templates: {visitor: {checkin: { subject: "%{name} has arrived", text: "for your meeting at %{time}", @@ -43,6 +52,7 @@ class Place::Smtp < PlaceOS::Driver @tls_mode : EMail::Client::TLSMode = EMail::Client::TLSMode::STARTTLS @send_lock : Mutex = Mutex.new @ssl_verify_ignore : Bool = false + @qr_binary_format : BinaryFormatQR = BinaryFormatQR::Hex def on_load on_update @@ -65,6 +75,7 @@ class Place::Smtp < PlaceOS::Driver @port = setting?(Int32, :port) || port @tls_mode = setting?(EMail::Client::TLSMode, :tls_mode) || tls_mode @ssl_verify_ignore = setting?(Bool, :ssl_verify_ignore) || false + @qr_binary_format = setting?(BinaryFormatQR, :qr_binary_format) || BinaryFormatQR::Hex @smtp_client = new_smtp_client @@ -88,11 +99,27 @@ class Place::Smtp < PlaceOS::Driver end def generate_svg_qrcode(text : String) : String - QRCode.new(text).as_svg + qr = Goban::QR.encode_string(text) + Goban::SVGExporter.svg_string(qr, 4) end def generate_png_qrcode(text : String, size : Int32 = 128) : String - Base64.strict_encode QRCode.new(text).as_png(size: size) + qr = Goban::QR.encode_string(text) + io = IO::Memory.new + Goban::PNGExporter.export(qr, io, size) + Base64.strict_encode io.to_slice + end + + def generate_png_qrcode_hex(hex_text : String, size : Int32 = 128) : String + case @qr_binary_format + in .hex? + in .base64? + hex_text = Base64.strict_encode hex_text.hexbytes + end + qr = Goban::QR.encode_string(hex_text) + io = IO::Memory.new + Goban::PNGExporter.export(qr, io, size) + Base64.strict_encode io.to_slice end def send_mail( diff --git a/drivers/place/visitor_mailer.cr b/drivers/place/visitor_mailer.cr index c430ed21934..1f4ed5e3fff 100644 --- a/drivers/place/visitor_mailer.cr +++ b/drivers/place/visitor_mailer.cr @@ -1,5 +1,6 @@ require "placeos-driver" require "placeos-driver/interface/mailer" +require "placeos-driver/interface/guest_building_access" require "./password_generator_helper" @@ -343,6 +344,10 @@ class Place::VisitorMailer < PlaceOS::Driver attach = if @disable_qr_code [] of NamedTuple(file_name: String, content: String, content_id: String) + elsif (access_control = system.implementing(Interface::GuestBuildingAccess).first?) && access_control.guest_access_configured?.get.as_b + details = access_control.grant_guest_access(visitor_name || visitor_email.sub('@', ' '), visitor_email, event_start, event_start + 1.hour.total_seconds).get + data = details["card_hex"].as_s + qr_png = mailer.generate_png_qrcode_hex(hex_text: data, size: 256).get.as_s else qr_png = mailer.generate_png_qrcode(text: "VISIT:#{visitor_email},#{resource_id},#{event_id},#{host_email}", size: 256).get.as_s [ From 2212b035cf1d98905369e8ae2287f37518c08cb7 Mon Sep 17 00:00:00 2001 From: Stephen von Takach Date: Fri, 13 Sep 2024 15:58:11 +1000 Subject: [PATCH 2/2] fix compile error --- drivers/place/visitor_mailer.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/place/visitor_mailer.cr b/drivers/place/visitor_mailer.cr index 1f4ed5e3fff..8103f1fc1cf 100644 --- a/drivers/place/visitor_mailer.cr +++ b/drivers/place/visitor_mailer.cr @@ -344,7 +344,7 @@ class Place::VisitorMailer < PlaceOS::Driver attach = if @disable_qr_code [] of NamedTuple(file_name: String, content: String, content_id: String) - elsif (access_control = system.implementing(Interface::GuestBuildingAccess).first?) && access_control.guest_access_configured?.get.as_b + elsif (access_control = system.implementing(Interface::GuestBuildingAccess).first?) && access_control.guest_access_configured?.get.as_bool details = access_control.grant_guest_access(visitor_name || visitor_email.sub('@', ' '), visitor_email, event_start, event_start + 1.hour.total_seconds).get data = details["card_hex"].as_s qr_png = mailer.generate_png_qrcode_hex(hex_text: data, size: 256).get.as_s