5 Commits

Author SHA1 Message Date
96864eed93 Password reset
Some checks failed
Dotnet build and test / log-the-inputs (push) Failing after 4s
Dotnet build and test / build (push) Failing after 0s
2025-09-07 22:37:33 +01:00
9c5ea692b0 Passwor re-init 2025-09-07 17:43:13 +01:00
111ada56f7 localisation 2025-08-31 18:27:53 +01:00
1f4b3980c7 restored templates
Some checks failed
Dotnet build and test / log-the-inputs (push) Failing after 2s
Dotnet build and test / build (push) Failing after 2s
2025-08-25 14:18:26 +01:00
7ac48c3bbf Drops the replaced Client table 2025-08-25 13:32:31 +01:00
65 changed files with 5233 additions and 2352 deletions

View File

@ -16,7 +16,7 @@
<PackageVersion Include="HigginsSoft.IdentityServer8.EntityFramework" Version="8.0.5-preview-net9" />
<PackageVersion Include="HigginsSoft.IdentityServer8.Security" Version="8.0.5-preview-net9" />
<PackageVersion Include="IdentityModel.AspNetCore" Version="4.3.0" />
<PackageVersion Include="MailKit" Version="4.13.0" />
<PackageVersion Include="MailKit" Version="4.8.0" />
<PackageVersion Include="Microsoft.AspNetCore.Antiforgery" Version="2.3.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Google" Version="9.0.7" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.7" />
@ -42,7 +42,7 @@
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="Microsoft.Playwright" Version="1.53.0" />
<PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
<PackageVersion Include="MimeKit" Version="4.13.0" />
<PackageVersion Include="MimeKit" Version="4.8.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<PackageVersion Include="PayPalMerchantSDK" Version="2.16.250" />

View File

@ -33,7 +33,7 @@ namespace Yavsc.ApiControllers
public BillingController(
IAuthorizationService authorizationService,
ILoggerFactory loggerFactory,
IStringLocalizer<Yavsc.YavscLocalization> SR,
IStringLocalizer<BillingController> SR,
ApplicationDbContext context,
IOptions<GoogleAuthSettings> googleSettings,
IYavscMessageSender GCMSender,

View File

@ -0,0 +1,18 @@
namespace Yavsc.Services
{
[Serializable]
internal class YavscInfrastructureException : Exception
{
public YavscInfrastructureException()
{
}
public YavscInfrastructureException(string? message) : base(message)
{
}
public YavscInfrastructureException(string? message, Exception? innerException) : base(message, innerException)
{
}
}
}

View File

@ -13,7 +13,7 @@ namespace Yavsc.Models.Billing
using Yavsc.Abstract.Workflow;
using Yavsc.Services;
public abstract class NominativeServiceCommand : IDecidableQuery, IIdentified<long>
public abstract class NominativeServiceCommand : IDecidableQuery, IIdentified<long>, IBillable
{
public string GetInvoiceId() { return GetType().Name + "/" + Id; }

View File

@ -24,16 +24,7 @@ namespace Yavsc.Models.Haircut
string _description = null;
public override string Description
{
get
{
string type = ResourcesHelpers.GlobalLocalizer[this.GetType().Name];
string gender = ResourcesHelpers.GlobalLocalizer[this.Prestation.Gender.ToString()];
return $"{_description} {type} ({gender})";
}
set
{
_description = value;
}
get; set;
}

View File

@ -453,7 +453,6 @@
<data name="PasswordConfirm"><value>Confirmation du mot de passe</value></data>
<data name="ErrorSendingEmailForConfirm"><value>L'envoi de de courrier pour confirmation de l'adresse e-mail a échoué.</value></data>
<data name="EmailSentForConfirm"><value>Un courrier a été envoyé pour confirmation de l'adresse e-mail .</value></data>
<data name="ConfirmYourAccountTitle"><value>S'il vous plait, confirmez votre addresse e-mail</value></data>
<data name="ConfirmYourAccountBody"><value>Vous avez créé avec succès votre compte {0},
mais votre adresse e-mail reste à confirmer.
Pour ce faire, suivez le lien suivant : &lt;{1}&gt;.

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader><resheader name="version">2.0</resheader><resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader><resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader><data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data><data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data><data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"><value>[base64 mime encoded serialized .NET Framework object]</value></data><data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"><value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value><comment>This is a comment</comment></data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root"
xmlns=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="HairCutQueryValidation"><value>Une demande (de {0}) en coiffure à domicile vient d'être validée</value></data>
</root>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,788 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader><resheader name="version">2.0</resheader><resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader><resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader><data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data><data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data><data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"><value>[base64 mime encoded serialized .NET Framework object]</value></data><data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"><value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value><comment>This is a comment</comment></data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root"
xmlns=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About">
<value>About</value>
</data>
<data name="About_BookAStar">
<value>About BookAStar</value>
</data>
<data name="About_Message">
<value>Welcome by your stars.</value>
</data>
<data name="access_denied">
<value>Access denied</value>
</data>
<data name="AccountBalance">
<value>Account Balance</value>
</data>
<data name="Activity">
<value>Activity</value>
</data>
<data name="Activities">
<value>Activities</value>
</data>
<data name="additionally">
<value>additionally</value>
</data>
<data name="Allow my geolocatisation, nearby my clients">
<value>Allow my geolocatisation, nearby my clients</value>
</data>
<data name="AnIMessageHasbeenSent">
<value>An instant message has been sent to {0}, showing to him your query. You should be contacted very soon.</value>
</data>
<data name="aprestation">
<value>a prestation</value>
</data>
<data name="AskForAnEstimate">
<value>Ask for an estimate</value>
</data>
<data name="AttachedFiles">
<value>Attached files</value>
</data>
<data name="AuthenticatedOnly">
<value>You must be authenticated in order to access this information</value>
</data>
<data name="Author">
<value>Author</value>
</data>
<data name="available">
<value>available</value>
</data>
<data name="Basket">
<value>Basket</value>
</data>
<data name="Bill_edition">
<value>Bill edition</value>
</data>
<data name="Bill_removal">
<value>Bill removal</value>
</data>
<data name="BillAccessControl">
<value>Bill access control</value>
</data>
<data name="BillCreated">
<value>Bill created</value>
</data>
<data name="BillSourceCode">
<value>Bill source code</value>
</data>
<data name="BillUpdated">
<value>Bill updated</value>
</data>
<data name="body">
<value>body</value>
</data>
<data name="Book A Star">
<value>Book an artist</value>
</data>
<data name="Book IT">
<value>Book a performer in information technology</value>
</data>
<data name="BookingTitleArtiste">
<value>Book an artiste</value>
</data>
<data name="BookingTitle6829C">
<value>Book a software editor</value>
</data>
<data name="Catalog">
<value>Catalog</value>
</data>
<data name="Change user name form">
<value>Change user name form</value>
</data>
<data name="Change your account settings">
<value>Change your account settings</value>
</data>
<data name="ChooseADescription">
<value>Please, choose a description</value>
</data>
<data name="ChooseATitle">
<value>Please, choose a title</value>
</data>
<data name="ChooseADateInTheFutur">
<value>Please, Choose A Date In The Futur</value>
</data>
<data name="ChooseAnEventDate">
<value>Please, choose a date for this event </value>
</data>
<data name="Ciffer">
<value>Ciffer</value>
</data>
<data name="Circles">
<value>Circles</value>
</data>
<data name="Click action">
<value>Click action</value>
</data>
<data name="Color">
<value>Color</value>
</data>
<data name="Comment">
<value>Comment</value>
</data>
<data name="Consultant">
<value>Consultant</value>
</data>
<data name="ContactAPerformer">
<value>Contact a performer</value>
</data>
<data name="CouldNotConvertVToDouble">
<value>Could not convert '{0}' to double.</value>
</data>
<data name="Count">
<value>Count</value>
</data>
<data name="Create">
<value>Créer</value>
</data>
<data name="Credits">
<value>Credits</value>
</data>
<data name="Date_search">
<value>Date search</value>
</data>
<data name="DB">
<value>Data base</value>
</data>
<data name="Description">
<value>Description</value>
</data>
<data name="Disable">
<value>Disable</value>
</data>
<data name="DisplayName">
<value>Display Name</value>
</data>
<data name="DoAnEstimate">
<value>Do an estimate</value>
</data>
<data name="DoComment">
<value>Commenter</value>
</data>
<data name="DocTemplateException">
<value>Une erreur est survenue à la génération de votre document</value>
</data>
<data name="DoNotPublishMyActivity">
<value>Ne pas publier mon activité</value>
</data>
<data name="DoPost">
<value>Do post</value>
</data>
<data name="DoSpecifyCircles">
<value>S'il vous plait, spécifiez ceux de vos cercles à qui est destiné ce contenu</value>
</data>
<data name="DoTag">
<value>Tagger</value>
</data>
<data name="DuplicateEmail">
<value>This email adress is already used ({0}).</value>
</data>
<data name="DuplicateUserName">
<value>This user name is already used ({0}).</value>
</data>
<data name="Edit">
<value>Edit</value>
</data>
<data name="Edited">
<value>Edited</value>
</data>
<data name="EditRelatedSkills">
<value>Edit related skills</value>
</data>
<data name="EndDate">
<value>Date de fin</value>
</data>
<data name="EndHour">
<value>Heure de fin</value>
</data>
<data name="email">
<value>e-mail</value>
</data>
<data name="EMailToPerformerFooter">
<value> Generated e-mail from {0}, because of your perfomer profile publication, and your email usage agreement. Visit {1} to modify your profile, unsubscribe or unregister.</value>
</data>
<data name="entries">
<value>entries</value>
</data>
<data name="Estimate not found">
<value>Estimate not found</value>
</data>
<data name="EstimateWanted">
<value>Estimate wanted</value>
</data>
<data name="EventWebPage">
<value>Event Web page</value>
</data>
<data name="ExistantDB">
<value>Existant data base</value>
</data>
<data name="External Logins">
<value>External Logins</value>
</data>
<data name="FillInAFutureDate">
<value>Please, use a date in the future as starting date.</value>
</data>
<data name="Forbidden">
<value>Restricted area</value>
</data>
<data name="from">
<value>from</value>
</data>
<data name="GiveAnExplicitReason">
<value>Tell more, below, about your query</value>
</data>
<data name="GoogleDidntGeoLocalized">
<value>Google could'nt identify this place</value>
</data>
<data name="Google calendar">
<value>Google calendar</value>
</data>
<data name="Google error">
<value>Google error : {0}</value>
</data>
<data name="Google registration id">
<value>Google registration id</value>
</data>
<data name="Home">
<value>Home</value>
</data>
<data name="Hide">
<value>Hide</value>
</data>
<data name="hidden">
<value>hidden</value>
</data>
<data name="Hide source">
<value>Hide the bill source text</value>
</data>
<data name="I understood">
<value>I understood</value>
</data>
<data name="Icons made by">
<value>Icons made by</value>
</data>
<data name="ImgLocator">
<value>Image URI</value>
</data>
<data name="ImportException">
<value>Exception at importing</value>
</data>
<data name="InternalServerError">
<value>Internal Server Error</value>
</data>
<data name="is licensed by">
<value>is licensed by</value>
</data>
<data name="Item added to basket">
<value>Item added to basket</value>
</data>
<data name="Location">
<value>Location</value>
</data>
<data name="Login">
<value>Login</value>
</data>
<data name="Logout">
<value>Logout</value>
</data>
<data name="MainActivity">
<value>Main activity</value>
</data>
<data name="Manage">
<value>Manage</value>
</data>
<data name="ManagedSiteSkills">
<value>Site skills</value>
</data>
<data name="MaxDate">
<value>Maximal date for the rendez-vous</value>
</data>
<data name="MEACode">
<value>Mainly Exerted Activity code</value>
</data>
<data name="Manage your account">
<value>Manage your account</value>
</data>
<data name="Members">
<value>Members</value>
</data>
<data name="Message sent">
<value>Your message has been sent.</value>
</data>
<data name="MinDate">
<value>Minimal date for the rendez-vous</value>
</data>
<data name="Modify">
<value>Modify</value>
</data>
<data name="My Estimates">
<value>My estimates</value>
</data>
<data name="Name">
<value>Name</value>
</data>
<data name="Needs">
<value>Needs</value>
</data>
<data name="Need">
<value>Need</value>
</data>
<data name="nouvel instrument">
<value>new instrument</value>
</data>
<data name="UserName">
<value>Display name</value>
</data>
<data name="New user name">
<value>New display name</value>
</data>
<data name="New Tag">
<value>New Tag</value>
</data>
<data name="NewPasswordMessageSent">
<value>A message had been sent, containing a link to follow in order to update your password.</value>
</data>
<data name="no content">
<value>no content</value>
</data>
<data name="NoSkillforthisactivity">
<value>No skill was informed by any performer for this activity</value>
</data>
<data name="none">
<value>none</value>
</data>
<data name="Non existent user">
<value>Non existent user</value>
</data>
<data name="Not Approuved">
<value>Not Approuved</value>
</data>
<data name="No calendar for this user">
<value>No calendar was associated to this user.</value>
</data>
<data name="Offline">
<value>Offline</value>
</data>
<data name="Online">
<value>Online</value>
</data>
<data name="OnlyAuthorizedMayContact">
<value>Only authorized users may contact a performer by mail.</value>
</data>
<data name="Pdf version">
<value>Pdf version</value>
</data>
<data name="PerformanceDate">
<value>Performance date</value>
</data>
<data name="PerformancePlace">
<value>Performance place</value>
</data>
<data name="Performers">
<value>Performers</value>
</data>
<data name="Performer">
<value>Performer</value>
</data>
<data name="Person">
<value>Person</value>
</data>
<data name="Photo">
<value>Photo</value>
</data>
<data name="PhotoUpdated">
<value>Photo updated</value>
</data>
<data name="PleaseCheckYourEmail">
<value>Please check your email to reset your password.</value>
</data>
<data name="PleaseConfirmYourNewPassword">
<value>Please confirm your new password</value>
</data>
<data name="PleaseFillInABody">
<value>Please fill in a body</value>
</data>
<data name="PleaseFillInAReason">
<value>Please, fill in a reason</value>
</data>
<data name="Posted">
<value>Posted</value>
</data>
<data name="PreferedDate">
<value>Prefered date</value>
</data>
<data name="prestation">
<value>prestation</value>
</data>
<data name="PresationLocation">
<value>Presation location:{0}.\n</value>
</data>
<data name="Preview">
<value>Preview</value>
<comment>comment on preview</comment>
</data>
<data name="Profile edition">
<value>Profile edition</value>
</data>
<data name="Private circle">
<value>Private circle</value>
</data>
<data name="ProviderId">
<value>Provider identifier</value>
</data>
<data name="ProviderName">
<value>Provider name</value>
</data>
<data name="Product reference">
<value>Product_reference</value>
</data>
<data name="ReadMore">
<value>Read more ...</value>
</data>
<data name="reason">
<value>reason</value>
</data>
<data name="Register">
<value>Register</value>
</data>
<data name="RegistrationUnexpectedError">
<value>Registration: unexpected error occured: "{0}". Please forgive for troubles</value>
</data>
<data name="Remember me">
<value>Remember me</value>
</data>
<data name="Remove">
<value>Remove</value>
</data>
<data name="ResetPassword">
<value>Reset your password</value>
</data>
<data name="Role">
<value>Role</value>
</data>
<data name="role created">
<value>role created</value>
</data>
<data name="RoleName">
<value>Role name</value>
</data>
<data name="Save these settings">
<value>Save these settings</value>
</data>
<data name="Search">
<value>Search</value>
</data>
<data name="SiteSkills">
<value>Talents/Compétences/Spécialités gérés sur ce site</value>
</data>
<data name="Skill">
<value>Skill</value>
</data>
<data name="Skills">
<value>Skills</value>
</data>
<data name="Specifyavalidlatitude">
<value>Please, specify a valid latitude</value>
</data>
<data name="Specifyavalidlongitude">
<value>Please, specify a valid longitude</value>
</data>
<data name="SpecifyLatitude">
<value>Specify a latitude</value>
</data>
<data name="SpecifyLongitude">
<value>Specify a longitude</value>
</data>
<data name="SpecifyPlace">
<value>Please, specify a place</value>
</data>
<data name="SomeoneAskingYouForAnEstimate">
<value>{0} would want you to establish an estimate concerning {1}</value>
</data>
<data name="Sound">
<value>Sound</value>
</data>
<data name="StartDate">
<value>Start date</value>
</data>
<data name="StartDateAfterEndDate">
<value>The ending date must be later than the starting one.</value>
</data>
<data name="StartHour">
<value>Start hour</value>
</data>
<data name="Submit">
<value>Submit</value>
</data>
<data name="SubmitChanges">
<value>Submit changes</value>
</data>
<data name="Tag">
<value>Tag</value>
</data>
<data name="Tag name">
<value>Tag name</value>
</data>
<data name="Tex version">
<value>LaTeX version</value>
</data>
<data name="ThisSiteUsesCookies">
<value>This site uses cookies</value>
</data>
<data name="ThisPerformerGivesAccessToHisCalendarAndSeemsToBeAvailableThis">
<value>ThisPerformer Gives access to his calendar and seems to be available this</value>
</data>
<data name="ThisPerformerGivesAccessToHisCalendarAndItAppearsHeShouldNotBeAvailableThis">
<value>This performer gives access to his calendar and it appears he should not be available this</value>
</data>
<data name="ThisPerformerDoesntGiveAccessToHisCalendar">
<value>ThisPerformerDoesntGiveAccessToHisCalendar</value>
</data>
<data name="Title">
<value>Title</value>
</data>
<data name="to">
<value>to</value>
</data>
<data name="TwoFactorAuthentication">
<value>Two-Factor authentication</value>
</data>
<data name="Unitary_cost">
<value>Unitary_cost</value>
</data>
<data name="Unregister">
<value>Unregister</value>
</data>
<data name="User List">
<value>User List</value>
</data>
<data name="User name">
<value>User name</value>
</data>
<data name="UsersInRole">
<value>List of users assuming the role "{0}"</value>
</data>
<data name="UserNotInThisRole">
<value>This user is not in this role</value>
</data>
<data name="UserSkills">
<value>User skills</value>
</data>
<data name="View source">
<value>View source</value>
</data>
<data name="was added to_the_role">
<value>was added to the role</value>
</data>
<data name="was_added_to_the_empty_role">
<value>There was no user in the "{1}" role. You ({0}) was just added as firt user in the "{1}" role.</value>
</data>
<data name="Welcome">
<value>Welcome</value>
<comment></comment>
</data>
<data name="XHasBeenNotified">
<value>{0} has been notified of your query, you should be fast contacted</value>
</data>
<data name="Xshouldbeavailable">
<value>regarding his calendar, {0} should be available for this booking</value>
</data>
<data name="Yavsc.Models.Musical.Profiles.Instrumentation">
<value>Paramètres musicien (l'instrument)</value>
</data>
<data name="Yavsc.Models.Musical.Profiles.DjSettings">
<value>Paramètres Dj (le compte SoundCloud.com)</value>
</data>
<data name="Yavsc.Models.Musical.Profiles.FormationSettings">
<value>Paramètres formation (les partenaires)</value>
</data>
<data name="Yavsc.Models.Musical.Profiles.GeneralSettings">
<value>Paramètres généraux: une couleur musicale</value>
</data>
<data name="YouNeedToBeAuthenticatedIOToContact">
<value>You need to be authenticated in order to contact a performer</value>
</data>
<data name="younotadmin">
<value>You're not administrator</value>
</data>
<data name="YourEstimates">
<value>Your estimates</value>
</data>
<data name="YourMEACode">
<value>Your activity</value>
</data>
<data name="YourNeed">
<value>Your need</value>
</data>
<data name="yourquerytransmitted">
<value>your query has been transmitted</value>
</data>
<data name="YourSkills">
<value>Your skills, your special fields, the scope of your activities</value>
</data>
<data name="YourPosts">
<value>You posts</value>
</data>
<data name="YourProfile">
<value>Your profile</value>
</data>
<data name="YourMessageHasBeenSent">
<value>Your message has been sent</value>
</data>
<data name="Longueur de cheveux">
<value>Hair Length</value>
</data>
<data name="Français">
<value>French</value>
</data>
<data name="Anglais">
<value>English</value>
</data>
<data name="Portugais"><value>Portugese</value></data>
<data name="RequiredField">
<value>This field is required.</value>
</data>
<data name="PasswordTooShort">
<value>Passwords must be at least {0} characters.</value>
</data>
<data name="PasswordRequiresNonLetterAndDigit">
<value>Passwords must have at least one non letter and non digit character.</value>
</data>
<data name="PasswordRequiresDigit">
<value>Passwords must have at least one digit ('0'-'9').</value>
</data>
<data name="PasswordRequiresUpper">
<value>Passwords must have at least one uppercase ('A'-'Z').</value>
</data>
<data name="PassAndConfirmDontMach">
<value>Passwords and confirmation are not the same.</value>
</data>
<data name="PasswordConfirm">
<value>Password confirmation</value>
</data>
<data name="InvalidUserName">
<value>Invalid user name.
Valid caracters are: underscore '_', '-', 'a' - 'z', 'A' - 'Z', '0' - '9', the single quote ('), the space and the dot.</value>
</data>
<data name="EmailSentForConfirm">
<value>An email has been sent to confirm your addresse.</value>
</data>
<data name="ConfirmYourAccountBody"><value>You successfully created your {0} account,
but your e-mail address is not yet confirmed.
Please, in order to validate it, follow this link &lt;{1}&gt;.
Thanks.
--
{0} - {2} &lt;https://{3}&gt;</value>
</data>
<data name="Instrumentation"><value>Instrumentation</value></data>
<data name="Partenariat"><value>Co-working</value></data>
</root>

View File

@ -437,7 +437,6 @@
<data name="ConfirmPassword"><value>Confirme sua senha</value></data>
<data name="ErrorSendingEmailForConfirm"><value>O envio de e-mail para confirmação do endereço de e-mail falhou.</value></data>
<data name="EmailSentForConfirm"><value>Um e-mail foi enviado para confirmação do endereço de e-mail.</value></data>
<data name="ConfirmYourAccountTitle"><value>Por favor, confirme seu endereço de e-mail</value></data>
<data name="ConfirmYourAccountBody"><value>Você criou sua conta {0} com sucesso,
mas o seu endereço de e-mail tem que ser confirmado.
Para fazer isso, siga o seguinte link : &lt;{1}&gt;.

View File

@ -0,0 +1,282 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Reset Password"><value>Ré-initialiser votre mot de passe</value></data>
<data name="role created"><value>Rôle créé</value></data>
<data name="RoleName"><value>Nom du rôle </value></data>
<data name="Save these settings"><value>Enregistrer ces paramètres</value></data>
<data name="Search"><value>Chercher</value></data>
<data name="Select a Google calendar"><value>Selectioner un calendrier Google</value></data>
<data name="Send"><value>Envoyer</value></data>
<data name="Send a private message"><value>Envoyer un message privé</value></data>
<data name="Send a public message"><value>Envoyer un message publique</value></data>
<data name="Set"><value>Positioner</value></data>
<data name="SettingsClass"><value>Classe du paramétrage</value></data>
<data name="Short"><value>court</value></data>
<data name="Son blog"><value>Son blog</value></data>
<data name="Your performer profile"><value>Votre profil professionel</value></data>
<data name="Setup below your activity parameters"><value>Positionnez ci-après vos les paramêtre de votre activité</value></data>
<data name="SiteSkills"><value>Talents/Compétences/Spécialités gérés sur ce site</value></data>
<data name="Skill"><value>Compétence</value></data>
<data name="Skills"><value>Talents/Compétences/Spécialités</value></data>
<data name="SomeoneAskingYouForAnEstimate"><value>{0} désirerait un devis concernant {1}</value></data>
<data name="Sound"><value>Son</value></data>
<data name="SpecifyLatitude"><value>Specify a latitude</value></data>
<data name="SpecifyLongitude"><value>Specify a longitude</value></data>
<data name="SpecifyPlace"><value>L'endroit ainsi renseigné ne semble pas convenir ...</value></data>
<data name="Specifyavalidlatitude"><value>Please, specify a valid latitude.</value></data>
<data name="StartDate"><value>Date de début</value></data>
<data name="StartDateAfterEndDate"><value>La date de fin doit être postérieure à la date de début.</value></data>
<data name="StartHour"><value>Heure de début</value></data>
<data name="Submit"><value>Soumettre</value></data>
<data name="SubmitChanges"><value>Envoyer les modifications</value></data>
<data name="Tag"><value>Tag</value></data>
<data name="Tag name"><value>Nom du tag</value></data>
<data name="Tex version"><value>Version LaTeX</value></data>
<data name="ThisSiteUsesCookies"><value>Ce site utilise les cookies</value></data>
<data name="ThisPerformerGivesAccessToHisCalendarAndSeemsToBeAvailableThis"><value>Selon son calendier Google, ce perstataire est disponbile ce</value></data>
<data name="ThisPerformerGivesAccessToHisCalendarAndItAppearsHeShouldNotBeAvailableThis"><value>Selon son calendier Google, ce perstataire pourrait ne pas être disponible ce</value></data>
<data name="ThisPerformerDoesntGiveAccessToHisCalendar"><value>Ce prestataire n'a pas mis de calendrier à disposition.</value></data>
<data name="Title"><value>Titre</value></data>
<data name="Feature"><value>Fonctionalité</value></data>
<data name="FeatureId"><value>Identifiant de fonctionalité</value></data>
<data name="to"><value>à</value></data>
<data name="TwoFactorAuthentication"><value>Double identification</value></data>
<data name="Unitary_cost"><value>Coût unitaire</value></data>
<data name="Unregister"><value>Se désinscrire</value></data>
<data name="Use a local account to log in"><value>Utiliser un compte local pour se connecter</value></data>
<data name="Use another service to log in"><value>Utiliser un autre service pour se connecter</value></data>
<data name="UseGeoLocalizationToReduceDistanceWithClients"><value>Utiliser ma position pour avoir des clients plus proches</value></data>
<data name="User"><value>Utilisateur</value><comment></comment></data>
<data name="User List"><value>Liste des utilisateurs</value><comment></comment></data>
<data name="UserName"><value>Nom d'utilisateur</value></data>
<data name="UsersInRole"><value>Liste des utilisateurs assumant le rôle "{0}"</value></data>
<data name="UserSkills"><value>Talents/compétences/spécialités utilisateur</value></data>
<data name="UserNotInThisRole"><value>Le rôle demandé n'est pas assumé par ce préstataire</value></data>
<data name="ValidationDate"><value>Date de validation</value></data>
<data name="View_source"><value>Voir le texte source de l'article</value></data>
<data name="was_added_to_the_role"><value>a été ajouté au rôle</value></data>
<data name="was_added_to_the_empty_role"><value>Il n'y avait pas d'utilisateur dans le rôle "{1}". Vous ({0}) avez été ajouté au rôle "{1}".</value></data>
<data name="WebSite"><value>Site Web</value><comment></comment></data>
<data name="Welcome"><value>Bienvenue</value><comment></comment></data>
<data name="Women"><value>Femme</value><comment></comment></data>
<data name="XHasBeenNotified"><value>{0} à été notifié de votre demande, vous devriez être contacté rapidement</value></data>
<data name="Xshouldbeavailable"><value>Au vu de son calendrier,
{0} devrait être disponible pour ce rendez-vous</value></data>
<data name="Yavsc.Models.Musical.Profiles.Instrumentation"><value>Paramètres musicien (l'instrument)</value></data>
<data name="Yavsc.Models.Musical.Profiles.DjSettings"><value>Paramètres Dj (le compte SoundCloud.com)</value></data>
<data name="Yavsc.Models.Workflow.Profiles.FormationSettings"><value>Paramètres formation (les partenaires)</value></data>
<data name="Yavsc.Models.Musical.Profiles.GeneralSettings"><value>Paramètres généraux (visibilité et présentation)</value></data>
<data name="Yavsc.Models.Haircut.BrusherProfile"><value>Paramètres coiffeur: tarifs, disponibilité</value></data>
<data name="Yes"><value>Oui</value></data>
<data name="YouNeedToBeAuthenticatedIOToContact"><value>Vous devez vous authentifier pour pouvoir demander un devis
à un préstataire.</value></data>
<data name="younotadmin"><value>Vous n'êtes pas administrateur</value></data>
<data name="Your account settings"><value>Les paramètres de votre compte</value></data>
<data name="Your book query"><value>Votre demande de rendez-vous</value></data>
<data name="Your password has been reset."><value>Votre mote de passe a été mis à jour.</value></data>
<data name="YourEstimates"><value>Vos Devis</value></data>
<data name="YourMEACode"><value>Votre activité</value></data>
<data name="YourNeed"><value>Votre besoin</value></data>
<data name="yourquerytransmitted"><value>Votre demande a été transmise</value></data>
<data name="YourSkills"><value>Vos talents, vos spécialités, le domaine de vos activités</value></data>
<data name="Your posts"><value>Vos publications</value></data>
<data name="Your profile"><value>Votre profil</value></data>
<data name="YourMessageHasBeenSent"><value>Votre messge a été envoyé</value></data>
<data name="Tell more, below, about your query"><value>Dites en plus, ci àprès, à propos de cet évennement</value></data>
<data name="UnsetActivity"><value>Supprimer mon profil professionel</value></data>
<data name="Français"><value>Français</value></data>
<data name="Anglais"><value>Anglais</value></data>
<data name="Portugais"><value>Portugais</value></data>
<data name="InvalidUserName"><value>Nom d'utilisateur invalide.
Les caratères valides sont: le souligné (_), le petit titret (-), l'apostrohe ('), les minuscules et majuscules de a à z, les chiffres de 0 à 9, l'espace et le point.</value></data>
<data name="RequiredField"><value>Ce champ est obligatoire.</value></data>
<data name="validationError"><value>Champ invalide ...</value></data>
<data name="PasswordTooShort"><value>Le Mot de passe doit contenir au moins 6 caractères.</value></data>
<data name="PasswordRequiresNonLetterAndDigit"><value>Mot de passe doit contenir au moins un caractère spécial (ni un chiffre, ni une lettre).</value></data>
<data name="PasswordRequiresDigit"><value>Les mots de passe doivent contenir au moins un chiffre ('0' à '9').</value></data>
<data name="PasswordRequiresUpper"><value>Les mots de passe doivent contenir au moins une lettre majuscule ('A' à 'Z').</value></data>
<data name="PassAndConfirmDontMach"><value>Le mot de passe et sa confirmation ne sont pas les mêmes.</value></data>
<data name="PasswordConfirm"><value>Confirmation du mot de passe</value></data>
<data name="ConfirmPassword"><value>Confirmation du mot de passe</value></data>
<data name="ErrorSendingEmailForConfirm"><value>L'envoi de de courrier pour confirmation de l'adresse e-mail a échoué.</value></data>
<data name="EmailSentForConfirm"><value>Un courrier a été envoyé pour confirmation de l'adresse e-mail .</value></data>
<data name="AccountEmailFactorTitle"><value>Le second facteur de votre identification</value></data>
<data name="AccountEmailFactorBody"><value>Votre compte est endurci d'une requisition d'un second facteur d'identification.
Une nouvelle connection depuis un navigateur web nécéssite votre authorisation.
Vous pouvez l'accorder en suivant le lien suivant : &lt;{1}&gt;.
Votre code dáctivation est : {4}
Vour pourrez cochez la case "Se souvenir de ce navigateur" pour conserver cette authorisation pour ce navigateur.
{0} - {2} &lt;{3}&gt;</value></data>
<data name="ConfirmYourAccountBody"><value>Vous avez créé avec succès votre compte {0},
mais votre adresse e-mail reste à confirmer.
Pour ce faire, veuillez, s'il vous plait, suivre le lien suivant
dans votre navigateur favori : &lt;{1}&gt;.
--
{0} - {2} &lt;{3}&gt;</value></data>
<data name="BadStringLength"><value>Taille maximale: {0} caractère.</value></data>
<data name="DetailledMinMaxStringLength"><value>Ce champ est
d'au moins {0} et d'au plus {1} caractère(s) (manquent {2}) ou ({3} en trop).</value></data>
<data name="DetailledMaxStringLength"><value>Ce champ est
d'au plus {0} caractère(s) ({1} en excès). </value></data>
<data name="EmailSentToPerformer"><value>Un message éléctronique a été envoyé à {0}.</value></data>
<data name="QueryValidatedNonReg"><value>Un client vient de valider une demande de prestation à votre encontre:
Prestation: {0}
Client : {1}
Date: {2},
Adresse: {3}
-----
{4}
Facture prévue (non réglée): {5}</value></data>
<data name="QueryValidatedRegular"><value>Un client vient de valider une demande de prestation à votre encontre:
Prestation: {0}
Client : {1}
Date: {2},
Adresse: {3}
-----
{4}
Facture réglée: {5}</value></data>
<data name="AllowMonthlyEmail"><value>Recevoir la lettre mensuelle d'information</value></data>
<data name="Join"><value>joindre</value></data>
<data name="Enroll"><value>Enrôler</value></data>
<data name="Fire"><value>Licencier</value></data>
<data name="LiveFlow"><value>Flux live</value></data>
<data name="Instrumentation"><value>Instrumentation</value></data>
<data name="Partenariat"><value>Partenariat</value></data>
<data name="IconWebUploadSpecification"><value>
Le format png pourrait être supporté ici,
le format Gif, peut-être aussi, et même, mais là, moins souvent, le surnommé Jpg.
</value></data>
</root>

View File

@ -14,16 +14,17 @@ using System.Web;
namespace Yavsc.Services
{
public class MailSender : IEmailSender<ApplicationUser>, IEmailSender, ITrueEmailSender
public class MailSender : IEmailSender<ApplicationUser>, IEmailSender, ITrueEmailSender
{
private readonly IStringLocalizer<YavscLocalization> localizer;
private readonly IStringLocalizer<MailSender> localizer;
readonly SiteSettings siteSettings;
readonly SmtpSettings smtpSettings;
private readonly ILogger logger;
public MailSender(
IOptions<SiteSettings> sitesOptions,
IOptions<SiteSettings> sitesOptions,
IOptions<SmtpSettings> smtpOptions,
ILoggerFactory loggerFactory
ILoggerFactory loggerFactory,
IStringLocalizer<MailSender> localizer
)
{
this.localizer = localizer;
@ -46,17 +47,15 @@ namespace Yavsc.Services
/// <returns>a MessageWithPayloadResponse,
/// <c>bool somethingsent = (response.failure == 0 &amp;&amp; response.success > 0)</c>
/// </returns>
public async Task SendEmailAsync(string email, string subject, string htmlMessage)
{
await SendEmailAsync("", email, subject, htmlMessage);
await SendEmailAsync("", email, subject, htmlMessage);
}
public async Task<string> SendEmailAsync(string name, string email, string subject, string htmlMessage)
{
logger.LogInformation($"SendEmail for {email} : {subject}");
MimeMessage msg = new ();
logger.LogInformation($"SendEmail for {email} : {subject}");
MimeMessage msg = new();
msg.From.Add(new MailboxAddress(siteSettings.Owner.Name,
siteSettings.Owner.EMail));
msg.To.Add(new MailboxAddress(name, email));
@ -68,20 +67,22 @@ namespace Yavsc.Services
msg.MessageId = MimeKit.Utils.MimeUtils.GenerateMessageId(
siteSettings.Authority
);
using (SmtpClient sc = new ())
using (SmtpClient sc = new())
{
sc.Connect(
smtpSettings.Server,
smtpSettings.Port,
SecureSocketOptions.Auto);
if (smtpSettings.UserName!=null) {
NetworkCredential creds = new (
smtpSettings.UserName, smtpSettings.Password);
await sc.AuthenticateAsync(System.Text.Encoding.UTF8, creds, System.Threading.CancellationToken.None);
SecureSocketOptions.Auto
);
if (smtpSettings.UserName != null)
{
sc.Authenticate(smtpSettings.UserName, smtpSettings.Password);
}
await sc.SendAsync(msg);
logger.LogInformation($"Sent : {msg.MessageId}");
sc.Disconnect(true);
}
return msg.MessageId;
}
@ -93,10 +94,10 @@ namespace Yavsc.Services
public async Task SendPasswordResetCodeAsync(ApplicationUser user, string email, string resetCode)
{
var callbackUrl = siteSettings.Audience + "/Account/ResetPassword/" +
var callbackUrl = siteSettings.Audience + "/Account/ResetPassword/" +
HttpUtility.UrlEncode(user.Id) + "/" + HttpUtility.UrlEncode(resetCode);
await SendEmailAsync(user.UserName, user.Email,
await SendEmailAsync(user.UserName, user.Email,
localizer["Reset Password"],
localizer["Please reset your password by "] + " <a href=\"" +
callbackUrl + "\" >following this link</a>");
@ -105,10 +106,10 @@ namespace Yavsc.Services
public async Task SendPasswordResetLinkAsync(ApplicationUser user, string email, string resetLink)
{
await SendEmailAsync(user.UserName, user.Email,
localizer["Reset Password"],
localizer["Please reset your password by "] + " <a href=\"" +
resetLink + "\" >following this link</a>");
await SendEmailAsync(user.UserName, user.Email,
localizer["Reset Password"],
localizer["Please reset your password by "] + " <a href=\"" +
resetLink + "\" >following this link</a>");
}
}
}

View File

@ -14,14 +14,17 @@ namespace Yavsc
public string FavIcon { get; set; } = "favicon.ico";
public string Logo { get; set; } = "logo.png";
/// <summary>
/// Conceptually,
/// This authorisation server only has this present site as unique audience.
/// </summary>
/// <returns></returns>
public string Audience { get; set; } = "lua.pschneider.fr";
/// <summary>
/// it's a very small company, with one domaine name only,
/// so let it be the same as in the Audience field.
/// External Url
/// </summary>
/// <value></value>
public string ExternalUrl { get; set; } = "http://lua.pschneider.fr";
/// <summary>
/// Must be a fqdn.
/// </summary>
/// <returns></returns>
public string Authority { get; set; } = "lua.pschneider.fr";

View File

@ -5,10 +5,10 @@ namespace Yavsc.ViewModels.Account
{
public class UnregisterViewModel
{
[YaRequired]
[Required]
public string UserId { get; set; }
public string ReturnUrl { get; set; }
public string? ReturnUrl { get; set; }
}
}

View File

@ -29,4 +29,4 @@
<ItemGroup>
<ProjectReference Include="../Yavsc.Abstract/Yavsc.Abstract.csproj" />
</ItemGroup>
</Project>
</Project>

View File

@ -28,6 +28,7 @@ using System.Security.Cryptography;
using System.Text.Unicode;
using System.Text;
using Yavsc.Server.Helpers;
using System.Reflection;
namespace Yavsc.Controllers
{
@ -66,7 +67,7 @@ namespace Yavsc.Controllers
ITrueEmailSender emailSender,
IOptions<SiteSettings> siteSettings,
ILoggerFactory loggerFactory, IOptions<TwilioSettings> twilioSettings,
IStringLocalizer<Yavsc.YavscLocalization> localizer,
IStringLocalizerFactory localizerFactory,
ApplicationDbContext dbContext)
{
_interaction = interaction;
@ -81,8 +82,9 @@ namespace Yavsc.Controllers
_siteSettings = siteSettings.Value;
_twilioSettings = twilioSettings.Value;
_logger = loggerFactory.CreateLogger<AccountController>();
_localizer = localizer;
_dbContext = dbContext;
_localizer = localizerFactory.Create(typeof(AccountController));
}
@ -861,11 +863,13 @@ namespace Yavsc.Controllers
{
ApplicationUser user;
// Username should not contain any '@'
if (model.LoginOrEmail.Contains('@')) {
if (model.LoginOrEmail.Contains('@'))
{
user = await _userManager.FindByEmailAsync(model.LoginOrEmail);
}
else {
user = await _dbContext.Users.FirstOrDefaultAsync( u => u.UserName == model.LoginOrEmail);
else
{
user = await _dbContext.Users.FirstOrDefaultAsync(u => u.UserName == model.LoginOrEmail);
}
// Don't reveal that the user does not exist or is not confirmed
@ -888,13 +892,16 @@ namespace Yavsc.Controllers
// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713
// Send an email with this link
var code = await _userManager.GeneratePasswordResetTokenAsync(user);
var callbackUrl = _siteSettings.Audience + "/Account/ResetPassword/" +
HttpUtility.UrlEncode(user.Id) + "/" + HttpUtility.UrlEncode(code);
var f = this.HttpContext.Features;
var callbackUrl = _siteSettings.ExternalUrl + "/Account/ResetPassword/" +
HttpUtility.UrlEncode(user.Id) + "/" + HttpUtility.UrlEncode(code);
var sent = await _emailSender.SendEmailAsync(user.UserName, user.Email, _localizer["Reset Password"],
_localizer["Please reset your password by "] + " <a href=\"" +
callbackUrl + "\" >following this link</a>");
return View("ForgotPasswordConfirmation", sent);
}
// If we got this far, something failed, redisplay form
@ -918,8 +925,15 @@ namespace Yavsc.Controllers
var user = await _userManager.FindByIdAsync(id);
if (user==null) return new BadRequestResult();
if (!await _userManager.VerifyUserTokenAsync(user,
_userManager.Options.Tokens.PasswordResetTokenProvider,
"ResetPassword", code.Replace("%2f","/")))
{
return BadRequest("code");
}
// We just serve the form to reset here.
return View(new ResetPasswordViewModel {
return View(new ResetPasswordViewModel
{
Id = id,
Code = code,
Email = user.Email
@ -944,9 +958,11 @@ namespace Yavsc.Controllers
// Don't reveal that the user does not exist
return RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account");
}
// code : "CfDJ8DmPlC3R8%2fNMqGlHZHZMwbjaXxgD3GW3H75Ubt+4Sbw%2fn%2fdg9X8Bll+CLIh%2fquI+Z96XEkx7bfrZiB+wpPb+b5%2ffgzgy+cQnKfX9J7%2fLNro+F3uE5JkXSlUc1WqVW2mVQrpWHjx1Dbn2n77TTGym3ttQoECsTR%2foo27dW9U11pmRJuTiwPBJZBOt0ffIRmgDDHh2f0VySTQEwjfRiLdCwctL%2fmh21ympJMKJl5PZnTVs"
if (user.Id != id) return BadRequest("userid");
var result = await _userManager.ResetPasswordAsync(user,
HttpUtility.UrlDecode(code), model.Password);
code.Replace("%2f","/"), model.Password);
if (result.Succeeded)
{
@ -1084,11 +1100,23 @@ namespace Yavsc.Controllers
}
[HttpGet, Authorize("AdministratorOnly")]
public IActionResult AdminDelete(string id)
public IActionResult AdminDelete(string id, string? returnUrl=null)
{
return View(new UnregisterViewModel { UserId = id });
return View(new UnregisterViewModel { UserId = id, ReturnUrl = returnUrl });
}
[HttpPost, Authorize("AdministratorOnly")]
public async Task<IActionResult> AdminDelete(UnregisterViewModel model)
{
var result = await DeleteUser(model.UserId);
if (!result.Succeeded)
{
AddErrors(result);
return new BadRequestObjectResult(ModelState);
}
return View();
}
[HttpPost, Authorize]
public async Task<IActionResult> Delete(UnregisterViewModel model)
{
@ -1116,21 +1144,6 @@ namespace Yavsc.Controllers
return await _userManager.DeleteAsync(user);
}
[HttpPost, Authorize("AdministratorOnly")]
public async Task<IActionResult> AdminDelete(UnregisterViewModel model)
{
var result = await DeleteUser(model.UserId);
if (!result.Succeeded)
{
AddErrors(result);
return new BadRequestObjectResult(ModelState);
}
return View();
}
#region Helpers
private void AddErrors(IdentityResult result)
{
foreach (var error in result.Errors)
@ -1139,15 +1152,5 @@ namespace Yavsc.Controllers
}
}
private async Task<ApplicationUser> GetCurrentUserAsync()
{
return await GetCurrentUserAsync(HttpContext.User.GetUserId());
}
private async Task<ApplicationUser> GetCurrentUserAsync(string id)
{
return await _userManager.FindByIdAsync(id);
}
#endregion
}
}

View File

@ -51,7 +51,7 @@ namespace Yavsc.Controllers
IOptions<GoogleAuthSettings> googleSettings,
IOptions<PayPalSettings> paypalSettings,
IOptions<CompanyInfoSettings> cinfoSettings,
IStringLocalizer<Yavsc.YavscLocalization> SR,
IStringLocalizer<ManageController> SR,
ICalendarManager calendarManager,
ILoggerFactory loggerFactory)
{

View File

@ -15,11 +15,11 @@ namespace Yavsc.Controllers
public class ActivityController : Controller
{
private readonly ApplicationDbContext _context;
readonly IStringLocalizer<Yavsc.YavscLocalization> SR;
readonly IStringLocalizer<ActivityController> SR;
readonly ILogger logger;
public ActivityController(ApplicationDbContext context,
IStringLocalizer<Yavsc.YavscLocalization> SR,
IStringLocalizer<ActivityController> SR,
ILoggerFactory loggerFactory)
{
_context = context;

View File

@ -16,6 +16,8 @@ namespace Yavsc.Controllers
using Models.Workflow;
using Services;
using Yavsc.Interface;
using Yavsc.Models.Billing;
using Yavsc.Models.Haircut;
using Yavsc.Server.Helpers;
using Yavsc.Settings;
@ -26,7 +28,7 @@ namespace Yavsc.Controllers
protected GoogleAuthSettings _googleSettings;
protected IYavscMessageSender _MessageSender;
protected ITrueEmailSender _emailSender;
protected IStringLocalizer _localizer;
protected IStringLocalizer<CommandController> _localizer;
protected SiteSettings _siteSettings;
protected SmtpSettings _smtpSettings;
protected ICalendarManager _calendarManager;
@ -36,7 +38,7 @@ namespace Yavsc.Controllers
IYavscMessageSender messageSender,
UserManager<ApplicationUser> userManager,
ICalendarManager calendarManager,
IStringLocalizer<YavscLocalization> localizer,
IStringLocalizer<CommandController> localizer,
ITrueEmailSender emailSender,
IOptions<SmtpSettings> smtpSettings,
IOptions<SiteSettings> siteSettings,

View File

@ -25,7 +25,7 @@ namespace Yavsc.Controllers
UserManager<ApplicationUser> userManager,
IBillingService billing,
ILoggerFactory loggerFactory,
IStringLocalizer<Yavsc.YavscLocalization> SR)
IStringLocalizer<FrontOfficeController> SR)
{
_context = context;
_userManager = userManager;

View File

@ -18,11 +18,9 @@ namespace Yavsc.Controllers
using System.Globalization;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
using Yavsc.Models.Messaging;
using PayPal.PayPalAPIInterfaceService.Model;
using Microsoft.Extensions.Options;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity.UI.Services;
using Yavsc.Interface;
using Yavsc.Settings;
using Yavsc.Abstract.Models.Messaging;
@ -31,12 +29,15 @@ namespace Yavsc.Controllers
public class HairCutCommandController : CommandController
{
readonly PayPalSettings payPalSettings;
private readonly IStringLocalizer<HairCutQuery> haircutLocalizer;
public HairCutCommandController(ApplicationDbContext context,
IOptions<PayPalSettings> payPalSettings,
IOptions<GoogleAuthSettings> googleSettings,
IYavscMessageSender GCMSender,
UserManager<ApplicationUser> userManager,
IStringLocalizer<Yavsc.YavscLocalization> localizer,
IStringLocalizer<HairCutQuery> haircutLocalizer,
IStringLocalizer<CommandController> localizer,
ITrueEmailSender emailSender,
IOptions<SmtpSettings> smtpSettings,
IOptions<SiteSettings> siteSettings,
@ -45,6 +46,7 @@ namespace Yavsc.Controllers
calManager, localizer, emailSender, smtpSettings, siteSettings, loggerFactory)
{
this.payPalSettings = payPalSettings.Value;
this.haircutLocalizer = haircutLocalizer;
}
@ -263,7 +265,7 @@ namespace Yavsc.Controllers
model.SelectedProfile = brusherProfile;
model.Client = await _userManager.FindByIdAsync(uid);
_logger.LogInformation(JsonConvert.SerializeObject(model));
var yaev = model.CreateNewHairCutQueryEvent(_localizer);
var yaev = model.CreateNewHairCutQueryEvent(this.haircutLocalizer);
if (pro.AcceptPublicContact)
{

View File

@ -16,11 +16,11 @@ namespace Yavsc.Controllers
public class ProjectController : Controller
{
private readonly ApplicationDbContext _context;
readonly IStringLocalizer<Yavsc.YavscLocalization> _localizer;
readonly IStringLocalizer<ProjectController> _localizer;
readonly IStringLocalizer<BugController> _bugLocalizer;
public ProjectController(ApplicationDbContext context,
IStringLocalizer<Yavsc.YavscLocalization> localizer,
IStringLocalizer<ProjectController> localizer,
IStringLocalizer<BugController> bugLocalizer
)
{

View File

@ -156,13 +156,13 @@ public static class HostingExtensions
policy.RequireAuthenticatedUser()
.RequireClaim("scope", "scope2");
});
options.AddPolicy("Performer", policy =>
{
policy
.RequireAuthenticatedUser()
.RequireClaim(Constants.RoleClaimType,
new string[] {Constants.PerformerGroupName, Constants.AdminGroupName})
new string[] { Constants.PerformerGroupName, Constants.AdminGroupName })
;
});
options.AddPolicy("AdministratorOnly", policy =>
@ -390,7 +390,7 @@ public static class HostingExtensions
var smtpSettings = services.GetRequiredService<IOptions<SmtpSettings>>();
var payPalSettings = services.GetRequiredService<IOptions<PayPalSettings>>();
var googleAuthSettings = services.GetRequiredService<IOptions<GoogleAuthSettings>>();
var localization = services.GetRequiredService<IStringLocalizer<YavscLocalization>>();
var localization = services.GetRequiredService<IStringLocalizer<Startup>>();
Startup.Configure(app, siteSettings, smtpSettings,
payPalSettings, googleAuthSettings, localization, loggerFactory,
app.Environment.EnvironmentName);
@ -398,50 +398,53 @@ public static class HostingExtensions
app.InitializeDatabase();
return app;
}
private static void InitializeDatabase(this IApplicationBuilder app)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
private static void InitializeDatabase(this IApplicationBuilder app)
{
serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
try
{
context.Database.Migrate();
}
catch (Exception ex)
{
// TODO log
}
if (!context.Clients.Any())
{
foreach (var client in Config.Clients)
{
context.Clients.Add(client.ToEntity());
}
context.SaveChanges();
}
var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
if (!context.IdentityResources.Any())
{
foreach (var resource in Config.IdentityResources)
try
{
context.IdentityResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
if (!context.ApiScopes.Any())
{
foreach (var resource in Config.ApiScopes)
context.Database.Migrate();
if (!context.Clients.Any())
{
foreach (var client in Config.Clients)
{
context.Clients.Add(client.ToEntity());
}
context.SaveChanges();
}
if (!context.IdentityResources.Any())
{
foreach (var resource in Config.IdentityResources)
{
context.IdentityResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
if (!context.ApiScopes.Any())
{
foreach (var resource in Config.ApiScopes)
{
context.ApiScopes.Add(resource.ToEntity());
}
context.SaveChanges();
}
}
catch (InvalidOperationException ex)
{
context.ApiScopes.Add(resource.ToEntity());
app.Properties["DegradedDBContext"] = ex.Message;
}
context.SaveChanges();
}
}
}
static void LoadGoogleConfig(IConfigurationRoot configuration)
{

View File

@ -34,7 +34,7 @@ namespace Yavsc.Helpers
public static HairCutQueryEvent CreateNewHairCutQueryEvent(this HairCutQuery query,
IStringLocalizer SR)
IStringLocalizer<HairCutQuery> SR)
{
string evdate = query.EventDate?.ToString("dddd dd/MM/yyyy à hh:mm")??"[pas de date spécifiée]";
string address = query.Location?.Address??"[pas de lieu spécifié]";
@ -42,7 +42,7 @@ namespace Yavsc.Helpers
string strprestation = query.Description;
var yaev = query.CreateEvent("NewHairCutQuery",
string.Format(ResourcesHelpers.GlobalLocalizer["HairCutQueryValidation"],query.Client.UserName),
string.Format(SR["HairCutQueryValidation"],query.Client.UserName),
$"{query.Client.Id}");

View File

@ -4,7 +4,7 @@ USER_AND_GROUP=www-data:www-data
SERVICE_PROD=yavsc
DOTNET_FRAMEWORK=net9.0
all:
all: css js
dotnet build
showConfig:
@ -35,4 +35,6 @@ pushInProd: publish
%.min.css: %.css
jsmin < $^ > $@
css: wwwroot/css/site.css
css: wwwroot/css/site.min.css
js: wwwroot/js/site.min.js

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,40 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Yavsc.Migrations
{
/// <inheritdoc />
public partial class pending : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Client");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Client",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
AccessTokenLifetime = table.Column<int>(type: "integer", nullable: false),
Active = table.Column<bool>(type: "boolean", nullable: false),
DisplayName = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false),
LogoutRedirectUri = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true),
RedirectUri = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true),
RefreshTokenLifeTime = table.Column<int>(type: "integer", nullable: false),
Secret = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: false),
Type = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Client", x => x.Id);
});
}
}
}

View File

@ -429,47 +429,6 @@ namespace Yavsc.Migrations
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("Yavsc.Models.Auth.Client", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("text");
b.Property<int>("AccessTokenLifetime")
.HasColumnType("integer");
b.Property<bool>("Active")
.HasColumnType("boolean");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("LogoutRedirectUri")
.HasMaxLength(512)
.HasColumnType("character varying(512)");
b.Property<string>("RedirectUri")
.HasMaxLength(512)
.HasColumnType("character varying(512)");
b.Property<int>("RefreshTokenLifeTime")
.HasColumnType("integer");
b.Property<string>("Secret")
.IsRequired()
.HasMaxLength(512)
.HasColumnType("character varying(512)");
b.Property<int>("Type")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Client");
});
modelBuilder.Entity("Yavsc.Models.Auth.Scope", b =>
{
b.Property<string>("Id")

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root"
xmlns=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ConfirmYourAccountBody">
<value>You successfully created your {0} account,
but your e-mail address is not yet confirmed.
Please, in order to validate it, follow this link &lt;{1}&gt;.
Thanks.
--
{0} - {2} &lt;https://{3}&gt;</value>
</data>
<data name="EmailSentForConfirm">
<value>An email has been sent to confirm your addresse.</value>
</data>
<data name="ConfirmYourAccountTitle">
<value>Please, confirm your e-mail</value>
</data>
<data name="ConfirmYourAccountBody">
<value>Ypu've successfully created an account {0},
but you still need to confirm your email.
Without this confirmation, you won't be able to login.
Please, follow this link to confirm your account : &lt;{1}&gt;.
--
{0} - {2} &lt;{3}&gt;</value>
</data>
<data name="Reset Password"><value>Ré-initialiser votre mot de passe</value></data>
<data name="Reset password confirmation"><value>Confirmation de ré-initialisation du mot de passe</value></data>
</root>

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root"
xmlns=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Reset Password"><value>Ré-initialiser votre mot de passe</value></data>
<data name="Reset password confirmation"><value>Confirmation de ré-initialisation du mot de passe</value></data>
</root>

View File

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root"
xmlns=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ConfirmYourAccountBody">
<value>Vous avez créé avec succès votre compte {0},
mais votre adresse e-mail reste à confirmer.
Pour ce faire, veuillez, s'il vous plait, suivre le lien suivant
dans votre navigateur favori : &lt;{1}&gt;.
--
{0} - {2} &lt;{3}&gt;</value>
</data>
<data name="ConfirmYourAccountTitle">
<value>S'il vous plait, confirmez votre addresse e-mail</value>
</data>
<data name="AccountEmailFactorBody">
<value>Votre compte est endurci d'une requisition d'un second facteur d'identification.
Une nouvelle connection depuis un navigateur web nécéssite votre autorisation.
Vous pouvez l'accorder en suivant le lien suivant : &lt;{1}&gt;.
Votre code dáctivation est : {4}
Vour pourrez cochez la case "Se souvenir de ce navigateur" pour conserver cette autorisation pour ce navigateur.
{0} - {2} &lt;{3}&gt;</value>
</data>
<data name="EmailSentForConfirm">
<value>Un courrier a été envoyé pour confirmation de l'adresse e-mail .</value>
</data>
<data name="Reset Password"><value>Ré-initialiser votre mot de passe</value></data>
<data name="Reset password confirmation"><value>Confirmation de ré-initialisation du mot de passe</value></data>
</root>

View File

@ -70,4 +70,4 @@
<data name="Buying"><value>Offre d'achat</value></data>
<data name="ServiceProposal">Offre de service<value></value></data>
<data name="For"><value>Pour</value></data>
</root>
</root>

View File

@ -772,18 +772,7 @@
<value>Invalid user name.
Valid caracters are: underscore '_', '-', 'a' - 'z', 'A' - 'Z', '0' - '9', the single quote ('), the space and the dot.</value>
</data>
<data name="EmailSentForConfirm">
<value>An email has been sent to confirm your addresse.</value>
</data>
<data name="ConfirmYourAccountTitle"><value>Please, confirm your e-mail</value></data>
<data name="ConfirmYourAccountBody"><value>You successfully created your {0} account,
but your e-mail address is not yet confirmed.
Please, in order to validate it, follow this link &lt;{1}&gt;.
Thanks.
--
{0} - {2} &lt;https://{3}&gt;</value>
</data>
<data name="Instrumentation"><value>Instrumentation</value></data>
<data name="Partenariat"><value>Co-working</value></data>
</root>

View File

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Please reset your password by following this link:"><value>Por favor use o seguinte link para redefinir sua senha:</value></data>
<data name="Reset Password"><value>Redefinir sua senha</value></data>
</root>

View File

@ -251,7 +251,6 @@
<data name="HalfLong"><value>mi-long</value></data>
<data name="MobileHairCut"><value>Coiffure à domicile</value></data>
<data name="HairCutQuery"><value>Préstation en coiffure à domicile</value></data>
<data name="HairCutQueryValidation"><value>Une demande (de {0}) en coiffure à domicile vient d'être validée</value></data>
<data name="Hide source"><value>Cacher le texte source de l'article</value></data>
<data name="Home"><value>Accueil</value></data>
<data name="Hide"><value>Cacher</value></data>
@ -462,7 +461,6 @@
<data name="PasswordConfirm"><value>Confirmation du mot de passe</value></data>
<data name="ConfirmPassword"><value>Confirmation du mot de passe</value></data>
<data name="ErrorSendingEmailForConfirm"><value>L'envoi de de courrier pour confirmation de l'adresse e-mail a échoué.</value></data>
<data name="EmailSentForConfirm"><value>Un courrier a été envoyé pour confirmation de l'adresse e-mail .</value></data>
<data name="AccountEmailFactorTitle"><value>Le second facteur de votre identification</value></data>
<data name="AccountEmailFactorBody"><value>Votre compte est endurci d'une requisition d'un second facteur d'identification.
@ -473,15 +471,7 @@ Votre code dáctivation est : {4}
Vour pourrez cochez la case "Se souvenir de ce navigateur" pour conserver cette authorisation pour ce navigateur.
{0} - {2} &lt;{3}&gt;</value></data>
<data name="ConfirmYourAccountTitle"><value>S'il vous plait, confirmez votre addresse e-mail</value></data>
<data name="ConfirmYourAccountBody"><value>Vous avez créé avec succès votre compte {0},
mais votre adresse e-mail reste à confirmer.
Pour ce faire, veuillez, s'il vous plait, suivre le lien suivant
dans votre navigateur favori : &lt;{1}&gt;.
--
{0} - {2} &lt;{3}&gt;</value></data>
<data name="BadStringLength"><value>Taille maximale: {0} caractère.</value></data>
<data name="DetailledMinMaxStringLength"><value>Ce champ est
d'au moins {0} et d'au plus {1} caractère(s) (manquent {2}) ou ({3} en trop).</value></data>

View File

@ -13,7 +13,7 @@ public class Startup
IOptions<SmtpSettings> smtpSettings,
IOptions<PayPalSettings> payPalSettings,
IOptions<GoogleAuthSettings> googleSettings,
IStringLocalizer<YavscLocalization> localizer,
IStringLocalizer<Startup> localizer,
ILoggerFactory loggerFactory,
string environmentName)
{

View File

@ -16,10 +16,10 @@ namespace Yavsc.ViewComponents
{
readonly ApplicationDbContext dbContext;
readonly IBillingService billing;
readonly IStringLocalizer<Yavsc.YavscLocalization> localizer;
readonly IStringLocalizer<BillViewComponent> localizer;
public BillViewComponent(ApplicationDbContext dbContext,
IStringLocalizer<Yavsc.YavscLocalization> localizer,
IStringLocalizer<BillViewComponent> localizer,
IBillingService billing)
{
this.billing = billing;

View File

@ -0,0 +1,10 @@
@{
ViewData["Title"] = "Account creation success";
}
<h1>@ViewData["Title"]</h1>
Your account has successfully been created.
<a asp-action="Index" asp-controller="Home">Return to home</a>

View File

@ -0,0 +1,14 @@
@model UnregisterViewModel
@{
ViewData["Title"] = "Unregister";
}
<h2>@ViewData["Title"].</h2>
<form asp-controller="Account" asp-action="AdminDelete" method="post" class="form-horizontal" role="form">
@Html.Hidden("UserId")
@Html.Hidden("ReturnUrl")
<input type="submit" value="Unregister" class="btn btn-primary" />
</form>

View File

@ -0,0 +1,12 @@
@model Yavsc.Abstract.Manage.EmailSentViewModel
@{
ViewData["Title"] = "S'il vous plait, veuillez confirmer votre adresse e-mail";
}
<h2>@ViewData["Title"].</h2>
<div>
<p>
Un message vient d'être envoyé à l'adresse e-mail ( @Model.EMail , id:@Model.MessageId ).
</p>
</div>

View File

@ -1,7 +1,9 @@
@model ResetPasswordViewModel
<form asp-route-id="@Model.Id" asp-route-code="@Model.Code">
<p>@Model.Email</p>
<p>Your email : <code>@Model.Email</code></p>
<input type="hidden" name="Email" value="@Model.Email" />
@Html.ValidationSummary()
<div class="form-group">
<label asp-for="Password"></label>
<input class="form-control" placeholder="Password" asp-for="Password" autofocus>
@ -10,6 +12,7 @@
<label asp-for="ConfirmPassword"></label>
<input class="form-control" placeholder="ConfirmPassword" asp-for="ConfirmPassword" autofocus>
</div>
<button class="btn btn-primary" name="button" value="Reset">Reset Password</button>
</form>

View File

@ -0,0 +1,7 @@
@{
ViewData["Title"] = "Reset password confirmation";
}
<h1>@ViewData["Title"].</h1>
<p>Votre mot de passe a été ré-initialisé.
<a href="~/signin">Cliquez ici pour vous connecter</a>.</p>

View File

@ -0,0 +1,8 @@
@{
ViewData["Title"] = "Reset password confirmation";
}
<h1>@ViewData["Title"].</h1>
<p>
Your password has been reset. Please <a href="~/signin">Click here to log in</a>.
</p>

View File

@ -52,9 +52,11 @@
<dd>
@Html.DisplayFor(m=>user.Email)
@if (!user.EmailConfirmed) {
<a asp-action="AdminSendConfirationEmail" asp-route-id="@user.Id" >Envoyer une demande de confirmation</a>
<a class="btn btn-primary"
asp-action="AdminSendConfirationEmail" asp-route-id="@user.Id" >Envoyer une demande de confirmation</a>
}
<a asp-action="AdminDelete" asp-route-id="@user.Id" >Supprimer</a>
<a asp-action="AdminDelete" asp-route-id="@user.Id"
class="btn btn-secondary">Supprimer</a>
</dd>
</dl>
</td>

View File

@ -37,7 +37,7 @@
@addTagHelper *, Yavsc
@inject IAuthorizationService AuthorizationService
@inject Microsoft.AspNetCore.Mvc.Localization.IHtmlLocalizer<Yavsc.YavscLocalization> SR
@inject Microsoft.AspNetCore.Mvc.Localization.IHtmlLocalizer<Startup> SR
@inject Microsoft.Extensions.Options.IOptions<SiteSettings> SiteSettings
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

View File

@ -1 +1 @@
{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"BBXYWCFMOYOt4QTTDtjmvrbhj20p07lIjqZv6kdsEUdkrsc0p2stHYp6yT8SLxPAqMgSiFmr29jHdS56gVUa9FEe1H7DXDZszgZ8JRGWaIa2fe2_2vD-hPzFxJNmS5zlo7mFaH0lL40imi7qyzDt3lmvZnBEhwNpGeg2Ge5rmDsT9w5zeDAfLnOOC4ghUNFfQnmVZQfjsXPt46MDkj94ZInOwqJBxbjhNJSvJWkW9y3PG02bPriBx6bsHdc7yPilsqICnnLRWxb79n6XJHZ-gHO1l-eeXwAj5gJI-CX_V7INjBAuNFTMJrCbf-hpghVadsIKLLK6QOeRbdA_6JzGQQ","DP":"EaH8Zw1B6y4cJTb9EzzzPLW20YXihxB8a1ywnYOekqlRS0vUJI8hh9IayWu56PKnIwVYnWlyIn-YreBTBpRubuyc26cyEYsnqGi44K0nnN3n43LBl5BpenI_AE9gLNmP2TAngPD0vINpg9fqTXNutEsNBF_6BLkqzC52rGLMGNk","DQ":"BWlE0UknVFCZ99HL3170Vz7niIVf9zKTEZACjWfBephHjVgeFFOZCrd_3TRGvaG8FVebYJn_ARiFLYuJOXG7u_VafR5MpXxd6Qzty8B4MF3jPEiYyqAylxPh1Uwk2Dl20evd4UoCWHI6Klb8gAAL54hiqKyoYdR24uAZ8YxWB6k","E":"AQAB","K":null,"KeyId":"131338364F1631C3CFBD59BF8F32A4B0","KeyOps":[],"Kid":"131338364F1631C3CFBD59BF8F32A4B0","Kty":"RSA","N":"xymIJugCkRasJ1zA587Kq5GafxcnVXXNVU-kuwCCpAwNndgn2uXCT4WuEDkFK3gcSQKZT_SdM9rMIeJcQjHybtgJs8A-AwGG2JKpppMJ3EkxD_p_-Q1q9D-_QcsZhRU_yP8i-jO8FgYfez4z0TqJWj3nxo3c83u8tkzO1UC4FBEKGlDG993AeqpmaEeycf5bBWitQQu-xy9NgsqzmtVMZtChMtC50fzmbbKkwuOc7506Lw6vzRkBCI8DpqqN50-yL3t7mbfqwxm0OIQ4mzN-n87gaCAJRzqxFj1nQSzmJSmQ7_-nGPSLH_BR3SaPRBQBrArzZyzU7FsMYdAjrTRGoQ","Oth":[],"P":"8RnoBTdVG4Igi3a_ps36pAX09N_nDeM8uG9Oyt5NWr1k0dv4iwtGSV4W8QTTHf5m9ZxQsQIPDxncSwr_WpwfKGGfxGVcESgtDkf10dq8Ajex4NefjnKtGSRX8dAQCRDcoN_v0k32kj90PImzseYM6S4p81dZLkOX0DX9sf3IU5k","Q":"03gsWqv7Vtlr_YWGXFQ4gyq1kew6tNMCAWLIzYTKeN1evYuXCsoEUoP7OPYRsZvQ13_hgEk2qfvEeZ8HoTIY_PXXKS8iUHNQXAaKaHSeRtfKmO7qDUd5jeMihvE2295FNf3VIM24oK3QJ0FPrt8qOIarcGa-lgj2llyiEId98Ek","QI":"OAdgkRIwrQ4X_91WW7bjC37Atn7yH8YBnjHHLSwmeaXkc4JOhdeXLVYIyVKoWqdRIhaT8q4liGA5F7Lbwg4cFQ8tUEjmIbacaRxpcFYYvhQcKGA-q1MxFK2ZwNUxMjc_20ZcH7ohneGNr63im_cUGT78fMzE_YBTbAp1Sxkd0fk","Use":null,"X":null,"X5c":[],"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true,"SignatureProviderObjectPoolCacheSize":16}}
{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"HQxDb0hC8hkvwiC9eL7Xgi3oxVuD2KhYRf2LgdVbTNNp7hof2ZxHQaRJBUjXXWu5dgjEFTbYHugydnsUb-y9fO-Q_k2mHYrCwwRGRR8_B1bqX6Or98PDKMLj8JOCoRWUe238hUjqdfm3X-wjLco9iEe86UUWnhPhsTKQ8hGuI7vo5c5BEF9Y3T9duITK0c3hgJQGujLUQLbCCP2MX0BR-tmvnBPV1mPe5fMkW79CymmlBdc8RjPNA_YLtLD4znZGoh7Fr_G1WpO6HdDyqnjqIof9QFSY9zjGissOhs6k5xZrTdego6giHk_hhxLsHvf9lekfL1XcOt97j28mooXGUQ","DP":"5gUJNJI-z3swRqAX0YSZxKjD1bbOl-HgEU9Bkrz_U6myVGziVnjrrLT92ymu7XiERwhRm4Hv-UNgCSipUA5wkTNw_qANbibcMAqjLqtXtC9OOraE9zw0fw72BzFp3BF2AvaUZlByyr45IJGyVVOg-AxCgaLinoWa15hjpVVLBck","DQ":"MVwIv2v0k93-nqLkTfU7UXe5lifNfqwK_h6wFrlPv2eRiPFs016-9epfAYz4w0KqHaFzZtK-_XDet_f6-Vommn4DjahTzBbyUWKPxo2jmu06hne8naoeLYP0VqRtbVVlq_rP5VKwb3SMnxj02FjpuDdSvbaEgJiCLjfv-mP3x8c","E":"AQAB","K":null,"KeyId":"31CBEC0AA49B244C218F53DA8D15FAF8","KeyOps":[],"Kid":"31CBEC0AA49B244C218F53DA8D15FAF8","Kty":"RSA","N":"vrBmdOxP7dksWCfJieoorbBgxiPlgcY1QpBbESso_7XpcGbtwK7Nmfbe_sy_jtdEi586MQBb6g7W663hnQyZ5j9etC6uNo5XkqJ4oAPvjWjjdx7HPyjhkSOgj6dS-mGNCzn36ZLkZacAxvDhxh409QGWEe7MpFB6ZRK9bj7hn77FMFvTnI71YU3sL3w35W3wjw30jyw4oaAA6cDA0dLLSc5wutu76KPxcyQGOhXtcOnUd0c1XYuOIAffg6EcmGSe5nF5iCZYk9Y7MuYKH07w6cVlPgKuOATSOuMSo7bp7Kgd-tuqvelJbGryNoAd4V_Fo6pgLbJoY8IeZDr9CDxZgw","Oth":[],"P":"8WfFywgbOmCiJwupMdgNF0VsdZ5VcgsAwlkrLSWAvIzihD99Fz3J9VPYnLtXW5b144CfJLz8nEnMDYPTqYw_dZ2rT9rsiUUvbVzeKvDVTjDLYNvdhZeseyoXIVfoHStoAdKXQqdhcVtDcuv3E0zszfuAP-jMMh0cwlTfscjauz0","Q":"yjexMUjUY5RvhN127pC4NKqkD5PABxDgt3w8ENuJZbAo-dJ72Ay2MFGAhNMVp-DZIijS_OntyqTNLADhFmf8nh6ZNRyvRYNPpvkvb0qf4QgSn2TiXm3wJrKG8mTJuuFWnUDTf3D2GLFAHk2MtAemh3-C34SezLHORjkaEvqLs78","QI":"KQRvX-At5Rb16A0R7hE0JOB2oNJKcbAoQHKttFBU9KeQo17TIBzt4R_ABswbWjmLRN_mzfaag8nrN-mOeeOzzgqt3xMjibRB4HJ0MBndt5wi4SEyHt3Me_-7fUN85SZR6DsNt2w05QTojsUBq4ah4RXAXIT5SqwcUE4ztBbM5Vw","Use":null,"X":null,"X5c":[],"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true,"SignatureProviderObjectPoolCacheSize":16}}

View File

@ -1 +1,6 @@
.welcome-page .logo{width:64px;}.icon-banner{width:32px;}.body-container{margin-top:60px;padding-bottom:40px;}.welcome-page li{list-style:none;padding:4px;}.logged-out-page iframe{display:none;width:0;height:0;}.grants-page .card{margin-top:20px;border-bottom:1px solid #d3d3d3;}.grants-page .card .card-title{font-size:120%;font-weight:bold;}.grants-page .card .card-title img{width:100px;height:100px;}.grants-page .card label{font-weight:bold;}
.grants-page.card{margin-top:20px;border-bottom:1px solid lightgray;}.grants-page.card.card-title{font-size:120%;font-weight:bold;}.grants-page.card.card-title img{width:100px;height:100px;}.grants-page.card label{font-weight:bold;}.navbar-dark.navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");}
div.carousel-inner>div.item>div.carousel-caption-s{margin:.5em;background-color:rgba(0,0,0,0.6);color:#ffffc8;font-weight:bold;padding:.5em;}
img.blogphoto{max-width:100%;max-height:100%;}
input[type='checkbox']{appearance:auto;min-width:1em;min-height:1em;}.container{background-color:#000000d5;color:#fff;padding:.5em;margin:.5em;}.post{background-color:#000000dd;color:#d1d1d1;padding:2.3em;border-radius:2em;border:solid#441515a4 2pt;}.actiongroup{float:right;margin:.5em;}.float-left{float:left;margin:.5em;}
a{color:aquamarine;background-color:black;}
a.close{cursor:pointer;}

View File

@ -13,3 +13,4 @@ var setUiCult = function(lngspec) {
document.cookie = 'ASPNET_CULTURE=c=' + lngspec + '|uic=' + lngspec;
location.reload();
};

View File

@ -1 +1,2 @@
var notifClick=function(i){0<i&&$.get("/api/dimiss/click/"+i)},setUiCult=function(i){document.cookie="ASPNET_CULTURE=c="+i+"|uic="+i,location.reload()};
var notifClick=function(nid){if(nid>0){$.get({url:'/api/dimiss/click/'+nid,success:$('div[data-nid='+nid+']').remove()});}};var setUiCult=function(lngspec){document.cookie='ASPNET_CULTURE=c='+lngspec+'|uic='+lngspec;location.reload();};