Build / Build (push) Successful in 36s
Completion program R3 (docs/ROADMAP.md, 2026-10-17). - Services/TwoFactor.cs: TOTP (RFC 6238, 30 s, 6 digits, SHA-1, one step of slack, Otp.NET 1.4.1) and ten recovery codes (SHA-256 kept, pulled when used). RootUser.Totp holds the secret, the last step taken (moved only by a conditional update, so a code works once even for two sign-ins at the same moment) and the codes' hashes. - /clientapi/user/totp/setup (the password) answers the secret, its otpauth:// URI and a QR code as an SVG data URI (QRCoder 1.8.0); /totp/enable takes the app's first code, shows the recovery codes once and ends every other session (this device gets a new one); /totp/disable takes the password and a code. GET /clientapi/user/account says whether it is on and how many recovery codes are left. - Sign-in (/clientapi/user/login, the invitation login, /oauth/login) asks for LoginForm.OneTimeCode with a 428, and only once the password was right; the OAuth page has the field. Recovery by email leaves two-factor on. - PrivaPub admin reset-totp <root>: the way back for a login that lost its authenticator and its codes. - scenarios/accounts.sh checks it all, with codes computed in Python; the OAuth page with its antiforgery token. Verified: dotnet build PrivaPub.sln -c Release; the pasture (gts, mailpit): accounts 45/45. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof
68 lines
2.8 KiB
XML
68 lines
2.8 KiB
XML
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
|
|
<PropertyGroup>
|
|
<TargetFramework>net10.0</TargetFramework>
|
|
<Nullable>disable</Nullable>
|
|
<ImplicitUsings>enable</ImplicitUsings>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0" />
|
|
<PackageReference Include="FFMpegCore" Version="5.5.0" />
|
|
<PackageReference Include="HtmlSanitizer" Version="9.2.1039" />
|
|
<PackageReference Include="MailKit" Version="4.18.0" />
|
|
<PackageReference Include="Markdig" Version="1.4.0" />
|
|
<PackageReference Include="MaxMind.Db" Version="5.2.0" />
|
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.9" />
|
|
<PackageReference Include="MongoDB.Entities" Version="25.1.0" />
|
|
<PackageReference Include="NetVips" Version="3.2.0" />
|
|
<PackageReference Include="NetVips.Native.linux-x64" Version="8.18.7" />
|
|
<PackageReference Include="OpenIddict.AspNetCore" Version="7.7.1" />
|
|
<PackageReference Include="OpenIddict.MongoDb" Version="7.7.1" />
|
|
<PackageReference Include="Otp.NET" Version="1.4.1" />
|
|
<PackageReference Include="QRCoder" Version="1.8.0" />
|
|
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
|
|
<PackageReference Include="Serilog.Sinks.MongoDB" Version="7.3.0" />
|
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.2.3" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\PrivaPub.ClientModels\PrivaPub.ClientModels.csproj" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<Compile Update="Resources\GenericRes.Designer.cs">
|
|
<DesignTime>True</DesignTime>
|
|
<AutoGen>True</AutoGen>
|
|
<DependentUpon>GenericRes.resx</DependentUpon>
|
|
</Compile>
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<EmbeddedResource Update="Resources\GenericRes.resx">
|
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
|
<LastGenOutput>GenericRes.Designer.cs</LastGenOutput>
|
|
</EmbeddedResource>
|
|
</ItemGroup>
|
|
|
|
<Target Name="GenerateBuildInfo" BeforeTargets="BeforeCompile">
|
|
<PropertyGroup>
|
|
<BuildInfoPath>$(IntermediateOutputPath)BuildInfo.g.cs</BuildInfoPath>
|
|
</PropertyGroup>
|
|
<ItemGroup>
|
|
<BuildInfoLine Include="public static class BuildInfo" />
|
|
<BuildInfoLine Include="{" />
|
|
<BuildInfoLine Include=" public const string Commit = "$(BuildCommit)"%3B" />
|
|
<BuildInfoLine Include=" public const string Ref = "$(BuildRef)"%3B" />
|
|
<BuildInfoLine Include=" public const string BuiltAt = "$(BuildTimeUtc)"%3B" />
|
|
<BuildInfoLine Include="}" />
|
|
</ItemGroup>
|
|
<WriteLinesToFile File="$(BuildInfoPath)" Lines="@(BuildInfoLine)" Overwrite="true" WriteOnlyWhenDifferent="true" />
|
|
<ItemGroup>
|
|
<Compile Include="$(BuildInfoPath)" />
|
|
<FileWrites Include="$(BuildInfoPath)" />
|
|
</ItemGroup>
|
|
</Target>
|
|
|
|
</Project>
|