8 Commits

2231 changed files with 12707 additions and 20060 deletions

View File

@@ -1,19 +0,0 @@
namespace EnvelopeGenerator.Application.Configurations
{
public class AuthenticatorParams
{
public string CharPool { get; init; } = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789";
//TODO: Increase the DefaultTotpSecretKeyLength (e.g. to 32) but make sure that the QR code is generated correctly and can be scanned by the authenticator.
public int DefaultTotpSecretKeyLength { get; init; } = 20;
public string TotpIssuer { get; init; } = "signFlow";
/// <summary>
/// 0 is user email, 1 is secret key and 2 is issuer.
/// </summary>
public string TotpUrlFormat { get; init; } = "otpauth://totp/{0}?secret={1}&issuer={2}";
public int TotpQRPixelsPerModule { get; init; } = 20;
}
}

View File

@@ -0,0 +1,13 @@
namespace EnvelopeGenerator.Application.Configurations
{
public class DispatcherConfig
{
public int SendingProfile { get; init; } = 1;
public string AddedWho { get; init; } = "DDEnvelopGenerator";
public int ReminderTypeId { get; init; } = 202377;
public string EmailAttmt1 { get; init; } = string.Empty;
}
}

View File

@@ -1,12 +0,0 @@
namespace EnvelopeGenerator.Application.Configurations;
public class DispatcherParams
{
public int SendingProfile { get; init; } = 1;
public string AddedWho { get; init; } = "DDEnvelopGenerator";
public int ReminderTypeId { get; init; } = 202377;
public string EmailAttmt1 { get; init; } = string.Empty;
}

View File

@@ -1,20 +0,0 @@
using DigitalData.Core.Abstractions.Client;
namespace EnvelopeGenerator.Application.Configurations;
/// <summary>
/// https://www.gtx-messaging.com/en/api-docs/sms-rest-api/
/// </summary>
public class GtxMessagingParams : IHttpClientOptions
{
public required string Uri { get; init; }
public string? Path { get; init; }
public Dictionary<string, object>? Headers { get; init; }
public Dictionary<string, object?>? QueryParams { get; init; }
public string RecipientQueryParamName { get; init; } = "to";
public string MessageQueryParamName { get; init; } = "text";
}

View File

@@ -0,0 +1,7 @@
namespace EnvelopeGenerator.Application.Configurations
{
public class MailConfig
{
public required Dictionary<string, string> Placeholders { get; init; }
}
}

View File

@@ -1,6 +0,0 @@
namespace EnvelopeGenerator.Application.Configurations;
public class MailParams
{
public required Dictionary<string, string> Placeholders { get; init; }
}

View File

@@ -1,49 +0,0 @@
using OtpNet;
using System.Globalization;
namespace EnvelopeGenerator.Application.Configurations
{
public class TotpSmsParams
{
/// <summary>
/// The unit is second.
/// </summary>
public int TotpStep { get; init; } = 90;
public string Format { get; init; } = "Ihr 2FA-Passwort lautet {0}. Gültig bis {1}";
public ExpirationHandler Expiration { get; init; } = new();
public VerificationWindow? TotpVerificationWindow { get; private init; } = VerificationWindow.RfcSpecifiedNetworkDelay;
private IEnumerable<int>? _tvwParams;
public IEnumerable<int>? TotpVerificationWindowParams
{
get => _tvwParams;
init
{
_tvwParams = value;
if(_tvwParams is not null)
TotpVerificationWindow = new(previous: _tvwParams.ElementAtOrDefault(0), future: _tvwParams.ElementAtOrDefault(0));
}
}
public class ExpirationHandler
{
public string CacheKeyFormat { get; init; } = "e{0}_r{1}_sms_code_expiration";
public string Format { get; init; } = "HH:mm:ss";
public string CultureName
{
get => _cultureInfo.Name;
init => _cultureInfo = new(value);
}
private CultureInfo _cultureInfo = new("de-DE");
public CultureInfo CultureInfo => _cultureInfo;
}
}
}

View File

@@ -1,19 +0,0 @@
using OtpNet;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IAuthenticator
{
string GenerateCode(int length);
string GenerateTotpSecretKey(int? length = null);
byte[] GenerateTotpQrCode(string userEmail, string secretKey, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null);
byte[] GenerateTotpQrCode(string userEmail, int? length = null, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null);
string GenerateTotp(string secretKey, int step = 30);
bool VerifyTotp(string totpCode, string secretKey, int step = 30, VerificationWindow? window = null);
}
}

View File

@@ -8,12 +8,10 @@ namespace EnvelopeGenerator.Application.Contracts
{ {
public interface IEnvelopeMailService : IEmailOutService public interface IEnvelopeMailService : IEmailOutService
{ {
Task<DataResult<int>> SendAsync(EnvelopeReceiverDto envelopeReceiverDto, Constants.EmailTemplateType tempType, Dictionary<string, object>? optionalPlaceholders = null); Task<DataResult<int>> SendAsync(EnvelopeReceiverDto envelopeReceiverDto, Constants.EmailTemplateType tempType);
Task<DataResult<int>> SendAsync(EnvelopeReceiverReadOnlyDto dto, Dictionary<string, object>? optionalPlaceholders = null); Task<DataResult<int>> SendAsync(EnvelopeReceiverReadOnlyDto dto);
Task<DataResult<int>> SendAccessCodeAsync(EnvelopeReceiverDto envelopeReceiverDto); Task<DataResult<int>> SendAccessCodeAsync(EnvelopeReceiverDto envelopeReceiverDto);
Task<DataResult<int>> SendTFAQrCodeAsync(EnvelopeReceiverDto envelopeReceiverDto);
} }
} }

View File

@@ -1,7 +1,7 @@
using DigitalData.Core.Abstractions.Application; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Messaging; using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts namespace EnvelopeGenerator.Application.Contracts
@@ -9,17 +9,15 @@ namespace EnvelopeGenerator.Application.Contracts
public interface IEnvelopeReceiverService : IBasicCRUDService<EnvelopeReceiverDto, EnvelopeReceiver, (int Envelope, int Receiver)> public interface IEnvelopeReceiverService : IBasicCRUDService<EnvelopeReceiverDto, EnvelopeReceiver, (int Envelope, int Receiver)>
{ {
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false, bool readOnly = true); Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false);
Task<DataResult<IEnumerable<string?>>> ReadAccessCodeByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true); Task<DataResult<IEnumerable<EnvelopeReceiverSecretDto>>> ReadSecretByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true);
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true); Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true);
Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true); Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true);
Task<DataResult<EnvelopeReceiverSecretDto>> ReadWithSecretByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true); Task<DataResult<EnvelopeReceiverDto>> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true);
Task<DataResult<EnvelopeReceiverDto>> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true);
Task<DataResult<string>> ReadAccessCodeByIdAsync(int envelopeId, int receiverId); Task<DataResult<string>> ReadAccessCodeByIdAsync(int envelopeId, int receiverId);
@@ -32,7 +30,5 @@ namespace EnvelopeGenerator.Application.Contracts
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses);
Task<DataResult<string?>> ReadLastUsedReceiverNameByMail(string mail); Task<DataResult<string?>> ReadLastUsedReceiverNameByMail(string mail);
Task<DataResult<SmsResponse>> SendSmsAsync(string envelopeReceiverId, string message);
} }
} }

View File

@@ -1,17 +0,0 @@
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Messaging;
namespace EnvelopeGenerator.Application.Contracts;
public interface IEnvelopeSmsHandler
{
/// <summary>
/// If expiration is passed then, sends sms and returns smsResponse and up-to-date expiration; otherwise send expiration.
/// </summary>
/// <param name="er_secret"></param>
/// <param name="cToken"></param>
/// <returns></returns>
Task<(SmsResponse? SmsResponse, DateTime Expiration)> SendTotpAsync(EnvelopeReceiverSecretDto er_secret, CancellationToken cToken = default);
bool VerifyTotp(string totpCode, string secretKey);
}

View File

@@ -0,0 +1,24 @@
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Security.Cryptography;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IJWTService<TClaimValue>
{
public static SymmetricSecurityKey GenerateSecurityKey(int byteSize = 32)
{
using var rng = RandomNumberGenerator.Create();
var randomBytes = new byte[byteSize];
rng.GetBytes(randomBytes);
var securityKey = new SymmetricSecurityKey(randomBytes);
return securityKey;
}
string GenerateToken(TClaimValue claimValue);
JwtSecurityToken? ReadSecurityToken(string token);
}
}

View File

@@ -1,5 +1,4 @@
using DigitalData.Core.Abstractions; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
@@ -8,10 +7,8 @@ namespace EnvelopeGenerator.Application.Contracts
{ {
public interface IReceiverService : ICRUDService<ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int> public interface IReceiverService : ICRUDService<ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>
{ {
Task<DataResult<ReceiverReadDto>> ReadByAsync(string? emailAddress = null, string? signature = null); public Task<DataResult<ReceiverReadDto>> ReadByAsync(string? emailAddress = null, string? signature = null);
Task<Result> DeleteByAsync(string? emailAddress = null, string? signature = null); public Task<Result> DeleteByAsync(string? emailAddress = null, string? signature = null);
Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto) where TUpdateDto : IUnique<int>;
} }
} }

View File

@@ -1,11 +0,0 @@
using EnvelopeGenerator.Application.DTOs.Messaging;
namespace EnvelopeGenerator.Application.Contracts;
//TODO: move to DigitalData.Core
public interface ISmsSender
{
string ServiceProvider { get; }
Task<SmsResponse> SendSmsAsync(string recipient, string message);
}

View File

@@ -0,0 +1,63 @@
using DigitalData.UserManager.Application.MappingProfiles;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.MappingProfiles;
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Services;
using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Infrastructure.Repositories;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace EnvelopeGenerator.Application
{
public static class DIExtensions
{
public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services, IConfiguration dispatcherConfigSection, IConfiguration mailConfigSection)
{
//Inject CRUD Service and repositoriesad
services.AddScoped<IConfigRepository, ConfigRepository>();
services.AddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
services.AddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
services.AddScoped<IConfigRepository, ConfigRepository>();
services.AddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
services.AddScoped<IDocumentStatusRepository, DocumentStatusRepository>();
services.AddScoped<IEmailTemplateRepository, EmailTemplateRepository>();
services.AddScoped<IEnvelopeRepository, EnvelopeRepository>();
services.AddScoped<IEnvelopeCertificateRepository, EnvelopeCertificateRepository>();
services.AddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
services.AddScoped<IEnvelopeHistoryRepository, EnvelopeHistoryRepository>();
services.AddScoped<IEnvelopeReceiverRepository, EnvelopeReceiverRepository>();
services.AddScoped<IEnvelopeTypeRepository, EnvelopeTypeRepository>();
services.AddScoped<IReceiverRepository, ReceiverRepository>();
services.AddScoped<IUserReceiverRepository, UserReceiverRepository>();
services.AddScoped<IEnvelopeReceiverReadOnlyRepository, EnvelopeReceiverReadOnlyRepository>();
services.AddScoped<IConfigService, ConfigService>();
services.AddScoped<IDocumentReceiverElementService, DocumentReceiverElementService>();
services.AddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
services.AddScoped<IEnvelopeHistoryService, EnvelopeHistoryService>();
services.AddScoped<IDocumentStatusService, DocumentStatusService>();
services.AddScoped<IEmailTemplateService, EmailTemplateService>();
services.AddScoped<IEnvelopeService, EnvelopeService>();
services.AddScoped<IEnvelopeCertificateService, EnvelopeCertificateService>();
services.AddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
services.AddScoped<IEnvelopeReceiverService, EnvelopeReceiverService>();
services.AddScoped<IEnvelopeTypeService, EnvelopeTypeService>();
services.AddScoped<IReceiverService, ReceiverService>();
services.AddScoped<IUserReceiverService, UserReceiverService>();
services.AddScoped<IEnvelopeReceiverReadOnlyService, EnvelopeReceiverReadOnlyService>();
//Auto mapping profiles
services.AddAutoMapper(typeof(BasicDtoMappingProfile).Assembly);
services.AddAutoMapper(typeof(UserMappingProfile).Assembly);
services.Configure<DispatcherConfig>(dispatcherConfigSection);
services.Configure<MailConfig>(mailConfigSection);
return services;
}
public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services, IConfiguration config) => services.AddEnvelopeGenerator(
dispatcherConfigSection: config.GetSection("DispatcherConfig"),
mailConfigSection: config.GetSection("MailConfig"));
}
}

View File

@@ -1,5 +1,4 @@
using DigitalData.Core.Abstractions; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs namespace EnvelopeGenerator.Application.DTOs
@@ -9,9 +8,11 @@ namespace EnvelopeGenerator.Application.DTOs
int SendingProfile, int SendingProfile,
string SignatureHost, string SignatureHost,
string ExternalProgramName, string ExternalProgramName,
string ExportPath) : IUnique<int> string ExportPath,
string DocumentPathDmz,
string ExportPathDmz,
string DocumentPathMoveAftsend) : IUnique<int>
{ {
[NotMapped]
[JsonIgnore] [JsonIgnore]
[Obsolete("Configuration does not have an ID; it represents a single table in the database.")] [Obsolete("Configuration does not have an ID; it represents a single table in the database.")]
public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single row in the database."); public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single row in the database.");

View File

@@ -51,9 +51,7 @@ namespace EnvelopeGenerator.Application.DTOs
public int? ExpiresWarningWhenDays { get; set; } public int? ExpiresWarningWhenDays { get; set; }
public bool TFAEnabled { get; init; } public bool DmzMoved { get; set; }
public bool DmzMoved { get; set; }
public UserReadDto? User { get; set; } public UserReadDto? User { get; set; }
public EnvelopeType? EnvelopeType { get; set; } public EnvelopeType? EnvelopeType { get; set; }

View File

@@ -25,7 +25,5 @@ namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
public DateTime AddedWhen { get; init; } public DateTime AddedWhen { get; init; }
public DateTime? ChangedWhen { get; init; } public DateTime? ChangedWhen { get; init; }
public bool HasPhoneNumber { get; init; }
} }
} }

View File

@@ -1,9 +1,4 @@
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{ {
public record EnvelopeReceiverSecretDto() : EnvelopeReceiverDto() public record EnvelopeReceiverSecretDto(string? AccessCode) : EnvelopeReceiverDto;
{
public string? AccessCode { get; init; }
public string? PhoneNumber { get; init; }
}
} }

View File

@@ -1,4 +0,0 @@
namespace EnvelopeGenerator.Application.DTOs.Messaging
{
public class GtxMessagingResponse : Dictionary<string, object?> { }
}

View File

@@ -1,11 +0,0 @@
namespace EnvelopeGenerator.Application.DTOs.Messaging
{
public record SmsResponse
{
public required bool Ok { get; init; }
public bool Failed => !Ok;
public dynamic? Errors { get; init; }
}
}

View File

@@ -4,7 +4,7 @@ using System.Text;
namespace EnvelopeGenerator.Application.DTOs.Receiver namespace EnvelopeGenerator.Application.DTOs.Receiver
{ {
public record ReceiverCreateDto([EmailAddress] string EmailAddress, string? TotpSecretkey = null) public record ReceiverCreateDto([EmailAddress] string EmailAddress)
{ {
public string Signature => sha256HexOfMail.Value; public string Signature => sha256HexOfMail.Value;

View File

@@ -1,24 +1,19 @@
using DigitalData.Core.Abstractions; using DigitalData.Core.DTO;
using DigitalData.Core.DTO;
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs.Receiver; namespace EnvelopeGenerator.Application.DTOs.Receiver
public record ReceiverReadDto(
int Id,
string EmailAddress,
string Signature,
DateTime AddedWhen
) : BaseDTO<int>(Id), IUnique<int>
{ {
[JsonIgnore] public record ReceiverReadDto(
public IEnumerable<EnvelopeReceiverBasicDto>? EnvelopeReceivers { get; init; } int Id,
string EmailAddress,
string Signature,
DateTime AddedWhen
) : BaseDTO<int>(Id)
{
[JsonIgnore]
public IEnumerable<EnvelopeReceiverBasicDto>? EnvelopeReceivers { get; init; }
public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name; public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name;
};
public string? TotpSecretkey { get; set; } = null; }
public DateTime? TfaRegDeadline { get; set; }
};

View File

@@ -1,5 +1,6 @@
using DigitalData.Core.Abstractions; using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs.Receiver; namespace EnvelopeGenerator.Application.DTOs.Receiver
{
public record ReceiverUpdateDto(int Id, string? TotpSecretkey = null, DateTime? TfaRegDeadline = null) : IUnique<int>; public record ReceiverUpdateDto(int Id) : IUnique<int>;
}

View File

@@ -1,60 +1,56 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<None Remove="Resources\Model.Designer.vb" /> <None Remove="Resources\Model.Designer.vb" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" /> <PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="DigitalData.Core.Abstractions" Version="2.2.1" /> <PackageReference Include="DigitalData.Core.Abstractions" Version="2.0.0" />
<PackageReference Include="DigitalData.Core.Application" Version="2.0.0" /> <PackageReference Include="DigitalData.Core.Application" Version="2.0.0" />
<PackageReference Include="DigitalData.Core.Client" Version="2.0.3" /> <PackageReference Include="DigitalData.Core.DTO" Version="2.0.0" />
<PackageReference Include="DigitalData.Core.DTO" Version="2.0.0" /> <PackageReference Include="DigitalData.EmailProfilerDispatcher" Version="2.0.0" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.18" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.18" /> <PackageReference Include="UserManager.Application" Version="2.0.0" />
<PackageReference Include="Otp.NET" Version="1.4.0" /> <PackageReference Include="UserManager.Infrastructure" Version="2.0.0" />
<PackageReference Include="QRCoder" Version="1.6.0" /> </ItemGroup>
<PackageReference Include="QRCoder-ImageSharp" Version="0.10.0" />
<PackageReference Include="UserManager.Application" Version="2.0.0" />
<PackageReference Include="UserManager.Infrastructure" Version="2.0.0" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\EnvelopeGenerator.Extensions\EnvelopeGenerator.Extensions.csproj" /> <ProjectReference Include="..\EnvelopeGenerator.Extensions\EnvelopeGenerator.Extensions.csproj" />
<ProjectReference Include="..\EnvelopeGenerator.Infrastructure\EnvelopeGenerator.Infrastructure.csproj" /> <ProjectReference Include="..\EnvelopeGenerator.Infrastructure\EnvelopeGenerator.Infrastructure.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Update="Resources\Model.Designer.cs"> <Compile Update="Resources\Model.Designer.cs">
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DependentUpon>Model.resx</DependentUpon> <DependentUpon>Model.resx</DependentUpon>
</Compile> </Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Update="Resources\Model.en.resx"> <EmbeddedResource Update="Resources\Model.en.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace> <CustomToolNamespace>My.Resources</CustomToolNamespace>
<LastGenOutput>Model.en.Designer.vb</LastGenOutput> <LastGenOutput>Model.en.Designer.vb</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator> <Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="Resources\Model.resx"> <EmbeddedResource Update="Resources\Model.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace> <CustomToolNamespace>My.Resources</CustomToolNamespace>
<LastGenOutput>Model.Designer.cs</LastGenOutput> <LastGenOutput>Model.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator> <Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="Resources\Resource.de-DE.resx"> <EmbeddedResource Update="Resources\Resource.de-DE.resx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="Resources\Resource.en-US.resx"> <EmbeddedResource Update="Resources\Resource.en-US.resx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,131 +0,0 @@
using Microsoft.Extensions.Caching.Distributed;
namespace EnvelopeGenerator.Application.Extensions
{
public static class CacheExtensions
{
public static Task SetLongAsync(this IDistributedCache cache, string key, long value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default)
=> options is null
? cache.SetAsync(key, BitConverter.GetBytes(value), token: cToken)
: cache.SetAsync(key, BitConverter.GetBytes(value), options: options, token: cToken);
public static async Task<long?> GetLongAsync(this IDistributedCache cache, string key, CancellationToken cToken = default)
{
var value = await cache.GetAsync(key, cToken);
return value is null ? null : BitConverter.ToInt64(value, 0);
}
public static Task SetDateTimeAsync(this IDistributedCache cache, string key, DateTime value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default)
=> cache.SetLongAsync(key: key, value: value.Ticks, options: options, cToken: cToken);
public static async Task<DateTime?> GetDateTimeAsync(this IDistributedCache cache, string key, CancellationToken cToken = default)
{
var value = await cache.GetAsync(key, cToken);
return value is null ? null : new(BitConverter.ToInt64(value, 0));
}
public static Task SetTimeSpanAsync(this IDistributedCache cache, string key, TimeSpan value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default)
=> cache.SetLongAsync(key: key, value: value.Ticks, options: options, cToken);
public static async Task<TimeSpan?> GetTimeSpanAsync(this IDistributedCache cache, string key, CancellationToken cToken = default)
{
var value = await cache.GetAsync(key, cToken);
return value is null ? null : new(BitConverter.ToInt64(value, 0));
}
//TODO: use code generator
#region GetOrSetAsync
#region string
public static async Task<string> GetOrSetAsync(this IDistributedCache cache, string key, Func<string> factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default)
{
var value = await cache.GetStringAsync(key, cToken);
if (value is null)
{
// create new and save
value = factory();
Task CacheAsync() => options is null
? cache.SetStringAsync(key, value, cToken)
: cache.SetStringAsync(key, value, options, cToken);
if (cacheInBackground)
_ = Task.Run(async () => await CacheAsync(), cToken);
else
await CacheAsync();
}
return value;
}
public static async Task<string> GetOrSetAsync(this IDistributedCache cache, string key, Func<Task<string>> factoryAsync, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default)
{
var value = await cache.GetStringAsync(key, cToken);
if(value is null)
{
// create new and save
value = await factoryAsync();
Task CacheAsync() => options is null
? cache.SetStringAsync(key: key, value: value, token: cToken)
: cache.SetStringAsync(key: key, value: value, options: options, token: cToken);
if (cacheInBackground)
_ = Task.Run(async () => await CacheAsync(), cToken);
else
await CacheAsync();
}
return value;
}
#endregion
#region DateTime
public static async Task<DateTime> GetOrSetAsync(this IDistributedCache cache, string key, Func<DateTime> factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default)
{
if (await cache.GetDateTimeAsync(key, cToken) is DateTime dateTimeValue)
return dateTimeValue;
else
{
// create new and save
var newValue = factory();
Task CacheAsync() => options is null
? cache.SetDateTimeAsync(key, newValue, cToken: cToken)
: cache.SetDateTimeAsync(key, newValue, options, cToken);
if (cacheInBackground)
_ = Task.Run(async () => await CacheAsync(), cToken);
else
await CacheAsync();
return newValue;
}
}
public static async Task<DateTime> GetOrSetAsync(this IDistributedCache cache, string key, Func<Task<DateTime>> factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default)
{
if (await cache.GetDateTimeAsync(key, cToken) is DateTime dateTimeValue)
return dateTimeValue;
else
{
// create new and save
var newValue = await factory();
Task CacheAsync() => options is null
? cache.SetDateTimeAsync(key, newValue, cToken: cToken)
: cache.SetDateTimeAsync(key, newValue, options, cToken);
if (cacheInBackground)
_ = Task.Run(async () => await CacheAsync(), cToken);
else
await CacheAsync();
return newValue;
}
}
#endregion
#endregion
}
}

View File

@@ -1,69 +0,0 @@
using DigitalData.UserManager.Application.MappingProfiles;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.MappingProfiles;
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Services;
using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Infrastructure.Repositories;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using DigitalData.Core.Client;
using QRCoder;
namespace EnvelopeGenerator.Application.Extensions;
public static class DIExtensions
{
public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services, IConfiguration config)
{
//Inject CRUD Service and repositoriesad
services.TryAddScoped<IConfigRepository, ConfigRepository>();
services.TryAddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
services.TryAddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
services.TryAddScoped<IConfigRepository, ConfigRepository>();
services.TryAddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
services.TryAddScoped<IDocumentStatusRepository, DocumentStatusRepository>();
services.TryAddScoped<IEmailTemplateRepository, EmailTemplateRepository>();
services.TryAddScoped<IEnvelopeRepository, EnvelopeRepository>();
services.TryAddScoped<IEnvelopeCertificateRepository, EnvelopeCertificateRepository>();
services.TryAddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
services.TryAddScoped<IEnvelopeHistoryRepository, EnvelopeHistoryRepository>();
services.TryAddScoped<IEnvelopeReceiverRepository, EnvelopeReceiverRepository>();
services.TryAddScoped<IEnvelopeTypeRepository, EnvelopeTypeRepository>();
services.TryAddScoped<IReceiverRepository, ReceiverRepository>();
services.TryAddScoped<IUserReceiverRepository, UserReceiverRepository>();
services.TryAddScoped<IEnvelopeReceiverReadOnlyRepository, EnvelopeReceiverReadOnlyRepository>();
services.TryAddScoped<IConfigService, ConfigService>();
services.TryAddScoped<IDocumentReceiverElementService, DocumentReceiverElementService>();
services.TryAddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
services.TryAddScoped<IEnvelopeHistoryService, EnvelopeHistoryService>();
services.TryAddScoped<IDocumentStatusService, DocumentStatusService>();
services.TryAddScoped<IEmailTemplateService, EmailTemplateService>();
services.TryAddScoped<IEnvelopeService, EnvelopeService>();
services.TryAddScoped<IEnvelopeCertificateService, EnvelopeCertificateService>();
services.TryAddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
services.TryAddScoped<IEnvelopeReceiverService, EnvelopeReceiverService>();
services.TryAddScoped<IEnvelopeTypeService, EnvelopeTypeService>();
services.TryAddScoped<IReceiverService, ReceiverService>();
services.TryAddScoped<IUserReceiverService, UserReceiverService>();
services.TryAddScoped<IEnvelopeReceiverReadOnlyService, EnvelopeReceiverReadOnlyService>();
//Auto mapping profiles
services.AddAutoMapper(typeof(BasicDtoMappingProfile).Assembly);
services.AddAutoMapper(typeof(UserMappingProfile).Assembly);
services.Configure<DispatcherParams>(config.GetSection(nameof(DispatcherParams)));
services.Configure<MailParams>(config.GetSection(nameof(MailParams)));
services.Configure<AuthenticatorParams>(config.GetSection(nameof(AuthenticatorParams)));
services.Configure<TotpSmsParams>(config.GetSection(nameof(TotpSmsParams)));
services.AddHttpClientService<GtxMessagingParams>(config.GetSection(nameof(GtxMessagingParams)));
services.TryAddSingleton<ISmsSender, GTXSmsSender>();
services.TryAddSingleton<IEnvelopeSmsHandler, EnvelopeSmsHandler>();
services.TryAddSingleton<IAuthenticator, Authenticator>();
services.TryAddSingleton<QRCodeGenerator>();
return services;
}
}

View File

@@ -1,14 +0,0 @@
using EnvelopeGenerator.Application.DTOs.Messaging;
namespace EnvelopeGenerator.Application.Extensions
{
public static class MappingExtensions
{
public static bool Ok(this GtxMessagingResponse gtxMessagingResponse)
=> gtxMessagingResponse.TryGetValue("message-status", out var status)
&& status?.ToString()?.ToLower() == "ok";
public static string ToBase64String(this byte[] bytes)
=> Convert.ToBase64String(bytes);
}
}

View File

@@ -14,7 +14,6 @@
public static readonly string PossibleSecurityBreach = nameof(PossibleSecurityBreach); public static readonly string PossibleSecurityBreach = nameof(PossibleSecurityBreach);
public static readonly string WrongEnvelopeReceiverId = nameof(WrongEnvelopeReceiverId); public static readonly string WrongEnvelopeReceiverId = nameof(WrongEnvelopeReceiverId);
public static readonly string EnvelopeOrReceiverNonexists = nameof(EnvelopeOrReceiverNonexists); public static readonly string EnvelopeOrReceiverNonexists = nameof(EnvelopeOrReceiverNonexists);
public static readonly string PhoneNumberNonexists = nameof(PhoneNumberNonexists);
public static readonly string Default = nameof(Default); public static readonly string Default = nameof(Default);
} }
} }

View File

@@ -3,9 +3,7 @@ using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
using EnvelopeGenerator.Application.DTOs.Messaging;
using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Application.Extensions;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.MappingProfiles namespace EnvelopeGenerator.Application.MappingProfiles
@@ -45,20 +43,13 @@ namespace EnvelopeGenerator.Application.MappingProfiles
CreateMap<EnvelopeHistoryCreateDto, EnvelopeHistory>(); CreateMap<EnvelopeHistoryCreateDto, EnvelopeHistory>();
CreateMap<EnvelopeReceiverDto, EnvelopeReceiver>(); CreateMap<EnvelopeReceiverDto, EnvelopeReceiver>();
CreateMap<EnvelopeTypeDto, EnvelopeType>(); CreateMap<EnvelopeTypeDto, EnvelopeType>();
CreateMap<ReceiverReadDto, Receiver>().ForMember(rcv => rcv.EnvelopeReceivers, rcvReadDto => rcvReadDto.Ignore()); CreateMap<ReceiverReadDto, Receiver>();
CreateMap<ReceiverCreateDto, Receiver>(); CreateMap<ReceiverCreateDto, Receiver>();
CreateMap<ReceiverUpdateDto, Receiver>(); CreateMap<ReceiverUpdateDto, Receiver>();
CreateMap<UserReceiverDto, UserReceiver>(); CreateMap<UserReceiverDto, UserReceiver>();
CreateMap<EnvelopeReceiverBase, EnvelopeReceiverBasicDto>(); CreateMap<EnvelopeReceiverBase, EnvelopeReceiverBasicDto>();
CreateMap<EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnly>(); CreateMap<EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnly>();
CreateMap<EnvelopeReceiverReadOnlyUpdateDto, EnvelopeReceiverReadOnly>(); CreateMap<EnvelopeReceiverReadOnlyUpdateDto, EnvelopeReceiverReadOnly>();
// Messaging mappings
// for GTX messaging
CreateMap<GtxMessagingResponse, SmsResponse>()
.ConstructUsing(gtxRes => gtxRes.Ok()
? new SmsResponse() { Ok = true }
: new SmsResponse() { Ok = false, Errors = gtxRes });
} }
} }
} }

View File

@@ -156,63 +156,27 @@
<data name="Hello" xml:space="preserve"> <data name="Hello" xml:space="preserve">
<value>Hallo</value> <value>Hallo</value>
</data> </data>
<data name="HomePageDescription" xml:space="preserve"> <data name="LocakedOpen" xml:space="preserve">
<value>Das digitale Unterschriftenportal ist eine Plattform, die entwickelt wurde, um Ihre Dokumente sicher zu unterschreiben und zu verwalten. Mit seiner benutzerfreundlichen Oberfläche können Sie Ihre Dokumente schnell hochladen, die Unterschriftsprozesse verfolgen und Ihre digitalen Unterschriftenanwendungen einfach durchführen. Dieses Portal beschleunigt Ihren Arbeitsablauf mit rechtlich gültigen Unterschriften und erhöht gleichzeitig die Sicherheit Ihrer Dokumente.</value> <value>Öffnen</value>
</data> </data>
<data name="LocationWarning" xml:space="preserve"> <data name="LocationWarning" xml:space="preserve">
<value>Bitte überprüfen Sie die Standortinformationen. Wenn sie falsch sind, korrigieren Sie diese bitte.</value> <value>Bitte überprüfen Sie die Standortinformationen. Wenn sie falsch sind, korrigieren Sie diese bitte.</value>
</data> </data>
<data name="LockedBodyAccess" xml:space="preserve"> <data name="LockedAccessCode" xml:space="preserve">
<value>Wir senden Ihnen nun einen Zugriffscode an Ihre hinterlegte Email-Adresse. Dies kann evtl. einige Minuten dauern!</value>
</data>
<data name="LockedBodyAuthenticator" xml:space="preserve">
<value>Bitte geben Sie den in Ihrer Authenticator-App angegebenen TOTP-Code ein.</value>
</data>
<data name="LockedBodyAuthenticatorNew" xml:space="preserve">
<value>Wir haben den QR-Code an Ihre E-Mail-Adresse gesendet. Ihr QR-Code ist bis {0} gültig. Sie können ihn für alle Umschläge verwenden, die Sie an diese E-Mail-Adresse erhalten.</value>
</data>
<data name="LockedBodySms" xml:space="preserve">
<value>Wir haben soeben den Zugangscode als SMS an die von Ihnen angegebene Telefonnummer gesendet.</value>
</data>
<data name="LockedCodeLabelAccess" xml:space="preserve">
<value>Zugriffscode</value> <value>Zugriffscode</value>
</data> </data>
<data name="LockedCodeLabelAuthenticator" xml:space="preserve"> <data name="LockedBody" xml:space="preserve">
<value>TOTP</value> <value>Wir haben Ihnen gerade den Zugriffscode an die hinterlegte Email Adresse gesendet. Dies kann evtl. einige Minuten dauern.</value>
</data> </data>
<data name="LockedCodeLabelSms" xml:space="preserve"> <data name="LockedFooterBody" xml:space="preserve">
<value>SMS-Code</value> <value>Bitte überprüfen Sie Ihr Email Postfach inklusive Spam-Ordner. Sie können auch den Absender bitten, Ihnen den Code auf anderem Wege zukommen zu lassen.</value>
</data> </data>
<data name="LockedFooterBodyAccess" xml:space="preserve"> <data name="LockedFooterTitle" xml:space="preserve">
<value>Bitte überprüfen Sie Ihr Email Postfach inklusive Spam-Ordner. Sie können auch den Absender &lt;a class="mail-link" href="mailto:{0}?subject={1}&amp;body={2}" target="_blank"&gt;{0}&lt;/a&gt; bitten, Ihnen den Code auf anderem Wege zukommen zu lassen.</value>
</data>
<data name="LockedFooterBodyAuthenticator" xml:space="preserve">
<value>Der neue QR-Code wird nur einmal für einen bestimmten Zeitraum gesendet und nach dem Scannen in Ihrer Authenticator-App gespeichert. Er kann für alle Umschläge verwendet werden, die an dieselbe E-Mail-Adresse gesendet werden, bis er abläuft. Wenn Sie die QR-Code-Mail nicht erhalten oder sie sowohl aus der Mail als auch aus authenticator löschen, kontaktieren Sie bitte den Absender.</value>
</data>
<data name="LockedFooterBodySms" xml:space="preserve">
<value>Sie können den Absender bitten, Ihre Rufnummer zu überprüfen. Die Telefonnummer muss mit der Ortsvorwahl eingegeben werden. Andernfalls können Sie beantragen, den Zwei-Faktor-Schutz zu entfernen.</value>
</data>
<data name="LockedFooterTitleAccess" xml:space="preserve">
<value>Sie haben keinen Zugriffscode erhalten?</value> <value>Sie haben keinen Zugriffscode erhalten?</value>
</data> </data>
<data name="LockedFooterTitleAuthenticator" xml:space="preserve"> <data name="LockedTitle" xml:space="preserve">
<value>Sie haben keinen QR-Code erhalten?</value>
</data>
<data name="LockedFooterTitleSms" xml:space="preserve">
<value>Sie haben keine SMS erhalten?</value>
</data>
<data name="LockedTitleAccess" xml:space="preserve">
<value>Dokument erfordert einen Zugriffscode</value> <value>Dokument erfordert einen Zugriffscode</value>
</data> </data>
<data name="LockedTitleAuthenticator" xml:space="preserve">
<value>2-Faktor-Authentifizierung</value>
</data>
<data name="LockedTitleSms" xml:space="preserve">
<value>2-Faktor-Authentifizierung</value>
</data>
<data name="Privacy" xml:space="preserve">
<value>Datenschutz</value>
</data>
<data name="ReadOnlyMessage" xml:space="preserve"> <data name="ReadOnlyMessage" xml:space="preserve">
<value>Weitergeleitet von {0}. Gültig bis {1}.</value> <value>Weitergeleitet von {0}. Gültig bis {1}.</value>
</data> </data>

View File

@@ -156,63 +156,27 @@
<data name="Hello" xml:space="preserve"> <data name="Hello" xml:space="preserve">
<value>Hello</value> <value>Hello</value>
</data> </data>
<data name="HomePageDescription" xml:space="preserve"> <data name="LocakedOpen" xml:space="preserve">
<value>The Digital Signature Portal is a platform developed for securely signing and managing your documents. With its user-friendly interface, you can quickly upload your documents, track the signing processes, and easily carry out your digital signature applications. This portal accelerates your workflow with legally valid signatures while enhancing the security of your documents.</value> <value>Open</value>
</data> </data>
<data name="LocationWarning" xml:space="preserve"> <data name="LocationWarning" xml:space="preserve">
<value>Please review the location information. If it is incorrect, kindly make the necessary corrections.</value> <value>Please review the location information. If it is incorrect, kindly make the necessary corrections.</value>
</data> </data>
<data name="LockedBodyAccess" xml:space="preserve"> <data name="LockedAccessCode" xml:space="preserve">
<value>We will now send you an access code to your registered e-mail address. This may take a few minutes!</value>
</data>
<data name="LockedBodyAuthenticator" xml:space="preserve">
<value>Please enter the TOTP provided in your Authenticator app.</value>
</data>
<data name="LockedBodyAuthenticatorNew" xml:space="preserve">
<value>We have sent the QR code to your e-mail address. Your QR code is valid until {0}. You can use it for all envelopes received at this email address.</value>
</data>
<data name="LockedBodySms" xml:space="preserve">
<value>We have just sent the access code as an SMS to the phone number you provided.</value>
</data>
<data name="LockedCodeLabelAccess" xml:space="preserve">
<value>Access Code</value> <value>Access Code</value>
</data> </data>
<data name="LockedCodeLabelAuthenticator" xml:space="preserve"> <data name="LockedBody" xml:space="preserve">
<value>TOTP</value> <value>We have just sent you the access code to the email address you provided. This may take a few minutes.</value>
</data> </data>
<data name="LockedCodeLabelSms" xml:space="preserve"> <data name="LockedFooterBody" xml:space="preserve">
<value>SMS Code</value> <value>Please check your email inbox including your spam folder. Furthermore, you can also ask the sender to send the code by other means.</value>
</data> </data>
<data name="LockedFooterBodyAccess" xml:space="preserve"> <data name="LockedFooterTitle" xml:space="preserve">
<value>Please check your email inbox including the spam folder. You can also ask the sender &lt;a class="mail-link" href="mailto:{0}?subject={1}&amp;body={2}" target="_blank"&gt;{0}&lt;/a&gt; to send you the code by other means.</value>
</data>
<data name="LockedFooterBodyAuthenticator" xml:space="preserve">
<value>The new QR code is sent only once for a given period and is saved in your authenticator app once scanned. It can be used for all envelopes received at the same email address until it expires. If you do not receive the QR code mail or delete it both from the mail and from authenticator, please contact the sender.</value>
</data>
<data name="LockedFooterBodySms" xml:space="preserve">
<value>You can ask the sender to check your phone number. The phone number must be entered with the area code. Otherwise you can request to remove the two-factor protection.</value>
</data>
<data name="LockedFooterTitleAccess" xml:space="preserve">
<value>You have not received an access code?</value> <value>You have not received an access code?</value>
</data> </data>
<data name="LockedFooterTitleAuthenticator" xml:space="preserve"> <data name="LockedTitle" xml:space="preserve">
<value>You have not received a QR code?</value>
</data>
<data name="LockedFooterTitleSms" xml:space="preserve">
<value>You have not received an SMS?</value>
</data>
<data name="LockedTitleAccess" xml:space="preserve">
<value>Document requires an access code</value> <value>Document requires an access code</value>
</data> </data>
<data name="LockedTitleAuthenticator" xml:space="preserve">
<value>2-Factor Authentication</value>
</data>
<data name="LockedTitleSms" xml:space="preserve">
<value>2-Factor Authentication</value>
</data>
<data name="Privacy" xml:space="preserve">
<value>Privacy</value>
</data>
<data name="ReadOnlyMessage" xml:space="preserve"> <data name="ReadOnlyMessage" xml:space="preserve">
<value>Forwarded by {0}. Valid until {1}.</value> <value>Forwarded by {0}. Valid until {1}.</value>
</data> </data>

View File

@@ -1,71 +0,0 @@
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Contracts;
using Microsoft.Extensions.Options;
using OtpNet;
using QRCoder;
using System.Text;
namespace EnvelopeGenerator.Application.Services
{
public class Authenticator : IAuthenticator
{
public static Lazy<Authenticator> LazyStatic => new(() => new Authenticator(Options.Create<AuthenticatorParams>(new()), new QRCodeGenerator()));
public static Authenticator Static => LazyStatic.Value;
private readonly AuthenticatorParams _params;
private readonly QRCodeGenerator _qrCodeGenerator;
public Authenticator(IOptions<AuthenticatorParams> options, QRCodeGenerator qrCodeGenerator)
{
_params = options.Value;
_qrCodeGenerator = qrCodeGenerator;
}
public string GenerateCode(int length)
{
//TODO: Inject Random as a singleton to support multithreading to improve performance.
Random random = new();
if (length <= 0)
throw new ArgumentException("Password length must be greater than 0.");
var passwordBuilder = new StringBuilder(length);
for (int i = 0; i < length; i++)
passwordBuilder.Append(_params.CharPool[random.Next(_params.CharPool.Length)]);
return passwordBuilder.ToString();
}
public string GenerateTotpSecretKey(int? length = null)
=> Base32Encoding.ToString(KeyGeneration.GenerateRandomKey(length ?? _params.DefaultTotpSecretKeyLength));
public byte[] GenerateTotpQrCode(string userEmail, string secretKey, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null)
{
var url = string.Format(totpUrlFormat ?? _params.TotpUrlFormat,
Uri.EscapeDataString(userEmail),
Uri.EscapeDataString(secretKey),
Uri.EscapeDataString(issuer ?? _params.TotpIssuer));
using var qrCodeData = _qrCodeGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.Q);
using var qrCode = new BitmapByteQRCode(qrCodeData);
return qrCode.GetGraphic(pixelsPerModule ?? _params.TotpQRPixelsPerModule);
}
public byte[] GenerateTotpQrCode(string userEmail, int? length = null, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null)
{
return GenerateTotpQrCode(
userEmail: userEmail,
secretKey: GenerateTotpSecretKey(length: length),
issuer: issuer,
totpUrlFormat: totpUrlFormat,
pixelsPerModule: pixelsPerModule);
}
public string GenerateTotp(string secretKey, int step = 30) => new Totp(Base32Encoding.ToBytes(secretKey), step).ComputeTotp();
public bool VerifyTotp(string totpCode, string secretKey, int step = 30, VerificationWindow? window = null)
=> new Totp(Base32Encoding.ToBytes(secretKey), step).VerifyTotp(totpCode, out _, window);
}
}

View File

@@ -12,8 +12,6 @@ using static EnvelopeGenerator.Common.Constants;
using EnvelopeGenerator.Extensions; using EnvelopeGenerator.Extensions;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
using EnvelopeGenerator.Application.Configurations; using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Extensions;
using Newtonsoft.Json;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
@@ -21,22 +19,20 @@ namespace EnvelopeGenerator.Application.Services
{ {
private readonly IEmailTemplateService _tempService; private readonly IEmailTemplateService _tempService;
private readonly IEnvelopeReceiverService _envRcvService; private readonly IEnvelopeReceiverService _envRcvService;
private readonly DispatcherParams _dConfig; private readonly DispatcherConfig _dConfig;
private readonly IConfigService _configService; private readonly IConfigService _configService;
private readonly Dictionary<string, string> _placeholders; private readonly Dictionary<string, string> _placeholders;
private readonly IAuthenticator _authenticator;
public EnvelopeMailService(IEmailOutRepository repository, IMapper mapper, IEmailTemplateService tempService, IEnvelopeReceiverService envelopeReceiverService, IOptions<DispatcherParams> dispatcherConfigOptions, IConfigService configService, IOptions<MailParams> mailConfig, IAuthenticator authenticator) : base(repository, mapper) public EnvelopeMailService(IEmailOutRepository repository, IMapper mapper, IEmailTemplateService tempService, IEnvelopeReceiverService envelopeReceiverService, IOptions<DispatcherConfig> dispatcherConfigOptions, IConfigService configService, IOptions<MailConfig> mailConfig) : base(repository, mapper)
{ {
_tempService = tempService; _tempService = tempService;
_envRcvService = envelopeReceiverService; _envRcvService = envelopeReceiverService;
_dConfig = dispatcherConfigOptions.Value; _dConfig = dispatcherConfigOptions.Value;
_configService = configService; _configService = configService;
_placeholders = mailConfig.Value.Placeholders; _placeholders = mailConfig.Value.Placeholders;
_authenticator = authenticator;
} }
private async Task<Dictionary<string, string>> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? envelopeReceiverDto = null) private async Task<Dictionary<string, string>> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? envelopeReceiverDto = null, EnvelopeReceiverReadOnlyDto? readOnlyDto = null)
{ {
if (accessCode is not null) if (accessCode is not null)
_placeholders["[DOCUMENT_ACCESS_CODE]"] = accessCode; _placeholders["[DOCUMENT_ACCESS_CODE]"] = accessCode;
@@ -68,7 +64,9 @@ namespace EnvelopeGenerator.Application.Services
return _placeholders; return _placeholders;
} }
public async Task<DataResult<int>> SendAsync(EnvelopeReceiverDto dto, EmailTemplateType tempType, Dictionary<string, object>? optionalPlaceholders = null) public async Task<DataResult<int>> SendAccessCodeAsync(EnvelopeReceiverDto dto) => await SendAsync(dto: dto, tempType: Constants.EmailTemplateType.DocumentAccessCodeReceived);
public async Task<DataResult<int>> SendAsync(EnvelopeReceiverDto dto, Constants.EmailTemplateType tempType)
{ {
var tempSerResult = await _tempService.ReadByNameAsync(tempType); var tempSerResult = await _tempService.ReadByNameAsync(tempType);
if (tempSerResult.IsFailed) if (tempSerResult.IsFailed)
@@ -106,19 +104,14 @@ namespace EnvelopeGenerator.Application.Services
var placeholders = await CreatePlaceholders(accessCode: accessCode, envelopeReceiverDto: dto); var placeholders = await CreatePlaceholders(accessCode: accessCode, envelopeReceiverDto: dto);
// Add optional place holders.
if (optionalPlaceholders is not null)
foreach (var oph in optionalPlaceholders)
placeholders[oph.Key] = oph.Value.ToString() ?? "NULL";
//TODO: remove the requirement to add the models using reflections //TODO: remove the requirement to add the models using reflections
return await CreateWithTemplateAsync(createDto: mail,placeholders: placeholders, return await CreateWithTemplateAsync(createDto: mail,placeholders: placeholders,
dto, dto.Envelope.User!, dto.Envelope); dto, dto.Envelope.User!, dto.Envelope);
} }
public async Task<DataResult<int>> SendAsync(EnvelopeReceiverReadOnlyDto dto, Dictionary<string, object>? optionalPlaceholders = null) public async Task<DataResult<int>> SendAsync(EnvelopeReceiverReadOnlyDto dto)
{ {
var tempSerResult = await _tempService.ReadByNameAsync(EmailTemplateType.DocumentShared); var tempSerResult = await _tempService.ReadByNameAsync(Constants.EmailTemplateType.DocumentShared);
if (tempSerResult.IsFailed) if (tempSerResult.IsFailed)
return tempSerResult.ToFail<int>().Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"The email cannot send because '{Constants.EmailTemplateType.DocumentShared}' template cannot found."); return tempSerResult.ToFail<int>().Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"The email cannot send because '{Constants.EmailTemplateType.DocumentShared}' template cannot found.");
var temp = tempSerResult.Data; var temp = tempSerResult.Data;
@@ -147,29 +140,7 @@ namespace EnvelopeGenerator.Application.Services
var placeholders = await CreatePlaceholders(readOnlyDto: dto); var placeholders = await CreatePlaceholders(readOnlyDto: dto);
// Add optional place holders.
if (optionalPlaceholders is not null)
foreach (var oph in optionalPlaceholders)
placeholders[oph.Key] = oph.Value.ToString() ?? "NULL";
return await CreateWithTemplateAsync(createDto: mail, placeholders: placeholders, dto.Envelope); return await CreateWithTemplateAsync(createDto: mail, placeholders: placeholders, dto.Envelope);
} }
public async Task<DataResult<int>> SendAccessCodeAsync(EnvelopeReceiverDto dto) => await SendAsync(dto: dto, tempType: EmailTemplateType.DocumentAccessCodeReceived);
public Task<DataResult<int>> SendTFAQrCodeAsync(EnvelopeReceiverDto dto)
{
// Check if receiver or secret key is null
if (dto.Receiver is null)
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver information is missing. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
if (dto.Receiver.TotpSecretkey is null)
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver.TotpSecretKey is null. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
var totp_qr_64 = _authenticator.GenerateTotpQrCode(userEmail: dto.Receiver.EmailAddress, secretKey: dto.Receiver.TotpSecretkey).ToBase64String();
return SendAsync(dto, EmailTemplateType.TotpSecret, new()
{
{"[TFA_QR_CODE]", totp_qr_64 },
});
}
} }
} }

View File

@@ -9,7 +9,6 @@ using EnvelopeGenerator.Infrastructure.Contracts;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using EnvelopeGenerator.Extensions; using EnvelopeGenerator.Extensions;
using EnvelopeGenerator.Application.DTOs.Messaging;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
@@ -17,36 +16,33 @@ namespace EnvelopeGenerator.Application.Services
{ {
private readonly IStringLocalizer<Resource> _localizer; private readonly IStringLocalizer<Resource> _localizer;
private readonly ISmsSender _smsSender; public EnvelopeReceiverService(IEnvelopeReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper)
public EnvelopeReceiverService(IEnvelopeReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper, ISmsSender smsSender)
: base(repository, mapper) : base(repository, mapper)
{ {
_localizer = localizer; _localizer = localizer;
_smsSender = smsSender;
} }
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true) public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true)
{ {
var env_rcvs = await _repository.ReadBySignatureAsync(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly); var env_rcvs = await _repository.ReadBySignatureAsync(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver);
return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverDto>>(env_rcvs)); return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverDto>>(env_rcvs));
} }
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false, bool readOnly = true) public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false)
{
var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly);
return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverDto>>(env_rcvs));
}
public async Task<DataResult<IEnumerable<string?>>> ReadAccessCodeByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true)
{ {
var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver); var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver);
return Result.Success(env_rcvs.Select(er => er.AccessCode)); return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverDto>>(env_rcvs));
} }
public async Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true) public async Task<DataResult<IEnumerable<EnvelopeReceiverSecretDto>>> ReadSecretByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true)
{ {
var env_rcv = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly); var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver);
return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverSecretDto>>(env_rcvs));
}
public async Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true)
{
var env_rcv = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver);
if (env_rcv is null) if (env_rcv is null)
return Result.Fail<EnvelopeReceiverDto>() return Result.Fail<EnvelopeReceiverDto>()
.Message(Key.EnvelopeReceiverNotFound); .Message(Key.EnvelopeReceiverNotFound);
@@ -54,17 +50,7 @@ namespace EnvelopeGenerator.Application.Services
return Result.Success(_mapper.Map<EnvelopeReceiverDto>(env_rcv)); return Result.Success(_mapper.Map<EnvelopeReceiverDto>(env_rcv));
} }
public async Task<DataResult<EnvelopeReceiverSecretDto>> ReadWithSecretByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true) public async Task<DataResult<EnvelopeReceiverDto>> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true)
{
var env_rcv = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly);
if (env_rcv is null)
return Result.Fail<EnvelopeReceiverSecretDto>()
.Message(Key.EnvelopeReceiverNotFound);
return Result.Success(_mapper.Map<EnvelopeReceiverSecretDto>(env_rcv));
}
public async Task<DataResult<EnvelopeReceiverDto>> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true)
{ {
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId(); (string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
@@ -75,7 +61,7 @@ namespace EnvelopeGenerator.Application.Services
.Notice(LogLevel.Warning, EnvelopeFlag.WrongEnvelopeReceiverId) .Notice(LogLevel.Warning, EnvelopeFlag.WrongEnvelopeReceiverId)
.Notice(LogLevel.Warning, Flag.PossibleSecurityBreach); .Notice(LogLevel.Warning, Flag.PossibleSecurityBreach);
return await ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly); return await ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver);
} }
public async Task<DataResult<bool>> VerifyAccessCodeAsync(string uuid, string signature, string accessCode) public async Task<DataResult<bool>> VerifyAccessCodeAsync(string uuid, string signature, string accessCode)
@@ -149,31 +135,5 @@ namespace EnvelopeGenerator.Application.Services
var er = await _repository.ReadLastByReceiver(mail); var er = await _repository.ReadLastByReceiver(mail);
return er is null ? Result.Fail<string?>().Notice(LogLevel.None, Flag.NotFound) : Result.Success(er.Name); return er is null ? Result.Fail<string?>().Notice(LogLevel.None, Flag.NotFound) : Result.Success(er.Name);
} }
public async Task<DataResult<SmsResponse>> SendSmsAsync(string envelopeReceiverId, string message)
{
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
if (uuid is null || signature is null)
return Result.Fail<SmsResponse>()
.Message(_localizer[Key.WrongEnvelopeReceiverId])
.Notice(LogLevel.Warning, (uuid, signature).ToTitle())
.Notice(LogLevel.Warning, EnvelopeFlag.WrongEnvelopeReceiverId)
.Notice(LogLevel.Warning, Flag.PossibleSecurityBreach);
var env_rcv = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: false, withReceiver: false);
if (env_rcv is null)
return Result.Fail<SmsResponse>()
.Message(Key.EnvelopeReceiverNotFound);
if (env_rcv.PhoneNumber is null)
return Result.Fail<SmsResponse>()
.Message(Key.PhoneNumberNonexists)
.Notice(LogLevel.Error, Flag.NotFound, $"An attempt was made to send sms to the user whose phone number is null. Envelope recipient ID is {envelopeReceiverId}, UUID is {uuid} and signature is {signature}.");
var res = await _smsSender.SendSmsAsync(recipient: env_rcv.PhoneNumber, message: message);
return Result.Success(res);
}
} }
} }

View File

@@ -1,54 +0,0 @@
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Messaging;
using EnvelopeGenerator.Application.Extensions;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Options;
namespace EnvelopeGenerator.Application.Services;
public class EnvelopeSmsHandler : IEnvelopeSmsHandler
{
private readonly ISmsSender _sender;
private readonly TotpSmsParams _totpSmsParams;
private readonly IDistributedCache _dCache;
private readonly IAuthenticator _authenticator;
public EnvelopeSmsHandler(ISmsSender sender, IOptions<TotpSmsParams> totpSmsParamsOptions, IDistributedCache distributedCache, IAuthenticator authenticator)
{
_sender = sender;
_totpSmsParams = totpSmsParamsOptions.Value;
_dCache = distributedCache;
_authenticator = authenticator;
}
/// <summary>
/// If expiration is passed then, sends sms and returns smsResponse and up-to-date expiration; otherwise send expiration.
/// </summary>
/// <param name="er_secret"></param>
/// <param name="cToken"></param>
/// <returns></returns>
public async Task<(SmsResponse? SmsResponse, DateTime Expiration)> SendTotpAsync(EnvelopeReceiverSecretDto er_secret, CancellationToken cToken = default)
{
var key = string.Format(_totpSmsParams.Expiration.CacheKeyFormat, er_secret.EnvelopeId, er_secret.ReceiverId);
var expiration = await _dCache.GetDateTimeAsync(key, cToken);
if(expiration is DateTime expirationDateTime && expirationDateTime >= DateTime.Now)
return (null, expirationDateTime);
else
{
var new_expiration = DateTime.Now.AddSeconds(_totpSmsParams.TotpStep);
var totp = _authenticator.GenerateTotp(er_secret.Receiver!.TotpSecretkey!, _totpSmsParams.TotpStep);
var msg = string.Format(_totpSmsParams.Format, totp, new_expiration.ToString(_totpSmsParams.Expiration.Format, _totpSmsParams.Expiration.CultureInfo));
await _dCache.SetDateTimeAsync(key, new_expiration, cToken: cToken);
return (await _sender.SendSmsAsync(er_secret.PhoneNumber!, msg), new_expiration);
}
}
public bool VerifyTotp(string totpCode, string secretKey) => _authenticator
.VerifyTotp(totpCode, secretKey, _totpSmsParams.TotpStep, _totpSmsParams.TotpVerificationWindow);
}

View File

@@ -1,40 +0,0 @@
using AutoMapper;
using DigitalData.Core.Abstractions.Client;
using DigitalData.Core.Client;
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.Messaging;
using Microsoft.Extensions.Options;
namespace EnvelopeGenerator.Application.Services;
//TODO: move to DigitalData.Core
public class GTXSmsSender : ISmsSender
{
private readonly IHttpClientService<GtxMessagingParams> _smsClient;
private readonly GtxMessagingParams _smsParams;
private readonly IMapper _mapper;
public string ServiceProvider { get; }
public GTXSmsSender(IHttpClientService<GtxMessagingParams> smsClient, IOptions<GtxMessagingParams> smsParamsOptions, IMapper mapper)
{
_smsClient = smsClient;
_smsParams = smsParamsOptions.Value;
_mapper = mapper;
ServiceProvider = GetType().Name.Replace("Service", string.Empty);
}
public async Task<SmsResponse> SendSmsAsync(string recipient, string message)
{
return await _smsClient.FetchAsync(queryParams: new Dictionary<string, object?>()
{
{ _smsParams.RecipientQueryParamName, recipient },
{ _smsParams.MessageQueryParamName, message }
})
.ThenAsync(res => res.Json<GtxMessagingResponse>())
.ThenAsync(_mapper.Map<SmsResponse>);
}
}

View File

@@ -5,8 +5,6 @@ using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.DTOs.Receiver;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using DigitalData.Core.Abstractions;
using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
@@ -36,17 +34,5 @@ namespace EnvelopeGenerator.Application.Services
return await _repository.DeleteAsync(rcv) ? Result.Success() : Result.Fail(); return await _repository.DeleteAsync(rcv) ? Result.Success() : Result.Fail();
} }
public virtual async Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto) where TUpdateDto : IUnique<int>
{
var val = await _repository.ReadByIdAsync(updateDto.Id);
if (val == null)
{
return Result.Fail().Notice(LogLevel.Warning, Flag.NotFound, $"{updateDto.Id} is not found in update process of {GetType()} entity.");
}
var entity = _mapper.Map(updateDto, val);
return (await _repository.UpdateAsync(entity)) ? Result.Success() : Result.Fail();
}
} }
} }

View File

@@ -77,9 +77,8 @@
End Enum End Enum
Public Enum CertificationType Public Enum CertificationType
AdvancedElectronicSignature = 1 ElectronicSignature = 1
'ElectronicSignature = 1 QualifiedSignature = 2
'QualifiedSignature = 2
End Enum End Enum
Public Enum FinalEmailType Public Enum FinalEmailType
@@ -100,7 +99,6 @@
DocumentCompleted DocumentCompleted
DocumentAccessCodeReceived DocumentAccessCodeReceived
DocumentShared DocumentShared
TotpSecret
End Enum End Enum
Public Enum EncodeType Public Enum EncodeType
@@ -110,13 +108,7 @@
DocumentForwarded DocumentForwarded
DocumentShared DocumentShared
End Enum End Enum
#End Region
#Region "Role"
Public NotInheritable Class ReceiverRole
Public Const PreAuth As String = "PreAuth"
Public Const FullyAuth As String = "FullyAuth"
End Class
#End Region #End Region
#Region "Constants" #Region "Constants"

View File

@@ -3,7 +3,13 @@
Public Property DocumentPathOrigin As String = "" Public Property DocumentPathOrigin As String = ""
Public Property DocumentPath As String = "" Public Property DocumentPath As String = ""
Public Property ExportPath As String = "" Public Property ExportPath As String = ""
Public Property DocumentPath_DMZ As String = ""
Public Property ExportPath_DMZ As String = ""
Public Property DOCUMENT_PATH_MOVE_AFTSEND As String = ""
Public Property FINISHED_PATH_EX_DMZ As String = ""
Public Property EML_PATH_EX_DMZ As String = ""
Public Property SendingProfile As Integer = 0 Public Property SendingProfile As Integer = 0
Public Property SignatureHost As String = "" Public Property SignatureHost As String = ""
Public Property Default_TFA_Enabled As Boolean = False Public Property NetUse_necessary As Boolean = False
Public Property NetUse_Finish As Boolean = False
End Class End Class

View File

@@ -8,8 +8,8 @@
Public Property Uuid As String = Guid.NewGuid.ToString() Public Property Uuid As String = Guid.NewGuid.ToString()
Public Property UseAccessCode As Boolean = False Public Property UseAccessCode As Boolean = False
Public Property Language As String = "de-DE" Public Property Language As String = "de-DE"
Public Property CertificationType As Constants.CertificationType = Constants.CertificationType.AdvancedElectronicSignature Public Property CertificationType As Constants.CertificationType = Constants.CertificationType.ElectronicSignature
Public Property TFA_Enabled As Boolean = False
Public Property SendReminderEmails As Boolean = False Public Property SendReminderEmails As Boolean = False
Public Property FirstReminderDays As Integer = 0 Public Property FirstReminderDays As Integer = 0
Public Property ReminderIntervalDays As Integer = 0 Public Property ReminderIntervalDays As Integer = 0

View File

@@ -75,7 +75,6 @@ Public Class EnvelopeReceiver
Public Property Sequence As Integer = 0 Public Property Sequence As Integer = 0
Public Property PrivateMessage As String = "" Public Property PrivateMessage As String = ""
Public Property AccessCode As String = "" Public Property AccessCode As String = ""
Public Property PhoneNumber As String = ""
Public Function GetSignature() As String Public Function GetSignature() As String
Return StringEx.GetChecksum(Email.ToUpper) Return StringEx.GetChecksum(Email.ToUpper)

View File

@@ -6,8 +6,7 @@
Public Property ContractType As Integer ' Unbenutzt Public Property ContractType As Integer ' Unbenutzt
Public Property Language As String Public Property Language As String
Public Property CertificationType As Constants.CertificationType = Constants.CertificationType.AdvancedElectronicSignature Public Property CertificationType As Constants.CertificationType = Constants.CertificationType.ElectronicSignature
Public Property TFA_Enabled As Boolean = False
Public Property SendReminderEmails As Boolean = False Public Property SendReminderEmails As Boolean = False
Public Property FirstReminderDays As Integer = 0 Public Property FirstReminderDays As Integer = 0
Public Property ReminderIntervalDays As Integer = 0 Public Property ReminderIntervalDays As Integer = 0

View File

@@ -77,8 +77,8 @@
<Reference Include="DigitalData.Modules.Logging"> <Reference Include="DigitalData.Modules.Logging">
<HintPath>..\..\2_DLL Projekte\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath> <HintPath>..\..\2_DLL Projekte\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
</Reference> </Reference>
<Reference Include="GdPicture.NET.14, Version=14.2.90.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL"> <Reference Include="GdPicture.NET.14, Version=14.2.89.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
<HintPath>..\packages\GdPicture.14.2.90\lib\net462\GdPicture.NET.14.dll</HintPath> <HintPath>..\packages\GdPicture.14.2.89\lib\net462\GdPicture.NET.14.dll</HintPath>
</Reference> </Reference>
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL"> <Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
@@ -260,13 +260,11 @@
<Generator>PublicResXFileCodeGenerator</Generator> <Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Model.en.Designer.vb</LastGenOutput> <LastGenOutput>Model.en.Designer.vb</LastGenOutput>
<CustomToolNamespace>My.Resources</CustomToolNamespace> <CustomToolNamespace>My.Resources</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Strings\Model.resx"> <EmbeddedResource Include="Strings\Model.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace> <CustomToolNamespace>My.Resources</CustomToolNamespace>
<Generator>PublicResXFileCodeGenerator</Generator> <Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Model.Designer.vb</LastGenOutput> <LastGenOutput>Model.Designer.vb</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -291,11 +289,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup /> <ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
<Import Project="..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets" Condition="Exists('..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets')" /> <Import Project="..\packages\GdPicture.runtimes.windows.14.2.89\build\net462\GdPicture.runtimes.windows.targets" Condition="Exists('..\packages\GdPicture.runtimes.windows.14.2.89\build\net462\GdPicture.runtimes.windows.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup> <PropertyGroup>
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText> <ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup> </PropertyGroup>
<Error Condition="!Exists('..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets'))" /> <Error Condition="!Exists('..\packages\GdPicture.runtimes.windows.14.2.89\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GdPicture.runtimes.windows.14.2.89\build\net462\GdPicture.runtimes.windows.targets'))" />
</Target> </Target>
</Project> </Project>

View File

@@ -82,14 +82,49 @@ Namespace Jobs
Logger.Debug("Loading ReportCreator..") Logger.Debug("Loading ReportCreator..")
ReportCreator = New ReportCreator(LogConfig, oState) ReportCreator = New ReportCreator(LogConfig, oState)
Logger.Debug("My.Settings.RuninDMZ: [{0}]", My.Settings.RuninDMZ.ToString)
Logger.Debug("My.Settings.NetUse_Usr: [{0}]", My.Settings.NetUse_Usr)
Config.DocumentPath = Config.DocumentPath
If My.Settings.RuninDMZ = True Then
If Config.DocumentPath_DMZ <> String.Empty Then
Logger.Debug("RuninDMZ - Using DocumentPath_DMZ: [{0}] - Overwrite Document-Path", Config.DocumentPath_DMZ)
Config.DocumentPath = Config.DocumentPath_DMZ
Config.NetUse_necessary = True
Else
Config.DocumentPath = Config.DocumentPath
End If
Else
If Config.DOCUMENT_PATH_MOVE_AFTSEND <> String.Empty Then
Logger.Debug("Using DMZRemotePath: [{0}] - Overwrite Document-Path ...", Config.DOCUMENT_PATH_MOVE_AFTSEND)
Config.DocumentPath = Config.DOCUMENT_PATH_MOVE_AFTSEND
Config.NetUse_Finish = True
Else
Config.DocumentPath = Config.DocumentPath
End If
End If
Logger.Debug("DocumentPath: [{0}]", Config.DocumentPath) Logger.Debug("DocumentPath: [{0}]", Config.DocumentPath)
If My.Settings.RuninDMZ = True Then
If Config.FINISHED_PATH_EX_DMZ <> String.Empty Then
Logger.Debug("RuninDMZ - FINISHED_PATH_EX_DMZ configured: [{0}]", Config.FINISHED_PATH_EX_DMZ)
Config.NetUse_Finish = True
End If
If Config.ExportPath_DMZ <> String.Empty Then
Logger.Debug("RuninDMZ - Using ExportPath_DMZ: [{0}] - Overwrite ExportPath", Config.ExportPath_DMZ)
Config.ExportPath = Config.ExportPath_DMZ
End If
End If
Logger.Debug("ExportPath: [{0}]", Config.ExportPath) Logger.Debug("ExportPath: [{0}]", Config.ExportPath)
If Config.NetUse_Finish = True Then
If NetUse_Command(Config.DocumentPath, My.Settings.NetUse_Usr, My.Settings.NetUse_PW) = True Then
Logger.Debug("NetUse_Finish = successful!")
End If
End If
Dim oCompleteStatus As Integer = Constants.EnvelopeStatus.EnvelopeCompletelySigned Dim oCompleteStatus As Integer = Constants.EnvelopeStatus.EnvelopeCompletelySigned
Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE WHERE STATUS = {oCompleteStatus} AND DATEDIFF(minute, CHANGED_WHEN, GETDATE()) >= {CompleteWaitTime} ORDER BY GUID" Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE WHERE STATUS = {oCompleteStatus} AND DATEDIFF(minute, CHANGED_WHEN, GETDATE()) >= {CompleteWaitTime} ORDER BY GUID"
Dim oTable = Database.GetDatatable(oSql) Dim oTable = Database.GetDatatable(oSql)
@@ -122,6 +157,10 @@ Namespace Jobs
Logger.Warn("EnvelopeData could not be loaded for Id [{0}]!", oId) Logger.Warn("EnvelopeData could not be loaded for Id [{0}]!", oId)
Throw New ArgumentNullException("EnvelopeData") Throw New ArgumentNullException("EnvelopeData")
End If End If
If Config.DOCUMENT_PATH_MOVE_AFTSEND <> String.Empty Then
oEnvelopeData.DocumentPath.Replace(Config.DocumentPathOrigin, Config.DOCUMENT_PATH_MOVE_AFTSEND)
Logger.Debug("Replaced Path in oEnvelopeData.DocumentPath!")
End If
Logger.Debug("Burning Annotations to pdf ...") Logger.Debug("Burning Annotations to pdf ...")
Dim oBurnedDocument As Byte() = BurnAnnotationsToPdf(oEnvelopeData) Dim oBurnedDocument As Byte() = BurnAnnotationsToPdf(oEnvelopeData)
If oBurnedDocument Is Nothing Then If oBurnedDocument Is Nothing Then
@@ -157,6 +196,13 @@ Namespace Jobs
Throw New ExportDocumentException("Could not export final document to disk!", ex) Throw New ExportDocumentException("Could not export final document to disk!", ex)
End Try End Try
If Config.NetUse_Finish = True Then
If Config.FINISHED_PATH_EX_DMZ <> String.Empty Then
If My.Settings.NetUse_PW <> String.Empty And My.Settings.NetUse_Usr <> String.Empty Then
Clean_DNZ_PAth(Config.FINISHED_PATH_EX_DMZ)
End If
End If
End If
Logger.Info("Writing EB-bytes to database...") Logger.Info("Writing EB-bytes to database...")
Update_File_DB(oOutputFilePath, oEnvelope.Id) Update_File_DB(oOutputFilePath, oEnvelope.Id)
@@ -241,48 +287,48 @@ Namespace Jobs
data = br.ReadBytes(CInt(numBytes)) data = br.ReadBytes(CInt(numBytes))
Return data Return data
End Function End Function
'Private Function NetUse_Command(pDestinationPath As String, pUsername As String, pPassword As String) Private Function NetUse_Command(pDestinationPath As String, pUsername As String, pPassword As String)
' Dim oDectryptedPW = Helpers.Decrypt(My.Settings.NetUse_PW) Dim oDectryptedPW = Helpers.Decrypt(My.Settings.NetUse_PW)
' Dim netUseCommand As String = $"net use {pDestinationPath} /user:{pUsername} {oDectryptedPW}" Dim netUseCommand As String = $"net use {pDestinationPath} /user:{pUsername} {oDectryptedPW}"
' Logger.Debug("EXECUTING NetUse_Command for " & pDestinationPath) Logger.Debug("EXECUTING NetUse_Command for " & pDestinationPath)
' Dim processInfo As New ProcessStartInfo("cmd.exe", $"/C {netUseCommand}") Dim processInfo As New ProcessStartInfo("cmd.exe", $"/C {netUseCommand}")
' processInfo.RedirectStandardOutput = True processInfo.RedirectStandardOutput = True
' processInfo.UseShellExecute = False processInfo.UseShellExecute = False
' processInfo.CreateNoWindow = True processInfo.CreateNoWindow = True
' Using process As Process = Process.Start(processInfo) Using process As Process = Process.Start(processInfo)
' process.WaitForExit() process.WaitForExit()
' ' Prüfe den Rückgabewert des net use Befehls ' Prüfe den Rückgabewert des net use Befehls
' If process.ExitCode = 0 Then If process.ExitCode = 0 Then
' Return True Return True
' Else Else
' Return False Return False
' End If End If
' End Using End Using
'End Function End Function
'Private Function Clean_DNZ_PAth(pSourcePath As String) As Boolean Private Function Clean_DNZ_PAth(pSourcePath As String) As Boolean
' Dim oFilename = System.IO.Path.GetFileName(pSourcePath) Dim oFilename = System.IO.Path.GetFileName(pSourcePath)
' Logger.Debug("## Starting Clean_DNZ_PAth ...") Logger.Debug("## Starting Clean_DNZ_PAth ...")
' Logger.Debug("## pSourcePath {0}", pSourcePath) Logger.Debug("## pSourcePath {0}", pSourcePath)
' Dim oDirectorySource = Path.Combine(pSourcePath, ParentFolderUID) Dim oDirectorySource = Path.Combine(pSourcePath, ParentFolderUID)
' Try Try
' Logger.Debug($"Deleting oDirectorySource {oDirectorySource} ...") Logger.Debug($"Deleting oDirectorySource {oDirectorySource} ...")
' Directory.Delete(oDirectorySource, True) Directory.Delete(oDirectorySource, True)
' Console.WriteLine($"Folder successfully deleted!") Console.WriteLine($"Folder successfully deleted!")
' Logger.Debug($"...Deleted!") Logger.Debug($"...Deleted!")
' Return True Return True
' Catch ex As Exception Catch ex As Exception
' Logger.Error(ex) Logger.Error(ex)
' Return False Return False
' End Try End Try
'End Function End Function
Private Function SendFinalEmails(pEnvelope As Envelope) As Boolean ', pAttachment As String Private Function SendFinalEmails(pEnvelope As Envelope) As Boolean ', pAttachment As String
Dim oMailToCreator = pEnvelope.FinalEmailToCreator Dim oMailToCreator = pEnvelope.FinalEmailToCreator
Dim oMailToReceivers = pEnvelope.FinalEmailToReceivers Dim oMailToReceivers = pEnvelope.FinalEmailToReceivers
@@ -352,7 +398,15 @@ Namespace Jobs
Dim oAnnotations = pEnvelopeData.AnnotationData Dim oAnnotations = pEnvelopeData.AnnotationData
Dim oInputPath = "" Dim oInputPath = ""
If IsNothing(pEnvelopeData.DocAsByte) Then If IsNothing(pEnvelopeData.DocAsByte) Then
oInputPath = pEnvelopeData.DocumentPath If My.Settings.RuninDMZ Then
Logger.Debug("Replacing Path in pData.DocumentPath ...")
oInputPath = pEnvelopeData.DocumentPath.Replace(Config.DocumentPathOrigin, Config.DocumentPath)
ElseIf Config.DOCUMENT_PATH_MOVE_AFTSEND <> String.Empty Then
Logger.Debug("Replacing Path in pData.DocumentPath ...")
oInputPath = pEnvelopeData.DocumentPath.Replace(Config.DocumentPathOrigin, Config.DOCUMENT_PATH_MOVE_AFTSEND)
Else
oInputPath = pEnvelopeData.DocumentPath
End If
Logger.Info($"Input path: [{oInputPath}]") Logger.Info($"Input path: [{oInputPath}]")
Else Else
Logger.Info($"we got bytes..") Logger.Info($"we got bytes..")

View File

@@ -16,13 +16,17 @@ Public Class ConfigModel
Dim oRow As DataRow = oTable.Rows.Item(0) Dim oRow As DataRow = oTable.Rows.Item(0)
Return New DbConfig() With { Return New DbConfig() With {
.DocumentPath = oRow.ItemEx("DOCUMENT_PATH", ""), .DocumentPath = oRow.ItemEx("DOCUMENT_PATH", ""),
.DocumentPathOrigin = oRow.ItemEx("DOCUMENT_PATH", ""), .DocumentPathOrigin = oRow.ItemEx("DOCUMENT_PATH", ""),
.ExportPath = oRow.ItemEx("EXPORT_PATH", ""), .DocumentPath_DMZ = oRow.ItemEx("DOCUMENT_PATH_DMZ", ""),
.SendingProfile = oRow.ItemEx("SENDING_PROFILE", 0), .ExportPath = oRow.ItemEx("EXPORT_PATH", ""),
.SignatureHost = oRow.ItemEx("SIGNATURE_HOST", ""), .ExportPath_DMZ = oRow.ItemEx("EXPORT_PATH_DMZ", ""),
.ExternalProgramName = oRow.ItemEx("EXTERNAL_PROGRAM_NAME", ""), .SendingProfile = oRow.ItemEx("SENDING_PROFILE", 0),
.Default_TFA_Enabled = oRow.ItemEx("DEF_TFA_ENABLED", False) .SignatureHost = oRow.ItemEx("SIGNATURE_HOST", ""),
.ExternalProgramName = oRow.ItemEx("EXTERNAL_PROGRAM_NAME", ""),
.DOCUMENT_PATH_MOVE_AFTSEND = oRow.ItemEx("DOCUMENT_PATH_MOVE_AFTSEND", ""),
.FINISHED_PATH_EX_DMZ = oRow.ItemEx("FINISHED_PATH_EX_DMZ", ""),
.EML_PATH_EX_DMZ = oRow.ItemEx("EML_PATH_EX_DMZ", "")
} }
Catch ex As Exception Catch ex As Exception
Logger.Error(ex) Logger.Error(ex)

View File

@@ -2,7 +2,6 @@
Imports System.Web.UI.WebControls Imports System.Web.UI.WebControls
Imports DigitalData.Modules.Base Imports DigitalData.Modules.Base
Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Logging
Imports EnvelopeGenerator.Common.Constants
Public Class EnvelopeModel Public Class EnvelopeModel
Inherits BaseModel Inherits BaseModel
@@ -35,7 +34,7 @@ Public Class EnvelopeModel
.Language = pRow.ItemEx("LANGUAGE", "de-DE"), .Language = pRow.ItemEx("LANGUAGE", "de-DE"),
.Status = ObjectEx.ToEnum(Of Constants.EnvelopeStatus)(pRow.ItemEx("STATUS", Constants.EnvelopeStatus.EnvelopeCreated.ToString())), .Status = ObjectEx.ToEnum(Of Constants.EnvelopeStatus)(pRow.ItemEx("STATUS", Constants.EnvelopeStatus.EnvelopeCreated.ToString())),
.AddedWhen = pRow.Item("ADDED_WHEN"), .AddedWhen = pRow.Item("ADDED_WHEN"),
.CertificationType = ObjectEx.ToEnum(Of Constants.CertificationType)(pRow.ItemEx("CERTIFICATION_TYPE", Constants.CertificationType.AdvancedElectronicSignature.ToString())), .CertificationType = ObjectEx.ToEnum(Of Constants.CertificationType)(pRow.ItemEx("CERTIFICATION_TYPE", Constants.CertificationType.ElectronicSignature.ToString())),
.User = New User(), .User = New User(),
.ExpiresWhen = pRow.ItemEx(Of Date)("EXPIRES_WHEN", Nothing), .ExpiresWhen = pRow.ItemEx(Of Date)("EXPIRES_WHEN", Nothing),
.ExpiresWarningWhen = pRow.ItemEx(Of Date)("EXPIRES_WARNING_WHEN", Nothing), .ExpiresWarningWhen = pRow.ItemEx(Of Date)("EXPIRES_WARNING_WHEN", Nothing),
@@ -46,8 +45,7 @@ Public Class EnvelopeModel
.ReminderIntervalDays = pRow.ItemEx("REMINDER_INTERVAL_DAYS", 0), .ReminderIntervalDays = pRow.ItemEx("REMINDER_INTERVAL_DAYS", 0),
.UseAccessCode = pRow.ItemEx("USE_ACCESS_CODE", False), .UseAccessCode = pRow.ItemEx("USE_ACCESS_CODE", False),
.FinalEmailToCreator = ObjectEx.ToEnum(Of Constants.FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_CREATOR", Constants.FinalEmailType.No.ToString())), .FinalEmailToCreator = ObjectEx.ToEnum(Of Constants.FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_CREATOR", Constants.FinalEmailType.No.ToString())),
.FinalEmailToReceivers = ObjectEx.ToEnum(Of Constants.FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_RECEIVERS", Constants.FinalEmailType.No.ToString())), .FinalEmailToReceivers = ObjectEx.ToEnum(Of Constants.FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_RECEIVERS", Constants.FinalEmailType.No.ToString()))
.TFA_Enabled = pRow.ItemEx("TFA_Enabled", False)
} }
Dim oDOC_RESULT = pRow.Item("DOC_RESULT") Dim oDOC_RESULT = pRow.Item("DOC_RESULT")
If Not IsDBNull(oDOC_RESULT) Then If Not IsDBNull(oDOC_RESULT) Then
@@ -144,17 +142,13 @@ Public Class EnvelopeModel
Public Function Insert(pEnvelope As Envelope) As Boolean Public Function Insert(pEnvelope As Envelope) As Boolean
Try Try
Dim oSql = $"INSERT INTO [dbo].[TBSIG_ENVELOPE] (MESSAGE, ENVELOPE_UUID, STATUS, USER_ID) Dim oSql = "INSERT INTO [dbo].[TBSIG_ENVELOPE] (MESSAGE, ENVELOPE_UUID, STATUS, USER_ID) "
VALUES('', oSql += " VALUES (@MESSAGE, @UUID, @STATUS, @USER_ID)"
'{pEnvelope.Uuid}',
'{CInt([Enum].Parse(GetType(EnvelopeStatus), Constants.EnvelopeStatus.EnvelopeCreated))}',
'{pEnvelope.UserId}')"
Dim oCommand As New SqlCommand(oSql) Dim oCommand As New SqlCommand(oSql)
'oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = String.Empty oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = String.Empty
'oCommand.Parameters.Add("UUID", SqlDbType.NVarChar).Value = pEnvelope.Uuid oCommand.Parameters.Add("UUID", SqlDbType.NVarChar).Value = pEnvelope.Uuid
'oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = Constants.EnvelopeStatus.EnvelopeCreated oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = Constants.EnvelopeStatus.EnvelopeCreated
'oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId
If Database.ExecuteNonQuery(oCommand) Then If Database.ExecuteNonQuery(oCommand) Then
pEnvelope.Id = GetEnvelopeId(pEnvelope) pEnvelope.Id = GetEnvelopeId(pEnvelope)
@@ -188,11 +182,9 @@ Public Class EnvelopeModel
oSql += " [REMINDER_INTERVAL_DAYS] = @REMINDER_INTERVAL_DAYS, " oSql += " [REMINDER_INTERVAL_DAYS] = @REMINDER_INTERVAL_DAYS, "
oSql += " [SEND_REMINDER_EMAILS] = @SEND_REMINDER_EMAILS, " oSql += " [SEND_REMINDER_EMAILS] = @SEND_REMINDER_EMAILS, "
oSql += " [USE_ACCESS_CODE] = @USE_ACCESS_CODE, " oSql += " [USE_ACCESS_CODE] = @USE_ACCESS_CODE, "
oSql += " [CHANGED_WHEN] = GETDATE(), " oSql += " [CHANGED_WHEN] = GETDATE() "
oSql += " [TFA_Enabled] = @TFA_Enabled"
oSql += " WHERE GUID = @ID AND USER_ID = @USER_ID" oSql += " WHERE GUID = @ID AND USER_ID = @USER_ID"
Dim oCommand As New SqlCommand(oSql) Dim oCommand As New SqlCommand(oSql)
oCommand.Parameters.Add("ID", SqlDbType.Int).Value = pEnvelope.Id oCommand.Parameters.Add("ID", SqlDbType.Int).Value = pEnvelope.Id
oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId
@@ -214,7 +206,7 @@ Public Class EnvelopeModel
oCommand.Parameters.Add("REMINDER_INTERVAL_DAYS", SqlDbType.Int).Value = pEnvelope.ReminderIntervalDays oCommand.Parameters.Add("REMINDER_INTERVAL_DAYS", SqlDbType.Int).Value = pEnvelope.ReminderIntervalDays
oCommand.Parameters.Add("SEND_REMINDER_EMAILS", SqlDbType.Bit).Value = pEnvelope.SendReminderEmails oCommand.Parameters.Add("SEND_REMINDER_EMAILS", SqlDbType.Bit).Value = pEnvelope.SendReminderEmails
oCommand.Parameters.Add("USE_ACCESS_CODE", SqlDbType.Bit).Value = pEnvelope.UseAccessCode oCommand.Parameters.Add("USE_ACCESS_CODE", SqlDbType.Bit).Value = pEnvelope.UseAccessCode
oCommand.Parameters.Add("TFA_ENABLED", SqlDbType.Bit).Value = pEnvelope.TFA_Enabled
Return Database.ExecuteNonQuery(oCommand, pTransaction) Return Database.ExecuteNonQuery(oCommand, pTransaction)
Catch ex As Exception Catch ex As Exception

View File

@@ -1,5 +1,4 @@
Imports DigitalData.Modules.Base Imports DigitalData.Modules.Base
Imports EnvelopeGenerator.Common.Constants
Public Class EnvelopeTypeModel Public Class EnvelopeTypeModel
Inherits BaseModel Inherits BaseModel
@@ -22,8 +21,7 @@ Public Class EnvelopeTypeModel
.FinalEmailToCreator = pRow.ItemEx("FINAL_EMAIL_TO_CREATOR", 0), .FinalEmailToCreator = pRow.ItemEx("FINAL_EMAIL_TO_CREATOR", 0),
.FinalEmailToReceivers = pRow.ItemEx("FINAL_EMAIL_TO_RECEIVERS", 0), .FinalEmailToReceivers = pRow.ItemEx("FINAL_EMAIL_TO_RECEIVERS", 0),
.ContractType = pRow.ItemEx("CONTRACT_TYPE", 0), .ContractType = pRow.ItemEx("CONTRACT_TYPE", 0),
.CertificationType = pRow.ItemEx("CERTIFICATION_TYPE", 0), .CertificationType = pRow.ItemEx("CERTIFICATION_TYPE", 0)
.TFA_Enabled = pRow.ItemEx("TFA_Enabled", 0)
} }
End Function End Function

View File

@@ -33,8 +33,7 @@ Public Class ReceiverModel
.Status = ReceiverSignedStatus, .Status = ReceiverSignedStatus,
.ColorType = DirectCast(pColorIndex + 1, ColorType), .ColorType = DirectCast(pColorIndex + 1, ColorType),
.AccessCode = pRow.ItemEx("ACCESS_CODE", ""), .AccessCode = pRow.ItemEx("ACCESS_CODE", ""),
.SignedDate = SignedDate, .SignedDate = SignedDate
.PhoneNumber = pRow.ItemEx("PHONE_NUMBER", "")
} }
End Function End Function
@@ -57,29 +56,25 @@ Public Class ReceiverModel
Public Function Insert(pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean Public Function Insert(pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean
Try Try
Dim oCheck = $"SELECT COUNT(GUID) FROM [dbo].[TBSIG_RECEIVER] WHERE SIGNATURE = '{pReceiver.GetSignature()}'" Dim oSql As String = "INSERT INTO [dbo].[TBSIG_RECEIVER]
Dim oExists = Database.GetScalarValue(oCheck)
If oExists = 0 Then
Dim oSql As String = $"INSERT INTO [dbo].[TBSIG_RECEIVER]
([EMAIL_ADDRESS] ([EMAIL_ADDRESS]
,[SIGNATURE]) ,[SIGNATURE])
VALUES VALUES
('{pReceiver.Email}' (@EMAIL
,'{pReceiver.GetSignature()}')" ,@SIGNATURE)"
Dim oCommand = New SqlCommand(oSql) Dim oCommand = New SqlCommand(oSql)
Dim oResult = Database.ExecuteNonQuery(oCommand) oCommand.Parameters.Add("EMAIL", SqlDbType.NVarChar).Value = pReceiver.Email
If oResult = True Then oCommand.Parameters.Add("SIGNATURE", SqlDbType.NVarChar).Value = pReceiver.GetSignature()
pReceiver.Id = GetReceiverIdByEmail(pReceiver.Email, pTransaction)
Return True Dim oResult = Database.ExecuteNonQuery(oCommand)
Else If oResult = True Then
Return False pReceiver.Id = GetReceiverIdByEmail(pReceiver.Email, pTransaction)
End If
Else Else
Logger.Warn($"Receiver [{pReceiver.Email}] already existing! Check collecting not existing Receivers!") Return False
Return True
End If End If
Return True
Catch ex As Exception Catch ex As Exception
Logger.Error(ex) Logger.Error(ex)
Return False Return False
@@ -88,18 +83,18 @@ Public Class ReceiverModel
Public Function Update(pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean Public Function Update(pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean
Try Try
Dim oSql As String = $"UPDATE [dbo].[TBSIG_USER_RECEIVER] Dim oSql As String = "UPDATE [dbo].[TBSIG_USER_RECEIVER]
SET [NAME] = '{pReceiver.Name}' SET [NAME] = @NAME
,[COMPANY_NAME] = '{pReceiver.Company}' ,[COMPANY_NAME] = @COMPANY
,[JOB_TITLE] = '{pReceiver.JobTitle}' ,[JOB_TITLE] = @JOB
WHERE RECEIVER_ID = {pReceiver.Id}" WHERE RECEIVER_ID = @RECEIVER_ID"
Dim oCommand = New SqlCommand(oSql) Dim oCommand = New SqlCommand(oSql)
'oCommand.Parameters.Add("NAME", SqlDbType.NVarChar).Value = pReceiver.Name oCommand.Parameters.Add("NAME", SqlDbType.NVarChar).Value = pReceiver.Name
'oCommand.Parameters.Add("COMPANY", SqlDbType.NVarChar).Value = pReceiver.Company oCommand.Parameters.Add("COMPANY", SqlDbType.NVarChar).Value = pReceiver.Company
'oCommand.Parameters.Add("JOB", SqlDbType.NVarChar).Value = pReceiver.JobTitle oCommand.Parameters.Add("JOB", SqlDbType.NVarChar).Value = pReceiver.JobTitle
'oCommand.Parameters.Add("RECEIVER_ID", SqlDbType.Int).Value = pReceiver.Id oCommand.Parameters.Add("RECEIVER_ID", SqlDbType.Int).Value = pReceiver.Id
'oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pReceiver.Id oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pReceiver.Id
Return Database.ExecuteNonQuery(oCommand, pTransaction) Return Database.ExecuteNonQuery(oCommand, pTransaction)
Catch ex As Exception Catch ex As Exception
@@ -118,7 +113,7 @@ Public Class ReceiverModel
End Function End Function
Public Function Assign(pEnvelope As Envelope, pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean Public Function Assign(pEnvelope As Envelope, pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean
Dim oSql = $"INSERT INTO [dbo].[TBSIG_ENVELOPE_RECEIVER] Dim oSql = "INSERT INTO [dbo].[TBSIG_ENVELOPE_RECEIVER]
([ENVELOPE_ID] ([ENVELOPE_ID]
,[RECEIVER_ID] ,[RECEIVER_ID]
,[PRIVATE_MESSAGE] ,[PRIVATE_MESSAGE]
@@ -126,28 +121,26 @@ Public Class ReceiverModel
,[NAME] ,[NAME]
,[JOB_TITLE] ,[JOB_TITLE]
,[COMPANY_NAME] ,[COMPANY_NAME]
,[SEQUENCE] ,[SEQUENCE])
,[PHONE_NUMBER])
VALUES VALUES
('{pEnvelope.Id}' (@ENVELOPE_ID
,'{pReceiver.Id}' ,@RECEIVER_ID
,'{pReceiver.PrivateMessage}' ,@MESSAGE
,'{pReceiver.AccessCode}' ,@ACCESS_CODE
,'{pReceiver.Name}' ,@NAME
,'{pReceiver.JobTitle}' ,@JOB
,'{pReceiver.Company}' ,@COMPANY
,'{pReceiver.Sequence}' ,@SEQUENCE)"
,'{pReceiver.PhoneNumber}')"
Dim oCommand As New SqlCommand(oSql) Dim oCommand As New SqlCommand(oSql)
'oCommand.Parameters.Add("ENVELOPE_ID", SqlDbType.NVarChar).Value = pEnvelope.Id oCommand.Parameters.Add("ENVELOPE_ID", SqlDbType.NVarChar).Value = pEnvelope.Id
'oCommand.Parameters.Add("RECEIVER_ID", SqlDbType.NVarChar).Value = pReceiver.Id oCommand.Parameters.Add("RECEIVER_ID", SqlDbType.NVarChar).Value = pReceiver.Id
'oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = pReceiver.PrivateMessage oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = pReceiver.PrivateMessage
'oCommand.Parameters.Add("ACCESS_CODE", SqlDbType.NVarChar).Value = pReceiver.AccessCode oCommand.Parameters.Add("ACCESS_CODE", SqlDbType.NVarChar).Value = pReceiver.AccessCode
'oCommand.Parameters.Add("NAME", SqlDbType.NVarChar).Value = pReceiver.Name oCommand.Parameters.Add("NAME", SqlDbType.NVarChar).Value = pReceiver.Name
'oCommand.Parameters.Add("JOB", SqlDbType.NVarChar).Value = pReceiver.JobTitle oCommand.Parameters.Add("JOB", SqlDbType.NVarChar).Value = pReceiver.JobTitle
'oCommand.Parameters.Add("COMPANY", SqlDbType.NVarChar).Value = pReceiver.Company oCommand.Parameters.Add("COMPANY", SqlDbType.NVarChar).Value = pReceiver.Company
'oCommand.Parameters.Add("SEQUENCE", SqlDbType.NVarChar).Value = pReceiver.Sequence oCommand.Parameters.Add("SEQUENCE", SqlDbType.NVarChar).Value = pReceiver.Sequence
Return Database.ExecuteNonQuery(oCommand, pTransaction) Return Database.ExecuteNonQuery(oCommand, pTransaction)
End Function End Function
@@ -273,22 +266,6 @@ Public Class ReceiverModel
Return String.Empty Return String.Empty
End Try End Try
End Function End Function
Public Function GetLastUsedReceiverPhone(pEmailAddress As String, pUserId As Integer) As String
Try
Dim oSql As String
oSql = "SELECT TOP 1 [PHONE_NUMBER] FROM dbo.VWSIG_ENVELOPE_RECEIVERS "
oSql += $" WHERE ENV_USERID_CREATED = {pUserId}) "
oSql += $" AND EMAIL_ADDRESS = '{pEmailAddress}' "
oSql += " AND Len([PHONE_NUMBER]) > 0 "
oSql += " ORDER BY [ADDED_WHEN] DESC"
Return Database.GetScalarValue(oSql)
Catch ex As Exception
Logger.Error(ex)
Return String.Empty
End Try
End Function
Private Function GetReceiverIdByEmail(pEmailAddress As String, pTransaction As SqlTransaction) As Integer Private Function GetReceiverIdByEmail(pEmailAddress As String, pTransaction As SqlTransaction) As Integer
Try Try

View File

@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
' indem Sie "*" wie unten gezeigt eingeben: ' indem Sie "*" wie unten gezeigt eingeben:
' <Assembly: AssemblyVersion("1.0.*")> ' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("2.2.0.0")> <Assembly: AssemblyVersion("1.9.3.0")>
<Assembly: AssemblyFileVersion("2.2.0.0")> <Assembly: AssemblyFileVersion("1.9.3.0")>

View File

@@ -15,7 +15,7 @@ Option Explicit On
Namespace My Namespace My
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _ <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0"), _ Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0"), _
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _ Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Partial Friend NotInheritable Class MySettings Partial Friend NotInheritable Class MySettings
Inherits Global.System.Configuration.ApplicationSettingsBase Inherits Global.System.Configuration.ApplicationSettingsBase
@@ -53,6 +53,33 @@ Namespace My
Return defaultInstance Return defaultInstance
End Get End Get
End Property End Property
<Global.System.Configuration.ApplicationScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("False")> _
Public ReadOnly Property RuninDMZ() As Boolean
Get
Return CType(Me("RuninDMZ"),Boolean)
End Get
End Property
<Global.System.Configuration.ApplicationScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("dd-gan\Administrator")> _
Public ReadOnly Property NetUse_Usr() As String
Get
Return CType(Me("NetUse_Usr"),String)
End Get
End Property
<Global.System.Configuration.ApplicationScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("sY4vnATDXwosbTJGip6SqA==")> _
Public ReadOnly Property NetUse_PW() As String
Get
Return CType(Me("NetUse_PW"),String)
End Get
End Property
End Class End Class
End Namespace End Namespace

View File

@@ -1,5 +1,15 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true"> <SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
<Profiles /> <Profiles />
<Settings /> <Settings>
<Setting Name="RuninDMZ" Type="System.Boolean" Scope="Application">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="NetUse_Usr" Type="System.String" Scope="Application">
<Value Profile="(Default)">dd-gan\Administrator</Value>
</Setting>
<Setting Name="NetUse_PW" Type="System.String" Scope="Application">
<Value Profile="(Default)">sY4vnATDXwosbTJGip6SqA==</Value>
</Setting>
</Settings>
</SettingsFile> </SettingsFile>

View File

@@ -45,7 +45,7 @@ Public Class ActionService
Return oSendResult Return oSendResult
End Function End Function
Public Function ResendReceiver(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean Public Function ResendReceiver(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean
Return EmailService.SendDocumentReceivedEmail(pEnvelope, pReceiver) EmailService.SendDocumentReceivedEmail(pEnvelope, pReceiver)
End Function End Function

View File

@@ -117,9 +117,6 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Dialog Concat PDF" xml:space="preserve">
<value>Please select the PDF documents you would like to link/concat:</value>
</data>
<data name="Do you really want to delete this envelope" xml:space="preserve"> <data name="Do you really want to delete this envelope" xml:space="preserve">
<value>Do you really want to delete this envelope?</value> <value>Do you really want to delete this envelope?</value>
</data> </data>
@@ -144,12 +141,6 @@
<data name="Document forwarded" xml:space="preserve"> <data name="Document forwarded" xml:space="preserve">
<value>Document forwarded to receiver: {0}</value> <value>Document forwarded to receiver: {0}</value>
</data> </data>
<data name="Drop only one file" xml:space="preserve">
<value>Currently, only one PDF file is permitted via drag and drop.</value>
</data>
<data name="Drop only pdf" xml:space="preserve">
<value />
</data>
<data name="Edit Envelope" xml:space="preserve"> <data name="Edit Envelope" xml:space="preserve">
<value>Edit Envelope</value> <value>Edit Envelope</value>
</data> </data>
@@ -177,12 +168,6 @@
<data name="Envelope-Editor" xml:space="preserve"> <data name="Envelope-Editor" xml:space="preserve">
<value>Envelope-Editor</value> <value>Envelope-Editor</value>
</data> </data>
<data name="Error email Validation" xml:space="preserve">
<value>The email [ @Mail ] could not be varified!</value>
</data>
<data name="Error phone Validation" xml:space="preserve">
<value />
</data>
<data name="Error sending the envelope" xml:space="preserve"> <data name="Error sending the envelope" xml:space="preserve">
<value>Error sending the envelope:</value> <value>Error sending the envelope:</value>
</data> </data>
@@ -205,7 +190,7 @@
<value>Receiver {0} has an invalid Email Address.</value> <value>Receiver {0} has an invalid Email Address.</value>
</data> </data>
<data name="Invitation successfully resend" xml:space="preserve"> <data name="Invitation successfully resend" xml:space="preserve">
<value>Invitation to [@Mail] has been send once again!</value> <value>Invitation has been send once again!</value>
</data> </data>
<data name="Missing Documents" xml:space="preserve"> <data name="Missing Documents" xml:space="preserve">
<value>Missing Documents</value> <value>Missing Documents</value>

View File

@@ -117,9 +117,6 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Dialog Concat PDF" xml:space="preserve">
<value>Bitte wählen Sie die PDF-Dokumente die Sie verketten möchten:</value>
</data>
<data name="Do you really want to delete this envelope" xml:space="preserve"> <data name="Do you really want to delete this envelope" xml:space="preserve">
<value>Wollen Sie diesen Umschlag wirklich löschen?</value> <value>Wollen Sie diesen Umschlag wirklich löschen?</value>
</data> </data>
@@ -144,9 +141,6 @@
<data name="Document forwarded" xml:space="preserve"> <data name="Document forwarded" xml:space="preserve">
<value>Umschlag an Empfänger {0} weitergeleitet.</value> <value>Umschlag an Empfänger {0} weitergeleitet.</value>
</data> </data>
<data name="Drop only one file" xml:space="preserve">
<value>Aktuell ist per Drag and Drop nur eine PDF-Datei erlaubt.</value>
</data>
<data name="Edit Envelope" xml:space="preserve"> <data name="Edit Envelope" xml:space="preserve">
<value>Bearbeite Umschlag</value> <value>Bearbeite Umschlag</value>
</data> </data>
@@ -174,13 +168,6 @@
<data name="Envelope-Editor" xml:space="preserve"> <data name="Envelope-Editor" xml:space="preserve">
<value>Umschlag-Editor</value> <value>Umschlag-Editor</value>
</data> </data>
<data name="Error email Validation" xml:space="preserve">
<value>Die Email-Adresse [ @Mail ] konnte nicht validiert werden!</value>
</data>
<data name="Error phone Validation" xml:space="preserve">
<value>The mobile phone number [@PhoneNr] could not be validated.
Pattern: +491234567890</value>
</data>
<data name="Error sending the envelope" xml:space="preserve"> <data name="Error sending the envelope" xml:space="preserve">
<value>Fehler beim Senden des Umschlags:</value> <value>Fehler beim Senden des Umschlags:</value>
</data> </data>
@@ -203,7 +190,7 @@ Pattern: +491234567890</value>
<value>Empfänger {0} hat keine gültige Email Addresse.</value> <value>Empfänger {0} hat keine gültige Email Addresse.</value>
</data> </data>
<data name="Invitation successfully resend" xml:space="preserve"> <data name="Invitation successfully resend" xml:space="preserve">
<value>Die Einladung an [@Mail] wurde nochmal versendet!</value> <value>Die Einladung wurde nochmal versendet!</value>
</data> </data>
<data name="Missing Documents" xml:space="preserve"> <data name="Missing Documents" xml:space="preserve">
<value>Fehlendes Dokument</value> <value>Fehlendes Dokument</value>

View File

@@ -64,15 +64,6 @@ Namespace My.Resources
End Set End Set
End Property End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Bitte wählen Sie die PDF-Dokumente die Sie verketten möchten: ähnelt.
'''</summary>
Public Shared ReadOnly Property Dialog_Concat_PDF() As String
Get
Return ResourceManager.GetString("Dialog Concat PDF", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Wollen Sie diesen Umschlag wirklich löschen? ähnelt. ''' Sucht eine lokalisierte Zeichenfolge, die Wollen Sie diesen Umschlag wirklich löschen? ähnelt.
'''</summary> '''</summary>
@@ -145,15 +136,6 @@ Namespace My.Resources
End Get End Get
End Property End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Aktuell ist per Drag and Drop nur eine PDF-Datei erlaubt. ähnelt.
'''</summary>
Public Shared ReadOnly Property Drop_only_one_file() As String
Get
Return ResourceManager.GetString("Drop only one file", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Bearbeite Umschlag ähnelt. ''' Sucht eine lokalisierte Zeichenfolge, die Bearbeite Umschlag ähnelt.
'''</summary> '''</summary>
@@ -235,25 +217,6 @@ Namespace My.Resources
End Get End Get
End Property End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Die Email-Adresse [ @Mail ] konnte nicht validiert werden! ähnelt.
'''</summary>
Public Shared ReadOnly Property Error_email_Validation() As String
Get
Return ResourceManager.GetString("Error email Validation", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die The mobile phone number [@PhoneNr] could not be validated.
'''Pattern: +491234567890 ähnelt.
'''</summary>
Public Shared ReadOnly Property Error_phone_Validation() As String
Get
Return ResourceManager.GetString("Error phone Validation", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Fehler beim Senden des Umschlags: ähnelt. ''' Sucht eine lokalisierte Zeichenfolge, die Fehler beim Senden des Umschlags: ähnelt.
'''</summary> '''</summary>
@@ -318,7 +281,7 @@ Namespace My.Resources
End Property End Property
'''<summary> '''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Die Einladung an [@Mail] wurde nochmal versendet! ähnelt. ''' Sucht eine lokalisierte Zeichenfolge, die Die Einladung wurde nochmal versendet! ähnelt.
'''</summary> '''</summary>
Public Shared ReadOnly Property Invitation_successfully_resend() As String Public Shared ReadOnly Property Invitation_successfully_resend() As String
Get Get

View File

@@ -91,15 +91,6 @@ Namespace My.Resources
End Get End Get
End Property End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Fortgeschrittene Elektronische Signatur ähnelt.
'''</summary>
Public Shared ReadOnly Property AdvancedElectronicSignature() As String
Get
Return ResourceManager.GetString("AdvancedElectronicSignature", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Abgeschlossen ähnelt. ''' Sucht eine lokalisierte Zeichenfolge, die Abgeschlossen ähnelt.
'''</summary> '''</summary>
@@ -163,6 +154,15 @@ Namespace My.Resources
End Get End Get
End Property End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Elektronische Signatur ähnelt.
'''</summary>
Public Shared ReadOnly Property ElectronicSignature() As String
Get
Return ResourceManager.GetString("ElectronicSignature", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Archiviert ähnelt. ''' Sucht eine lokalisierte Zeichenfolge, die Archiviert ähnelt.
'''</summary> '''</summary>

View File

@@ -126,9 +126,6 @@
<data name="AccessCodeRequested" xml:space="preserve"> <data name="AccessCodeRequested" xml:space="preserve">
<value>Accesscode requested</value> <value>Accesscode requested</value>
</data> </data>
<data name="AdvancedElectronicSignature" xml:space="preserve">
<value>Advanced electronic signature</value>
</data>
<data name="Completed" xml:space="preserve"> <data name="Completed" xml:space="preserve">
<value>Completed</value> <value>Completed</value>
</data> </data>
@@ -147,6 +144,9 @@
<data name="Draft" xml:space="preserve"> <data name="Draft" xml:space="preserve">
<value>Draft</value> <value>Draft</value>
</data> </data>
<data name="ElectronicSignature" xml:space="preserve">
<value>Electronic Signature</value>
</data>
<data name="EnvelopeArchived" xml:space="preserve"> <data name="EnvelopeArchived" xml:space="preserve">
<value>Archived</value> <value>Archived</value>
</data> </data>

View File

@@ -126,9 +126,6 @@
<data name="AccessCodeRequested" xml:space="preserve"> <data name="AccessCodeRequested" xml:space="preserve">
<value>Zugriffscode angefordert</value> <value>Zugriffscode angefordert</value>
</data> </data>
<data name="AdvancedElectronicSignature" xml:space="preserve">
<value>Fortgeschrittene Elektronische Signatur</value>
</data>
<data name="Completed" xml:space="preserve"> <data name="Completed" xml:space="preserve">
<value>Abgeschlossen</value> <value>Abgeschlossen</value>
</data> </data>
@@ -150,6 +147,9 @@
<data name="Draft" xml:space="preserve"> <data name="Draft" xml:space="preserve">
<value>Entwurf</value> <value>Entwurf</value>
</data> </data>
<data name="ElectronicSignature" xml:space="preserve">
<value>Elektronische Signatur</value>
</data>
<data name="EnvelopeArchived" xml:space="preserve"> <data name="EnvelopeArchived" xml:space="preserve">
<value>Archiviert</value> <value>Archiviert</value>
</data> </data>

View File

@@ -2,6 +2,9 @@
<configuration> <configuration>
<configSections> <configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="EnvelopeGenerator.Common.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections> </configSections>
<system.diagnostics> <system.diagnostics>
<sources> <sources>
@@ -26,4 +29,17 @@
</sharedListeners> </sharedListeners>
</system.diagnostics> </system.diagnostics>
<applicationSettings>
<EnvelopeGenerator.Common.My.MySettings>
<setting name="RuninDMZ" serializeAs="String">
<value>False</value>
</setting>
<setting name="NetUse_Usr" serializeAs="String">
<value>dd-gan\Administrator</value>
</setting>
<setting name="NetUse_PW" serializeAs="String">
<value>sY4vnATDXwosbTJGip6SqA==</value>
</setting>
</EnvelopeGenerator.Common.My.MySettings>
</applicationSettings>
</configuration> </configuration>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="GdPicture" version="14.2.90" targetFramework="net462" /> <package id="GdPicture" version="14.2.89" targetFramework="net462" />
<package id="GdPicture.runtimes.windows" version="14.2.90" targetFramework="net462" /> <package id="GdPicture.runtimes.windows" version="14.2.89" targetFramework="net462" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="2.1.1" targetFramework="net462" /> <package id="Microsoft.Extensions.Logging.Abstractions" version="2.1.1" targetFramework="net462" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net462" /> <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net462" />
<package id="Quartz" version="3.8.0" targetFramework="net462" /> <package id="Quartz" version="3.8.0" targetFramework="net462" />

View File

@@ -1,7 +1,6 @@
using DigitalData.Core.Abstractions; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
@@ -24,9 +23,19 @@ namespace EnvelopeGenerator.Domain.Entities
[Column("EXPORT_PATH", TypeName = "nvarchar(256)")] [Column("EXPORT_PATH", TypeName = "nvarchar(256)")]
public string? ExportPath { get; init; } public string? ExportPath { get; init; }
[Column("DOCUMENT_PATH_DMZ", TypeName = "nvarchar(512)")]
[Required]
public string? DocumentPathDmz { get; init; }
[Column("EXPORT_PATH_DMZ", TypeName = "nvarchar(512)")]
[Required]
public required string ExportPathDmz { get; init; }
[Column("DOCUMENT_PATH_MOVE_AFTSEND", TypeName = "nvarchar(512)")]
[Required]
public required string DocumentPathMoveAftsend { get; init; }
[Obsolete("Configuration does not have an ID; it represents a single table in the database.")] [Obsolete("Configuration does not have an ID; it represents a single table in the database.")]
[NotMapped]
[JsonIgnore]
public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single table in the database."); public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single table in the database.");
} }
} }

View File

@@ -84,9 +84,6 @@ namespace EnvelopeGenerator.Domain.Entities
[Column("EXPIRES_WARNING_WHEN_DAYS")] [Column("EXPIRES_WARNING_WHEN_DAYS")]
public int? ExpiresWarningWhenDays { get; set; } public int? ExpiresWarningWhenDays { get; set; }
[Column("TFA_ENABLED", TypeName = "bit")]
public bool TFAEnabled { get; set; }
/// <summary> /// <summary>
/// The sender of envelope /// The sender of envelope
/// </summary> /// </summary>

View File

@@ -16,10 +16,21 @@ namespace EnvelopeGenerator.Domain.Entities
[Column("ENVELOPE_ID")] [Column("ENVELOPE_ID")]
public int EnvelopeId { get; set; } public int EnvelopeId { get; set; }
[Required]
[Column("FILENAME", TypeName = "nvarchar(256)")]
public required string Filename { get; set; }
[Required]
[Column("FILEPATH", TypeName = "nvarchar(256)")]
public required string Filepath { get; set; }
[Required] [Required]
[Column("ADDED_WHEN", TypeName = "datetime")] [Column("ADDED_WHEN", TypeName = "datetime")]
public required DateTime AddedWhen { get; set; } public required DateTime AddedWhen { get; set; }
[Column("FILENAME_ORIGINAL", TypeName = "nvarchar(256)")]
public required string FilenameOriginal { get; set; }
[Column("BYTE_DATA", TypeName = "varbinary(max)")] [Column("BYTE_DATA", TypeName = "varbinary(max)")]
public byte[]? ByteData { get; init; } public byte[]? ByteData { get; init; }

View File

@@ -41,15 +41,6 @@ namespace EnvelopeGenerator.Domain.Entities
[Column("CHANGED_WHEN", TypeName = "datetime")] [Column("CHANGED_WHEN", TypeName = "datetime")]
public DateTime? ChangedWhen { get; set; } public DateTime? ChangedWhen { get; set; }
[Column("PHONE_NUMBER")]
[StringLength(20)]
[RegularExpression(@"^\+[0-9]+$", ErrorMessage = "Phone number must start with '+' followed by digits.")]
public string? PhoneNumber { get; set; }
[NotMapped]
public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId); public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId);
[NotMapped]
public bool HasPhoneNumber => PhoneNumber is not null;
} }
} }

View File

@@ -2,33 +2,28 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Domain.Entities
[Table("TBSIG_RECEIVER", Schema = "dbo")]
public class Receiver : IUnique<int>
{ {
[Key] [Table("TBSIG_RECEIVER", Schema = "dbo")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] public class Receiver : IUnique<int>
[Column("GUID")] {
public int Id { get; set; } [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("GUID")]
public int Id { get; set; }
[Required, EmailAddress] [Required, EmailAddress]
[Column("EMAIL_ADDRESS", TypeName = "nvarchar(128)")] [Column("EMAIL_ADDRESS", TypeName = "nvarchar(128)")]
public required string EmailAddress { get; set; } public required string EmailAddress { get; set; }
[Required] [Required]
[Column("SIGNATURE", TypeName = "nvarchar(64)")] [Column("SIGNATURE", TypeName = "nvarchar(64)")]
public required string Signature { get; set; } public required string Signature { get; set; }
[Required] [Required]
[Column("ADDED_WHEN", TypeName = "datetime")] [Column("ADDED_WHEN", TypeName = "datetime")]
public DateTime AddedWhen { get; set; } public DateTime AddedWhen { get; set; }
[Column("TOTP_SECRET_KEY", TypeName = "nvarchar(MAX)")] public IEnumerable<EnvelopeReceiver>? EnvelopeReceivers { get; init; }
public string? TotpSecretkey { get; set; } }
[Column("TFA_REG_DEADLINE", TypeName = "datetime")]
public DateTime? TfaRegDeadline { get; set; }
public IEnumerable<EnvelopeReceiver>? EnvelopeReceivers { get; init; }
} }

View File

@@ -7,7 +7,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DigitalData.Core.Abstractions" Version="2.2.1" /> <PackageReference Include="DigitalData.Core.Abstractions" Version="2.0.0" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher.Abstraction" Version="1.0.0" /> <PackageReference Include="DigitalData.EmailProfilerDispatcher.Abstraction" Version="1.0.0" />
<PackageReference Include="UserManager.Domain" Version="1.0.0" /> <PackageReference Include="UserManager.Domain" Version="1.0.0" />
</ItemGroup> </ItemGroup>

View File

@@ -10,7 +10,6 @@
<PackageReference Include="HtmlSanitizer" Version="8.0.865" /> <PackageReference Include="HtmlSanitizer" Version="8.0.865" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="7.0.19" /> <PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="7.0.19" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Otp.NET" Version="1.4.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,14 +0,0 @@
using OtpNet;
namespace EnvelopeGenerator.Extensions
{
public static class StringExtension
{
public static bool IsValidTotp(this string totp, string secret)
{
var secret_bytes = Base32Encoding.ToBytes(secret);
var secret_totp = new Totp(secret_bytes);
return secret_totp.VerifyTotp(totp, out _, VerificationWindow.RfcSpecifiedNetworkDelay);
}
}
}

View File

@@ -65,8 +65,7 @@ Public Class EnvelopeEditorController
Public Function CreateEnvelope() As Envelope Public Function CreateEnvelope() As Envelope
Dim oEnvelope As New Envelope() With { Dim oEnvelope As New Envelope() With {
.UserId = State.UserId, .UserId = State.UserId,
.User = UserModel.SelectUser(), .User = UserModel.SelectUser()
.TFA_Enabled = DEF_TF_ENABLED
} }
If EnvelopeModel.Insert(oEnvelope) Then If EnvelopeModel.Insert(oEnvelope) Then
@@ -88,13 +87,11 @@ Public Class EnvelopeEditorController
Public Function SaveReceivers(pEnvelope As Envelope, pReceiversFromGrid As List(Of EnvelopeReceiver)) As Boolean Public Function SaveReceivers(pEnvelope As Envelope, pReceiversFromGrid As List(Of EnvelopeReceiver)) As Boolean
Dim oExistingReceivers As List(Of EnvelopeReceiver) = ReceiverModel.ListReceivers(pReceiversFromGrid).ToList() Dim oExistingReceivers As List(Of EnvelopeReceiver) = ReceiverModel.ListReceivers(pReceiversFromGrid).ToList()
Dim oExistingAddresses = oExistingReceivers.Select(Function(r) r.Email) Dim oExistingAddresses = oExistingReceivers.Select(Function(r) r.Email)
Logger.Debug($"oExistingReceivers.count: {oExistingReceivers.Count}")
Logger.Debug($"oExistingAddresses.count: {oExistingAddresses.Count}")
Dim oNewReceivers = pReceiversFromGrid.Where(Function(r) Dim oNewReceivers = pReceiversFromGrid.Where(Function(r)
If r.Email Is Nothing Then Return False If r.Email Is Nothing Then Return False
Return Not oExistingAddresses.Contains(r.Email) Return Not oExistingAddresses.Contains(r.Email)
End Function).ToList() End Function).ToList()
Logger.Debug($"oNewReceivers.count: {oNewReceivers.Count}")
If CreateNewReceivers(oNewReceivers) = False Then If CreateNewReceivers(oNewReceivers) = False Then
Return False Return False
End If End If
@@ -409,11 +406,4 @@ Public Class EnvelopeEditorController
Return String.Empty Return String.Empty
End If End If
End Function End Function
Public Function GetLastPhoneByEmailAdress(pEmailAdress As String) As String
If (String.IsNullOrEmpty(pEmailAdress) = False) Then
Return ReceiverModel.GetLastUsedReceiverPhone(pEmailAdress, Envelope.UserId)
Else
Return String.Empty
End If
End Function
End Class End Class

View File

@@ -76,10 +76,10 @@
<HintPath>..\..\2_DLL Projekte\DDMonorepo\Controls.DocumentViewer\bin\Debug\DigitalData.Controls.DocumentViewer.dll</HintPath> <HintPath>..\..\2_DLL Projekte\DDMonorepo\Controls.DocumentViewer\bin\Debug\DigitalData.Controls.DocumentViewer.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.GUIs.Common"> <Reference Include="DigitalData.GUIs.Common">
<HintPath>..\..\2_DLL Projekte\DDMonorepo\GUIs.Common\bin\Debug\DigitalData.GUIs.Common.dll</HintPath> <HintPath>..\..\DDMonorepo\GUIs.Common\bin\Debug\DigitalData.GUIs.Common.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.Modules.Base"> <Reference Include="DigitalData.Modules.Base">
<HintPath>..\..\2_DLL Projekte\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath> <HintPath>..\..\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.Modules.Config, Version=1.2.2.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="DigitalData.Modules.Config, Version=1.2.2.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
@@ -107,7 +107,6 @@
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath> <HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data.Linq" /> <Reference Include="System.Data.Linq" />
@@ -205,7 +204,6 @@
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="frmEnvelopeMainData.resx"> <EmbeddedResource Include="frmEnvelopeMainData.resx">
<DependentUpon>frmEnvelopeMainData.vb</DependentUpon> <DependentUpon>frmEnvelopeMainData.vb</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="frmFieldEditor.en.resx"> <EmbeddedResource Include="frmFieldEditor.en.resx">
<DependentUpon>frmFieldEditor.vb</DependentUpon> <DependentUpon>frmFieldEditor.vb</DependentUpon>

View File

@@ -1,19 +1,10 @@
Imports DigitalData.Modules.Database Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Logging
Imports EnvelopeGenerator.Common
Module ModuleSettings Module ModuleSettings
Public ENVELOPE_TEMP_DOCUMENT As String = "" Public DOCUMENT_PATH_MOVE_AFTSEND As String = ""
Public CurrLogConfig As LogConfig Public CurrLogConfig As LogConfig
Public Directory2Delete As String = "" Public Directory2Delete As String = ""
Public MS_GDPICTUREKEY As String = "" Public MS_GDPICTUREKEY As String = ""
Public DB_DD_ECM As MSSQLServer = Nothing Public DB_DD_ECM As MSSQLServer = Nothing
Public DEF_TF_ENABLED As Boolean = False
Public MYUSER As User
Public MyTempFiles As TempFiles
Public SQL_REP_ENV_USER_LM As String = ""
Public SQL_REP_ENV_USER_TM As String = ""
Public SQL_REP_ENV_USER_Y As String = ""
Public SQL_REP_ENV_USER_ALL As String = ""
Public DT_CHARTS As DataTable
End Module End Module

View File

@@ -11,7 +11,7 @@ Imports System.Runtime.InteropServices
<Assembly: AssemblyCompany("Digital Data")> <Assembly: AssemblyCompany("Digital Data")>
<Assembly: AssemblyProduct("Envelope Generator")> <Assembly: AssemblyProduct("Envelope Generator")>
<Assembly: AssemblyCopyright("Copyright © 2024")> <Assembly: AssemblyCopyright("Copyright © 2024")>
<Assembly: AssemblyTrademark("2.8.0.0")> <Assembly: AssemblyTrademark("2.4.5.0")>
<Assembly: AssemblyCulture("")> <Assembly: AssemblyCulture("")>
' Setting ComVisible to false makes the types in this assembly not visible ' Setting ComVisible to false makes the types in this assembly not visible
@@ -32,5 +32,5 @@ Imports System.Runtime.InteropServices
' You can specify all the values or you can default the Build and Revision Numbers ' You can specify all the values or you can default the Build and Revision Numbers
' by using the '*' as shown below: ' by using the '*' as shown below:
' [assembly: AssemblyVersion("1.0.*")] ' [assembly: AssemblyVersion("1.0.*")]
<Assembly: AssemblyVersion("2.8.0.0")> <Assembly: AssemblyVersion("2.7.0.0")>
<Assembly: AssemblyFileVersion("1.0.0.0")> <Assembly: AssemblyFileVersion("1.0.0.0")>

View File

@@ -56,10 +56,8 @@ Partial Public Class frmEnvelopeEditor
Me.txtCreatorEmailLabel = New DevExpress.XtraBars.BarStaticItem() Me.txtCreatorEmailLabel = New DevExpress.XtraBars.BarStaticItem()
Me.txtEnvelopeIdLabel2 = New DevExpress.XtraBars.BarStaticItem() Me.txtEnvelopeIdLabel2 = New DevExpress.XtraBars.BarStaticItem()
Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem()
Me.bsitm_info = New DevExpress.XtraBars.BarStaticItem() Me.BarStaticItem1 = New DevExpress.XtraBars.BarStaticItem()
Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem()
Me.BarButtonItem3 = New DevExpress.XtraBars.BarButtonItem()
Me.bbtnitm_ConcatFiles = New DevExpress.XtraBars.BarButtonItem()
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonPageGroupDocuments = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroupDocuments = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
@@ -82,7 +80,6 @@ Partial Public Class frmEnvelopeEditor
Me.RepositoryItemComboBox1 = New DevExpress.XtraEditors.Repository.RepositoryItemComboBox() Me.RepositoryItemComboBox1 = New DevExpress.XtraEditors.Repository.RepositoryItemComboBox()
Me.colName = New DevExpress.XtraGrid.Columns.GridColumn() Me.colName = New DevExpress.XtraGrid.Columns.GridColumn()
Me.colAccessCode = New DevExpress.XtraGrid.Columns.GridColumn() Me.colAccessCode = New DevExpress.XtraGrid.Columns.GridColumn()
Me.colPhoneNumber = New DevExpress.XtraGrid.Columns.GridColumn()
Me.RepositoryItemEmailEdit = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit() Me.RepositoryItemEmailEdit = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit()
Me.RepositoryItemPictureEdit1 = New DevExpress.XtraEditors.Repository.RepositoryItemPictureEdit() Me.RepositoryItemPictureEdit1 = New DevExpress.XtraEditors.Repository.RepositoryItemPictureEdit()
Me.RepositoryItemColorPickEdit1 = New DevExpress.XtraEditors.Repository.RepositoryItemColorPickEdit() Me.RepositoryItemColorPickEdit1 = New DevExpress.XtraEditors.Repository.RepositoryItemColorPickEdit()
@@ -101,7 +98,6 @@ Partial Public Class frmEnvelopeEditor
Me.EnvelopeDocumentBindingSource = New System.Windows.Forms.BindingSource(Me.components) Me.EnvelopeDocumentBindingSource = New System.Windows.Forms.BindingSource(Me.components)
Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog() Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog()
Me.txtEnvelopeIdLabel = New DevExpress.XtraBars.BarStaticItem() Me.txtEnvelopeIdLabel = New DevExpress.XtraBars.BarStaticItem()
Me.btnShowFile = New DevExpress.XtraBars.BarButtonItem()
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainerControl1.Panel1.SuspendLayout() Me.SplitContainerControl1.Panel1.SuspendLayout()
@@ -244,9 +240,9 @@ Partial Public Class frmEnvelopeEditor
'RibbonControl1 'RibbonControl1
' '
Me.RibbonControl1.ExpandCollapseItem.Id = 0 Me.RibbonControl1.ExpandCollapseItem.Id = 0
Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.btnSave, Me.btnCancel, Me.btnNewFile, Me.btnDeleteFile, Me.btnSendEnvelope, Me.btnEditFields, Me.btnDeleteReceiver, Me.btnEditData, Me.txtCreatorEmailLabel, Me.txtEnvelopeIdLabel2, Me.BarButtonItem1, Me.bsitm_info, Me.BarButtonItem2, Me.BarButtonItem3, Me.bbtnitm_ConcatFiles, Me.btnShowFile}) Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.btnSave, Me.btnCancel, Me.btnNewFile, Me.btnDeleteFile, Me.btnSendEnvelope, Me.btnEditFields, Me.btnDeleteReceiver, Me.btnEditData, Me.txtCreatorEmailLabel, Me.txtEnvelopeIdLabel2, Me.BarButtonItem1, Me.BarStaticItem1, Me.BarButtonItem2})
resources.ApplyResources(Me.RibbonControl1, "RibbonControl1") resources.ApplyResources(Me.RibbonControl1, "RibbonControl1")
Me.RibbonControl1.MaxItemId = 18 Me.RibbonControl1.MaxItemId = 15
Me.RibbonControl1.Name = "RibbonControl1" Me.RibbonControl1.Name = "RibbonControl1"
Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1}) Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1})
Me.RibbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False] Me.RibbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False]
@@ -335,10 +331,10 @@ Partial Public Class frmEnvelopeEditor
Me.BarButtonItem1.Id = 12 Me.BarButtonItem1.Id = 12
Me.BarButtonItem1.Name = "BarButtonItem1" Me.BarButtonItem1.Name = "BarButtonItem1"
' '
'bsitm_info 'BarStaticItem1
' '
Me.bsitm_info.Id = 13 Me.BarStaticItem1.Id = 13
Me.bsitm_info.Name = "bsitm_info" Me.BarStaticItem1.Name = "BarStaticItem1"
' '
'BarButtonItem2 'BarButtonItem2
' '
@@ -346,19 +342,6 @@ Partial Public Class frmEnvelopeEditor
Me.BarButtonItem2.Id = 14 Me.BarButtonItem2.Id = 14
Me.BarButtonItem2.Name = "BarButtonItem2" Me.BarButtonItem2.Name = "BarButtonItem2"
' '
'BarButtonItem3
'
resources.ApplyResources(Me.BarButtonItem3, "BarButtonItem3")
Me.BarButtonItem3.Id = 15
Me.BarButtonItem3.Name = "BarButtonItem3"
'
'bbtnitm_ConcatFiles
'
resources.ApplyResources(Me.bbtnitm_ConcatFiles, "bbtnitm_ConcatFiles")
Me.bbtnitm_ConcatFiles.Id = 16
Me.bbtnitm_ConcatFiles.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitm_ConcatFiles.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.bbtnitm_ConcatFiles.Name = "bbtnitm_ConcatFiles"
'
'RibbonPage1 'RibbonPage1
' '
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroupDocuments, Me.RibbonPageGroupInvitation, Me.RibbonPageGroupAddSignature, Me.RibbonPageGroupReceiver}) Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroupDocuments, Me.RibbonPageGroupInvitation, Me.RibbonPageGroupAddSignature, Me.RibbonPageGroupReceiver})
@@ -376,9 +359,7 @@ Partial Public Class frmEnvelopeEditor
'RibbonPageGroupDocuments 'RibbonPageGroupDocuments
' '
Me.RibbonPageGroupDocuments.ItemLinks.Add(Me.btnNewFile) Me.RibbonPageGroupDocuments.ItemLinks.Add(Me.btnNewFile)
Me.RibbonPageGroupDocuments.ItemLinks.Add(Me.bbtnitm_ConcatFiles)
Me.RibbonPageGroupDocuments.ItemLinks.Add(Me.btnDeleteFile) Me.RibbonPageGroupDocuments.ItemLinks.Add(Me.btnDeleteFile)
Me.RibbonPageGroupDocuments.ItemLinks.Add(Me.btnShowFile)
Me.RibbonPageGroupDocuments.Name = "RibbonPageGroupDocuments" Me.RibbonPageGroupDocuments.Name = "RibbonPageGroupDocuments"
resources.ApplyResources(Me.RibbonPageGroupDocuments, "RibbonPageGroupDocuments") resources.ApplyResources(Me.RibbonPageGroupDocuments, "RibbonPageGroupDocuments")
' '
@@ -405,7 +386,7 @@ Partial Public Class frmEnvelopeEditor
' '
Me.RibbonStatusBar1.ItemLinks.Add(Me.txtCreatorEmailLabel) Me.RibbonStatusBar1.ItemLinks.Add(Me.txtCreatorEmailLabel)
Me.RibbonStatusBar1.ItemLinks.Add(Me.txtEnvelopeIdLabel2) Me.RibbonStatusBar1.ItemLinks.Add(Me.txtEnvelopeIdLabel2)
Me.RibbonStatusBar1.ItemLinks.Add(Me.bsitm_info) Me.RibbonStatusBar1.ItemLinks.Add(Me.BarStaticItem1)
resources.ApplyResources(Me.RibbonStatusBar1, "RibbonStatusBar1") resources.ApplyResources(Me.RibbonStatusBar1, "RibbonStatusBar1")
Me.RibbonStatusBar1.Name = "RibbonStatusBar1" Me.RibbonStatusBar1.Name = "RibbonStatusBar1"
Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1
@@ -485,7 +466,7 @@ Partial Public Class frmEnvelopeEditor
'ViewReceivers 'ViewReceivers
' '
Me.ViewReceivers.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Simple Me.ViewReceivers.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Simple
Me.ViewReceivers.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.colColor, Me.colEmail, Me.colName, Me.colAccessCode, Me.colPhoneNumber}) Me.ViewReceivers.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.colColor, Me.colEmail, Me.colName, Me.colAccessCode})
Me.ViewReceivers.GridControl = Me.GridReceivers Me.ViewReceivers.GridControl = Me.GridReceivers
Me.ViewReceivers.Name = "ViewReceivers" Me.ViewReceivers.Name = "ViewReceivers"
Me.ViewReceivers.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.[True] Me.ViewReceivers.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.[True]
@@ -545,12 +526,6 @@ Partial Public Class frmEnvelopeEditor
Me.colAccessCode.OptionsColumn.AllowEdit = False Me.colAccessCode.OptionsColumn.AllowEdit = False
Me.colAccessCode.OptionsColumn.ReadOnly = True Me.colAccessCode.OptionsColumn.ReadOnly = True
' '
'colPhoneNumber
'
resources.ApplyResources(Me.colPhoneNumber, "colPhoneNumber")
Me.colPhoneNumber.FieldName = "PhoneNumber"
Me.colPhoneNumber.Name = "colPhoneNumber"
'
'RepositoryItemEmailEdit 'RepositoryItemEmailEdit
' '
resources.ApplyResources(Me.RepositoryItemEmailEdit, "RepositoryItemEmailEdit") resources.ApplyResources(Me.RepositoryItemEmailEdit, "RepositoryItemEmailEdit")
@@ -684,16 +659,8 @@ Partial Public Class frmEnvelopeEditor
Me.txtEnvelopeIdLabel.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph Me.txtEnvelopeIdLabel.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph
Me.txtEnvelopeIdLabel.Tag = "Envelope-ID: {0}" Me.txtEnvelopeIdLabel.Tag = "Envelope-ID: {0}"
' '
'btnShowFile
'
resources.ApplyResources(Me.btnShowFile, "btnShowFile")
Me.btnShowFile.Id = 17
Me.btnShowFile.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem4.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.btnShowFile.Name = "btnShowFile"
'
'frmEnvelopeEditor 'frmEnvelopeEditor
' '
Me.AllowDrop = True
resources.ApplyResources(Me, "$this") resources.ApplyResources(Me, "$this")
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.SplitContainerControl1) Me.Controls.Add(Me.SplitContainerControl1)
@@ -814,12 +781,8 @@ Partial Public Class frmEnvelopeEditor
Friend WithEvents txtEnvelopeIdLabel2 As DevExpress.XtraBars.BarStaticItem Friend WithEvents txtEnvelopeIdLabel2 As DevExpress.XtraBars.BarStaticItem
Friend WithEvents colPageCount As DevExpress.XtraGrid.Columns.TileViewColumn Friend WithEvents colPageCount As DevExpress.XtraGrid.Columns.TileViewColumn
Friend WithEvents BarButtonItem1 As DevExpress.XtraBars.BarButtonItem Friend WithEvents BarButtonItem1 As DevExpress.XtraBars.BarButtonItem
Friend WithEvents bsitm_info As DevExpress.XtraBars.BarStaticItem Friend WithEvents BarStaticItem1 As DevExpress.XtraBars.BarStaticItem
Friend WithEvents BarButtonItem2 As DevExpress.XtraBars.BarButtonItem Friend WithEvents BarButtonItem2 As DevExpress.XtraBars.BarButtonItem
Friend WithEvents BarButtonItem3 As DevExpress.XtraBars.BarButtonItem
Friend WithEvents bbtnitm_ConcatFiles As DevExpress.XtraBars.BarButtonItem
Friend WithEvents colPhoneNumber As DevExpress.XtraGrid.Columns.GridColumn
Friend WithEvents btnShowFile As DevExpress.XtraBars.BarButtonItem
#End Region #End Region

View File

@@ -213,7 +213,7 @@
</value> </value>
</data> </data>
<data name="btnNewFile.Caption" xml:space="preserve"> <data name="btnNewFile.Caption" xml:space="preserve">
<value>Ein PDF-Dokument hinzufügen</value> <value>Neues Dokument</value>
</data> </data>
<data name="btnNewFile.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="btnNewFile.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
@@ -322,30 +322,35 @@
</value> </value>
</data> </data>
<data name="btnEditData.Caption" xml:space="preserve"> <data name="btnEditData.Caption" xml:space="preserve">
<value>Eigenschaften</value> <value>Titel und Typ</value>
</data> </data>
<data name="btnEditData.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="btnEditData.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAOYDAAAC77u/ dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABwFAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iRG9jdW1lbnRfUHJvcGVydGllcyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3Jv Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
dW5kOm5ldyAwIDAgMzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6 MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQo8L3N0eWxlPg0KICA8cGF0aCBkPSJNMzAsMjV2 LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3
LTJsLTIuMi0wLjRjLTAuMi0wLjYtMC40LTEuMy0wLjctMS44bDEuMy0xLjhsLTEuNC0xLjRsLTEuOCwx RDc7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7b3Bh
LjNjLTAuNS0wLjMtMS4yLTAuNi0xLjgtMC43TDIzLDE2aC0yICBsLTAuNCwyLjJjLTAuNiwwLjItMS4z Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tm
LDAuNC0xLjgsMC43bC0xLjgtMS4zbC0xLjQsMS40bDEuMywxLjhjLTAuMywwLjUtMC42LDEuMi0wLjcs aWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8ZyAvPg0KICA8ZyBpZD0iUmVuYW1lXzFfIj4NCiAgICA8
MS44TDE0LDIzdjJsMi4yLDAuNGMwLjIsMC42LDAuNCwxLjMsMC43LDEuOCAgbC0xLjMsMS44bDEuNCwx cGF0aCBkPSJNMi4xLDE2aDIuMmwwLjYtMi4zaDMuMkw4LjgsMTZIMTFMNy44LDZINS40TDIuMSwxNnog
LjRsMS44LTEuM2MwLjUsMC4zLDEuMiwwLjYsMS44LDAuN0wyMSwzMmgybDAuNC0yLjJjMC42LTAuMiwx TTYuNCw4LjdjMC4xLTAuMywwLjEtMC42LDAuMS0wLjloMC4xICAgYzAsMC4zLDAuMSwwLjYsMC4xLDAu
LjMtMC40LDEuOC0wLjdsMS44LDEuM2wxLjQtMS40bC0xLjMtMS44ICBjMC4zLTAuNSwwLjYtMS4yLDAu OWwxLDMuM0g1LjRMNi40LDguN3ogTTE3LjUsMTAuNmMwLjYtMC4yLDEuMS0wLjUsMS41LTAuOWMwLjQt
Ny0xLjhMMzAsMjV6IE0yMiwyNmMtMS4xLDAtMi0wLjktMi0yczAuOS0yLDItMnMyLDAuOSwyLDJTMjMu MC40LDAuNi0wLjksMC42LTEuNGMwLTAuNy0wLjMtMS4zLTAuOS0xLjcgICBDMTguMSw2LjIsMTcuMSw2
MSwyNiwyMiwyNnoiIGNsYXNzPSJCbHVlIiAvPg0KICA8cGF0aCBkPSJNMTQuMywyNkg2VjRoNmg2djVj LDE1LjksNkgxMnY5LjlWMTZoNGMxLjIsMCwyLjItMC4yLDIuOS0wLjhDMTkuNywxNC42LDIwLDE0LDIw
MCwwLjYsMC40LDEsMSwxaDV2NS45bDAsMC40YzAuNywwLjIsMS40LDAuNSwyLDAuOFY5bC03LTdINUM0 LDEzYzAtMC42LTAuMi0xLjItMC43LTEuNiAgIEMxOC45LDExLDE4LjMsMTAuNywxNy41LDEwLjZ6IE0x
LjQsMiw0LDIuNCw0LDN2MjQgIGMwLDAuNiwwLjQsMSwxLDFoMTAuMUMxNC43LDI3LjQsMTQuNCwyNi43 NC40LDcuN2gwLjljMS4xLDAsMS43LDAuNCwxLjcsMS4xYzAsMC40LTAuMSwwLjctMC40LDAuOUMxNi40
LDE0LjMsMjZ6IiBjbGFzcz0iQmxhY2siIC8+DQo8L3N2Zz4L LDkuOSwxNiwxMCwxNS41LDEwaC0xLjFWNy43eiAgICBNMTcsMTMuOGMtMC4zLDAuMi0wLjgsMC40LTEu
MywwLjRoLTEuM3YtMi42aDEuM2MwLjUsMCwwLjksMC4xLDEuMywwLjNjMC4zLDAuMiwwLjUsMC42LDAu
NSwwLjlDMTcuNSwxMy4zLDE3LjQsMTMuNiwxNywxMy44eiIgY2xhc3M9IkJsYWNrIiAvPg0KICAgIDxw
YXRoIGQ9Ik0yNywxOWwtOCw4bC00LTRsOC04TDI3LDE5eiBNMjgsMThsMS43LTEuN2MwLjQtMC40LDAu
NC0xLDAtMS4zTDI3LDEyLjNjLTAuNC0wLjQtMS0wLjQtMS4zLDBMMjQsMTRMMjgsMTh6ICAgIE0xNCwy
NHY0aDRMMTQsMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
</value> </value>
</data> </data>
<data name="txtCreatorEmailLabel.Caption" xml:space="preserve"> <data name="txtCreatorEmailLabel.Caption" xml:space="preserve">
@@ -409,60 +414,6 @@
<data name="BarButtonItem2.Caption" xml:space="preserve"> <data name="BarButtonItem2.Caption" xml:space="preserve">
<value>Öffnen</value> <value>Öffnen</value>
</data> </data>
<data name="BarButtonItem3.Caption" xml:space="preserve">
<value>BarButtonItem3</value>
</data>
<data name="bbtnitm_ConcatFiles.Caption" xml:space="preserve">
<value>Mehrere PDF-Dokumente verketten</value>
</data>
<data name="bbtnitm_ConcatFiles.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAHECAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTXVsdGlwbGVfRG9jdW1lbnRzIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91
bmQ6bmV3IDAgMCAzMiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuQmxhY2t7ZmlsbDoj
NzI3MjcyO30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTMxLDhoLTVWNWMwLTAuNS0wLjUtMS0xLTFoLTVW
MWMwLTAuNS0wLjUtMS0xLTFIMUMwLjUsMCwwLDAuNSwwLDF2MjJjMCwwLjUsMC41LDEsMSwxaDV2M2Mw
LDAuNSwwLjUsMSwxLDEgIGg1djNjMCwwLjUsMC41LDEsMSwxaDE4YzAuNSwwLDEtMC41LDEtMVY5QzMy
LDguNSwzMS41LDgsMzEsOHogTTYsNXYxN0gyVjJoMTZ2Mkg3QzYuNSw0LDYsNC41LDYsNXogTTEyLDl2
MTdIOFY2aDE2djJIMTMgIEMxMi41LDgsMTIsOC41LDEyLDl6IE0zMCwzMEgxNFYxMGgxNlYzMHoiIGNs
YXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
</value>
</data>
<data name="btnShowFile.Caption" xml:space="preserve">
<value>Dokument anzeigen</value>
</data>
<data name="BarButtonItem4.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJYEAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD
MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkRvY3VtZW50UERGIj4NCiAgICA8cGF0aCBkPSJN
MjIsMjR2NEgyVjJoMTR2NWMwLDAuNiwwLjQsMSwxLDFoNXY0aDJWN2wtNy03SDFDMC40LDAsMCwwLjQs
MCwxdjI4YzAsMC42LDAuNCwxLDEsMWgyMmMwLjYsMCwxLTAuNCwxLTEgICB2LTVIMjJ6IiBjbGFzcz0i
QmxhY2siIC8+DQogICAgPHBhdGggZD0iTTE5LjIsMTZjMC4zLDAuNSwwLjQsMS4xLDAuNCwxLjljMCww
LjktMC4yLDEuNS0wLjUsMmMtMC4zLDAuNS0wLjcsMC43LTEuMywwLjdoLTAuNnYtNS4zaDAuNiAgIEMx
OC40LDE1LjMsMTguOSwxNS42LDE5LjIsMTZ6IE0xMi4xLDE1LjNoLTAuNXYyLjZoMC41YzAuNywwLDEu
MS0wLjQsMS4xLTEuM2MwLTAuNC0wLjEtMC44LTAuMy0xQzEyLjYsMTUuNCwxMi40LDE1LjMsMTIuMSwx
NS4zeiAgICBNMzAsMTJ2MTJINlYxMkgzMHogTTE0LjgsMTYuNWMwLTAuOC0wLjItMS41LTAuNi0xLjlj
LTAuNC0wLjQtMS0wLjctMS44LTAuN0gxMHY4aDEuNnYtMi43aDAuNmMwLjgsMCwxLjQtMC4zLDEuOS0w
LjggICBDMTQuNSwxOCwxNC44LDE3LjMsMTQuOCwxNi41eiBNMjEuMiwxNy45YzAtMi42LTEuMS0zLjkt
My40LTMuOWgtMi4xdjhoMi4yYzEuMSwwLDEuOS0wLjQsMi41LTEuMUMyMC45LDIwLjIsMjEuMiwxOS4y
LDIxLjIsMTcuOXogICAgTTI2LDE0aC0zLjd2OGgxLjZ2LTMuMWgydi0xLjNoLTJ2LTIuMkgyNlYxNHoi
IGNsYXNzPSJSZWQiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
</value>
</data>
<data name="RibbonControl1.Location" type="System.Drawing.Point, System.Drawing"> <data name="RibbonControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value> <value>0, 0</value>
</data> </data>
@@ -470,7 +421,7 @@
<value>Umschlag</value> <value>Umschlag</value>
</data> </data>
<data name="RibbonPageGroupDocuments.Text" xml:space="preserve"> <data name="RibbonPageGroupDocuments.Text" xml:space="preserve">
<value>Dokument-Funktionen</value> <value>Dateien</value>
</data> </data>
<data name="RibbonPageGroupInvitation.Text" xml:space="preserve"> <data name="RibbonPageGroupInvitation.Text" xml:space="preserve">
<value>Prozess</value> <value>Prozess</value>
@@ -627,7 +578,7 @@
<value>0</value> <value>0</value>
</data> </data>
<data name="colColor.Width" type="System.Int32, mscorlib"> <data name="colColor.Width" type="System.Int32, mscorlib">
<value>32</value> <value>37</value>
</data> </data>
<data name="RepositoryItemComboBox1.AutoHeight" type="System.Boolean, mscorlib"> <data name="RepositoryItemComboBox1.AutoHeight" type="System.Boolean, mscorlib">
<value>False</value> <value>False</value>
@@ -642,7 +593,7 @@
<value>1</value> <value>1</value>
</data> </data>
<data name="colEmail.Width" type="System.Int32, mscorlib"> <data name="colEmail.Width" type="System.Int32, mscorlib">
<value>275</value> <value>341</value>
</data> </data>
<data name="colName.Caption" xml:space="preserve"> <data name="colName.Caption" xml:space="preserve">
<value>Anrede Email</value> <value>Anrede Email</value>
@@ -654,7 +605,7 @@
<value>2</value> <value>2</value>
</data> </data>
<data name="colName.Width" type="System.Int32, mscorlib"> <data name="colName.Width" type="System.Int32, mscorlib">
<value>227</value> <value>344</value>
</data> </data>
<data name="colAccessCode.Caption" xml:space="preserve"> <data name="colAccessCode.Caption" xml:space="preserve">
<value>Zugriffscode</value> <value>Zugriffscode</value>
@@ -666,19 +617,7 @@
<value>3</value> <value>3</value>
</data> </data>
<data name="colAccessCode.Width" type="System.Int32, mscorlib"> <data name="colAccessCode.Width" type="System.Int32, mscorlib">
<value>109</value> <value>147</value>
</data>
<data name="colPhoneNumber.Caption" xml:space="preserve">
<value>Mobilnummer</value>
</data>
<data name="colPhoneNumber.Visible" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="colPhoneNumber.VisibleIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="colPhoneNumber.Width" type="System.Int32, mscorlib">
<value>226</value>
</data> </data>
<data name="RepositoryItemEmailEdit.AutoHeight" type="System.Boolean, mscorlib"> <data name="RepositoryItemEmailEdit.AutoHeight" type="System.Boolean, mscorlib">
<value>False</value> <value>False</value>
@@ -1107,10 +1046,10 @@
<data name="&gt;&gt;BarButtonItem1.Type" xml:space="preserve"> <data name="&gt;&gt;BarButtonItem1.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;bsitm_info.Name" xml:space="preserve"> <data name="&gt;&gt;BarStaticItem1.Name" xml:space="preserve">
<value>bsitm_info</value> <value>BarStaticItem1</value>
</data> </data>
<data name="&gt;&gt;bsitm_info.Type" xml:space="preserve"> <data name="&gt;&gt;BarStaticItem1.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarStaticItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraBars.BarStaticItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;BarButtonItem2.Name" xml:space="preserve"> <data name="&gt;&gt;BarButtonItem2.Name" xml:space="preserve">
@@ -1119,18 +1058,6 @@
<data name="&gt;&gt;BarButtonItem2.Type" xml:space="preserve"> <data name="&gt;&gt;BarButtonItem2.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;BarButtonItem3.Name" xml:space="preserve">
<value>BarButtonItem3</value>
</data>
<data name="&gt;&gt;BarButtonItem3.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;bbtnitm_ConcatFiles.Name" xml:space="preserve">
<value>bbtnitm_ConcatFiles</value>
</data>
<data name="&gt;&gt;bbtnitm_ConcatFiles.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;RibbonPage1.Name" xml:space="preserve"> <data name="&gt;&gt;RibbonPage1.Name" xml:space="preserve">
<value>RibbonPage1</value> <value>RibbonPage1</value>
</data> </data>
@@ -1233,12 +1160,6 @@
<data name="&gt;&gt;colAccessCode.Type" xml:space="preserve"> <data name="&gt;&gt;colAccessCode.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;colPhoneNumber.Name" xml:space="preserve">
<value>colPhoneNumber</value>
</data>
<data name="&gt;&gt;colPhoneNumber.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;RepositoryItemEmailEdit.Name" xml:space="preserve"> <data name="&gt;&gt;RepositoryItemEmailEdit.Name" xml:space="preserve">
<value>RepositoryItemEmailEdit</value> <value>RepositoryItemEmailEdit</value>
</data> </data>
@@ -1329,12 +1250,6 @@
<data name="&gt;&gt;txtEnvelopeIdLabel.Type" xml:space="preserve"> <data name="&gt;&gt;txtEnvelopeIdLabel.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarStaticItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraBars.BarStaticItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;btnShowFile.Name" xml:space="preserve">
<value>btnShowFile</value>
</data>
<data name="&gt;&gt;btnShowFile.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve"> <data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>frmEnvelopeEditor</value> <value>frmEnvelopeEditor</value>
</data> </data>

View File

@@ -1,16 +1,12 @@
Imports System.ComponentModel Imports System.ComponentModel
Imports System.Data.SqlClient Imports System.Data.SqlClient
Imports System.IO Imports System.IO
Imports System.Text.RegularExpressions
Imports DevExpress.Export.Xl Imports DevExpress.Export.Xl
Imports DevExpress.Utils.CommonDialogs Imports DevExpress.Utils.CommonDialogs
Imports DevExpress.Utils.Drawing Imports DevExpress.Utils.Drawing
Imports DevExpress.Utils.Svg.CommonSvgImages
Imports DevExpress.XtraEditors Imports DevExpress.XtraEditors
Imports DevExpress.XtraExport.Helpers Imports DevExpress.XtraExport.Helpers
Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Columns
Imports DevExpress.XtraGrid.Views.Base
Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraSplashScreen Imports DevExpress.XtraSplashScreen
Imports DigitalData.Modules.Base Imports DigitalData.Modules.Base
@@ -18,7 +14,6 @@ Imports DigitalData.Modules.Logging
Imports EnvelopeGenerator.Common Imports EnvelopeGenerator.Common
Imports EnvelopeGenerator.Common.Constants Imports EnvelopeGenerator.Common.Constants
Imports EnvelopeGenerator.Common.My Imports EnvelopeGenerator.Common.My
Imports GdPicture14
Partial Public Class frmEnvelopeEditor Partial Public Class frmEnvelopeEditor
Public Property Envelope As Envelope Public Property Envelope As Envelope
@@ -33,9 +28,8 @@ Partial Public Class frmEnvelopeEditor
Private Const COL_NAME = "Name" Private Const COL_NAME = "Name"
Private Const COL_EMAIL = "Email" Private Const COL_EMAIL = "Email"
Private Const COL_CODE = "AccessCode" Private Const COL_CODE = "AccessCode"
Private Const COL_PHONE = "PhoneNumber"
Public Property State As State Public Property State As State
Private TempFiles As TempFiles
Public Sub New() Public Sub New()
InitializeComponent() InitializeComponent()
@@ -46,53 +40,42 @@ Partial Public Class frmEnvelopeEditor
'SaveEnvelopeWithValidation() 'SaveEnvelopeWithValidation()
' If Not IsNothing(Envelope) Then ' If Not IsNothing(Envelope) Then
Try Try
' prüfen ob es schon eine Datei gibt ' prüfen ob es schon eine Datei gibt
If Documents.Count > 0 Then If Documents.Count > 0 Then
MsgBox(Resources.Envelope.Only_one_file_is_allowed, MsgBoxStyle.Information, Text) MsgBox(Resources.Envelope.Only_one_file_is_allowed, MsgBoxStyle.Information, Text)
Return Return
End If End If
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
Await AddDocument(OpenFileDialog1.FileName) Dim oDocument = Await Controller.CreateDocument(OpenFileDialog1.FileName)
End If
Catch ex As Exception If oDocument IsNot Nothing Then
Logger.Error(ex) Documents.Add(oDocument)
Finally ' Update_File_DB(OpenFileDialog1.FileName)
SplashScreenManager.CloseOverlayForm(oHandle) Else
MsgBox(Resources.Envelope.Document_Could_Not_Be_Saved, MsgBoxStyle.Critical, Text)
End If
End If
RibbonPageGroupAddSignature_Enabled() Catch ex As Exception
End Try Logger.Error(ex)
Finally
SplashScreenManager.CloseOverlayForm(oHandle)
RibbonPageGroupAddSignature_Enabled()
End Try
' Else ' Else
' SplashScreenManager.CloseOverlayForm(oHandle) ' SplashScreenManager.CloseOverlayForm(oHandle)
' End If ' End If
End Sub End Sub
Private Async Function AddDocument(pfilePath As String) As Threading.Tasks.Task(Of Boolean)
Dim oDocument = Await Controller.CreateDocument(pfilePath)
If oDocument IsNot Nothing Then
Documents.Add(oDocument)
' Update_File_DB(OpenFileDialog1.FileName)
ClearBsiItem()
Return True
Else
MsgBox(Resources.Envelope.Document_Could_Not_Be_Saved, MsgBoxStyle.Critical, Text)
Return False
End If
End Function
Private Sub frmEditor_Load(sender As Object, e As EventArgs) Handles Me.Load Private Sub frmEditor_Load(sender As Object, e As EventArgs) Handles Me.Load
Logger = State.LogConfig.GetLogger() Logger = State.LogConfig.GetLogger()
Logger.Debug("Loading Configuration..") Logger.Debug("Loading Configuration..")
TempFiles = New TempFiles(State.LogConfig)
TempFiles.Create()
If Envelope Is Nothing Then If Envelope Is Nothing Then
Logger.Debug("Loading Controller..")
Controller = New EnvelopeEditorController(State) Controller = New EnvelopeEditorController(State)
' Get additional data ' Get additional data
Logger.Debug("Loading oDataForm..")
Dim oDataForm As New frmEnvelopeMainData() With { Dim oDataForm As New frmEnvelopeMainData() With {
.State = State, .State = State,
.Envelope = Controller.Envelope, .Envelope = Controller.Envelope,
@@ -110,25 +93,6 @@ Partial Public Class frmEnvelopeEditor
Receivers = New BindingList(Of EnvelopeReceiver)(Controller.Envelope.Receivers) Receivers = New BindingList(Of EnvelopeReceiver)(Controller.Envelope.Receivers)
For Each docItem As EnvelopeDocument In Documents For Each docItem As EnvelopeDocument In Documents
If Not File.Exists(docItem.Filepath) Then
Dim oTempFolder = TempFiles.TempPath
Dim oTempFilename = String.Concat(oTempFolder, "\", $"ViewEnvDoc_{Envelope.Id}.pdf")
If File.Exists(oTempFilename) Then
Try
File.OpenWrite(oTempFilename)
Catch ex As Exception
MsgBox("File might already be open?", MsgBoxStyle.Exclamation)
Me.Cursor = Cursors.Default
Exit Sub
End Try
File.Delete(oTempFilename)
End If
WriteBytetoPath(oTempFilename, docItem.Byte_Data)
docItem.Filepath = oTempFilename
GridDocuments.Tag = docItem.Filepath
End If
If docItem.Thumbnail Is Nothing Then If docItem.Thumbnail Is Nothing Then
docItem.Thumbnail = Controller.CreateThumbnail(docItem.Filepath) docItem.Thumbnail = Controller.CreateThumbnail(docItem.Filepath)
docItem.PageCount = Controller.GetPageCount(docItem.Filepath) docItem.PageCount = Controller.GetPageCount(docItem.Filepath)
@@ -151,7 +115,7 @@ Partial Public Class frmEnvelopeEditor
RepositoryItemComboBox1.Items.AddRange(AllReceiverEmails) RepositoryItemComboBox1.Items.AddRange(AllReceiverEmails)
SetAccessCodeColumnVisible() SetAccessCodeColumnVisible()
SetPhoneNumberColumnVisible()
txtEnvelopeIdLabel2.Caption = String.Format(txtEnvelopeIdLabel2.Tag.ToString, Controller.Envelope.Id) txtEnvelopeIdLabel2.Caption = String.Format(txtEnvelopeIdLabel2.Tag.ToString, Controller.Envelope.Id)
txtCreatorEmailLabel.Caption = String.Format(txtCreatorEmailLabel.Tag.ToString, Controller.Envelope.User.Email) txtCreatorEmailLabel.Caption = String.Format(txtCreatorEmailLabel.Tag.ToString, Controller.Envelope.User.Email)
@@ -165,13 +129,6 @@ Partial Public Class frmEnvelopeEditor
colAccessCode.Visible = False colAccessCode.Visible = False
End If End If
End Sub End Sub
Private Sub SetPhoneNumberColumnVisible()
If Envelope.TFA_Enabled = True Then
colPhoneNumber.Visible = True
Else
colPhoneNumber.Visible = False
End If
End Sub
Private Sub btnDeleteFile_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnDeleteFile.ItemClick Private Sub btnDeleteFile_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnDeleteFile.ItemClick
If ViewDocuments.GetSelectedRows().Count > 0 Then If ViewDocuments.GetSelectedRows().Count > 0 Then
@@ -184,19 +141,13 @@ Partial Public Class frmEnvelopeEditor
Dim oDocument As EnvelopeDocument = DirectCast(ViewDocuments.GetFocusedRow(), EnvelopeDocument) Dim oDocument As EnvelopeDocument = DirectCast(ViewDocuments.GetFocusedRow(), EnvelopeDocument)
If Controller.DeleteDocument(oDocument) Then If Controller.DeleteDocument(oDocument) Then
Documents.Remove(oDocument) Documents.Remove(oDocument)
GridDocuments.DataSource = Nothing
ClearBsiItem()
End If End If
End If End If
End Sub End Sub
Private Sub btnSave_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnSave.ItemClick Private Sub btnSave_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnSave.ItemClick
Try Try
If SaveEnvelopeWithOutValidation() = True Then SaveEnvelopeWithOutValidation()
bsitm_info.Caption = "Data saved succeddfully " + Now.ToString
Else
bsitm_info.Caption = "Exceprion - Error saving Data. Check LOG"
End If
Catch ex As Exception Catch ex As Exception
Logger.Error(ex) Logger.Error(ex)
End Try End Try
@@ -212,19 +163,6 @@ Partial Public Class frmEnvelopeEditor
If ViewDocuments.GetSelectedRows().Count > 0 Then If ViewDocuments.GetSelectedRows().Count > 0 Then
Dim oDocument As EnvelopeDocument = DirectCast(ViewDocuments.GetFocusedRow(), EnvelopeDocument) Dim oDocument As EnvelopeDocument = DirectCast(ViewDocuments.GetFocusedRow(), EnvelopeDocument)
Dim oEnvelope = Controller.Envelope
If Not IsNothing(oDocument.Byte_Data) Then
Dim oTempFolder = TempFiles.TempPath
Dim oTempFilename = String.Concat(oTempFolder, "\", $"ViewEnvDoc_{oEnvelope.Id}.pdf")
If Not File.Exists(oTempFilename) Then
WriteBytetoPath(oTempFilename, oDocument.Byte_Data)
oDocument.Filepath = oTempFilename
End If
End If
Dim oGDPictureKey As String = MS_GDPICTUREKEY Dim oGDPictureKey As String = MS_GDPICTUREKEY
Dim oForm As New frmFieldEditor(State) With { Dim oForm As New frmFieldEditor(State) With {
@@ -242,23 +180,7 @@ Partial Public Class frmEnvelopeEditor
SplashScreenManager.CloseOverlayForm(oHandle) SplashScreenManager.CloseOverlayForm(oHandle)
End Try End Try
End Sub End Sub
Private Sub WriteBytetoPath(ByVal sFileName As String, pByte As Byte())
'For Document
Try
If Not pByte Is Nothing Then
'Read image data into a file stream
Using fs As New FileStream(sFileName, FileMode.OpenOrCreate, FileAccess.Write)
fs.Write(pByte, 0, pByte.Length)
'Set image variable value using memory stream.
fs.Flush()
fs.Close()
End Using
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Error in downloadFile")
End Try
End Sub
Private Function SaveEnvelopeWithValidation() As Boolean Private Function SaveEnvelopeWithValidation() As Boolean
Return SaveEnvelope(True) Return SaveEnvelope(True)
End Function End Function
@@ -462,7 +384,7 @@ Partial Public Class frmEnvelopeEditor
oForm.ShowDialog() oForm.ShowDialog()
SetAccessCodeColumnVisible() SetAccessCodeColumnVisible()
SetPhoneNumberColumnVisible()
SetFormTitle(Controller.Envelope.Title) SetFormTitle(Controller.Envelope.Title)
End Sub End Sub
@@ -514,14 +436,10 @@ Partial Public Class frmEnvelopeEditor
Private Sub DocumentButtons_Enable() Private Sub DocumentButtons_Enable()
If ViewDocuments.RowCount = 0 Then If ViewDocuments.RowCount = 0 Then
btnNewFile.Enabled = True btnNewFile.Enabled = True
bbtnitm_ConcatFiles.Enabled = True
btnDeleteFile.Enabled = False btnDeleteFile.Enabled = False
btnShowFile.Enabled = False
Else Else
btnNewFile.Enabled = False btnNewFile.Enabled = False
bbtnitm_ConcatFiles.Enabled = False
btnDeleteFile.Enabled = True btnDeleteFile.Enabled = True
btnShowFile.Enabled = True
End If End If
End Sub End Sub
@@ -561,12 +479,7 @@ Partial Public Class frmEnvelopeEditor
RibbonPageGroupAddSignature_Enabled() RibbonPageGroupAddSignature_Enabled()
End Sub End Sub
Dim CellValueChanged As Boolean = False Dim CellValueChanged As Boolean = False
Private Sub ViewReceivers_ColumnPositionChanged(sender As Object, e As EventArgs) Handles ViewReceivers.ColumnPositionChanged
End Sub
Private Sub ViewReceivers_CellValueChanged(sender As Object, e As Views.Base.CellValueChangedEventArgs) Handles ViewReceivers.CellValueChanged Private Sub ViewReceivers_CellValueChanged(sender As Object, e As Views.Base.CellValueChangedEventArgs) Handles ViewReceivers.CellValueChanged
If e.Column.FieldName = COL_EMAIL And CellValueChanged = False Then If e.Column.FieldName = COL_EMAIL And CellValueChanged = False Then
If e.Value Is Nothing Then If e.Value Is Nothing Then
' Keine E-Mail-Adresse, also weg damit ' Keine E-Mail-Adresse, also weg damit
@@ -578,196 +491,21 @@ Partial Public Class frmEnvelopeEditor
Dim oNameCellValue = ViewReceivers.GetRowCellValue(e.RowHandle, COL_NAME) Dim oNameCellValue = ViewReceivers.GetRowCellValue(e.RowHandle, COL_NAME)
If oNameCellValue Is Nothing Then If oNameCellValue Is Nothing Then
Dim oEmailAdress As String = DirectCast(e.Value.ToString.ToLower, String) Dim oEmailAdress As String = DirectCast(e.Value.ToString.ToLower, String)
oEmailAdress = Trim(oEmailAdress)
If IsValidEmailAddress(oEmailAdress) = True Then Dim oLastName As String = Controller.GetLastNameByEmailAdress(oEmailAdress)
Dim oLastName As String = Controller.GetLastNameByEmailAdress(oEmailAdress) Dim oAccessCode As String = Helpers.GetAccessCode()
Dim oAccessCode As String = Helpers.GetAccessCode() ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_EMAIL), oEmailAdress)
Dim oPhoneNumber As String = Controller.GetLastPhoneByEmailAdress(oEmailAdress) ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_NAME), oLastName)
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_EMAIL), oEmailAdress) ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE), oAccessCode)
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_NAME), oLastName)
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE), oAccessCode)
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_PHONE), oPhoneNumber)
Else
Dim oMsg = Resources.Envelope.Error_email_Validation
oMsg = oMsg.Replace("@Mail", oEmailAdress)
MsgBox(oMsg, MsgBoxStyle.Exclamation, Text)
ViewReceivers.DeleteRow(ViewReceivers.FocusedRowHandle)
End If
CellValueChanged = False CellValueChanged = False
End If End If
End If End If
ElseIf e.Column.FieldName = COL_PHONE And CellValueChanged = False Then
CellValueChanged = True
Dim oPhoneNumber As String = DirectCast(e.Value.ToString.ToLower, String)
oPhoneNumber = Trim(oPhoneNumber)
If IsValidMobilePhoneNumber(oPhoneNumber) = True Then
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_PHONE), oPhoneNumber)
Else
Dim oMsg = Resources.Envelope.Error_phone_Validation
oMsg = oMsg.Replace("@PhoneNr", oPhoneNumber)
MsgBox(oMsg, MsgBoxStyle.Exclamation, Text)
ViewReceivers.DeleteRow(ViewReceivers.FocusedRowHandle)
End If
CellValueChanged = False
End If End If
End Sub End Sub
Private Function IsValidEmailAddress(pEmailAddress As String) As Boolean
Try
If pEmailAddress.Contains("@") Then
Dim oAddress = New System.Net.Mail.MailAddress(pEmailAddress)
Return oAddress.Address = pEmailAddress
Else
Return False
End If
Catch ex As Exception
Logger.Error(ex)
Return False
End Try
End Function
Private Function IsValidMobilePhoneNumber(pPhoneNumber As String) As Boolean
Try
Dim pattern As String = "^\+49\d{10,14}$"
Dim regex As New Regex(pattern)
Return regex.IsMatch(pPhoneNumber)
Catch ex As Exception
Logger.Error(ex)
Return False
End Try
End Function
Private Sub RibbonControl1_Click(sender As Object, e As EventArgs) Handles RibbonControl1.Click Private Sub RibbonControl1_Click(sender As Object, e As EventArgs) Handles RibbonControl1.Click
End Sub End Sub
Private Async Sub bbtnitm_ConcatFiles_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitm_ConcatFiles.ItemClick
ENVELOPE_TEMP_DOCUMENT = String.Empty
OpenFileDialog1.Multiselect = True
OpenFileDialog1.Title = Resources.Envelope.Dialog_Concat_PDF
Dim oSuccess As Boolean = False
Dim oHandle = SplashScreenManager.ShowOverlayForm(Me)
Try
Dim oErr As Boolean = False
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
Dim oIDX As Integer = -1
For Each oFile As String In OpenFileDialog1.FileNames
oIDX += 1
Next
Dim arPDF As GdPicturePDF() = New GdPicturePDF(oIDX) {}
oIDX = 0
For Each oFile As String In OpenFileDialog1.FileNames
arPDF(oIDX) = New GdPicturePDF()
If arPDF(oIDX).LoadFromFile(oFile) <> GdPictureStatus.OK Then
MsgBox($"PDF Status of file {oFile} is not OK. Please check PDF-conformity!", MsgBoxStyle.Critical)
oErr = True
Exit For
End If
oIDX += 1
Next
If oErr = False Then
Dim dstPDF As GdPicturePDF = arPDF(0).MergeDocuments(arPDF)
Dim oStatus As GdPictureStatus = arPDF(0).GetStat()
If oStatus = GdPictureStatus.OK Then
Dim oTempFolder = MyTempFiles.TempPath
If Not Directory.Exists(oTempFolder) Then
Directory.CreateDirectory(oTempFolder)
End If
Dim oTempFilename = String.Concat(oTempFolder, "\", $"MergedDoc.pdf")
'wenn es das MergedDocument schon gibt dann löschen
If System.IO.File.Exists(oTempFilename) Then
System.IO.File.Delete(oTempFilename)
End If
If dstPDF.SaveToFile(oTempFilename) = GdPictureStatus.OK Then
ENVELOPE_TEMP_DOCUMENT = oTempFilename
dstPDF.CloseDocument()
oSuccess = True
Else
MsgBox("Unexpected format-error within the final document!", MsgBoxStyle.Critical)
oSuccess = False
End If
Else
MessageBox.Show("The MergeDocuments() method has failed with the status: " + oStatus.ToString(), "Example: MergeDocuments")
oSuccess = False
End If
dstPDF.Dispose()
oIDX = 0
For Each oFile As String In OpenFileDialog1.FileNames
arPDF(oIDX).CloseDocument()
oIDX += 1
Next
If oSuccess = True And ENVELOPE_TEMP_DOCUMENT <> String.Empty Then
Await AddDocument(ENVELOPE_TEMP_DOCUMENT)
End If
End If
End If
Catch ex As Exception
Logger.Error(ex)
Finally
SplashScreenManager.CloseOverlayForm(oHandle)
End Try
'frmChooseDocVariant.ShowDialog()
End Sub
Private Sub frmEnvelopeEditor_DragEnter(sender As Object, e As DragEventArgs) Handles Me.DragEnter
ClearBsiItem()
' Prüfen, ob die Daten vom Typ Datei sind
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
' prüfen ob es schon eine Datei gibt
If Documents.Count > 0 Then
e.Effect = DragDropEffects.None
bsitm_info.Caption = Resources.Envelope.Only_one_file_is_allowed
bsitm_info.ItemAppearance.Normal.BackColor = Color.Red
bsitm_info.ItemAppearance.Normal.ForeColor = Color.Yellow
Else
' Effekt auf "Kopieren" setzen, um Drag-and-Drop zu ermöglichen
e.Effect = DragDropEffects.Copy
End If
Else
e.Effect = DragDropEffects.None
End If
End Sub
Sub ClearBsiItem()
bsitm_info.Caption = ""
bsitm_info.ItemAppearance.Normal.BackColor = Color.Transparent
bsitm_info.ItemAppearance.Normal.ForeColor = Color.Black
End Sub
Private Async Sub frmEnvelopeEditor_DragDrop(sender As Object, e As DragEventArgs) Handles Me.DragDrop
' Den Pfad der Datei(en) erhalten
Dim ofiles() As String = CType(e.Data.GetData(DataFormats.FileDrop), String())
' Beispiel: Ersten Dateipfad anzeigen
If ofiles IsNot Nothing AndAlso ofiles.Length > 0 Then
If Not ofiles(0).ToString.EndsWith("pdf") Then
bsitm_info.Caption = Resources.Envelope.Drop_only_one_file
bsitm_info.ItemAppearance.Normal.BackColor = Color.Red
bsitm_info.ItemAppearance.Normal.ForeColor = Color.Yellow
Else
Dim oHandle = SplashScreenManager.ShowOverlayForm(Me)
Await AddDocument(ofiles(0))
SplashScreenManager.CloseOverlayForm(oHandle)
' MessageBox.Show("Dateipfad: " & ofiles(0), "Datei abgelegt", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End If
End Sub
Private Sub GridDocuments_DoubleClick(sender As Object, e As EventArgs) Handles GridDocuments.DoubleClick
showdocument()
End Sub
Private Sub btnShowFile_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnShowFile.ItemClick
showDocument
End Sub
Sub showdocument()
If Not IsNothing(Documents) Then
Process.Start(Documents.Item(0).Filepath)
End If
End Sub
End Class End Class

View File

@@ -25,7 +25,6 @@ Partial Class frmEnvelopeMainData
Me.components = New System.ComponentModel.Container() Me.components = New System.ComponentModel.Container()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmEnvelopeMainData)) Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmEnvelopeMainData))
Me.LayoutControl1 = New DevExpress.XtraLayout.LayoutControl() Me.LayoutControl1 = New DevExpress.XtraLayout.LayoutControl()
Me.chked_2Faktor = New DevExpress.XtraEditors.CheckEdit()
Me.txtTitle = New DevExpress.XtraEditors.TextEdit() Me.txtTitle = New DevExpress.XtraEditors.TextEdit()
Me.cmbEnvelopeType = New DevExpress.XtraEditors.ComboBoxEdit() Me.cmbEnvelopeType = New DevExpress.XtraEditors.ComboBoxEdit()
Me.btOK = New DevExpress.XtraEditors.SimpleButton() Me.btOK = New DevExpress.XtraEditors.SimpleButton()
@@ -63,11 +62,9 @@ Partial Class frmEnvelopeMainData
Me.LayoutControlItem8 = New DevExpress.XtraLayout.LayoutControlItem() Me.LayoutControlItem8 = New DevExpress.XtraLayout.LayoutControlItem()
Me.LayoutControlItem12 = New DevExpress.XtraLayout.LayoutControlItem() Me.LayoutControlItem12 = New DevExpress.XtraLayout.LayoutControlItem()
Me.LayoutControlItem13 = New DevExpress.XtraLayout.LayoutControlItem() Me.LayoutControlItem13 = New DevExpress.XtraLayout.LayoutControlItem()
Me.LayoutControlItem16 = New DevExpress.XtraLayout.LayoutControlItem()
Me.AdornerUIManager1 = New DevExpress.Utils.VisualEffects.AdornerUIManager(Me.components) Me.AdornerUIManager1 = New DevExpress.Utils.VisualEffects.AdornerUIManager(Me.components)
CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.LayoutControl1.SuspendLayout() Me.LayoutControl1.SuspendLayout()
CType(Me.chked_2Faktor.Properties, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.txtTitle.Properties, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.txtTitle.Properties, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.cmbEnvelopeType.Properties, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.cmbEnvelopeType.Properties, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.cmbCertificationType.Properties, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.cmbCertificationType.Properties, System.ComponentModel.ISupportInitialize).BeginInit()
@@ -103,13 +100,11 @@ Partial Class frmEnvelopeMainData
CType(Me.LayoutControlItem8, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LayoutControlItem8, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.LayoutControlItem12, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LayoutControlItem12, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.LayoutControlItem13, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LayoutControlItem13, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.LayoutControlItem16, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.AdornerUIManager1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.AdornerUIManager1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout() Me.SuspendLayout()
' '
'LayoutControl1 'LayoutControl1
' '
Me.LayoutControl1.Controls.Add(Me.chked_2Faktor)
Me.LayoutControl1.Controls.Add(Me.txtTitle) Me.LayoutControl1.Controls.Add(Me.txtTitle)
Me.LayoutControl1.Controls.Add(Me.cmbEnvelopeType) Me.LayoutControl1.Controls.Add(Me.cmbEnvelopeType)
Me.LayoutControl1.Controls.Add(Me.btOK) Me.LayoutControl1.Controls.Add(Me.btOK)
@@ -129,15 +124,6 @@ Partial Class frmEnvelopeMainData
Me.LayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = New System.Drawing.Rectangle(855, 189, 650, 400) Me.LayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = New System.Drawing.Rectangle(855, 189, 650, 400)
Me.LayoutControl1.Root = Me.Root Me.LayoutControl1.Root = Me.Root
' '
'chked_2Faktor
'
resources.ApplyResources(Me.chked_2Faktor, "chked_2Faktor")
Me.chked_2Faktor.Name = "chked_2Faktor"
Me.chked_2Faktor.Properties.Appearance.Font = CType(resources.GetObject("chked_2Faktor.Properties.Appearance.Font"), System.Drawing.Font)
Me.chked_2Faktor.Properties.Appearance.Options.UseFont = True
Me.chked_2Faktor.Properties.Caption = resources.GetString("chked_2Faktor.Properties.Caption")
Me.chked_2Faktor.StyleController = Me.LayoutControl1
'
'txtTitle 'txtTitle
' '
resources.ApplyResources(Me.txtTitle, "txtTitle") resources.ApplyResources(Me.txtTitle, "txtTitle")
@@ -325,16 +311,16 @@ Partial Class frmEnvelopeMainData
'EmptySpaceItem2 'EmptySpaceItem2
' '
Me.EmptySpaceItem2.AllowHotTrack = False Me.EmptySpaceItem2.AllowHotTrack = False
Me.EmptySpaceItem2.Location = New System.Drawing.Point(0, 441) Me.EmptySpaceItem2.Location = New System.Drawing.Point(0, 416)
Me.EmptySpaceItem2.Name = "EmptySpaceItem2" Me.EmptySpaceItem2.Name = "EmptySpaceItem2"
Me.EmptySpaceItem2.Size = New System.Drawing.Size(565, 63) Me.EmptySpaceItem2.Size = New System.Drawing.Size(565, 88)
Me.EmptySpaceItem2.TextSize = New System.Drawing.Size(0, 0) Me.EmptySpaceItem2.TextSize = New System.Drawing.Size(0, 0)
' '
'groupFinalEmail 'groupFinalEmail
' '
Me.groupFinalEmail.GroupStyle = DevExpress.Utils.GroupStyle.Light Me.groupFinalEmail.GroupStyle = DevExpress.Utils.GroupStyle.Light
Me.groupFinalEmail.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem9, Me.LayoutControlItem14}) Me.groupFinalEmail.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem9, Me.LayoutControlItem14})
Me.groupFinalEmail.Location = New System.Drawing.Point(0, 348) Me.groupFinalEmail.Location = New System.Drawing.Point(0, 323)
Me.groupFinalEmail.Name = "groupFinalEmail" Me.groupFinalEmail.Name = "groupFinalEmail"
Me.groupFinalEmail.Size = New System.Drawing.Size(565, 93) Me.groupFinalEmail.Size = New System.Drawing.Size(565, 93)
resources.ApplyResources(Me.groupFinalEmail, "groupFinalEmail") resources.ApplyResources(Me.groupFinalEmail, "groupFinalEmail")
@@ -362,7 +348,7 @@ Partial Class frmEnvelopeMainData
Me.groupExpiration.Enabled = False Me.groupExpiration.Enabled = False
Me.groupExpiration.GroupStyle = DevExpress.Utils.GroupStyle.Light Me.groupExpiration.GroupStyle = DevExpress.Utils.GroupStyle.Light
Me.groupExpiration.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem10, Me.LayoutControlItem11}) Me.groupExpiration.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem10, Me.LayoutControlItem11})
Me.groupExpiration.Location = New System.Drawing.Point(0, 255) Me.groupExpiration.Location = New System.Drawing.Point(0, 230)
Me.groupExpiration.Name = "groupExpiration" Me.groupExpiration.Name = "groupExpiration"
Me.groupExpiration.Size = New System.Drawing.Size(565, 93) Me.groupExpiration.Size = New System.Drawing.Size(565, 93)
resources.ApplyResources(Me.groupExpiration, "groupExpiration") resources.ApplyResources(Me.groupExpiration, "groupExpiration")
@@ -390,7 +376,7 @@ Partial Class frmEnvelopeMainData
Me.groupReminders.Enabled = False Me.groupReminders.Enabled = False
Me.groupReminders.GroupStyle = DevExpress.Utils.GroupStyle.Light Me.groupReminders.GroupStyle = DevExpress.Utils.GroupStyle.Light
Me.groupReminders.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem5, Me.LayoutControlItem6, Me.LayoutControlItem7}) Me.groupReminders.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem5, Me.LayoutControlItem6, Me.LayoutControlItem7})
Me.groupReminders.Location = New System.Drawing.Point(0, 140) Me.groupReminders.Location = New System.Drawing.Point(0, 115)
Me.groupReminders.Name = "groupReminders" Me.groupReminders.Name = "groupReminders"
Me.groupReminders.Size = New System.Drawing.Size(565, 115) Me.groupReminders.Size = New System.Drawing.Size(565, 115)
resources.ApplyResources(Me.groupReminders, "groupReminders") resources.ApplyResources(Me.groupReminders, "groupReminders")
@@ -425,10 +411,10 @@ Partial Class frmEnvelopeMainData
'groupOptions 'groupOptions
' '
Me.groupOptions.GroupStyle = DevExpress.Utils.GroupStyle.Light Me.groupOptions.GroupStyle = DevExpress.Utils.GroupStyle.Light
Me.groupOptions.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem8, Me.LayoutControlItem12, Me.LayoutControlItem13, Me.LayoutControlItem16}) Me.groupOptions.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem8, Me.LayoutControlItem12, Me.LayoutControlItem13})
Me.groupOptions.Location = New System.Drawing.Point(0, 0) Me.groupOptions.Location = New System.Drawing.Point(0, 0)
Me.groupOptions.Name = "groupOptions" Me.groupOptions.Name = "groupOptions"
Me.groupOptions.Size = New System.Drawing.Size(565, 140) Me.groupOptions.Size = New System.Drawing.Size(565, 115)
resources.ApplyResources(Me.groupOptions, "groupOptions") resources.ApplyResources(Me.groupOptions, "groupOptions")
' '
'LayoutControlItem8 'LayoutControlItem8
@@ -452,21 +438,12 @@ Partial Class frmEnvelopeMainData
'LayoutControlItem13 'LayoutControlItem13
' '
Me.LayoutControlItem13.Control = Me.chkUseAccessCode Me.LayoutControlItem13.Control = Me.chkUseAccessCode
Me.LayoutControlItem13.Location = New System.Drawing.Point(0, 73) Me.LayoutControlItem13.Location = New System.Drawing.Point(0, 48)
Me.LayoutControlItem13.Name = "LayoutControlItem13" Me.LayoutControlItem13.Name = "LayoutControlItem13"
Me.LayoutControlItem13.Size = New System.Drawing.Size(541, 22) Me.LayoutControlItem13.Size = New System.Drawing.Size(541, 22)
Me.LayoutControlItem13.TextSize = New System.Drawing.Size(0, 0) Me.LayoutControlItem13.TextSize = New System.Drawing.Size(0, 0)
Me.LayoutControlItem13.TextVisible = False Me.LayoutControlItem13.TextVisible = False
' '
'LayoutControlItem16
'
Me.LayoutControlItem16.Control = Me.chked_2Faktor
Me.LayoutControlItem16.Location = New System.Drawing.Point(0, 48)
Me.LayoutControlItem16.Name = "LayoutControlItem16"
Me.LayoutControlItem16.Size = New System.Drawing.Size(541, 25)
Me.LayoutControlItem16.TextSize = New System.Drawing.Size(0, 0)
Me.LayoutControlItem16.TextVisible = False
'
'AdornerUIManager1 'AdornerUIManager1
' '
Me.AdornerUIManager1.Owner = Me Me.AdornerUIManager1.Owner = Me
@@ -484,7 +461,6 @@ Partial Class frmEnvelopeMainData
Me.ShowInTaskbar = False Me.ShowInTaskbar = False
CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).EndInit()
Me.LayoutControl1.ResumeLayout(False) Me.LayoutControl1.ResumeLayout(False)
CType(Me.chked_2Faktor.Properties, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.txtTitle.Properties, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.txtTitle.Properties, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.cmbEnvelopeType.Properties, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.cmbEnvelopeType.Properties, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.cmbCertificationType.Properties, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.cmbCertificationType.Properties, System.ComponentModel.ISupportInitialize).EndInit()
@@ -520,7 +496,6 @@ Partial Class frmEnvelopeMainData
CType(Me.LayoutControlItem8, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.LayoutControlItem8, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.LayoutControlItem12, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.LayoutControlItem12, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.LayoutControlItem13, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.LayoutControlItem13, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.LayoutControlItem16, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.AdornerUIManager1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.AdornerUIManager1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False) Me.ResumeLayout(False)
@@ -565,6 +540,4 @@ Partial Class frmEnvelopeMainData
Friend WithEvents LayoutControlItem14 As DevExpress.XtraLayout.LayoutControlItem Friend WithEvents LayoutControlItem14 As DevExpress.XtraLayout.LayoutControlItem
Friend WithEvents EmptySpaceItem2 As DevExpress.XtraLayout.EmptySpaceItem Friend WithEvents EmptySpaceItem2 As DevExpress.XtraLayout.EmptySpaceItem
Friend WithEvents groupAllOptions As DevExpress.XtraLayout.LayoutControlGroup Friend WithEvents groupAllOptions As DevExpress.XtraLayout.LayoutControlGroup
Friend WithEvents chked_2Faktor As DevExpress.XtraEditors.CheckEdit
Friend WithEvents LayoutControlItem16 As DevExpress.XtraLayout.LayoutControlItem
End Class End Class

View File

@@ -118,40 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="chked_2Faktor.Location" type="System.Drawing.Point, System.Drawing">
<value>27, 210</value>
</data>
<data name="chked_2Faktor.Properties.Appearance.Font" type="System.Drawing.Font, System.Drawing">
<value>Segoe UI, 10pt, style=Bold</value>
</data>
<data name="chked_2Faktor.Properties.Caption" xml:space="preserve">
<value>2 Faktor -Authentifizierung aktivieren</value>
</data>
<data name="chked_2Faktor.Size" type="System.Drawing.Size, System.Drawing">
<value>537, 21</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="chked_2Faktor.TabIndex" type="System.Int32, mscorlib">
<value>21</value>
</data>
<data name="&gt;&gt;chked_2Faktor.Name" xml:space="preserve">
<value>chked_2Faktor</value>
</data>
<data name="&gt;&gt;chked_2Faktor.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;chked_2Faktor.Parent" xml:space="preserve">
<value>LayoutControl1</value>
</data>
<data name="&gt;&gt;chked_2Faktor.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="txtTitle.Location" type="System.Drawing.Point, System.Drawing"> <data name="txtTitle.Location" type="System.Drawing.Point, System.Drawing">
<value>204, 45</value> <value>204, 45</value>
</data> </data>
<data name="txtTitle.Size" type="System.Drawing.Size, System.Drawing"> <data name="txtTitle.Size" type="System.Drawing.Size, System.Drawing">
<value>363, 20</value> <value>363, 20</value>
</data> </data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="txtTitle.TabIndex" type="System.Int32, mscorlib"> <data name="txtTitle.TabIndex" type="System.Int32, mscorlib">
<value>4</value> <value>4</value>
</data> </data>
@@ -165,7 +138,7 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;txtTitle.ZOrder" xml:space="preserve"> <data name="&gt;&gt;txtTitle.ZOrder" xml:space="preserve">
<value>5</value> <value>4</value>
</data> </data>
<data name="cmbEnvelopeType.Location" type="System.Drawing.Point, System.Drawing"> <data name="cmbEnvelopeType.Location" type="System.Drawing.Point, System.Drawing">
<value>204, 69</value> <value>204, 69</value>
@@ -190,7 +163,7 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;cmbEnvelopeType.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cmbEnvelopeType.ZOrder" xml:space="preserve">
<value>6</value> <value>5</value>
</data> </data>
<data name="btOK.Location" type="System.Drawing.Point, System.Drawing"> <data name="btOK.Location" type="System.Drawing.Point, System.Drawing">
<value>22, 636</value> <value>22, 636</value>
@@ -218,7 +191,7 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;btOK.ZOrder" xml:space="preserve"> <data name="&gt;&gt;btOK.ZOrder" xml:space="preserve">
<value>7</value> <value>6</value>
</data> </data>
<data name="btCancel.Location" type="System.Drawing.Point, System.Drawing"> <data name="btCancel.Location" type="System.Drawing.Point, System.Drawing">
<value>92, 636</value> <value>92, 636</value>
@@ -245,10 +218,7 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;btCancel.ZOrder" xml:space="preserve"> <data name="&gt;&gt;btCancel.ZOrder" xml:space="preserve">
<value>8</value> <value>7</value>
</data>
<data name="cmbCertificationType.Enabled" type="System.Boolean, mscorlib">
<value>False</value>
</data> </data>
<data name="cmbCertificationType.Location" type="System.Drawing.Point, System.Drawing"> <data name="cmbCertificationType.Location" type="System.Drawing.Point, System.Drawing">
<value>207, 162</value> <value>207, 162</value>
@@ -272,10 +242,10 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;cmbCertificationType.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cmbCertificationType.ZOrder" xml:space="preserve">
<value>9</value> <value>8</value>
</data> </data>
<data name="chkSendReminderEmails.Location" type="System.Drawing.Point, System.Drawing"> <data name="chkSendReminderEmails.Location" type="System.Drawing.Point, System.Drawing">
<value>27, 302</value> <value>27, 277</value>
</data> </data>
<data name="chkSendReminderEmails.Properties.Caption" xml:space="preserve"> <data name="chkSendReminderEmails.Properties.Caption" xml:space="preserve">
<value>Erinnerungen senden</value> <value>Erinnerungen senden</value>
@@ -296,13 +266,13 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;chkSendReminderEmails.ZOrder" xml:space="preserve"> <data name="&gt;&gt;chkSendReminderEmails.ZOrder" xml:space="preserve">
<value>10</value> <value>9</value>
</data> </data>
<data name="spnFirstReminderDays.EditValue" type="System.Decimal, mscorlib"> <data name="spnFirstReminderDays.EditValue" type="System.Decimal, mscorlib">
<value>0</value> <value>0</value>
</data> </data>
<data name="spnFirstReminderDays.Location" type="System.Drawing.Point, System.Drawing"> <data name="spnFirstReminderDays.Location" type="System.Drawing.Point, System.Drawing">
<value>207, 324</value> <value>207, 299</value>
</data> </data>
<data name="spnFirstReminderDays.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2"> <data name="spnFirstReminderDays.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2">
<value>Combo</value> <value>Combo</value>
@@ -323,13 +293,13 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;spnFirstReminderDays.ZOrder" xml:space="preserve"> <data name="&gt;&gt;spnFirstReminderDays.ZOrder" xml:space="preserve">
<value>11</value> <value>10</value>
</data> </data>
<data name="spnReminderIntervalDays.EditValue" type="System.Decimal, mscorlib"> <data name="spnReminderIntervalDays.EditValue" type="System.Decimal, mscorlib">
<value>0</value> <value>0</value>
</data> </data>
<data name="spnReminderIntervalDays.Location" type="System.Drawing.Point, System.Drawing"> <data name="spnReminderIntervalDays.Location" type="System.Drawing.Point, System.Drawing">
<value>207, 348</value> <value>207, 323</value>
</data> </data>
<data name="spnReminderIntervalDays.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2"> <data name="spnReminderIntervalDays.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2">
<value>Combo</value> <value>Combo</value>
@@ -350,13 +320,13 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;spnReminderIntervalDays.ZOrder" xml:space="preserve"> <data name="&gt;&gt;spnReminderIntervalDays.ZOrder" xml:space="preserve">
<value>12</value> <value>11</value>
</data> </data>
<data name="spnExpiresDays.EditValue" type="System.Decimal, mscorlib"> <data name="spnExpiresDays.EditValue" type="System.Decimal, mscorlib">
<value>0</value> <value>0</value>
</data> </data>
<data name="spnExpiresDays.Location" type="System.Drawing.Point, System.Drawing"> <data name="spnExpiresDays.Location" type="System.Drawing.Point, System.Drawing">
<value>207, 417</value> <value>207, 392</value>
</data> </data>
<data name="spnExpiresDays.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2"> <data name="spnExpiresDays.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2">
<value>Combo</value> <value>Combo</value>
@@ -377,13 +347,13 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;spnExpiresDays.ZOrder" xml:space="preserve"> <data name="&gt;&gt;spnExpiresDays.ZOrder" xml:space="preserve">
<value>13</value> <value>12</value>
</data> </data>
<data name="spnExpiresWarningDays.EditValue" type="System.Decimal, mscorlib"> <data name="spnExpiresWarningDays.EditValue" type="System.Decimal, mscorlib">
<value>0</value> <value>0</value>
</data> </data>
<data name="spnExpiresWarningDays.Location" type="System.Drawing.Point, System.Drawing"> <data name="spnExpiresWarningDays.Location" type="System.Drawing.Point, System.Drawing">
<value>207, 441</value> <value>207, 416</value>
</data> </data>
<data name="spnExpiresWarningDays.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2"> <data name="spnExpiresWarningDays.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2">
<value>Combo</value> <value>Combo</value>
@@ -404,7 +374,7 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;spnExpiresWarningDays.ZOrder" xml:space="preserve"> <data name="&gt;&gt;spnExpiresWarningDays.ZOrder" xml:space="preserve">
<value>14</value> <value>13</value>
</data> </data>
<data name="cmbLanguage.Location" type="System.Drawing.Point, System.Drawing"> <data name="cmbLanguage.Location" type="System.Drawing.Point, System.Drawing">
<value>207, 186</value> <value>207, 186</value>
@@ -428,10 +398,10 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;cmbLanguage.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cmbLanguage.ZOrder" xml:space="preserve">
<value>15</value> <value>14</value>
</data> </data>
<data name="chkUseAccessCode.Location" type="System.Drawing.Point, System.Drawing"> <data name="chkUseAccessCode.Location" type="System.Drawing.Point, System.Drawing">
<value>27, 235</value> <value>27, 210</value>
</data> </data>
<data name="chkUseAccessCode.Properties.Caption" xml:space="preserve"> <data name="chkUseAccessCode.Properties.Caption" xml:space="preserve">
<value>Verwende Zugriffscode</value> <value>Verwende Zugriffscode</value>
@@ -452,10 +422,10 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;chkUseAccessCode.ZOrder" xml:space="preserve"> <data name="&gt;&gt;chkUseAccessCode.ZOrder" xml:space="preserve">
<value>16</value> <value>15</value>
</data> </data>
<data name="cmbEmailToCreator.Location" type="System.Drawing.Point, System.Drawing"> <data name="cmbEmailToCreator.Location" type="System.Drawing.Point, System.Drawing">
<value>207, 510</value> <value>207, 485</value>
</data> </data>
<data name="cmbEmailToCreator.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2"> <data name="cmbEmailToCreator.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2">
<value>Combo</value> <value>Combo</value>
@@ -476,10 +446,10 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;cmbEmailToCreator.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cmbEmailToCreator.ZOrder" xml:space="preserve">
<value>17</value> <value>16</value>
</data> </data>
<data name="cmbEmailToReceivers.Location" type="System.Drawing.Point, System.Drawing"> <data name="cmbEmailToReceivers.Location" type="System.Drawing.Point, System.Drawing">
<value>207, 534</value> <value>207, 509</value>
</data> </data>
<data name="cmbEmailToReceivers.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2"> <data name="cmbEmailToReceivers.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2">
<value>Combo</value> <value>Combo</value>
@@ -500,7 +470,7 @@
<value>LayoutControl1</value> <value>LayoutControl1</value>
</data> </data>
<data name="&gt;&gt;cmbEmailToReceivers.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cmbEmailToReceivers.ZOrder" xml:space="preserve">
<value>18</value> <value>17</value>
</data> </data>
<data name="LayoutControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="LayoutControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
@@ -754,12 +724,6 @@
<data name="&gt;&gt;LayoutControlItem13.Type" xml:space="preserve"> <data name="&gt;&gt;LayoutControlItem13.Type" xml:space="preserve">
<value>DevExpress.XtraLayout.LayoutControlItem, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraLayout.LayoutControlItem, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;LayoutControlItem16.Name" xml:space="preserve">
<value>LayoutControlItem16</value>
</data>
<data name="&gt;&gt;LayoutControlItem16.Type" xml:space="preserve">
<value>DevExpress.XtraLayout.LayoutControlItem, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;AdornerUIManager1.Name" xml:space="preserve"> <data name="&gt;&gt;AdornerUIManager1.Name" xml:space="preserve">
<value>AdornerUIManager1</value> <value>AdornerUIManager1</value>
</data> </data>

View File

@@ -4,7 +4,7 @@ Imports EnvelopeGenerator.Common.Constants
Imports System.ComponentModel Imports System.ComponentModel
Public Class frmEnvelopeMainData Public Class frmEnvelopeMainData
Private FormLoaded As Boolean = False
Public Property Envelope As Envelope = New Envelope() Public Property Envelope As Envelope = New Envelope()
Public Property NewEnvelopeMode As Boolean = True Public Property NewEnvelopeMode As Boolean = True
@@ -20,87 +20,70 @@ Public Class frmEnvelopeMainData
End Sub End Sub
Private Sub frmEnvelopeMainData_Load(sender As Object, e As EventArgs) Handles MyBase.Load Private Sub frmEnvelopeMainData_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try If NewEnvelopeMode = True Then
If NewEnvelopeMode = True Then Me.Text = Resources.Envelope.New_Envelope
Me.Text = Resources.Envelope.New_Envelope
Else
Me.Text = Resources.Envelope.Edit_Envelope
cmbEnvelopeType.ReadOnly = True
End If
EnvelopeTypeModel = New EnvelopeTypeModel(State)
Dim oTypes = EnvelopeTypeModel.List()
If oTypes.Count = 0 Then
MsgBox("No templates in Database!", MsgBoxStyle.Exclamation, Text)
Close()
Exit Sub
End If
' Dim oTranslatedVerificationTypeList = VerificationTypeList.Select(AddressOf TranslateVerificationTypeType).ToList()
Dim certificationTypeList = [Enum].GetValues(GetType(CertificationType)).Cast(Of CertificationType)()
Dim oTranslatedCertificationTypeList = certificationTypeList.Select(AddressOf TranslateCertificationType).ToList()
cmbCertificationType.Properties.Items.AddRange(oTranslatedCertificationTypeList)
Dim finalEmailTypeList = [Enum].GetValues(GetType(FinalEmailType)).Cast(Of FinalEmailType)()
Dim oTranslatedFinalEmailTypeList = finalEmailTypeList.Select(AddressOf TranslateFinalEmailType).ToList()
cmbEmailToCreator.Properties.Items.AddRange(oTranslatedFinalEmailTypeList)
cmbEmailToReceivers.Properties.Items.AddRange(oTranslatedFinalEmailTypeList)
cmbEnvelopeType.Properties.Items.AddRange(oTypes.ToList)
cmbLanguage.Properties.Items.AddRange(New List(Of String) From {"de", "en"})
groupAllOptions.Expanded = False
If NewEnvelopeMode = True Then
Dim oType = oTypes.FirstOrDefault()
' This will trigger loading values from the type
cmbEnvelopeType.EditValue = oType
chked_2Faktor.EditValue = DEF_TF_ENABLED
Else
' This will trigger loading values from the type
cmbEnvelopeType.EditValue = Envelope.EnvelopeType
' cmbEnvelopeType.SelectedIndex = Convert.ToInt32(Envelope.EnvelopeType) - 1
' cmbEnvelopeType.SelectedIndex = Envelope.Type.Id - 1
' cmbEnvelopeType.SelectedItem = cmbEnvelopeType.Properties.Items.Cast(Of EnvelopeType).Where(Function(i) i.Id = Envelope.EnvelopeType.Id).SingleOrDefault()
' Now we can override these values with the values from envelope
txtTitle.EditValue = Envelope.Title
chkUseAccessCode.EditValue = Envelope.UseAccessCode
chked_2Faktor.EditValue = Envelope.TFA_Enabled
cmbCertificationType.SelectedIndex = Convert.ToInt32(Envelope.CertificationType) - 1
cmbEmailToCreator.SelectedIndex = Convert.ToInt32(Envelope.FinalEmailToCreator)
cmbEmailToReceivers.SelectedIndex = Convert.ToInt32(Envelope.FinalEmailToReceivers)
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected Error loading form:")
End Try
End Sub
Private Sub CheckAccessCode()
If Envelope.TFA_Enabled = True Then
chkUseAccessCode.Checked = True
chkUseAccessCode.Enabled = False
Else Else
chkUseAccessCode.Enabled = True Me.Text = Resources.Envelope.Edit_Envelope
cmbEnvelopeType.ReadOnly = True
End If End If
EnvelopeTypeModel = New EnvelopeTypeModel(State)
Dim oTypes = EnvelopeTypeModel.List()
If oTypes.Count = 0 Then
MsgBox("No templates in Database!", MsgBoxStyle.Exclamation, Text)
Close()
Exit Sub
End If
Dim certificationTypeList = [Enum].GetValues(GetType(CertificationType)).Cast(Of CertificationType)()
Dim oTranslatedCertificationTypeList = certificationTypeList.Select(AddressOf TranslateCertificationType).ToList()
cmbCertificationType.Properties.Items.AddRange(oTranslatedCertificationTypeList)
Dim finalEmailTypeList = [Enum].GetValues(GetType(FinalEmailType)).Cast(Of FinalEmailType)()
Dim oTranslatedFinalEmailTypeList = FinalEmailTypeList.Select(AddressOf TranslateFinalEmailType).ToList()
cmbEmailToCreator.Properties.Items.AddRange(oTranslatedFinalEmailTypeList)
cmbEmailToReceivers.Properties.Items.AddRange(oTranslatedFinalEmailTypeList)
cmbEnvelopeType.Properties.Items.AddRange(oTypes.ToList)
cmbLanguage.Properties.Items.AddRange(New List(Of String) From {"de", "en"})
groupAllOptions.Expanded = False
If NewEnvelopeMode = True Then
Dim oType = oTypes.FirstOrDefault()
' This will trigger loading values from the type
cmbEnvelopeType.EditValue = oType
Else
' This will trigger loading values from the type
cmbEnvelopeType.EditValue = Envelope.EnvelopeType
' cmbEnvelopeType.SelectedIndex = Convert.ToInt32(Envelope.EnvelopeType) - 1
' cmbEnvelopeType.SelectedIndex = Envelope.Type.Id - 1
' cmbEnvelopeType.SelectedItem = cmbEnvelopeType.Properties.Items.Cast(Of EnvelopeType).Where(Function(i) i.Id = Envelope.EnvelopeType.Id).SingleOrDefault()
' Now we can override these values with the values from envelope
txtTitle.EditValue = Envelope.Title
chkUseAccessCode.EditValue = Envelope.UseAccessCode
cmbCertificationType.SelectedIndex = Convert.ToInt32(Envelope.CertificationType) - 1
cmbEmailToCreator.SelectedIndex = Convert.ToInt32(Envelope.FinalEmailToCreator)
cmbEmailToReceivers.SelectedIndex = Convert.ToInt32(Envelope.FinalEmailToReceivers)
End If
End Sub End Sub
Private Function TranslateCertificationType(pType As CertificationType) As String Private Function TranslateCertificationType(pType As CertificationType) As String
Return Resources.Model.ResourceManager.GetString(pType.ToString()) Return Resources.Model.ResourceManager.GetString(pType.ToString())
End Function End Function
Private Function TranslateFinalEmailType(pType As FinalEmailType) As String Private Function TranslateFinalEmailType(pType As FinalEmailType) As String
Return Resources.Model.ResourceManager.GetString(pType.ToString()) Return Resources.Model.ResourceManager.GetString(pType.ToString())
End Function End Function
Private Sub btOK_Click(sender As Object, e As EventArgs) Handles btOK.Click Private Sub btOK_Click(sender As Object, e As EventArgs) Handles btOK.Click
Dim Validator As Validator = New Validator(State.LogConfig, AdornerUIManager1) Dim Validator As Validator = New Validator(State.LogConfig, AdornerUIManager1)
Dim oMissingParams = Validator.Validate(txtTitle) Dim oMissingParams = Validator.Validate(txtTitle)
@@ -127,16 +110,13 @@ Public Class frmEnvelopeMainData
Envelope.ExpiresWarningWhenDays = spnExpiresWarningDays.EditValue Envelope.ExpiresWarningWhenDays = spnExpiresWarningDays.EditValue
Envelope.FinalEmailToCreator = cmbEmailToCreator.SelectedIndex Envelope.FinalEmailToCreator = cmbEmailToCreator.SelectedIndex
Envelope.FinalEmailToReceivers = cmbEmailToReceivers.SelectedIndex Envelope.FinalEmailToReceivers = cmbEmailToReceivers.SelectedIndex
Envelope.TFA_Enabled = chked_2Faktor.EditValue
' ContractType kann zzt nicht über die Oberfläche gesetzt werden ' ContractType kann zzt nicht über die Oberfläche gesetzt werden
Envelope.ContractType = ContractType.Contract Envelope.ContractType = ContractType.Contract
End Sub End Sub
Private Sub frmEnvelopeMainData_Shown(sender As Object, e As EventArgs) Handles Me.Shown Private Sub frmEnvelopeMainData_Shown(sender As Object, e As EventArgs) Handles Me.Shown
SetFormHeight() SetFormHeight()
CheckAccessCode()
FormLoaded = True
End Sub End Sub
Private Sub SetFormHeight() Private Sub SetFormHeight()
@@ -172,15 +152,4 @@ Public Class frmEnvelopeMainData
cmbEmailToReceivers.SelectedIndex = oSelectedType.FinalEmailToReceivers cmbEmailToReceivers.SelectedIndex = oSelectedType.FinalEmailToReceivers
End Sub End Sub
Private Sub chked_2Faktor_CheckedChanged(sender As Object, e As EventArgs) Handles chked_2Faktor.CheckedChanged
If FormLoaded = True Then
If chked_2Faktor.Checked = True Then
chkUseAccessCode.Checked = True
chkUseAccessCode.Enabled = False
Else
chkUseAccessCode.Enabled = True
End If
End If
End Sub
End Class End Class

View File

@@ -65,7 +65,7 @@ Partial Class frmMain
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
Me.RibbonPageEnvelopeActions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageEnvelopeActions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonPageFunctions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup2 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage()
Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonStatusBar = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() Me.RibbonStatusBar = New DevExpress.XtraBars.Ribbon.RibbonStatusBar()
@@ -85,20 +85,8 @@ Partial Class frmMain
Me.GridColumn4 = New DevExpress.XtraGrid.Columns.GridColumn() Me.GridColumn4 = New DevExpress.XtraGrid.Columns.GridColumn()
Me.GridColumn5 = New DevExpress.XtraGrid.Columns.GridColumn() Me.GridColumn5 = New DevExpress.XtraGrid.Columns.GridColumn()
Me.GridColumn7 = New DevExpress.XtraGrid.Columns.GridColumn() Me.GridColumn7 = New DevExpress.XtraGrid.Columns.GridColumn()
Me.XtraTabPageAdmin = New DevExpress.XtraTab.XtraTabPage()
Me.GridControlData = New DevExpress.XtraGrid.GridControl()
Me.GridViewData = New DevExpress.XtraGrid.Views.Grid.GridView()
Me.PanelControl1 = New DevExpress.XtraEditors.PanelControl()
Me.GroupControl1 = New DevExpress.XtraEditors.GroupControl()
Me.btnEnvelopes_All = New DevExpress.XtraEditors.SimpleButton()
Me.btnEnvelopes_thisYear = New DevExpress.XtraEditors.SimpleButton()
Me.btnEnvelopes_lastmonth = New DevExpress.XtraEditors.SimpleButton()
Me.btnEnvelopes_thismonth = New DevExpress.XtraEditors.SimpleButton()
Me.RefreshTimer = New System.Windows.Forms.Timer(Me.components) Me.RefreshTimer = New System.Windows.Forms.Timer(Me.components)
Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog() Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog()
Me.GroupControl2 = New DevExpress.XtraEditors.GroupControl()
Me.SplitContainerControl2 = New DevExpress.XtraEditors.SplitContainerControl()
Me.ChartControl1 = New DevExpress.XtraCharts.ChartControl()
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainerControl1.Panel1.SuspendLayout() Me.SplitContainerControl1.Panel1.SuspendLayout()
@@ -117,21 +105,6 @@ Partial Class frmMain
CType(Me.ViewReceiversCompleted, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.ViewReceiversCompleted, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.ViewHistoryCompleted, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.ViewHistoryCompleted, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.ViewCompleted, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.ViewCompleted, System.ComponentModel.ISupportInitialize).BeginInit()
Me.XtraTabPageAdmin.SuspendLayout()
CType(Me.GridControlData, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.GridViewData, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.PanelControl1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.PanelControl1.SuspendLayout()
CType(Me.GroupControl1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.GroupControl1.SuspendLayout()
CType(Me.GroupControl2, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.SplitContainerControl2, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.SplitContainerControl2.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainerControl2.Panel1.SuspendLayout()
CType(Me.SplitContainerControl2.Panel2, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainerControl2.Panel2.SuspendLayout()
Me.SplitContainerControl2.SuspendLayout()
CType(Me.ChartControl1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout() Me.SuspendLayout()
' '
'SplashScreenManager1 'SplashScreenManager1
@@ -161,7 +134,7 @@ Partial Class frmMain
resources.ApplyResources(Me.XtraTabControlMain, "XtraTabControlMain") resources.ApplyResources(Me.XtraTabControlMain, "XtraTabControlMain")
Me.XtraTabControlMain.Name = "XtraTabControlMain" Me.XtraTabControlMain.Name = "XtraTabControlMain"
Me.XtraTabControlMain.SelectedTabPage = Me.XtraTabPage1 Me.XtraTabControlMain.SelectedTabPage = Me.XtraTabPage1
Me.XtraTabControlMain.TabPages.AddRange(New DevExpress.XtraTab.XtraTabPage() {Me.XtraTabPage1, Me.XtraTabPage2, Me.XtraTabPageAdmin}) Me.XtraTabControlMain.TabPages.AddRange(New DevExpress.XtraTab.XtraTabPage() {Me.XtraTabPage1, Me.XtraTabPage2})
' '
'XtraTabPage1 'XtraTabPage1
' '
@@ -453,7 +426,7 @@ Partial Class frmMain
' '
'RibbonPage1 'RibbonPage1
' '
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageEnvelopeActions, Me.RibbonPageGroup1, Me.RibbonPageFunctions}) Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageEnvelopeActions, Me.RibbonPageGroup1, Me.RibbonPageGroup2})
Me.RibbonPage1.Name = "RibbonPage1" Me.RibbonPage1.Name = "RibbonPage1"
resources.ApplyResources(Me.RibbonPage1, "RibbonPage1") resources.ApplyResources(Me.RibbonPage1, "RibbonPage1")
' '
@@ -472,15 +445,15 @@ Partial Class frmMain
Me.RibbonPageGroup1.Name = "RibbonPageGroup1" Me.RibbonPageGroup1.Name = "RibbonPageGroup1"
resources.ApplyResources(Me.RibbonPageGroup1, "RibbonPageGroup1") resources.ApplyResources(Me.RibbonPageGroup1, "RibbonPageGroup1")
' '
'RibbonPageFunctions 'RibbonPageGroup2
' '
Me.RibbonPageFunctions.ItemLinks.Add(Me.btnShowDocument) Me.RibbonPageGroup2.ItemLinks.Add(Me.btnShowDocument)
Me.RibbonPageFunctions.ItemLinks.Add(Me.btnContactReceiver) Me.RibbonPageGroup2.ItemLinks.Add(Me.btnContactReceiver)
Me.RibbonPageFunctions.ItemLinks.Add(Me.bbtnitmInfoMail) Me.RibbonPageGroup2.ItemLinks.Add(Me.bbtnitmInfoMail)
Me.RibbonPageFunctions.ItemLinks.Add(Me.bbtnitmEB) Me.RibbonPageGroup2.ItemLinks.Add(Me.bbtnitmEB)
Me.RibbonPageFunctions.ItemLinks.Add(Me.BarButtonItem2) Me.RibbonPageGroup2.ItemLinks.Add(Me.BarButtonItem2)
Me.RibbonPageFunctions.Name = "RibbonPageFunctions" Me.RibbonPageGroup2.Name = "RibbonPageGroup2"
resources.ApplyResources(Me.RibbonPageFunctions, "RibbonPageFunctions") resources.ApplyResources(Me.RibbonPageGroup2, "RibbonPageGroup2")
' '
'RibbonPage2 'RibbonPage2
' '
@@ -633,70 +606,6 @@ Partial Class frmMain
Me.GridColumn7.FieldName = "AddedWhen" Me.GridColumn7.FieldName = "AddedWhen"
Me.GridColumn7.Name = "GridColumn7" Me.GridColumn7.Name = "GridColumn7"
' '
'XtraTabPageAdmin
'
Me.XtraTabPageAdmin.Controls.Add(Me.SplitContainerControl2)
Me.XtraTabPageAdmin.Controls.Add(Me.PanelControl1)
Me.XtraTabPageAdmin.Name = "XtraTabPageAdmin"
resources.ApplyResources(Me.XtraTabPageAdmin, "XtraTabPageAdmin")
'
'GridControlData
'
resources.ApplyResources(Me.GridControlData, "GridControlData")
Me.GridControlData.MainView = Me.GridViewData
Me.GridControlData.MenuManager = Me.RibbonControl
Me.GridControlData.Name = "GridControlData"
Me.GridControlData.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridViewData})
'
'GridViewData
'
Me.GridViewData.GridControl = Me.GridControlData
Me.GridViewData.Name = "GridViewData"
'
'PanelControl1
'
Me.PanelControl1.Controls.Add(Me.GroupControl2)
Me.PanelControl1.Controls.Add(Me.GroupControl1)
resources.ApplyResources(Me.PanelControl1, "PanelControl1")
Me.PanelControl1.Name = "PanelControl1"
'
'GroupControl1
'
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_All)
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_thisYear)
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_lastmonth)
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_thismonth)
resources.ApplyResources(Me.GroupControl1, "GroupControl1")
Me.GroupControl1.Name = "GroupControl1"
'
'btnEnvelopes_All
'
Me.btnEnvelopes_All.Appearance.BackColor = System.Drawing.Color.MediumTurquoise
Me.btnEnvelopes_All.Appearance.Options.UseBackColor = True
resources.ApplyResources(Me.btnEnvelopes_All, "btnEnvelopes_All")
Me.btnEnvelopes_All.Name = "btnEnvelopes_All"
'
'btnEnvelopes_thisYear
'
Me.btnEnvelopes_thisYear.Appearance.BackColor = System.Drawing.Color.LightSeaGreen
Me.btnEnvelopes_thisYear.Appearance.Options.UseBackColor = True
resources.ApplyResources(Me.btnEnvelopes_thisYear, "btnEnvelopes_thisYear")
Me.btnEnvelopes_thisYear.Name = "btnEnvelopes_thisYear"
'
'btnEnvelopes_lastmonth
'
Me.btnEnvelopes_lastmonth.Appearance.BackColor = System.Drawing.Color.Turquoise
Me.btnEnvelopes_lastmonth.Appearance.Options.UseBackColor = True
resources.ApplyResources(Me.btnEnvelopes_lastmonth, "btnEnvelopes_lastmonth")
Me.btnEnvelopes_lastmonth.Name = "btnEnvelopes_lastmonth"
'
'btnEnvelopes_thismonth
'
Me.btnEnvelopes_thismonth.Appearance.BackColor = System.Drawing.Color.Aquamarine
Me.btnEnvelopes_thismonth.Appearance.Options.UseBackColor = True
resources.ApplyResources(Me.btnEnvelopes_thismonth, "btnEnvelopes_thismonth")
Me.btnEnvelopes_thismonth.Name = "btnEnvelopes_thismonth"
'
'RefreshTimer 'RefreshTimer
' '
Me.RefreshTimer.Interval = 120000 Me.RefreshTimer.Interval = 120000
@@ -705,33 +614,6 @@ Partial Class frmMain
' '
resources.ApplyResources(Me.SaveFileDialog1, "SaveFileDialog1") resources.ApplyResources(Me.SaveFileDialog1, "SaveFileDialog1")
' '
'GroupControl2
'
resources.ApplyResources(Me.GroupControl2, "GroupControl2")
Me.GroupControl2.Name = "GroupControl2"
'
'SplitContainerControl2
'
resources.ApplyResources(Me.SplitContainerControl2, "SplitContainerControl2")
Me.SplitContainerControl2.Name = "SplitContainerControl2"
'
'SplitContainerControl2.Panel1
'
Me.SplitContainerControl2.Panel1.Controls.Add(Me.GridControlData)
resources.ApplyResources(Me.SplitContainerControl2.Panel1, "SplitContainerControl2.Panel1")
'
'SplitContainerControl2.Panel2
'
Me.SplitContainerControl2.Panel2.Controls.Add(Me.ChartControl1)
resources.ApplyResources(Me.SplitContainerControl2.Panel2, "SplitContainerControl2.Panel2")
Me.SplitContainerControl2.SplitterPosition = 501
'
'ChartControl1
'
resources.ApplyResources(Me.ChartControl1, "ChartControl1")
Me.ChartControl1.Name = "ChartControl1"
Me.ChartControl1.SeriesSerializable = New DevExpress.XtraCharts.Series(-1) {}
'
'frmMain 'frmMain
' '
resources.ApplyResources(Me, "$this") resources.ApplyResources(Me, "$this")
@@ -761,21 +643,6 @@ Partial Class frmMain
CType(Me.ViewReceiversCompleted, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.ViewReceiversCompleted, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.ViewHistoryCompleted, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.ViewHistoryCompleted, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.ViewCompleted, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.ViewCompleted, System.ComponentModel.ISupportInitialize).EndInit()
Me.XtraTabPageAdmin.ResumeLayout(False)
CType(Me.GridControlData, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.GridViewData, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.PanelControl1, System.ComponentModel.ISupportInitialize).EndInit()
Me.PanelControl1.ResumeLayout(False)
CType(Me.GroupControl1, System.ComponentModel.ISupportInitialize).EndInit()
Me.GroupControl1.ResumeLayout(False)
CType(Me.GroupControl2, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.SplitContainerControl2.Panel1, System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainerControl2.Panel1.ResumeLayout(False)
CType(Me.SplitContainerControl2.Panel2, System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainerControl2.Panel2.ResumeLayout(False)
CType(Me.SplitContainerControl2, System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainerControl2.ResumeLayout(False)
CType(Me.ChartControl1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False) Me.ResumeLayout(False)
Me.PerformLayout() Me.PerformLayout()
@@ -825,7 +692,7 @@ Partial Class frmMain
Friend WithEvents txtRefreshLabel As DevExpress.XtraBars.BarStaticItem Friend WithEvents txtRefreshLabel As DevExpress.XtraBars.BarStaticItem
Friend WithEvents btnShowDocument As DevExpress.XtraBars.BarButtonItem Friend WithEvents btnShowDocument As DevExpress.XtraBars.BarButtonItem
Friend WithEvents btnContactReceiver As DevExpress.XtraBars.BarButtonItem Friend WithEvents btnContactReceiver As DevExpress.XtraBars.BarButtonItem
Friend WithEvents RibbonPageFunctions As DevExpress.XtraBars.Ribbon.RibbonPageGroup Friend WithEvents RibbonPageGroup2 As DevExpress.XtraBars.Ribbon.RibbonPageGroup
Friend WithEvents colEnvelopeId As DevExpress.XtraGrid.Columns.GridColumn Friend WithEvents colEnvelopeId As DevExpress.XtraGrid.Columns.GridColumn
Friend WithEvents ViewHistoryCompleted As DevExpress.XtraGrid.Views.Grid.GridView Friend WithEvents ViewHistoryCompleted As DevExpress.XtraGrid.Views.Grid.GridView
Friend WithEvents ColHistoryStatusCompleted As DevExpress.XtraGrid.Columns.GridColumn Friend WithEvents ColHistoryStatusCompleted As DevExpress.XtraGrid.Columns.GridColumn
@@ -842,16 +709,4 @@ Partial Class frmMain
Friend WithEvents bbtnitmEB As DevExpress.XtraBars.BarButtonItem Friend WithEvents bbtnitmEB As DevExpress.XtraBars.BarButtonItem
Friend WithEvents bbtnitmInfoMail As DevExpress.XtraBars.BarButtonItem Friend WithEvents bbtnitmInfoMail As DevExpress.XtraBars.BarButtonItem
Friend WithEvents BarButtonItem2 As DevExpress.XtraBars.BarButtonItem Friend WithEvents BarButtonItem2 As DevExpress.XtraBars.BarButtonItem
Friend WithEvents XtraTabPageAdmin As DevExpress.XtraTab.XtraTabPage
Friend WithEvents PanelControl1 As DevExpress.XtraEditors.PanelControl
Friend WithEvents GroupControl1 As DevExpress.XtraEditors.GroupControl
Friend WithEvents btnEnvelopes_thisYear As DevExpress.XtraEditors.SimpleButton
Friend WithEvents btnEnvelopes_lastmonth As DevExpress.XtraEditors.SimpleButton
Friend WithEvents btnEnvelopes_thismonth As DevExpress.XtraEditors.SimpleButton
Friend WithEvents btnEnvelopes_All As DevExpress.XtraEditors.SimpleButton
Friend WithEvents GridControlData As DevExpress.XtraGrid.GridControl
Friend WithEvents GridViewData As DevExpress.XtraGrid.Views.Grid.GridView
Friend WithEvents GroupControl2 As DevExpress.XtraEditors.GroupControl
Friend WithEvents SplitContainerControl2 As DevExpress.XtraEditors.SplitContainerControl
Friend WithEvents ChartControl1 As DevExpress.XtraCharts.ChartControl
End Class End Class

View File

@@ -764,7 +764,7 @@
<data name="RibbonPageGroup1.Text" xml:space="preserve"> <data name="RibbonPageGroup1.Text" xml:space="preserve">
<value>Daten</value> <value>Daten</value>
</data> </data>
<data name="RibbonPageFunctions.Text" xml:space="preserve"> <data name="RibbonPageGroup2.Text" xml:space="preserve">
<value>Funktionen</value> <value>Funktionen</value>
</data> </data>
<data name="RibbonPage1.Text" xml:space="preserve"> <data name="RibbonPage1.Text" xml:space="preserve">
@@ -1025,291 +1025,6 @@
<data name="&gt;&gt;XtraTabPage2.ZOrder" xml:space="preserve"> <data name="&gt;&gt;XtraTabPage2.ZOrder" xml:space="preserve">
<value>1</value> <value>1</value>
</data> </data>
<data name="SplitContainerControl2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="SplitContainerControl2.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 79</value>
</data>
<data name="GridControlData.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="GridControlData.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="GridControlData.Size" type="System.Drawing.Size, System.Drawing">
<value>501, 388</value>
</data>
<data name="GridControlData.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;GridControlData.Name" xml:space="preserve">
<value>GridControlData</value>
</data>
<data name="&gt;&gt;GridControlData.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;GridControlData.Parent" xml:space="preserve">
<value>SplitContainerControl2.Panel1</value>
</data>
<data name="&gt;&gt;GridControlData.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="SplitContainerControl2.Panel1.Text" xml:space="preserve">
<value>Panel1</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Panel1.Name" xml:space="preserve">
<value>SplitContainerControl2.Panel1</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Panel1.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.SplitGroupPanel, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Panel1.Parent" xml:space="preserve">
<value>SplitContainerControl2</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Panel1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="ChartControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>17, 6</value>
</data>
<data name="ChartControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 200</value>
</data>
<data name="ChartControl1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;ChartControl1.Name" xml:space="preserve">
<value>ChartControl1</value>
</data>
<data name="&gt;&gt;ChartControl1.Type" xml:space="preserve">
<value>DevExpress.XtraCharts.ChartControl, DevExpress.XtraCharts.v21.2.UI, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;ChartControl1.Parent" xml:space="preserve">
<value>SplitContainerControl2.Panel2</value>
</data>
<data name="&gt;&gt;ChartControl1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="SplitContainerControl2.Panel2.Text" xml:space="preserve">
<value>Panel2</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Panel2.Name" xml:space="preserve">
<value>SplitContainerControl2.Panel2</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Panel2.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.SplitGroupPanel, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Panel2.Parent" xml:space="preserve">
<value>SplitContainerControl2</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Panel2.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="SplitContainerControl2.Size" type="System.Drawing.Size, System.Drawing">
<value>1088, 388</value>
</data>
<data name="SplitContainerControl2.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Name" xml:space="preserve">
<value>SplitContainerControl2</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.SplitContainerControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.Parent" xml:space="preserve">
<value>XtraTabPageAdmin</value>
</data>
<data name="&gt;&gt;SplitContainerControl2.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="GroupControl2.Location" type="System.Drawing.Point, System.Drawing">
<value>496, 5</value>
</data>
<data name="GroupControl2.Size" type="System.Drawing.Size, System.Drawing">
<value>427, 68</value>
</data>
<data name="GroupControl2.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="GroupControl2.Text" xml:space="preserve">
<value>Diagramme</value>
</data>
<data name="&gt;&gt;GroupControl2.Name" xml:space="preserve">
<value>GroupControl2</value>
</data>
<data name="&gt;&gt;GroupControl2.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.GroupControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;GroupControl2.Parent" xml:space="preserve">
<value>PanelControl1</value>
</data>
<data name="&gt;&gt;GroupControl2.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="btnEnvelopes_All.Location" type="System.Drawing.Point, System.Drawing">
<value>339, 26</value>
</data>
<data name="btnEnvelopes_All.Size" type="System.Drawing.Size, System.Drawing">
<value>104, 35</value>
</data>
<data name="btnEnvelopes_All.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="btnEnvelopes_All.Text" xml:space="preserve">
<value>Insgesamt</value>
</data>
<data name="&gt;&gt;btnEnvelopes_All.Name" xml:space="preserve">
<value>btnEnvelopes_All</value>
</data>
<data name="&gt;&gt;btnEnvelopes_All.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.SimpleButton, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;btnEnvelopes_All.Parent" xml:space="preserve">
<value>GroupControl1</value>
</data>
<data name="&gt;&gt;btnEnvelopes_All.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="btnEnvelopes_thisYear.Location" type="System.Drawing.Point, System.Drawing">
<value>229, 26</value>
</data>
<data name="btnEnvelopes_thisYear.Size" type="System.Drawing.Size, System.Drawing">
<value>104, 35</value>
</data>
<data name="btnEnvelopes_thisYear.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="btnEnvelopes_thisYear.Text" xml:space="preserve">
<value>Dieses Jahr</value>
</data>
<data name="&gt;&gt;btnEnvelopes_thisYear.Name" xml:space="preserve">
<value>btnEnvelopes_thisYear</value>
</data>
<data name="&gt;&gt;btnEnvelopes_thisYear.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.SimpleButton, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;btnEnvelopes_thisYear.Parent" xml:space="preserve">
<value>GroupControl1</value>
</data>
<data name="&gt;&gt;btnEnvelopes_thisYear.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="btnEnvelopes_lastmonth.Location" type="System.Drawing.Point, System.Drawing">
<value>119, 26</value>
</data>
<data name="btnEnvelopes_lastmonth.Size" type="System.Drawing.Size, System.Drawing">
<value>104, 35</value>
</data>
<data name="btnEnvelopes_lastmonth.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="btnEnvelopes_lastmonth.Text" xml:space="preserve">
<value>Letzten Monat</value>
</data>
<data name="&gt;&gt;btnEnvelopes_lastmonth.Name" xml:space="preserve">
<value>btnEnvelopes_lastmonth</value>
</data>
<data name="&gt;&gt;btnEnvelopes_lastmonth.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.SimpleButton, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;btnEnvelopes_lastmonth.Parent" xml:space="preserve">
<value>GroupControl1</value>
</data>
<data name="&gt;&gt;btnEnvelopes_lastmonth.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="btnEnvelopes_thismonth.Location" type="System.Drawing.Point, System.Drawing">
<value>9, 26</value>
</data>
<data name="btnEnvelopes_thismonth.Size" type="System.Drawing.Size, System.Drawing">
<value>104, 35</value>
</data>
<data name="btnEnvelopes_thismonth.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="btnEnvelopes_thismonth.Text" xml:space="preserve">
<value>Diesen Monat</value>
</data>
<data name="&gt;&gt;btnEnvelopes_thismonth.Name" xml:space="preserve">
<value>btnEnvelopes_thismonth</value>
</data>
<data name="&gt;&gt;btnEnvelopes_thismonth.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.SimpleButton, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;btnEnvelopes_thismonth.Parent" xml:space="preserve">
<value>GroupControl1</value>
</data>
<data name="&gt;&gt;btnEnvelopes_thismonth.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="GroupControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>11, 5</value>
</data>
<data name="GroupControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>453, 68</value>
</data>
<data name="GroupControl1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="GroupControl1.Text" xml:space="preserve">
<value>Umschläge pro User</value>
</data>
<data name="&gt;&gt;GroupControl1.Name" xml:space="preserve">
<value>GroupControl1</value>
</data>
<data name="&gt;&gt;GroupControl1.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.GroupControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;GroupControl1.Parent" xml:space="preserve">
<value>PanelControl1</value>
</data>
<data name="&gt;&gt;GroupControl1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="PanelControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="PanelControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="PanelControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>1088, 79</value>
</data>
<data name="PanelControl1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;PanelControl1.Name" xml:space="preserve">
<value>PanelControl1</value>
</data>
<data name="&gt;&gt;PanelControl1.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.PanelControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;PanelControl1.Parent" xml:space="preserve">
<value>XtraTabPageAdmin</value>
</data>
<data name="&gt;&gt;PanelControl1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="XtraTabPageAdmin.Size" type="System.Drawing.Size, System.Drawing">
<value>1088, 467</value>
</data>
<data name="XtraTabPageAdmin.Text" xml:space="preserve">
<value>Auswertungen (Admin)</value>
</data>
<data name="&gt;&gt;XtraTabPageAdmin.Name" xml:space="preserve">
<value>XtraTabPageAdmin</value>
</data>
<data name="&gt;&gt;XtraTabPageAdmin.Type" xml:space="preserve">
<value>DevExpress.XtraTab.XtraTabPage, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;XtraTabPageAdmin.Parent" xml:space="preserve">
<value>XtraTabControlMain</value>
</data>
<data name="&gt;&gt;XtraTabPageAdmin.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;XtraTabControlMain.Name" xml:space="preserve"> <data name="&gt;&gt;XtraTabControlMain.Name" xml:space="preserve">
<value>XtraTabControlMain</value> <value>XtraTabControlMain</value>
</data> </data>
@@ -1383,7 +1098,7 @@
<value>True</value> <value>True</value>
</metadata> </metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>108</value> <value>263</value>
</metadata> </metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing"> <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value> <value>6, 13</value>
@@ -1393,83 +1108,83 @@
</data> </data>
<data name="frmMain.IconOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="frmMain.IconOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
DQAACw0B7QfALAAAEYBJREFUeF7t3b+uHEkVx/F9BD8ED7DmBfAD8ACEDsjZnMQJuXMSJxsRICJEgGRB YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAABGASURBVHhe7d2/rhxJFcfxfQQ/BA+w5gXwA/AAhA7I2ZzE
QgJaCQmJCAdEJGxCQnKpnz1t+rbPzPR016k6p+obfKR1773Tf6brdNU5VX2/enp6CunbH7x8Ubwq3hTv CblzEicbESAiRIBkQUICWgkJiQgHRCRsQkJyqZ89bfq2z8z0dNepOqfqG3ykde+903+m63TVOVV9v3p6
ivfFh+IJCEz3qO5V3bO6d3UPv7Du8QjMjT3oIhWvC104GjpGo3ta97bu8TABwdzYii5E8U3xXWFdNGBU egrp2x+8fFG8Kt4U74r3xYfiCQhM96juVd2zund1D7+w7vEIzI096CIVrwtdOBo6RqN7Wve27vEwAcHc
uue7BwNzo7dy0uoWKRpaFwaYjdrCK6uteDM3eiknqYhH9x6wqW28ttqOF3NjbTqpy8lZJw3guWaBwNxY 2IouRPFN8V1hXTRgVLrnuwcDc6O3ctLqFikaWhcGmI3awiurrXgzN3opJ6mIR/cesKltvLbajhdzY206
SzmJrwtlRK2TBHCb2s7XVtuqxdx4VjloJffeXk4CwDlqSy7JQnPjGeVAleCjuw/UpTZVPVFobjyqHKAm qcvJWScN4LlmgcDcWEs5ia8LZUStkwRwm9rO11bbqsXceFY5aCX33l5OAsA5aksuyUJz4xnlQJXgo7sP
PlgHD6CON1bbO8rc+KhyUOryM9YH2lBbqzIkMDc+ohyIEn10+YG21OZOJwjNjXvpAIrvLwcEoC21vVNB 1KU2VT1RaG48qhygJj5YBw+gjjdW2zvK3PioclDq8jPWB9pQW6syJDA3PqIciBJ9dPmBttTmTicIzY17
wNy4h3Z8OQDrwAC0cSoImBvv0Q4vO7YOCEBbh4OAufEW7eiyQ+tAAPRxKAiYG6/RDi47sg4AQF8PBwFz 6QCK7y8HBKAttb1TQcDcuId2fDkA68AAtHEqCJgb79EOLzu2DghAW4eDgLnxFu3oskPrQAD0cSgImBuv
o6V8sEp9ZPuB2NRGd5cIzY2W8qHU+YEc3ltt2GJu3CofyAw/IJddMwbNjWvlgzS339oBgNjurh0wNy7K 0Q4uO7IOAEBfDwcBc6OlfLBKfWT7gdjURneXCM2NlvKh1PmBHN5bbdhibtwqH8gMPyCXXTMGzY1r5YM0
BzDuB/K6mw8wNy7KL7OkF8jtrdW2F+ZGKb+okp/1gQByuVoaNDdK+SWy/sAYrlYFzI3lF/QOP+uDAORk t9/aAYDY7q4dMDcuygcw7gfyupsPMDcuyi+zpBfI7a3VthfmRim/qJKf9YEAcrlaGjQ3Svklsv7AGK5W
vmPwiw1SfpjEHzCWD1Zb/2JD+UGe/sCYvugFPPuHlB/i6Q+M6YtewLN/lB9g0g8wtmeTg7YBgD/XBYzt BcyN5Rf0Dj/rgwDkZL5j8IsNUn6YxB8wlg9WW/9iQ/lBnv7AmL7oBTz7h5Qf4ukPjOmLXsCzf5QfYNIP
3brNrxu/Zv1ZvwBgLJ9nB64DAMk/YA6fk4HrAMCf6Abm8N2zAFA20P0H5vJxGLAEALr/wFw+DgOWAED2 MLZnk4O2AYA/1wWM7d26za8bv2b9Wb8AYCyfZweuAwDJP2AOn5OB6wDAn+gG5vDdswBQNtD9B+bycRiw
H5jLx2rAEgCY/APM5eOkIMb/wLxeKAAw+w+Y0ysFAF74CczpDQlAYF7vFAB48w8wp/cKAFQAgvjNj14+ BAC6/8BcPg4DlgBA9h+Yy8dqwBIAmPwDzOXjpCDG/8C8XigAMPsPmNMrBQBe+AnM6Q0JQGBe7xQAePMP
/f4nY9M5WueOLj4oAFj/Aw396ocvn/76i5dPT3+bg85V52xdC7RFAOhMT8X//NFuKCPTOevcrWuCdggA MKf3CgBUAIL4zY9ePv3+J2PTOVrnji4+KABY/wMN/eqHL5/++ouXT09/m4POVedsXQu0RQDoTE/F//zR
negJ+I9f2o1jJroG9Ab6IQB08Iefvnz675/tBjEjXQtdE+tawRcBoCElwP71a7sR4NO1IUnYFgGgkb/8 bigj0znr3K1rgnYIAJ3oCfiPX9qNYya6BvQG+iEAdPCHn758+u+f7QYxI10LXRPrWsEXAaAhJcD+9Wu7
nKf+HrpGulbWNUR9BABnv/3xy6d//86+2XGdrpmunXVNUQ8BwMlspT0vlAx9EQAczFra80LJ0A8BoCJK EeDTtSFJ2BYBoJG//Jyn/h66RrpW1jVEfQQAZ7/98cunf//Ovtlxna6Zrp11TVEPAcDJbKU9L5QMfREA
e74oGdZHAKiE0l4blAzrIgCcRGmvD0qGdRAATqC01xclw/MIAAdQ2ouFkuFxBIAHUdqLS9+N9Z3hOgLA HMxa2vNCydAPAaAiSnu+KBnWRwCohNJeG5QM6yIAnERprw9KhnUQAE6gtNcXJcPzCAAHUNqLhZLhcQSA
TpT2cqBk+BgCwB0qO/39rX2zIS59Z5QM7yMA3EBpLzdKhvcRAAwqL/3zW/umQj76LikZ2ggAG5T2xkTJ B1Hai0vfjfWd4ToCwE6U9nKgZPgYAsAdKjv9/a19syEufWeUDO8jANxAaS83Sob3EQAMKi/981v7pkI+
0EYAuFAZKfKEHh1bJtY5RKBjo2T4fwSAInJpL2uNO/pcCUqGn0wdACKX9kbpskYeUlEynDQARC/tqZs6 +i4pGdoIABuU9sZEydBGALhQGSnyhB4dWybWOUSgY6Nk+H8EgCJyaS9rjTv6XAlKhp9MHQAil/ZG6bJG
UtIq+nqJmUuG0wWAyKU9HdfIZSuufTzTBIDopb1Z1rrrHCO/M2G2kuEUAYBxaDzkX2IYOgBEL+3N/r47 HlJRMpw0AEQv7ambOlLSKvp6iZlLhtMFgMilPR3XyGUrrn080wSA6KW9Wda66xwjvzNhtpLhFAGAcWg8
nXvkCswMJcNhA0DkG0t0c1nHPaPIQVpGLhkOFwAidy23qEXHD9SLUYdqwwQAdSczrtqbeVaazt26JpGN 5F9iGDoARC/tzf6+O5175ArMDCXDYQNA5BtLdHNZxz2jyEFaRi4ZDhcAInctt6hFxw/Ui1GHasMEAHUn
VjIcIgBELi/doyfLjHkAnXOWntrWSCXD1AEgemlvL52DdX4jG+V7y14yTBsAIpf2jvjTz+zzHJHO1boG M67am3lWms7duiaRjVYyHCIARC4v3aMny4x5AJ1zlp7a1kglw9QBIHppby+dg3V+Ixvle8teMkwbACKX
GWUvGaYLANGnlR6lG2mGCSg6x5EC90L3ZMbvL1UAyJIxPkqr56zzHsnob1POVtlJEQCiLy2taeTS4OgB 9o7408/s8xyRztW6BhllLxmmCwDRp5UepRtphgkoOseRAvdC92TG7y9VAMiSMT5Kq+es8x7J6G9TzlbZ
fJFpCXeKAKCulXWhRzVivVnnZJ3rqLIMB9IMAUbIGu81Wmkwc8nviExVnTQBQHVX62KPaqTS4EzBWzLN SREAoi8trWnk0uDoAXyRaQl3igCgrpV1oUc1Yr1Z52Sd66iyDAfSDAFGyBrvNVppMHPJ74hMVZ00AUB1
EUiVBOyZPV6mgracvTZCabBlyU/fTe+p4LpHresQVaoA0Guq73b6Z6tkVvbSYMuS3zp5qu+q572yvgbR V+tij2qk0uBMwVsyzRFIlQTsmT1epoK2nL02QmmwZclP303vqeC6R63rEFWqANBrqu92+merZFb20mDL
pQoArZOBt7K5reYiZC4NtqrcXFtZ2aN6lC1gpwoA0uIL1VPrXjmu19Mti0i9JB1Li+8qY7BOFwC8x5SP kt86earvque9sr4G0aUKAK2Tgbeyua3mImQuDbaq3FxbWdmjepQtYKcKANLiC9VT6145rtfTLYtIvSQd
zOhqmZjMVBpsWfLbm3DTd+rda8uYs0kXADS+84rmRyJ4q/fbZSkNtiz56dpbx3CLVw9S92SG72crXQAQ S4vvKmOwThcAvMeUj8zoapmYzFQabFny25tw03fq3WvLmLNJFwA0vvOK5kcieKv322UpDbYs+enaW8dw
z0b36JfY8obPUBpsVfI7EhD189Zn1XAkGEWQMgB4djGPrOyiNPhJ65KfdQy36Lu1PquGTEO0tZQBQLye i1cPUvdkhu9nK10AEM9G9+iX2PKGz1AabFXyOxIQ9fPWZ9VwJBhFkDIAeHYxj6zsojT4SeuSn3UMt+i7
uvpca3/3eN5ca+pqHrn5vemYWiTa5Ojy22j3TARpA4BnlvloA5u5NNiiOiPXSn73ePbSMlZpFmkDgLK6 tT6rhkxDtLWUAUC8nrr6XGt/93jeXGvqah65+b3pmFok2uTo8tto90wEaQOAZ5b5aAObuTTYojoj10p+
1pdRw9HxnMaYrZ6CkSactJp0cybR5pk32ls1iihtABCvhNOZG2220mDEkt+WZ2DOvmYjdQDwTDqdSbZl 93j20jJWaRZpA4CyutaXUcPR8ZzGmK2egpEmnLSadHMm0eaZN9pbNYoobQAQr4TTmRttttJgxJLflmdg
eCLWkKXHE/U+iSB1ABCvG/DoWFPUMFqNiXs+gVqV/HQtzwQ6r9yM7j1rf5mkDwCeT9szYzvPpNNWj5dS zr5mI3UA8Ew6nUm2ZXgi1pClxxP1PokgdQAQrxvw6FhT1DBajYl7PoFalfx0Lc8EOq/cjO49a3+ZpA8A
tqp6yJmqh2euKFIe5qj0AcCzoZ39gkctDWpfrbr+Z4Ob5wOi5TX3kj4AiFd3u0Z9d8TSYPSS35pX7b/l nk/bM2M7z6TTVo+XUraqesiZqodnrihSHuao9AHAs6Gd/YJHLQ1qX626/meDm+cDouU195I+AIhXd7tG
9fY0RADwTPKcfbtLlkTZXp5P1DVds7MJTs+KTPbk32KIAKAbxfqSaqiRZBulNJih5LfmmaQ8G5yiGCIA fXfE0mD0kt+aV+2/5fX2NEQA8EzynH27S5ZE2V6eT9Q1XbOzCU7Pikz25N9iiACgG8X6kmqokWQbpTSY
SKQFQpZMT06LPjNTT8bzoZB14Y9lmADg+XSqkWXXDdlq7OxRGsxS8lt4JmAjTMCqZZgAINEXe3hWLLZq oeS35pmkPBucohgiAEikBUKWTE9Oiz4zU0/G86GQdeGPZZgA4Pl0qpFl1w3ZauzsURrMUvJbeCZgI0zA
BK1Fq2qG1MqsR78XohgqAERcILTVqjGpu17jmPUZrbr+tYKWZ6DNvPDHMlQAiLhAyJKpNJip5Ldg4c9+ qmWYACDRF3t4Viy2agStRatqhtTKrEe/F6IYKgBEXCC01aoxqbte45j1Ga26/rWClmegzbzwxzJUAIi4
QwUA8Rqr1kyuZUmoZUxcel5bj9xKb8MFgCwLP1qWBvV0PcL6LA81Sn6LLN9/FMMFAPF6AqhRWPs7qtUT QMiSqTSYqeS3YOHPfkMFAPEaq9ZMrmVJqGVMXHpeW4/cSm/DBYAsCz9algb1dD3C+iwPNUp+iyzffxTD
NrIaJb81r8Cle8raX3ZDBgDPhlV7DNhqjB1RjRzFGgt/HjdkAMiUBW6ZZY9E51yjSrGWoQoUzZABQLye BQDxegKoUVj7O6rVEzayGiW/Na/ApXvK2l92QwYAz4ZVewzYaowdUY0cxRoLfx43ZADIlAVumWWPROdc
rB514JZ19ihqzlNYeNX+a/dUIhk2AHgmg2omrRatZtpF4JFN90yqjpj8WwwbAFQOsr7MGjzmgrcsDfak o0qxlqEKFM2QAUC8nqwedeCWdfYoas5TWHjV/mv3VCIZNgB4JoNqJq0WrWbaReCRTfdMqo6Y/FsMGwBU
c6xV8luLvhYkqmEDgGS7KVqutuvFYx59tmAfydABwLNb6DGGlZFLg16ZdM8cisdwL5KhA4BkTAyNWBrM DrK+zBo85oK3LA32pHOsVfJbi74WJKphA4BkuylarrbrxWMefbZgH8nQAcCzW+gxhpWRS4NemXTPHIrH
eL1GW/hjGT4AZCwNjVYa9Cj5LfS51j5rGG3hj2X4AJBlgdCaxrRePZcedC5eiTTPPM9oC38swwcAyTY9 cC+SoQOAZEwMjVgazHi9Rlv4Yxk+AGQsDY1WGvQo+S30udY+axht4Y9l+ACQZYHQmsa0Xj2XHnQuXok0
dMSSoNdCGq+eUu1p31FNEQAyLRDxHLL0VrtLnel7jWqKACAZnhSeN3QUNRsWC3/OmyYARB8rjpb4u0bn zzzPaAt/LMMHAMk2PXTEkqDXQhqvnlLtad9RTREAMi0Q8Ryy9Fa7S53pe41qigAgGZ4Unjd0FDUbFgt/
WCMhmDG3E9E0ASBytni0pN89NZKCGas7EU0TACRqvXjEuv89Z+cFeAVMz/kKEU0VACLOGPMcmkR3tKud zpsmAEQfK46W+LtG51gjIZgxtxPRNAEgcrZ4tKTfPTWSghmrOxFNEwAkar14xLr/PWfnBXgFTM/5ChFN
cYZnVFMFgGhzxmdI+t1zJCnoGTS95itENVUAkCg3zwwLf/Z6ZIFQtCCe3XQBIEL3URnsGTL+e+la7K2k FQAizhjzHJpEd7SrnXGGZ1RTBYBoc8ZnSPrdcyQp6Bk0veYrRDVVAJAoN88MC3/2emSBULQgnt10ASBC
sPCnrukCgPRMIOkJ1irpp/0oW35Gy2Pd04PyOp6zidyspgwAurGtm6CGeyUkzyHI2t4GdU/LgHWvCx65 91EZ7Bky/nvpWuytpLDwp67pAoD0TCDpCdYq6af9KFt+Rstj3dOD8jqes4ncrKYMALqxrZughnslJM8h
lJvVlAGg1yQSz8CzVmuyzUKf1WrIcqshegbPGpO5MpoyAEjraaSeuYctj7FshOP3CkKzLPyxTBsAPEtw yNreBnVPy4B1rwseuZSb1ZQBoNckEs/As1Zrss1Cn9VqyHKrIXoGzxqTuTKaMgBI62mknrmHLY+xbITj
29JWyyeoZx3bMwG3ZvVgWn5fM5k2AIhXo1wvfdUY2ivpuNWijNUqh6Frts5heC2RvtZjm8XUAaDFmNJr 9wpCsyz8sUwbADxLcNvSVssnqGcd2zMBt2b1YFp+XzOZNgCIV6NcL33VGNor6bjVoozVKoeha7bOYXgt
qLFVK+l3T8uk4NI175WzmcHUAcA7q9zqaamnWIvGv9C+Wg1pdA17Vm1GN3UAEK+nWasGIj1uYs/gueV1 kb7WY5vF1AGgxZjSa6ixVSvpd0/LpODSNe+Vs5nB1AHAO6vc6mmpp1iLxr/QvloNaXQNe1ZtRjd1ABCv
LfXdW+c2k+kDQKvElpeeCSzPxFwLngnTLKYPAOrOWjdHBhHGr62GOR5aDpuimj4ASMaXcEaqXbdKdNbk p1mrBiI9bmLP4LnldS313VvnNpPpA0CrxJaXngksz8RcC54J0yymDwDqzlo3RwYRxq+thjkeWg6bopo+
9ZLSbAgARctJLjVsS2S96VhalTpr8ZgslREB4CLLDayEWMTMtY6pZeLzDH3X1jnMiABwkeVv8kV+cmXp AEjGl3BGql23SnTW5PWS0mwIAEXLSS41bEtkvelYWpU6a/GYLJURAeAiyw2shFjEzLWOqWXi8wx919Y5
SXn9jcKMCAAXnpNNasmwYq3VgqczZl34YyEArEROZmWasRa5MhApeRoBAWAlal271TTfWnSsraYLP2rm zIgAcJHlb/JFfnJl6Ul5/Y3CjAgAF56TTWrJsGKt1YKnM2Zd+GMhAKxETmZlmrEWuTIQKXkaAQFgJWpd
hT8WAsCKbtxoiSwdT8Yuq4454rXMFEhbIABsROu+PvLCzGiivfg00zCqFQLARss57veM0F2NNKyKWD7t u9U031p0rK2mCz9q5oU/FgLAim7caIksHU/GLquOOeK1zBRIWyAAbETrvj7ywsxoor34NNMwqhUCwEbL
jQBgiDAnYKSnVYReFbV/GwHA0HuB0Iir1HonBVn4YyMAGJQosm6iFvSkGjFRpXPq2bMi+WcjAFzRY4GQ Oe73jNBdjTSsilg+7Y0AYIgwJ2Ckp1WEXhW1fxsBwNB7gdCIq9R6JwVZ+GMjABiUKLJuohb0pBoxUaVz
stQjj1N7TRdm4c91BIArekxrnaFG3SMpyMKf6wgAN7TssmaY5ltLy+nCJP9uIwDc0GqB0Ixd1FZDLBb+ 6tmzIvlnIwBc0WOBkLLUI49Te00XZuHPdQSAK3pMa52hRt0jKcjCn+sIADe07LJmmOZbS8vpwiT/biMA
3EYAuKHFAqFRk373tEoKsvDnNgLAHS0WCM04Q63F3AAW/txHALijVdIq24Kfo3SOreYEzJBUPYsAcIdu 3NBqgdCMXdRWQywW/txGALihxQKhUZN+97RKCrLw5zYCwB0tFgjNOEOtxdwAFv7cRwC4o1XSKtuCn6N0
2FalK8qA9Wg/Mw6tHkUA2KHlVFbduCM+uXROrRq/zDisOoIAsIOeXNZN5mmk7HWP162N3JOqiQCwU49p jq3mBMyQVD2LAHCHbthWpSvKgPVoPzMOrR5FANih5VRW3bgjPrl0Tq0av8w4rDqCALCDnlzWTeZppOx1
rEpiZe7G6th7vGWJ2v9+BICdei0Q0s2c8WmmY+4RNIWFP/sRAHbS08y62VrQ2DnTdFYda8vx/hbJv/0I j9etjdyTqokAsFOPaaxKYmXuxurYe7xlidr/fgSAnXotENLNnPFppmPuETSFhT/7EQB20tPMutla0Ng5
AA/osUBojbcC38fCn8cQAB4Q4b33usEjPuF0TL0DpLDw5zEEgAf17NouNJEmUl5Ax9L7hR+i78Y6PlxH 03RWHWvL8f4Wyb/9CAAP6LFAaI23At/Hwp/HEAAeEOG997rBIz7hdEy9A6Sw8OcxBIAH9ezaLjSRJlJe
AHiQbvYIQUDHEOGFoTqGKNcjY7K0NwLAAeruRnjiSc+Md+9Xpy1mmUbtgQBwQoSXXYqOo2UD0L4inbt1 QMfS+4Ufou/GOj5cRwB4kG72CEFAxxDhhaE6hijXI2OytDcCwAHq7kZ44knPjHfvV6ctZplG7YEAcEKE
jNiHAHBSjzfcWPQUbLH0VfuI0vthsc95BIAKIuUFPMfBs5znTAgAlUTKC3g8GSP1dBjv10MAqGzEsTHj l12KjqNlA9C+Ip27dYzYhwBwUo833Fj0FGyx9FX7iNL7YbHPeQSACiLlBTzHwbOc50wIAJVEygt4PBkj
/XERAByM8rQcvVcDAoCb7ONlxvtzIAA4ivIEVSN65Amqn43Q+Bnv+yMANBBlDL3nJSM9Xt5hYbzfBgGg 9XQY79dDAKhsxLEx4/1xEQAcjPK0HL1XAwKAm+zjZcb7cyAAOIryBFUjeuQJqp+N0PgZ7/sjADQQZQy9
kSh5gWsvGdG2Hi/vsDDeb4cA0FCUcfX2JSP6714v71hjvN8eAaCxSHkBLZ3t/fKOBeP9PggAnUTJC0TA 5yUjPV7eYWG83wYBoJEoeYFrLxnRth4v77Aw3m+HANBQlHH19iUj+u9eL+9YY7zfHgGgsUh5AS2d7f3y
eL8fAkBHUfICPTHe74sA0FmUvEBrjPdjIAAEECUv0Arj/TgIAIHMkBdgvB8LASCYkfMCjPfjIQAENFpe jgXj/T4IAJ1EyQtEwHi/HwJAR1HyAj0x3u+LANBZlLxAa4z3YyAABBAlL9AK4/04CACBzJAXYLwfCwEg
gPF+XASAoEbJCzDej40AEFzmvADj/fgIAAlkzAsw3s+BAJBElrwA4/1cCACJRM8LMN7PhwCQUMS8AOP9 mJHzAoz34yEABDRaXoDxflwEgKBGyQsw3o+NABBc5rwA4/34CAAJZMwLMN7PgQCQRJa8AOP9XAgAiUTP
nAgASUXKCzDez4sAkFjvvADj/fwIAMn1ygsw3h8DAWAQLfMCjPfHQQAYSIu8AOP9sRAABuOVF2C8PyYC CzDez4cAkFDEvADj/ZwIAElFygsw3s+LAJBY77wA4/38CADJ9coLMN4fAwFgEC3zAoz3x0EAGEiLvADj
wIBq5wUY74+LADCwGnkBxvtjIwAM7kxegPH++AgAE3g0L8B4fx4EgEnszQsw3p8LAWAyt/ICjPfnQwCY /bEQAAbjlRdgvD8mAsCAaucFGO+PiwAwsBp5Acb7YyMADO5MXoDx/vgIABN4NC/AeH8eBIBJ7M0LMN6f
kJUXYLw/JwLApJa8AOP9uSkAfNhuxBw01me8P7UPCgDvNxsBzOG9AsC7zUYAc3inAPBmsxHAHN4oALza CwFgMrfyAoz350MAmJCVF2C8PycCwKSWvADj/bkpAHzYbsQcNNZnvD+1DwoA7zcbAczhvQLAu81GAHN4
bAQwh1cKAC82GwHM4cVXT09UAoAJfVDbXwIAiUBgLu/WAeD15n8CGNvrdQAgDwDM5cXnAHAJAt9tfgDA pwDwZrMRwBzeKAC82mwEMIdXCgAvNhsBzOHFV09PVAKACX1Q218CAIlAYC7v1gHg9eZ/Ahjb63UAIA8A
mL5b2v06AHyz+SEAY/rY/d8GAIYBwBw+dv+fBYBLEKAaAIztY/Z/sQ0AzAoExvZq3eafBQApP8CkIGBM zOXF5wBwCQLfbX4AwJi+W9r9OgB8s/khAGP62P3fBgCGAcAcPnb/nwWASxCgGgCM7WP2f7ENAMwKBMb2
Hyf/rD37h5QfYk4AMKbPyb/Fs38syg/SCwDG8sXTX77YIOWH6QUAY/ni6S9fbFiUX+BNQcAY3lttXMyN at3mnwUAKT/ApCBgTB8n/6w9+4eUH2JOADCmz8m/xbN/LMoP0gsAxvLF01++2CDlh+kFAGP54ukvX2xY
Un7p682HAMjpa6uNi7lxUX7x7eaDAOTy1mrbC3PjovyyZgeSEARyUtv9POvPYm5cKx/A5CAgp2eTfizm lF/gTUHAGN5bbVzMjVJ+6evNhwDI6WurjYu5cVF+8e3mgwDk8tZq2wtz46L8smYHkhAEclLb/Tzrz2Ju
xq3yQbw4FMjljdWWt8yNlvKBVAWAHK5m/bfMjZbyoeQDgPjujvvXzI3XlA9WafD7y44AxKK2ebXkZzE3 XCsfwOQgIKdnk34s5sat8kG8OBTI5Y3VlrfMjZbygVQFgByuZv23zI2W8qHkA4D47o7718yN15QPVmnw
3qIdXHZkHQCAPh5u/GJuvEc7uuzQOhAAbR1q/GJu3EM7vOzYOiAAbRxu/GJu3Es7vhyAdWAAfJ1q/GJu +8uOAMSitnm15GcxN96iHVx2ZB0AgD4ebvxibrxHO7rs0DoQAG0davxibtxDO7zs2DogAG0cbvxibtxL
fIQOoKA6ALSlNneq8Yu58VHlQFQiZJ4A0Iba2u5S3y3mxqPKQTFjEPC1a4bfXubGM8oBau0AQwKgLrWp O74cgHVgAHydavxibnyEDqCgOgC0pTZ3qvGLufFR5UBUImSeANCG2truUt8t5sajykExYxDwtWuG317m
u3P7H2VuPKscqIYELCUG6lBbqtLl3zI31lIOWglCcgPAMWo7pxN9t5gbaysnoXcMMiwA9lFbMd/hV5u5 xjPKAWrtAEMCoC61qbtz+x9lbjyrHKiGBCwlBupQW6rS5d8yN9ZSDloJQnIDwDFqO6cTfbeYG2srJ6F3
0YtO6nJy1kkDs2vW8BfmRm/lJJUo5M+QAZ+oLVRP8O1hbmylnLSSheoV8KfJMRvd87r3XZJ7e5kbe9CF DDIsAPZRWzHf4VebudGLTupyctZJA7Nr1vAX5kZv5SSVKOTPkAGfqC1UT/DtYW5spZy0koXqFfCnyTEb
uFwQRUOGCRiN7mnd290b/Zq5MQJdpEJDBU0u0oVTRpTAgOh0j+pe1T2re1f3cJgG/9zTV/8DjLb7xxzb 3fO6912Se3uZG3vQhbhcEEVDhgkYje5p3dvdG/2auTECXaRCQwVNLtKFU0aUwIDodI/qXtU9q3tX93CY
8g8AAAAASUVORK5CYII= Bv/c01f/A4y2+8cc2/IPAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms"> <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
@@ -1688,10 +1403,10 @@
<data name="&gt;&gt;RibbonPageGroup1.Type" xml:space="preserve"> <data name="&gt;&gt;RibbonPageGroup1.Type" xml:space="preserve">
<value>DevExpress.XtraBars.Ribbon.RibbonPageGroup, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraBars.Ribbon.RibbonPageGroup, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;RibbonPageFunctions.Name" xml:space="preserve"> <data name="&gt;&gt;RibbonPageGroup2.Name" xml:space="preserve">
<value>RibbonPageFunctions</value> <value>RibbonPageGroup2</value>
</data> </data>
<data name="&gt;&gt;RibbonPageFunctions.Type" xml:space="preserve"> <data name="&gt;&gt;RibbonPageGroup2.Type" xml:space="preserve">
<value>DevExpress.XtraBars.Ribbon.RibbonPageGroup, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraBars.Ribbon.RibbonPageGroup, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;RibbonPage2.Name" xml:space="preserve"> <data name="&gt;&gt;RibbonPage2.Name" xml:space="preserve">
@@ -1790,12 +1505,6 @@
<data name="&gt;&gt;GridColumn7.Type" xml:space="preserve"> <data name="&gt;&gt;GridColumn7.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;GridViewData.Name" xml:space="preserve">
<value>GridViewData</value>
</data>
<data name="&gt;&gt;GridViewData.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Views.Grid.GridView, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;RefreshTimer.Name" xml:space="preserve"> <data name="&gt;&gt;RefreshTimer.Name" xml:space="preserve">
<value>RefreshTimer</value> <value>RefreshTimer</value>
</data> </data>

View File

@@ -40,22 +40,17 @@ Public Class frmMain
TempFiles = New TempFiles(LogConfig) TempFiles = New TempFiles(LogConfig)
TempFiles.Create() TempFiles.Create()
MyTempFiles = TempFiles
RefreshHelper = New RefreshHelper(ViewEnvelopes, "Id") RefreshHelper = New RefreshHelper(ViewEnvelopes, "Id")
Controller = New EnvelopeListController(State) Controller = New EnvelopeListController(State)
Try Try
Me.LookAndFeel.UseDefaultLookAndFeel = False Me.LookAndFeel.UseDefaultLookAndFeel = False
LookAndFeel.SetSkinStyle(SkinStyle.Office2019White, SkinSvgPalette.DefaultSkin) LookAndFeel.SetSkinStyle(SkinStyle.Office2019White, SkinSvgPalette.DefaultSkin)
Catch ex As Exception Catch ex As Exception
End Try End Try
If MYUSER.IsAdmin Then
XtraTabControlMain.TabPages(2).PageVisible = True
Else
XtraTabControlMain.TabPages(2).PageVisible = False
End If
LoadEnvelopeData() LoadEnvelopeData()
End Sub End Sub
@@ -195,8 +190,6 @@ Public Class frmMain
End Sub End Sub
Private Sub XtraTabControl1_SelectedPageChanged(sender As Object, e As DevExpress.XtraTab.TabPageChangedEventArgs) Handles XtraTabControlMain.SelectedPageChanged Private Sub XtraTabControl1_SelectedPageChanged(sender As Object, e As DevExpress.XtraTab.TabPageChangedEventArgs) Handles XtraTabControlMain.SelectedPageChanged
RibbonPageFunctions.Enabled = True
RibbonPageEnvelopeActions.Enabled = True
Select Case XtraTabControlMain.SelectedTabPageIndex Select Case XtraTabControlMain.SelectedTabPageIndex
Case 1 Case 1
btnEditEnvelope.Enabled = False btnEditEnvelope.Enabled = False
@@ -213,10 +206,6 @@ Public Class frmMain
bbtnitmEB.Enabled = False bbtnitmEB.Enabled = False
LoadEnvelopeData() LoadEnvelopeData()
txtEnvelopeIdLabel.Caption = "No Envelope selected" txtEnvelopeIdLabel.Caption = "No Envelope selected"
Case 2
RibbonPageFunctions.Enabled = False
RibbonPageEnvelopeActions.Enabled = False
End Select End Select
End Sub End Sub
@@ -576,9 +565,7 @@ Public Class frmMain
For Each oReceiver As EnvelopeReceiver In Receivers For Each oReceiver As EnvelopeReceiver In Receivers
If oReceiver.Email = selReceiver.Email Then If oReceiver.Email = selReceiver.Email Then
If oController.ActionService.ResendReceiver(oEnvelope, oReceiver) = True Then If oController.ActionService.ResendReceiver(oEnvelope, oReceiver) = True Then
Dim oMsg = Resources.Envelope.Invitation_successfully_resend.Replace("@Mail", oReceiver.Email) MsgBox(Resources.Envelope.Invitation_successfully_resend, MsgBoxStyle.Information, Text)
MsgBox(oMsg, MsgBoxStyle.Information, Text)
End If End If
End If End If
Next Next
@@ -595,49 +582,4 @@ Public Class frmMain
txtEnvelopeIdLabel.Caption = String.Format(txtEnvelopeIdLabel.Tag, oEnvelope.Id) txtEnvelopeIdLabel.Caption = String.Format(txtEnvelopeIdLabel.Tag, oEnvelope.Id)
End Sub End Sub
Private Sub btnEnvelopes_thismonth_Click(sender As Object, e As EventArgs) Handles btnEnvelopes_thismonth.Click
If SQL_REP_ENV_USER_TM <> String.Empty Then
Result_Execute(SQL_REP_ENV_USER_TM)
Else
GridControlData.DataSource = Nothing
End If
End Sub
Private Sub btnEnvelopes_lastmonth_Click(sender As Object, e As EventArgs) Handles btnEnvelopes_lastmonth.Click
If SQL_REP_ENV_USER_LM <> String.Empty Then
Result_Execute(SQL_REP_ENV_USER_LM)
Else
GridControlData.DataSource = Nothing
End If
End Sub
Private Sub btnEnvelopes_thisYear_Click(sender As Object, e As EventArgs) Handles btnEnvelopes_thisYear.Click
If SQL_REP_ENV_USER_Y <> String.Empty Then
Result_Execute(SQL_REP_ENV_USER_Y)
Else
GridControlData.DataSource = Nothing
End If
End Sub
Private Sub btnEnvelopes_All_Click(sender As Object, e As EventArgs) Handles btnEnvelopes_All.Click
If SQL_REP_ENV_USER_ALL <> String.Empty Then
Result_Execute(SQL_REP_ENV_USER_ALL)
Else
GridControlData.DataSource = Nothing
End If
End Sub
Private Sub Result_Execute(mySQL As String)
Try
Dim oDT As DataTable = DB_DD_ECM.GetDatatable(mySQL)
If Not IsNothing(oDT) Then
GridControlData.DataSource = oDT
Else
GridControlData.DataSource = Nothing
End If
Catch ex As Exception
End Try
End Sub
End Class End Class

View File

@@ -62,7 +62,7 @@ Public Class frmSplashScreen
Private Sub Worker_DoWork(sender As Object, e As DoWorkEventArgs) Handles Worker.DoWork Private Sub Worker_DoWork(sender As Object, e As DoWorkEventArgs) Handles Worker.DoWork
Dim oState As State = DirectCast(e.Argument, State) Dim oState As State = DirectCast(e.Argument, State)
Worker.ReportProgress(20, "Initializing Database") Worker.ReportProgress(20, "Initialize Database")
Thread.Sleep(300) Thread.Sleep(300)
Dim oConnectionString = MSSQLServer.DecryptConnectionString(oState.Config.ConnectionString) Dim oConnectionString = MSSQLServer.DecryptConnectionString(oState.Config.ConnectionString)
@@ -74,33 +74,15 @@ Public Class frmSplashScreen
DB_DD_ECM = oState.Database DB_DD_ECM = oState.Database
End If End If
Worker.ReportProgress(40, "Initializing Configuration") Worker.ReportProgress(40, "Initialize Confguration")
Thread.Sleep(300) Thread.Sleep(300)
Dim oSQl = "SELECT * FROM TBDD_SQL_COMMANDS"
Dim oDT = oState.Database.GetDatatable(oSQl)
For Each oROW As DataRow In oDT.Rows
If oROW.Item("TITLE") = "REPORT ENV USER THIS_MONTH" Then
SQL_REP_ENV_USER_TM = oROW.Item("SQL_COMMAND")
ElseIf oROW.Item("TITLE") = "REPORT ENV USER LAST_MONTH" Then
SQL_REP_ENV_USER_LM = oROW.Item("SQL_COMMAND")
ElseIf oROW.Item("TITLE") = "REPORT ENV USER YEAR" Then
SQL_REP_ENV_USER_Y = oROW.Item("SQL_COMMAND")
ElseIf oROW.Item("TITLE") = "REPORT ENV USER ALL" Then
SQL_REP_ENV_USER_ALL = oROW.Item("SQL_COMMAND")
End If
Next
oSQl = "SELECT * FROM TBSIG_CHART"
DT_CHARTS = oState.Database.GetDatatable(oSQl)
Dim ConfigModel = New ConfigModel(oState) Dim ConfigModel = New ConfigModel(oState)
oState.DbConfig = ConfigModel.LoadConfiguration() oState.DbConfig = ConfigModel.LoadConfiguration()
DEF_TF_ENABLED = oState.DbConfig.Default_TFA_Enabled DOCUMENT_PATH_MOVE_AFTSEND = oState.DbConfig.DOCUMENT_PATH_MOVE_AFTSEND
' DOCUMENT_PATH_MOVE_AFTSEND = oState.DbConfig.DOCUMENT_PATH_MOVE_AFTSEND Worker.ReportProgress(60, "Initialize User")
Worker.ReportProgress(60, "Initializing User")
Dim oKey = oState.Database.GetScalarValue("SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE' and ACTIVE = 1") Dim oKey = oState.Database.GetScalarValue("SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE' and ACTIVE = 1")
Thread.Sleep(300) Thread.Sleep(300)
If oKey.ToString <> String.Empty Then If oKey.ToString <> String.Empty Then
MS_GDPICTUREKEY = oKey MS_GDPICTUREKEY = oKey
End If End If
@@ -109,14 +91,13 @@ Public Class frmSplashScreen
Dim oUser = oUserModel.SelectUser() Dim oUser = oUserModel.SelectUser()
Worker.ReportProgress(80, "Initializing Rights") Worker.ReportProgress(80, "Initialize Rights")
Thread.Sleep(300) Thread.Sleep(300)
' This checks for module access and admin rights ' This checks for module access and admin rights
If oUser IsNot Nothing Then If oUser IsNot Nothing Then
oUserModel.CheckUserLogin(oUser) oUserModel.CheckUserLogin(oUser)
End If End If
MYUSER = oUser
Worker.ReportProgress(100, "Starting Application") Worker.ReportProgress(100, "Starting Application")
Thread.Sleep(300) Thread.Sleep(300)

View File

@@ -7,7 +7,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DigitalData.Core.Abstractions" Version="2.2.1" /> <PackageReference Include="DigitalData.Core.Abstractions" Version="2.0.0" />
<PackageReference Include="DigitalData.Core.API" Version="2.0.0" /> <PackageReference Include="DigitalData.Core.API" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.15" /> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.15" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />

View File

@@ -1,7 +1,7 @@
using DigitalData.Core.API; using DigitalData.Core.API;
using DigitalData.Core.Application; using DigitalData.Core.Application;
using DigitalData.UserManager.Application; using DigitalData.UserManager.Application;
using EnvelopeGenerator.Application.Extensions; using EnvelopeGenerator.Application;
using EnvelopeGenerator.Infrastructure; using EnvelopeGenerator.Infrastructure;
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Localization;

View File

@@ -5,19 +5,19 @@ namespace EnvelopeGenerator.Infrastructure.Contracts
{ {
public interface IEnvelopeReceiverRepository : ICRUDRepository<EnvelopeReceiver, (int Envelope, int Receiver)> public interface IEnvelopeReceiverRepository : ICRUDRepository<EnvelopeReceiver, (int Envelope, int Receiver)>
{ {
Task<IEnumerable<EnvelopeReceiver>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false, bool readOnly = true); Task<IEnumerable<EnvelopeReceiver>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false);
Task<IEnumerable<EnvelopeReceiver>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true); Task<IEnumerable<EnvelopeReceiver>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true);
Task<EnvelopeReceiver?> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true); Task<EnvelopeReceiver?> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true);
Task<string?> ReadAccessCodeAsync(string uuid, string signature, bool readOnly = true); Task<string?> ReadAccessCodeAsync(string uuid, string signature);
Task<int> CountAsync(string uuid, string signature); Task<int> CountAsync(string uuid, string signature);
Task<EnvelopeReceiver?> ReadByIdAsync(int envelopeId, int receiverId, bool readOnly = true); Task<EnvelopeReceiver?> ReadByIdAsync(int envelopeId, int receiverId);
Task<string?> ReadAccessCodeByIdAsync(int envelopeId, int receiverId, bool readOnly = true); Task<string?> ReadAccessCodeByIdAsync(int envelopeId, int receiverId);
Task<IEnumerable<EnvelopeReceiver>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); Task<IEnumerable<EnvelopeReceiver>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses);

View File

@@ -7,7 +7,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DigitalData.Core.Abstractions" Version="2.2.1" /> <PackageReference Include="DigitalData.Core.Abstractions" Version="2.0.0" />
<PackageReference Include="DigitalData.Core.Infrastructure" Version="2.0.0" /> <PackageReference Include="DigitalData.Core.Infrastructure" Version="2.0.0" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher" Version="2.0.0" /> <PackageReference Include="DigitalData.EmailProfilerDispatcher" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.16" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.16" />

View File

@@ -11,9 +11,9 @@ namespace EnvelopeGenerator.Infrastructure.Repositories
{ {
} }
private IQueryable<EnvelopeReceiver> ReadWhere(string? uuid = null, string? signature = null, bool withEnvelope = false, bool withReceiver = false, bool readOnly = true) private IQueryable<EnvelopeReceiver> ReadWhere(string? uuid = null, string? signature = null, bool withEnvelope = false, bool withReceiver = false)
{ {
var query = readOnly ? _dbSet.AsNoTracking() : _dbSet; var query = _dbSet.AsNoTracking();
if (uuid is not null) if (uuid is not null)
query = query.Where(er => er.Envelope != null && er.Envelope.Uuid == uuid); query = query.Where(er => er.Envelope != null && er.Envelope.Uuid == uuid);
@@ -32,34 +32,31 @@ namespace EnvelopeGenerator.Infrastructure.Repositories
return query; return query;
} }
public async Task<IEnumerable<EnvelopeReceiver>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false, bool readOnly = true) public async Task<IEnumerable<EnvelopeReceiver>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false)
=> await ReadWhere(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly).ToListAsync(); => await ReadWhere(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver).ToListAsync();
public async Task<IEnumerable<EnvelopeReceiver>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true) public async Task<IEnumerable<EnvelopeReceiver>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true)
=> await ReadWhere(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly).ToListAsync(); => await ReadWhere(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver).ToListAsync();
public async Task<EnvelopeReceiver?> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true) public async Task<EnvelopeReceiver?> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true)
=> await ReadWhere(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly).FirstOrDefaultAsync(); => await ReadWhere(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver).FirstOrDefaultAsync();
public async Task<string?> ReadAccessCodeAsync(string uuid, string signature, bool readOnly = true) public async Task<string?> ReadAccessCodeAsync(string uuid, string signature)
=> await ReadWhere(uuid: uuid, signature: signature, readOnly: readOnly) => await ReadWhere(uuid: uuid, signature: signature)
.Select(er => er.AccessCode) .Select(er => er.AccessCode)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
public async Task<int> CountAsync(string uuid, string signature) => await ReadWhere(uuid: uuid, signature: signature).CountAsync(); public async Task<int> CountAsync(string uuid, string signature) => await ReadWhere(uuid: uuid, signature: signature).CountAsync();
private IQueryable<EnvelopeReceiver> ReadById(int envelopeId, int receiverId, bool readOnly = true) public IQueryable<EnvelopeReceiver> ReadById(int envelopeId, int receiverId) => _dbSet.AsNoTracking()
{ .Where(er => er.EnvelopeId == envelopeId && er.ReceiverId == receiverId);
var query = readOnly ? _dbSet.AsNoTracking() : _dbSet;
return query.Where(er => er.EnvelopeId == envelopeId && er.ReceiverId == receiverId);
}
public async Task<EnvelopeReceiver?> ReadByIdAsync(int envelopeId, int receiverId, bool readOnly = true) public async Task<EnvelopeReceiver?> ReadByIdAsync(int envelopeId, int receiverId)
=> await ReadById(envelopeId: envelopeId, receiverId: receiverId, readOnly: readOnly) => await ReadById(envelopeId: envelopeId, receiverId: receiverId)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
public async Task<string?> ReadAccessCodeByIdAsync(int envelopeId, int receiverId, bool readOnly = true) public async Task<string?> ReadAccessCodeByIdAsync(int envelopeId, int receiverId)
=> await ReadById(envelopeId: envelopeId, receiverId: receiverId, readOnly: readOnly) => await ReadById(envelopeId: envelopeId, receiverId: receiverId)
.Select(er => er.AccessCode) .Select(er => er.AccessCode)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();

View File

@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections> <configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="EnvelopeGenerator.Service.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup>
</configSections> </configSections>
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
@@ -13,4 +16,11 @@
</dependentAssembly> </dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
<applicationSettings>
<EnvelopeGenerator.Service.My.MySettings>
<setting name="RunInDMZ" serializeAs="String">
<value>False</value>
</setting>
</EnvelopeGenerator.Service.My.MySettings>
</applicationSettings>
</configuration> </configuration>

View File

@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
' übernehmen, indem Sie "*" eingeben: ' übernehmen, indem Sie "*" eingeben:
' <Assembly: AssemblyVersion("1.0.*")> ' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.8.0.0")> <Assembly: AssemblyVersion("1.7.1.0")>
<Assembly: AssemblyFileVersion("1.8.0.0")> <Assembly: AssemblyFileVersion("1.7.1.0")>

View File

@@ -1,10 +1,10 @@
'------------------------------------------------------------------------------ '------------------------------------------------------------------------------
' <auto-generated> ' <auto-generated>
' Dieser Code wurde von einem Tool generiert. ' This code was generated by a tool.
' Laufzeitversion:4.0.30319.42000 ' Runtime Version:4.0.30319.42000
' '
' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn ' Changes to this file may cause incorrect behavior and will be lost if
' der Code erneut generiert wird. ' the code is regenerated.
' </auto-generated> ' </auto-generated>
'------------------------------------------------------------------------------ '------------------------------------------------------------------------------
@@ -22,7 +22,7 @@ Namespace My
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
#Region "Automatische My.Settings-Speicherfunktion" #Region "My.Settings Auto-Save Functionality"
#If _MyType = "WindowsForms" Then #If _MyType = "WindowsForms" Then
Private Shared addedHandler As Boolean Private Shared addedHandler As Boolean
@@ -53,6 +53,15 @@ Namespace My
Return defaultInstance Return defaultInstance
End Get End Get
End Property End Property
<Global.System.Configuration.ApplicationScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("False")> _
Public ReadOnly Property RunInDMZ() As Boolean
Get
Return CType(Me("RunInDMZ"),Boolean)
End Get
End Property
End Class End Class
End Namespace End Namespace

View File

@@ -1,5 +1,9 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true"> <SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
<Profiles /> <Profiles />
<Settings /> <Settings>
<Setting Name="RunInDMZ" Type="System.Boolean" Scope="Application">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile> </SettingsFile>

View File

@@ -1,4 +1,5 @@
using EnvelopeGenerator.Web.Services; using EnvelopeGenerator.Common;
using EnvelopeGenerator.Web.Services;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Web.Controllers namespace EnvelopeGenerator.Web.Controllers

View File

@@ -1,7 +1,4 @@
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Web.Models;
using EnvelopeGenerator.Web.Models;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Security.Claims; using System.Security.Claims;
@@ -9,7 +6,6 @@ namespace EnvelopeGenerator.Web.Controllers
{ {
public static class ControllerBaseExtensions public static class ControllerBaseExtensions
{ {
#region Auth
public static string? GetClaimValue(this ControllerBase controller, string claimType) => controller.User.FindFirstValue(claimType); public static string? GetClaimValue(this ControllerBase controller, string claimType) => controller.User.FindFirstValue(claimType);
public static string? GetAuthEnvelopeUuid(this ControllerBase controller) => controller.User.FindFirstValue(ClaimTypes.NameIdentifier); public static string? GetAuthEnvelopeUuid(this ControllerBase controller) => controller.User.FindFirstValue(ClaimTypes.NameIdentifier);
@@ -28,34 +24,6 @@ namespace EnvelopeGenerator.Web.Controllers
return int.TryParse(env_id_str, out int env_id) ? env_id : null; return int.TryParse(env_id_str, out int env_id) ? env_id : null;
} }
public static async Task SignInEnvelopeAsync(this HttpContext context, EnvelopeReceiverDto er, string receiverRole)
{
var claims = new List<Claim> {
new(ClaimTypes.NameIdentifier, er.Envelope!.Uuid),
new(ClaimTypes.Hash, er.Receiver!.Signature),
new(ClaimTypes.Name, er.Name ?? string.Empty),
new(ClaimTypes.Email, er.Receiver.EmailAddress),
new(EnvelopeClaimTypes.Title, er.Envelope.Title),
new(EnvelopeClaimTypes.Id, er.Envelope.Id.ToString()),
new(ClaimTypes.Role, receiverRole)
};
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
AllowRefresh = false,
IsPersistent = false
};
await context.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties);
}
#endregion
#region View error
//TODO: integrate localizer for ready-to-use views //TODO: integrate localizer for ready-to-use views
public static ViewResult ViewError(this Controller controller, ErrorViewModel errorViewModel) => controller.View("_Error", errorViewModel); public static ViewResult ViewError(this Controller controller, ErrorViewModel errorViewModel) => controller.View("_Error", errorViewModel);
@@ -93,6 +61,5 @@ namespace EnvelopeGenerator.Web.Controllers
Subtitle = "Ein unerwarteter Fehler ist aufgetreten", Subtitle = "Ein unerwarteter Fehler ist aufgetreten",
Body = "Bitte kontaktieren Sie das IT-Team." Body = "Bitte kontaktieren Sie das IT-Team."
}); });
#endregion }
}
} }

View File

@@ -3,13 +3,12 @@ using EnvelopeGenerator.Common;
using EnvelopeGenerator.Web.Services; using EnvelopeGenerator.Web.Services;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using EnvelopeGenerator.Application;
using EnvelopeGenerator.Extensions; using EnvelopeGenerator.Extensions;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Web.Controllers namespace EnvelopeGenerator.Web.Controllers
{ {
[Authorize(Roles = ReceiverRole.FullyAuth)] [Authorize]
[Route("api/[controller]")]
public class DocumentController : BaseController public class DocumentController : BaseController
{ {
private readonly EnvelopeOldService envelopeService; private readonly EnvelopeOldService envelopeService;
@@ -48,8 +47,8 @@ namespace EnvelopeGenerator.Web.Controllers
} }
} }
[Authorize(Roles = ReceiverRole.FullyAuth)] [Authorize]
[HttpPost("{envelopeKey}")] [HttpPost("api/document/{envelopeKey}")]
public async Task<IActionResult> Open(string envelopeKey) public async Task<IActionResult> Open(string envelopeKey)
{ {
try try

View File

@@ -1,4 +1,5 @@
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Common; using EnvelopeGenerator.Common;
using EnvelopeGenerator.Web.Services; using EnvelopeGenerator.Web.Services;
@@ -10,7 +11,7 @@ using EnvelopeGenerator.Extensions;
namespace EnvelopeGenerator.Web.Controllers namespace EnvelopeGenerator.Web.Controllers
{ {
[Authorize(Roles = ReceiverRole.FullyAuth)] [Authorize]
[ApiController] [ApiController]
[Route("api/[controller]")] [Route("api/[controller]")]
public class EnvelopeController : BaseController public class EnvelopeController : BaseController
@@ -22,6 +23,7 @@ namespace EnvelopeGenerator.Web.Controllers
private readonly IReceiverService _receiverService; private readonly IReceiverService _receiverService;
private readonly IEnvelopeReceiverService _envRcvService; private readonly IEnvelopeReceiverService _envRcvService;
public EnvelopeController(DatabaseService database, public EnvelopeController(DatabaseService database,
EnvelopeOldService envelope, EnvelopeOldService envelope,
ILogger<EnvelopeController> logger, UrlEncoder urlEncoder, ILogger<EnvelopeController> logger, UrlEncoder urlEncoder,
@@ -64,7 +66,7 @@ namespace EnvelopeGenerator.Web.Controllers
} }
} }
[Authorize(Roles = ReceiverRole.FullyAuth)] [Authorize]
[HttpPost("{envelopeKey}")] [HttpPost("{envelopeKey}")]
public async Task<IActionResult> Update(string envelopeKey, int index) public async Task<IActionResult> Update(string envelopeKey, int index)
{ {
@@ -110,7 +112,7 @@ namespace EnvelopeGenerator.Web.Controllers
} }
} }
[Authorize(Roles = ReceiverRole.FullyAuth)] [Authorize]
[HttpPost("reject")] [HttpPost("reject")]
public async Task<IActionResult> Reject([FromBody] string? reason = null) public async Task<IActionResult> Reject([FromBody] string? reason = null)
{ {

View File

@@ -18,551 +18,433 @@ using static EnvelopeGenerator.Common.Constants;
using Ganss.Xss; using Ganss.Xss;
using Newtonsoft.Json; using Newtonsoft.Json;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using DigitalData.Core.Client;
using OtpNet;
namespace EnvelopeGenerator.Web.Controllers; namespace EnvelopeGenerator.Web.Controllers
public class HomeController : ViewControllerBase
{ {
private readonly EnvelopeOldService envelopeOldService; public class HomeController : Controller
private readonly IEnvelopeReceiverService _envRcvService; {
private readonly IEnvelopeHistoryService _historyService; private readonly ILogger<HomeController> _logger;
private readonly IConfiguration _configuration; private readonly EnvelopeOldService envelopeOldService;
private readonly IEnvelopeMailService _mailService; private readonly IEnvelopeReceiverService _envRcvService;
private readonly IEnvelopeReceiverReadOnlyService _readOnlyService; private readonly IEnvelopeHistoryService _historyService;
private readonly IAuthenticator _authenticator; private readonly IStringLocalizer<Resource> _localizer;
private readonly IReceiverService _rcvService; private readonly IConfiguration _configuration;
private readonly IEnvelopeSmsHandler _envSmsHandler; private readonly HtmlSanitizer _sanitizer;
private readonly Cultures _cultures;
private readonly IEnvelopeMailService _mailService;
private readonly IEnvelopeReceiverReadOnlyService _readOnlyService;
public HomeController(EnvelopeOldService envelopeOldService, ILogger<HomeController> logger, IEnvelopeReceiverService envelopeReceiverService, IEnvelopeHistoryService historyService, IStringLocalizer<Resource> localizer, IConfiguration configuration, HtmlSanitizer sanitizer, Cultures cultures, IEnvelopeMailService envelopeMailService, IEnvelopeReceiverReadOnlyService readOnlyService, IAuthenticator authenticator, IReceiverService receiverService, IEnvelopeSmsHandler envelopeSmsService) : base(logger, sanitizer, cultures, localizer) public HomeController(EnvelopeOldService envelopeOldService, ILogger<HomeController> logger, IEnvelopeReceiverService envelopeReceiverService, IEnvelopeHistoryService historyService, IStringLocalizer<Resource> localizer, IConfiguration configuration, HtmlSanitizer sanitizer, Cultures cultures, IEnvelopeMailService envelopeMailService, IEnvelopeReceiverReadOnlyService readOnlyService)
{
this.envelopeOldService = envelopeOldService;
_envRcvService = envelopeReceiverService;
_historyService = historyService;
_configuration = configuration;
_mailService = envelopeMailService;
_readOnlyService = readOnlyService;
_authenticator = authenticator;
_rcvService = receiverService;
_envSmsHandler = envelopeSmsService;
}
[HttpGet("/")]
public IActionResult Main([FromQuery] string? culture = null)
{
//TODO: add a middelware or use an asp.net functionality insead of this code-smell
culture = culture is not null ? _sanitizer.Sanitize(culture) : null;
if (UserLanguage is null && culture is null)
{ {
UserLanguage = _cultures.Default.Language; this.envelopeOldService = envelopeOldService;
return Redirect($"{Request.Headers["Referer"]}?culture={_cultures.Default.Language}"); _envRcvService = envelopeReceiverService;
_historyService = historyService;
_localizer = localizer;
_configuration = configuration;
_sanitizer = sanitizer;
_cultures = cultures;
_mailService = envelopeMailService;
_logger = logger;
_readOnlyService = readOnlyService;
} }
ViewData["UserCulture"] = _cultures[UserLanguage]; [HttpGet("EnvelopeKey/{envelopeReceiverId}")]
public async Task<IActionResult> MainAsync([FromRoute] string envelopeReceiverId, [FromQuery] string? culture = null)
return View();
}
[HttpGet("EnvelopeKey/{envelopeReceiverId}")]
public async Task<IActionResult> MainAsync([FromRoute] string envelopeReceiverId, [FromQuery] string? culture = null)
{
try
{ {
//TODO: add a middelware or use an asp.net functionality insead of this code-smell try
culture = culture is not null ? _sanitizer.Sanitize(culture) : null;
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
if (UserLanguage is null && culture is null)
{ {
UserLanguage = _cultures.Default.Language; //TODO: add a middelware or use an asp.net functionality insead of this code-smell
return Redirect($"{Request.Headers["Referer"]}?culture={_cultures.Default.Language}"); culture = culture is not null ? _sanitizer.Sanitize(culture) : null;
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
if (UserLanguage is null && culture is null)
{
UserLanguage = _cultures.Default.Language;
return Redirect($"{Request.Headers["Referer"]}?culture={_cultures.Default.Language}");
}
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
if (!envelopeReceiverId.TryDecode(out var decoded))
{
Response.StatusCode = StatusCodes.Status401Unauthorized;
return this.ViewDocumentNotFound();
}
if(decoded.GetEncodeType() == EncodeType.EnvelopeReceiverReadOnly)
return Redirect($"{envelopeReceiverId}/ReadOnly");
ViewData["EnvelopeKey"] = envelopeReceiverId;
return await _envRcvService.ReadByEnvelopeReceiverIdAsync(envelopeReceiverId: envelopeReceiverId).ThenAsync<EnvelopeReceiverDto, IActionResult>(
SuccessAsync: async er =>
{
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeReceiverId);
bool accessCodeAlreadyRequested = await _historyService.AccessCodeAlreadyRequested(envelopeId: er.Envelope!.Id, userReference: er.Receiver!.EmailAddress);
if (!accessCodeAlreadyRequested)
{
await _historyService.RecordAsync(er.EnvelopeId, er.Receiver.EmailAddress, Constants.EnvelopeStatus.AccessCodeRequested);
var mailRes = await _mailService.SendAccessCodeAsync(envelopeReceiverDto: er);
if (mailRes.IsFailed)
{
_logger.LogNotice(mailRes);
return this.ViewAccessCodeNotSent();
}
}
return Redirect($"{envelopeReceiverId}/Locked");
},
Fail: (messages, notices) =>
{
_logger.LogNotice(notices);
return this.ViewEnvelopeNotFound();
});
} }
catch(Exception ex)
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
if (!envelopeReceiverId.TryDecode(out var decoded))
{ {
Response.StatusCode = StatusCodes.Status401Unauthorized; _logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception:ex, message: _localizer[WebKey.UnexpectedError]);
return this.ViewDocumentNotFound(); return this.ViewInnerServiceError();
} }
}
if(decoded.GetEncodeType() == EncodeType.EnvelopeReceiverReadOnly) [HttpGet("EnvelopeKey/{envelopeReceiverId}/Locked")]
return Redirect($"{envelopeReceiverId}/ReadOnly"); public async Task<IActionResult> EnvelopeLocked([FromRoute] string envelopeReceiverId)
{
try
{
ViewData["UserCulture"] = _cultures[UserLanguage];
ViewData["EnvelopeKey"] = envelopeReceiverId; return await _envRcvService.IsExisting(envelopeReceiverId: envelopeReceiverId).ThenAsync(
Success: isExisting => isExisting ? View().WithData("EnvelopeKey", envelopeReceiverId) : this.ViewEnvelopeNotFound(),
Fail: IActionResult (messages,notices) =>
{
_logger.LogNotice(notices);
Response.StatusCode = StatusCodes.Status401Unauthorized;
return this.ViewEnvelopeNotFound();
});
}
catch(Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex);
return this.ViewInnerServiceError();
}
}
return await _envRcvService.ReadByEnvelopeReceiverIdAsync(envelopeReceiverId: envelopeReceiverId).ThenAsync<EnvelopeReceiverDto, IActionResult>( [HttpPost("EnvelopeKey/{envelopeReceiverId}/Locked")]
public async Task<IActionResult> LogInEnvelope([FromRoute] string envelopeReceiverId, [FromForm] string access_code)
{
try
{
ViewData["UserCulture"] = _cultures[UserLanguage];
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
if (uuid is null || signature is null)
{
_logger.LogEnvelopeError(uuid: uuid, signature: signature, message: _localizer[WebKey.WrongEnvelopeReceiverId]);
return Unauthorized();
}
_logger.LogInformation($"Envelope UUID: [{uuid}]\nReceiver Signature: [{signature}]");
//check access code
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeReceiverId);
var verification = await _envRcvService.VerifyAccessCodeAsync(uuid: uuid, signature: signature, accessCode: access_code);
if (verification.IsFailed)
{
_logger.LogNotice(verification.Notices);
Response.StatusCode = StatusCodes.Status401Unauthorized;
return View("EnvelopeLocked")
.WithData("ErrorMessage", _localizer[WebKey.WrongAccessCode].Value);
}
return await _envRcvService.ReadByUuidSignatureAsync(uuid: uuid, signature: signature).ThenAsync<EnvelopeReceiverDto, IActionResult>(
SuccessAsync: async er =>
{
//check the access code verification
if (verification.IsWrong())
{
//Constants.EnvelopeStatus.AccessCodeIncorrect
await _historyService.RecordAsync(er.EnvelopeId, er.Receiver!.EmailAddress, Constants.EnvelopeStatus.AccessCodeIncorrect);
Response.StatusCode = StatusCodes.Status401Unauthorized;
return View("EnvelopeLocked")
.WithData("ErrorMessage", _localizer[WebKey.WrongAccessCode].Value);
}
await _historyService.RecordAsync(er.EnvelopeId, er.Receiver!.EmailAddress, Constants.EnvelopeStatus.AccessCodeCorrect);
ViewData["EnvelopeKey"] = envelopeReceiverId;
//check rejection
var rejRcvrs = await _historyService.ReadRejectingReceivers(er.Envelope!.Id);
if(rejRcvrs.Any())
{
ViewBag.IsExt = !rejRcvrs.Contains(er.Receiver); //external if the current user is not rejected
return View("EnvelopeRejected", er);
}
//check if it has already signed
if (await _historyService.IsSigned(envelopeId: er.Envelope!.Id, userReference: er.Receiver!.EmailAddress))
return View("EnvelopeSigned");
if (er.Envelope.Documents?.FirstOrDefault() is EnvelopeDocumentDto doc && doc.ByteData is not null)
{
ViewData["DocumentBytes"] = doc.ByteData;
}
else
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, message: "No document byte-data was found in ENVELOPE_DOCUMENT table.");
return this.ViewDocumentNotFound();
}
var claims = new List<Claim> {
new(ClaimTypes.NameIdentifier, uuid),
new(ClaimTypes.Hash, signature),
new(ClaimTypes.Name, er.Name ?? string.Empty),
new(ClaimTypes.Email, er.Receiver.EmailAddress),
new(EnvelopeClaimTypes.Title, er.Envelope.Title),
new(EnvelopeClaimTypes.Id, er.Envelope.Id.ToString())
};
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
AllowRefresh = false,
IsPersistent = false
};
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties);
//add PSPDFKit licence key
ViewData["PSPDFKitLicenseKey"] = _configuration["PSPDFKitLicenseKey"];
return View("ShowEnvelope", er);
},
Fail: (messages, notices) =>
{
_logger.LogNotice(notices);
return this.ViewEnvelopeNotFound();
}
);
}
catch (Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex);
return this.ViewInnerServiceError();
}
}
[Authorize]
[HttpGet("EnvelopeKey/{envelopeReceiverId}/Success")]
public async Task<IActionResult> EnvelopeSigned(string envelopeReceiverId)
{
try
{
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
return await _envRcvService.IsExisting(envelopeReceiverId: envelopeReceiverId).ThenAsync(
SuccessAsync: async isExisting =>
{
if(!isExisting)
return this.ViewEnvelopeNotFound();
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeReceiverId);
if (!envelopeOldService.ReceiverAlreadySigned(response.Envelope, response.Receiver.Id))
return Redirect($"/EnvelopeKey/{envelopeReceiverId}/Locked");
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
ViewData["UserCulture"] = _cultures[UserLanguage];
ViewData["EnvelopeKey"] = envelopeReceiverId;
return View();
},
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return this.ViewEnvelopeNotFound();
});
}
catch (Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex);
return this.ViewInnerServiceError();
}
}
[Authorize]
[HttpGet("EnvelopeKey/{envelopeReceiverId}/Rejected")]
public async Task<IActionResult> EnvelopeRejected(string envelopeReceiverId)
{
try
{
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return await _envRcvService.ReadByEnvelopeReceiverIdAsync(envelopeReceiverId).ThenAsync(
SuccessAsync: async (er) =>
{ViewData["UserCulture"] = _cultures[UserLanguage];
ViewData["UserCulture"] = _cultures[UserLanguage];
return await _historyService.IsRejected(envelopeId: er.EnvelopeId)
? View(er)
: Redirect($"/EnvelopeKey/{envelopeReceiverId}/Locked");
},
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return this.ViewEnvelopeNotFound();
});
}
catch (Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex);
return this.ViewInnerServiceError();
}
}
[HttpGet("EnvelopeKey/{readOnlyKey}/ReadOnly")]
public async Task<IActionResult> EnvelopeReceiverReadOnly([FromRoute] string readOnlyKey)
{
try
{
ViewData["UserCulture"] = _cultures[UserLanguage];
readOnlyKey = _sanitizer.Sanitize(readOnlyKey);
// check if the readOnlyId is valid
if (!readOnlyKey.TryDecode(out var decodedKeys) || decodedKeys.GetEncodeType() != EncodeType.EnvelopeReceiverReadOnly)
{
Response.StatusCode = StatusCodes.Status401Unauthorized;
return this.ViewDocumentNotFound();
}
var readOnlyId = decodedKeys.ParseReadOnlyId();
var erro_res = await _readOnlyService.ReadByIdAsync(readOnlyId);
if (erro_res.IsFailed)
{
_logger.LogNotice(erro_res.Notices);
return this.ViewInnerServiceError();
}
var erro = erro_res.Data;
if (DateTime.Now > erro.DateValid)
return View("EnvelopeExpired");
return await _envRcvService.ReadByUuidSignatureAsync(uuid: erro.Envelope!.Uuid, erro.Receiver!.Signature).ThenAsync(
SuccessAsync: async er => SuccessAsync: async er =>
{ {
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeReceiverId); var envelopeKey = (er.Envelope!.Uuid, er.Receiver!.Signature).EncodeEnvelopeReceiverId();
bool accessCodeAlreadyRequested = await _historyService.AccessCodeAlreadyRequested(envelopeId: er.Envelope!.Id, userReference: er.Receiver!.EmailAddress); EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeKey);
if (!accessCodeAlreadyRequested)
//TODO: implement multi-threading to history process (Task)
var hist_res = await _historyService.RecordAsync((int)erro.EnvelopeId, erro.AddedWho, EnvelopeStatus.EnvelopeViewed);
if (hist_res.IsFailed)
{ {
await _historyService.RecordAsync(er.EnvelopeId, er.Receiver.EmailAddress, EnvelopeStatus.AccessCodeRequested); _logger.LogError(
"Although the envelope was sent as read-only, the EnvelopeShared hisotry could not be saved. ReadOnly-key: {readOnlyKey}\nEnvelope Receiver:\n{envelopeReceiver}",
var mailRes = await _mailService.SendAccessCodeAsync(envelopeReceiverDto: er); readOnlyKey, JsonConvert.SerializeObject(er));
if (mailRes.IsFailed) _logger.LogNotice(hist_res.Notices);
{
_logger.LogNotice(mailRes);
return this.ViewAccessCodeNotSent();
}
} }
return Redirect($"{envelopeReceiverId}/Locked"); if (er.Envelope.Documents?.FirstOrDefault() is EnvelopeDocumentDto doc && doc.ByteData is not null)
{
ViewData["DocumentBytes"] = doc.ByteData;
ViewData["EnvelopeKey"] = envelopeKey;
ViewData["IsReadOnly"] = true;
ViewData["ReadOnly"] = erro;
ViewData["PSPDFKitLicenseKey"] = _configuration["PSPDFKitLicenseKey"];
return View("ShowEnvelope", er);
}
else
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeKey, message: "No document byte-data was found in ENVELOPE_DOCUMENT table.");
return this.ViewDocumentNotFound();
}
}, },
Fail: (messages, notices) => Fail: (messages, notices) =>
{ {
_logger.LogNotice(notices); _logger.LogNotice(notices);
return this.ViewEnvelopeNotFound(); return this.ViewEnvelopeNotFound();
}); });
} }
catch(Exception ex) catch (Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception:ex, message: _localizer[WebKey.UnexpectedError]);
return this.ViewInnerServiceError();
}
}
[HttpGet("EnvelopeKey/{envelopeReceiverId}/Locked")]
public async Task<IActionResult> EnvelopeLocked([FromRoute] string envelopeReceiverId)
{
try
{
ViewData["UserCulture"] = _cultures[UserLanguage];
return await _envRcvService.ReadByEnvelopeReceiverIdAsync(envelopeReceiverId: envelopeReceiverId).ThenAsync(
Success: er => View()
.WithData("EnvelopeKey", envelopeReceiverId)
.WithData("TFAEnabled", er.Envelope!.TFAEnabled)
.WithData("HasPhoneNumber", er.HasPhoneNumber)
.WithData("SenderEmail", er.Envelope.User!.Email)
.WithData("EnvelopeTitle", er.Envelope.Title),
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
Response.StatusCode = StatusCodes.Status401Unauthorized;
return this.ViewEnvelopeNotFound();
});
}
catch(Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex);
return this.ViewInnerServiceError();
}
}
#region TFA Views
[NonAction]
private async Task<IActionResult> TFAViewAsync(bool viaSms, EnvelopeReceiverSecretDto er_secret, string envelopeReceiverId)
{
if (viaSms)
{
var (smsRes, expiration) = await _envSmsHandler.SendTotpAsync(er_secret);
ViewData["EnvelopeKey"] = envelopeReceiverId;
ViewData["TFAEnabled"] = er_secret.Envelope!.TFAEnabled;
ViewData["HasPhoneNumber"] = er_secret.HasPhoneNumber;
ViewData["SenderEmail"] = er_secret.Envelope.User!.Email;
ViewData["EnvelopeTitle"] = er_secret.Envelope.Title;
if (smsRes?.Failed ?? false)
{ {
var res_json = JsonConvert.SerializeObject(smsRes); _logger.LogError(ex, "An unexpected error occurred while displaying a read-only envelope. Read-only key is {readOnlyKey}. {message}", readOnlyKey, ex.Message);
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, message: $"An unexpected error occurred while sending an SMS code. Response: ${res_json}");
return this.ViewInnerServiceError(); return this.ViewInnerServiceError();
} }
return View("EnvelopeLocked").WithData("CodeType", "smsCode").WithData("SmsExpiration", expiration);
}
else
{
return View("EnvelopeLocked")
.WithData("CodeType", "authenticatorCode")
.WithData("TfaRegDeadline", er_secret.Receiver?.TfaRegDeadline);
}
}
[NonAction]
private async Task<IActionResult?> HandleAccessCodeAsync(Auth auth, EnvelopeReceiverSecretDto er_secret, string envelopeReceiverId)
{
//check the access code verification
if (er_secret.AccessCode != auth.AccessCode)
{
//Constants.EnvelopeStatus.AccessCodeIncorrect
await _historyService.RecordAsync(er_secret.EnvelopeId, er_secret.Receiver!.EmailAddress, EnvelopeStatus.AccessCodeIncorrect);
Response.StatusCode = StatusCodes.Status401Unauthorized;
return View("EnvelopeLocked")
.WithData("EnvelopeKey", envelopeReceiverId)
.WithData("TFAEnabled", er_secret.Envelope!.TFAEnabled)
.WithData("HasPhoneNumber", er_secret.HasPhoneNumber)
.WithData("SenderEmail", er_secret.Envelope.User!.Email)
.WithData("EnvelopeTitle", er_secret.Envelope.Title)
.WithData("ErrorMessage", _localizer[WebKey.WrongAccessCode].Value);
} }
await _historyService.RecordAsync(er_secret.EnvelopeId, er_secret.Receiver!.EmailAddress, EnvelopeStatus.AccessCodeCorrect); [Authorize]
[HttpGet("IsAuthenticated")]
//check if the user has phone is added public IActionResult IsAuthenticated()
if (er_secret.Envelope!.TFAEnabled)
{ {
var rcv = er_secret.Receiver; var envelopeUuid = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
if (rcv.TotpSecretkey is null) var receiverSignature = User.FindFirst(ClaimTypes.Hash)?.Value;
{ return Ok(new { EnvelopeUuid = envelopeUuid, ReceiverSignature = receiverSignature });
rcv.TotpSecretkey = _authenticator.GenerateTotpSecretKey();
await _rcvService.UpdateAsync(rcv);
}
await HttpContext.SignInEnvelopeAsync(er_secret, ReceiverRole.PreAuth);
return await TFAViewAsync(auth.UserSelectSMS, er_secret, envelopeReceiverId);
} }
return null; [HttpPost("lang/{language}")]
} public IActionResult SetLanguage([FromRoute] string language)
[NonAction]
private async Task<IActionResult?> HandleSmsAsync(Auth auth, EnvelopeReceiverSecretDto er_secret, string envelopeReceiverId)
{
if (er_secret.Receiver!.TotpSecretkey is null)
throw new InvalidOperationException($"TotpSecretkey of DTO cannot validate without TotpSecretkey. Dto: {JsonConvert.SerializeObject(er_secret)}");
if (!User.IsInRole(ReceiverRole.PreAuth) || !_envSmsHandler.VerifyTotp(auth.SmsCode!, er_secret.Receiver.TotpSecretkey))
{ {
Response.StatusCode = StatusCodes.Status401Unauthorized; try
ViewData["ErrorMessage"] = _localizer[WebKey.WrongAccessCode].Value; {
return await TFAViewAsync(viaSms: true, er_secret, envelopeReceiverId); language = _sanitizer.Sanitize(language);
if (!_cultures.Languages.Contains(language))
return BadRequest();
UserLanguage = language;
return Redirect(Request.Headers["Referer"].ToString());
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(statusCode: StatusCodes.Status500InternalServerError);
}
} }
return null; [HttpGet("lang")]
} public IActionResult GetLanguages() => Ok(_cultures.Languages);
[NonAction] private string? UserLanguage
private async Task<IActionResult?> HandleAuthenticatorAsync(Auth auth, EnvelopeReceiverSecretDto er_secret, string envelopeReceiverId)
{
if (er_secret.Receiver!.TotpSecretkey is null)
throw new InvalidOperationException($"TotpSecretkey of DTO cannot validate without TotpSecretkey. Dto: {JsonConvert.SerializeObject(er_secret)}");
if (!User.IsInRole(ReceiverRole.PreAuth) || !_authenticator.VerifyTotp(auth.AuthenticatorCode!, er_secret.Receiver.TotpSecretkey, window: VerificationWindow.RfcSpecifiedNetworkDelay))
{ {
Response.StatusCode = StatusCodes.Status401Unauthorized; get
ViewData["ErrorMessage"] = _localizer[WebKey.WrongAccessCode].Value;
return await TFAViewAsync(viaSms: false, er_secret, envelopeReceiverId);
}
return null;
}
#endregion
[HttpPost("EnvelopeKey/{envelopeReceiverId}/Locked")]
public async Task<IActionResult> LogInEnvelope([FromRoute] string envelopeReceiverId, [FromForm] Auth auth)
{
try
{
ViewData["UserCulture"] = _cultures[UserLanguage];
ViewData["EnvelopeKey"] = envelopeReceiverId;
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
if (uuid is null || signature is null)
{ {
_logger.LogEnvelopeError(uuid: uuid, signature: signature, message: _localizer[WebKey.WrongEnvelopeReceiverId]); var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName];
return Unauthorized();
if (string.IsNullOrEmpty(cookieValue))
return null;
var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0];
return culture?.Value ?? null;
} }
set
_logger.LogInformation("Envelope UUID: [{uuid}]\nReceiver Signature: [{signature}]", uuid, signature);
//check access code
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeReceiverId);
var er_secret_res = await _envRcvService.ReadWithSecretByUuidSignatureAsync(uuid: uuid, signature: signature);
if (er_secret_res.IsFailed)
{ {
_logger.LogNotice(er_secret_res.Notices); if(value is null)
return this.ViewEnvelopeNotFound(); Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
}
var er_secret = er_secret_res.Data;
if (auth.HasMulti)
{
return Unauthorized();
}
else if (auth.HasAccessCode)
{
if (await HandleAccessCodeAsync(auth, er_secret, envelopeReceiverId) is IActionResult acView)
return acView;
}
else if (auth.HasSmsCode)
{
if (await HandleSmsAsync(auth, er_secret, envelopeReceiverId) is IActionResult smsView)
return smsView;
}
else if (auth.HasAuthenticatorCode)
{
if(await HandleAuthenticatorAsync(auth, er_secret, envelopeReceiverId) is IActionResult aView)
return aView;
}
else
{
Response.StatusCode = StatusCodes.Status401Unauthorized;
return View("EnvelopeLocked")
.WithData("EnvelopeKey", envelopeReceiverId)
.WithData("TFAEnabled", er_secret.Envelope!.TFAEnabled)
.WithData("HasPhoneNumber", er_secret.HasPhoneNumber)
.WithData("SenderEmail", er_secret.Envelope.User!.Email)
.WithData("EnvelopeTitle", er_secret.Envelope.Title)
.WithData("ErrorMessage", _localizer[WebKey.WrongAccessCode].Value);
}
//continue the process without important data to minimize security errors.
EnvelopeReceiverDto er = er_secret;
//check rejection
var rejRcvrs = await _historyService.ReadRejectingReceivers(er.Envelope!.Id);
if(rejRcvrs.Any())
{
ViewBag.IsExt = !rejRcvrs.Contains(er.Receiver); //external if the current user is not rejected
return View("EnvelopeRejected", er);
}
//check if it has already signed
if (await _historyService.IsSigned(envelopeId: er.Envelope!.Id, userReference: er.Receiver!.EmailAddress))
return View("EnvelopeSigned");
if (er.Envelope.Documents?.FirstOrDefault() is EnvelopeDocumentDto doc && doc.ByteData is not null)
{
ViewData["DocumentBytes"] = doc.ByteData;
}
else
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, message: "No document byte-data was found in ENVELOPE_DOCUMENT table.");
return this.ViewDocumentNotFound();
}
await HttpContext.SignInEnvelopeAsync(er, ReceiverRole.FullyAuth);
//add PSPDFKit licence key
ViewData["PSPDFKitLicenseKey"] = _configuration["PSPDFKitLicenseKey"];
return View("ShowEnvelope", er);
}
catch (Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex);
return this.ViewInnerServiceError();
}
}
[Authorize(Roles = ReceiverRole.FullyAuth)]
[HttpGet("EnvelopeKey/{envelopeReceiverId}/Success")]
public async Task<IActionResult> EnvelopeSigned(string envelopeReceiverId)
{
try
{
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
return await _envRcvService.IsExisting(envelopeReceiverId: envelopeReceiverId).ThenAsync(
SuccessAsync: async isExisting =>
{
if(!isExisting)
return this.ViewEnvelopeNotFound();
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeReceiverId);
if (!envelopeOldService.ReceiverAlreadySigned(response.Envelope, response.Receiver.Id))
return Redirect($"/EnvelopeKey/{envelopeReceiverId}/Locked");
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
ViewData["UserCulture"] = _cultures[UserLanguage];
ViewData["EnvelopeKey"] = envelopeReceiverId;
return View();
},
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return this.ViewEnvelopeNotFound();
});
}
catch (Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex);
return this.ViewInnerServiceError();
}
}
[Authorize(Roles = ReceiverRole.FullyAuth)]
[HttpGet("EnvelopeKey/{envelopeReceiverId}/Rejected")]
public async Task<IActionResult> EnvelopeRejected(string envelopeReceiverId)
{
try
{
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return await _envRcvService.ReadByEnvelopeReceiverIdAsync(envelopeReceiverId).ThenAsync(
SuccessAsync: async (er) =>
{
ViewData["UserCulture"] = _cultures[UserLanguage];
ViewData["UserCulture"] = _cultures[UserLanguage];
return await _historyService.IsRejected(envelopeId: er.EnvelopeId)
? View(er)
: Redirect($"/EnvelopeKey/{envelopeReceiverId}/Locked");
},
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return this.ViewEnvelopeNotFound();
});
}
catch (Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex);
return this.ViewInnerServiceError();
}
}
[HttpGet("EnvelopeKey/{readOnlyKey}/ReadOnly")]
public async Task<IActionResult> EnvelopeReceiverReadOnly([FromRoute] string readOnlyKey)
{
try
{
ViewData["UserCulture"] = _cultures[UserLanguage];
readOnlyKey = _sanitizer.Sanitize(readOnlyKey);
// check if the readOnlyId is valid
if (!readOnlyKey.TryDecode(out var decodedKeys) || decodedKeys.GetEncodeType() != EncodeType.EnvelopeReceiverReadOnly)
{
Response.StatusCode = StatusCodes.Status401Unauthorized;
return this.ViewDocumentNotFound();
}
var readOnlyId = decodedKeys.ParseReadOnlyId();
var erro_res = await _readOnlyService.ReadByIdAsync(readOnlyId);
if (erro_res.IsFailed)
{
_logger.LogNotice(erro_res.Notices);
return this.ViewInnerServiceError();
}
var erro = erro_res.Data;
if (DateTime.Now > erro.DateValid)
return View("EnvelopeExpired");
return await _envRcvService.ReadByUuidSignatureAsync(uuid: erro.Envelope!.Uuid, erro.Receiver!.Signature).ThenAsync(
SuccessAsync: async er =>
{
var envelopeKey = (er.Envelope!.Uuid, er.Receiver!.Signature).EncodeEnvelopeReceiverId();
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeKey);
//TODO: implement multi-threading to history process (Task)
var hist_res = await _historyService.RecordAsync((int)erro.EnvelopeId, erro.AddedWho, EnvelopeStatus.EnvelopeViewed);
if (hist_res.IsFailed)
{
_logger.LogError(
"Although the envelope was sent as read-only, the EnvelopeShared hisotry could not be saved. ReadOnly-key: {readOnlyKey}\nEnvelope Receiver:\n{envelopeReceiver}",
readOnlyKey, JsonConvert.SerializeObject(er));
_logger.LogNotice(hist_res.Notices);
}
if (er.Envelope.Documents?.FirstOrDefault() is EnvelopeDocumentDto doc && doc.ByteData is not null)
{
ViewData["DocumentBytes"] = doc.ByteData;
ViewData["EnvelopeKey"] = envelopeKey;
ViewData["IsReadOnly"] = true;
ViewData["ReadOnly"] = erro;
ViewData["PSPDFKitLicenseKey"] = _configuration["PSPDFKitLicenseKey"];
return View("ShowEnvelope", er);
}
else else
{ {
_logger.LogEnvelopeError(envelopeReceiverId: envelopeKey, message: "No document byte-data was found in ENVELOPE_DOCUMENT table."); var cookieOptions = new CookieOptions()
return this.ViewDocumentNotFound(); {
Expires = DateTimeOffset.UtcNow.AddYears(1),
Secure = false,
SameSite = SameSiteMode.Strict,
HttpOnly = true
};
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)),
cookieOptions);
} }
},
Fail: (messages, notices) =>
{
_logger.LogNotice(notices);
return this.ViewEnvelopeNotFound();
});
}
catch (Exception ex)
{
_logger.LogError(ex, "An unexpected error occurred while displaying a read-only envelope. Read-only key is {readOnlyKey}. {message}", readOnlyKey, ex.Message);
return this.ViewInnerServiceError();
}
}
[Authorize(Roles = ReceiverRole.FullyAuth)]
[HttpGet("IsAuthenticated")]
public IActionResult IsAuthenticated()
{
var envelopeUuid = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var receiverSignature = User.FindFirst(ClaimTypes.Hash)?.Value;
return Ok(new { EnvelopeUuid = envelopeUuid, ReceiverSignature = receiverSignature });
}
[HttpPost("lang/{language}")]
public IActionResult SetLanguage([FromRoute] string language)
{
try
{
language = _sanitizer.Sanitize(language);
if (!_cultures.Languages.Contains(language))
return BadRequest();
UserLanguage = language;
return Redirect(Request.Headers["Referer"].ToString());
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(statusCode: StatusCodes.Status500InternalServerError);
}
}
[HttpGet("lang")]
public IActionResult GetLanguages() => Ok(_cultures.Languages);
private string? UserLanguage
{
get
{
var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName];
if (string.IsNullOrEmpty(cookieValue))
return null;
var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0];
return culture?.Value ?? null;
}
set
{
if(value is null)
Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
else
{
var cookieOptions = new CookieOptions()
{
Expires = DateTimeOffset.UtcNow.AddYears(1),
Secure = false,
SameSite = SameSiteMode.Strict,
HttpOnly = true
};
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)),
cookieOptions);
} }
} }
}
public IActionResult Error404() => this.ViewError404(); public IActionResult Error404() => this.ViewError404();
}
} }

View File

@@ -1,5 +1,6 @@
using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Application.Resources;
using Ganss.Xss; using Ganss.Xss;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;

View File

@@ -1,10 +1,10 @@
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
using EnvelopeGenerator.Extensions;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json; using Newtonsoft.Json;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Web.Controllers namespace EnvelopeGenerator.Web.Controllers
{ {
@@ -29,7 +29,7 @@ namespace EnvelopeGenerator.Web.Controllers
} }
[HttpPost] [HttpPost]
[Authorize(Roles = ReceiverRole.FullyAuth)] [Authorize]
public async Task<IActionResult> CreateAsync([FromBody] EnvelopeReceiverReadOnlyCreateDto createDto) public async Task<IActionResult> CreateAsync([FromBody] EnvelopeReceiverReadOnlyCreateDto createDto)
{ {
try try

View File

@@ -1,87 +0,0 @@
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Web.Models;
using Ganss.Xss;
using Microsoft.AspNetCore.Mvc;
using EnvelopeGenerator.Extensions;
using Microsoft.Extensions.Localization;
using EnvelopeGenerator.Application.Resources;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Extensions;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Authorization;
namespace EnvelopeGenerator.Web.Controllers;
//TODO: Add authorization as well as limiting the link duration (intermediate token with different role) or sign it
[Route("tfa")]
public class TFARegController : ViewControllerBase
{
private readonly IEnvelopeReceiverService _envRcvService;
private readonly IAuthenticator _authenticator;
private readonly IReceiverService _rcvService;
private readonly TFARegParams _params;
public TFARegController(ILogger<TFARegController> logger, HtmlSanitizer sanitizer, Cultures cultures, IStringLocalizer<Resource> localizer, IEnvelopeReceiverService erService, IAuthenticator authenticator, IReceiverService receiverService, IOptions<TFARegParams> tfaRegParamsOptions) : base(logger, sanitizer, cultures, localizer)
{
_envRcvService = erService;
_authenticator = authenticator;
_rcvService = receiverService;
_params = tfaRegParamsOptions.Value;
}
[Authorize]
[HttpGet("{envelopeReceiverId}")]
public async Task<IActionResult> Reg(string envelopeReceiverId)
{
try
{
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
if (uuid is null || signature is null)
{
_logger.LogEnvelopeError(uuid: uuid, signature: signature, message: _localizer[WebKey.WrongEnvelopeReceiverId]);
return Unauthorized();
}
var er_secret_res = await _envRcvService.ReadWithSecretByUuidSignatureAsync(uuid: uuid, signature: signature);
if (er_secret_res.IsFailed)
{
_logger.LogNotice(er_secret_res.Notices);
return this.ViewEnvelopeNotFound();
}
var er_secret = er_secret_res.Data;
if (!er_secret.Envelope!.TFAEnabled)
return Unauthorized();
var rcv = er_secret.Receiver;
// Generate QR code as base 64
rcv!.TotpSecretkey = _authenticator.GenerateTotpSecretKey();
await _rcvService.UpdateAsync(rcv);
var totp_qr_64 = _authenticator.GenerateTotpQrCode(userEmail: rcv.EmailAddress, secretKey: rcv.TotpSecretkey).ToBase64String();
// Calculate RFA registiration deadline
if (rcv.TfaRegDeadline is null)
{
rcv.TfaRegDeadline = _params.Deadline;
await _rcvService.UpdateAsync(rcv);
}
else if (rcv.TfaRegDeadline <= DateTime.Now)
return View("_Expired");
ViewData["RegDeadline"] = rcv.TfaRegDeadline;
ViewData["TotpQR64"] = totp_qr_64;
return View();
}
catch(Exception ex)
{
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex, message: _localizer[WebKey.UnexpectedError]);
return this.ViewInnerServiceError();
}
}
}

Some files were not shown because too many files have changed in this diff Show More