Only show last three digits for 125khz tokens

This commit is contained in:
Laura Hausmann 2023-05-18 21:42:14 +02:00
parent 67a2c51a1b
commit cce63b8d87
Signed by: zotan
GPG key ID: D044E84C5BE01605
7 changed files with 179 additions and 18 deletions

View file

@ -0,0 +1,99 @@
// <auto-generated />
using AfRApay.Web.Backend.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace AfRApay.Web.Backend.Database.Migrations
{
[DbContext(typeof(DatabaseContext))]
[Migration("20230518190147_65F053DB-D1B9-4D26-B494-63452C498D74")]
partial class _65F053DBD1B94D26B49463452C498D74
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "7.0.2");
modelBuilder.Entity("AfRApay.Web.Backend.Database.Tables.Card", b =>
{
b.Property<string>("Id")
.HasColumnType("NVarChar(255)")
.HasColumnName("CardId");
b.Property<int>("Type")
.HasColumnType("INTEGER")
.HasColumnName("CardType");
b.Property<long>("UserId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("Cards");
});
modelBuilder.Entity("AfRApay.Web.Backend.Database.Tables.Config", b =>
{
b.Property<string>("Name")
.HasColumnType("NVarChar(255)")
.HasColumnName("Name");
b.Property<string>("Value")
.IsRequired()
.HasColumnType("NVarChar(255)")
.HasColumnName("Value");
b.HasKey("Name");
b.ToTable("Config");
});
modelBuilder.Entity("AfRApay.Web.Backend.Database.Tables.User", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("ID");
b.Property<long>("Balance")
.HasColumnType("INTEGER")
.HasColumnName("Balance");
b.Property<string>("LastIdempotencyKey")
.HasColumnType("NVarChar(255)")
.HasColumnName("LastIdempotencyKey");
b.Property<string>("Nickname")
.IsRequired()
.HasColumnType("NVarChar(255)")
.HasColumnName("Nickname");
b.HasKey("Id");
b.HasIndex("Nickname")
.IsUnique();
b.ToTable("Users");
});
modelBuilder.Entity("AfRApay.Web.Backend.Database.Tables.Card", b =>
{
b.HasOne("AfRApay.Web.Backend.Database.Tables.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
#pragma warning restore 612, 618
}
}
}

View file

@ -0,0 +1,32 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AfRApay.Web.Backend.Database.Migrations
{
/// <inheritdoc />
public partial class _65F053DBD1B94D26B49463452C498D74 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "CardType",
table: "Cards",
type: "INTEGER",
nullable: false,
defaultValue: 0);
// Detect AfRA door tokens
migrationBuilder.Sql("UPDATE Cards SET CardType = 10 WHERE LENGTH(CardId) = 10 AND CardId GLOB '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "CardType",
table: "Cards");
}
}
}

View file

@ -22,6 +22,10 @@ namespace AfRApay.Web.Backend.Database.Migrations
.HasColumnType("NVarChar(255)")
.HasColumnName("CardId");
b.Property<int>("Type")
.HasColumnType("INTEGER")
.HasColumnName("CardType");
b.Property<long>("UserId")
.HasColumnType("INTEGER");

View file

@ -5,6 +5,20 @@ namespace AfRApay.Web.Backend.Database.Tables;
[Table("Cards")]
public class Card {
[Column("CardId", TypeName = "NVarChar(255)")] [Key] public string Id { get; set; } = null!;
[Column("UserId")] [Required] public User User { get; set; } = null!;
[Column("CardId", TypeName = "NVarChar(255)")] [Key] public string Id { get; set; } = null!;
[Column("CardType")] [Required] public CardType Type { get; set; } = CardType.Unknown;
[Column("UserId")] [Required] public User User { get; set; } = null!;
public enum CardType {
Unknown = 0,
Rfid125KhzGeneric = 10,
NfcGeneric = 20,
NfcMifareClassic = 21,
NfcTflOyster = 22,
NfcOvChipkaart = 23,
NfcItso = 24,
FeliCaGeneric = 30,
FeliCaSuica = 31,
FeliCaPasmo = 32,
}
}

View file

@ -3,6 +3,7 @@
@using Microsoft.AspNetCore.Mvc.TagHelpers
@using Microsoft.EntityFrameworkCore
@using System.Globalization
@using AfRApay.Web.Backend.Database.Tables
@model EditUserModel
@{
ViewData["Title"] = "Edit User";
@ -70,23 +71,23 @@
<br/>
<h3 class="text-center">Cards</h3>
@{
async Task RenderCard(string cardHolder, string cardNumber = "Awooo!", string expDate = "01/2038", EditUserModel.CardType type = EditUserModel.CardType.Normal) {
var cardTypeClasses = type switch {
EditUserModel.CardType.Normal => "fake-card",
EditUserModel.CardType.LinkPlaceholder => "fake-card ghost-card",
EditUserModel.CardType.DeletionConfirmation => "fake-card",
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null)};
async Task RenderCard(string cardHolder, string cardNumber = "Awooo!", string expDate = "01/2038", Card.CardType cardType = Card.CardType.Unknown, EditUserModel.CardDisplayType displayType = EditUserModel.CardDisplayType.Normal) {
var cardTypeClasses = displayType switch {
EditUserModel.CardDisplayType.Normal => "fake-card",
EditUserModel.CardDisplayType.LinkPlaceholder => "fake-card ghost-card",
EditUserModel.CardDisplayType.DeletionConfirmation => "fake-card",
_ => throw new ArgumentOutOfRangeException(nameof(displayType), displayType, null)};
var blurClasses = type == EditUserModel.CardType.Normal ? " blur-true m-2" : "m-2";
var blurClasses = displayType == EditUserModel.CardDisplayType.Normal ? " blur-true m-2" : "m-2";
<div class="fake-card-wrapper @blurClasses">
@if (type == EditUserModel.CardType.Normal) {
@if (displayType == EditUserModel.CardDisplayType.Normal) {
<form id="@cardNumber" method="POST">
<input type="hidden" name="cardId" value="@cardNumber">
<button type="button" class="btn btn-danger btn-lg hover-button" data-bs-toggle="modal" data-bs-target="#delete_card_@(cardNumber)_modal">Delete</button>
</form>
}
else if (type == EditUserModel.CardType.LinkPlaceholder) {
else if (displayType == EditUserModel.CardDisplayType.LinkPlaceholder) {
if (linkActive) {
<button class="btn btn-secondary btn-lg link-card-button-in-progress">Link in progress</button>
}
@ -108,7 +109,13 @@
</div>
</div>
@if(cardNumber.Length < 12) {
<h2 class="card-number">@cardNumber</h2>
if (cardType == Card.CardType.Rfid125KhzGeneric) {
<h2 class="card-number"><span class="text-blur">0000000</span>@cardNumber[^3..]</h2>
}
else
{
<h2 class="card-number">@cardNumber</h2>
}
}
else {
<h2 class="card-number-long">@cardNumber</h2>
@ -132,7 +139,7 @@
}
@{
async Task RenderCardModal(string cardHolder, string cardNumber) {
async Task RenderCardModal(string cardHolder, string cardNumber, Card.CardType cardType = Card.CardType.Unknown) {
<div class="modal fade" id="delete_card_@(cardNumber)_modal" tabindex="-1" aria-labelledby="delete_card_@(cardNumber)_modal_label" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
@ -142,7 +149,7 @@
</div>
<div class="modal-body d-flex justify-content-center">
@{
await RenderCard(cardHolder, cardNumber, type: EditUserModel.CardType.DeletionConfirmation);
await RenderCard(cardHolder, cardNumber, cardType: cardType, displayType: EditUserModel.CardDisplayType.DeletionConfirmation);
}
</div>
<div class="modal-footer">
@ -158,9 +165,9 @@
<div class="row justify-content-center">
@{
foreach (var card in cards) {
await RenderCard(user.Nickname, card.Id);
await RenderCardModal(user.Nickname, card.Id);
await RenderCard(user.Nickname, card.Id, cardType: card.Type);
await RenderCardModal(user.Nickname, card.Id, cardType: card.Type);
}
await RenderCard(user.Nickname, type: EditUserModel.CardType.LinkPlaceholder);
await RenderCard(user.Nickname, displayType: EditUserModel.CardDisplayType.LinkPlaceholder);
}
</div>

View file

@ -80,7 +80,7 @@ public class EditUserModel : PageModel {
Response.Redirect($"/#{user.Nickname}");
}
public enum CardType {
public enum CardDisplayType {
Normal = 1,
LinkPlaceholder = 2,
DeletionConfirmation = 3

View file

@ -310,3 +310,8 @@ button.accept-policy {
.mw-max-content {
min-width: max-content;
}
.text-blur {
color: transparent;
text-shadow: 0 0 15px #fff;
}