Personal: added register method

This commit is contained in:
pavelbannov 2021-09-17 17:32:37 +03:00
parent d32f555706
commit 6233ab55a3
11 changed files with 543 additions and 294 deletions

View File

@ -13,6 +13,7 @@ using System.Threading;
using System.Web;
using ASC.Api.Core;
using ASC.Api.Utils;
using ASC.Common;
using ASC.Common.Logging;
using ASC.Common.Utils;
@ -95,6 +96,7 @@ namespace ASC.Employee.Core.Controllers
private MobileDetector MobileDetector { get; }
private ProviderManager ProviderManager { get; }
private Constants Constants { get; }
private Recaptcha Recaptcha { get; }
private ILog Log { get; }
public PeopleController(
@ -136,7 +138,8 @@ namespace ASC.Employee.Core.Controllers
CommonLinkUtility commonLinkUtility,
MobileDetector mobileDetector,
ProviderManager providerManager,
Constants constants
Constants constants,
Recaptcha recaptcha
)
{
Log = option.Get("ASC.Api");
@ -178,6 +181,7 @@ namespace ASC.Employee.Core.Controllers
MobileDetector = mobileDetector;
ProviderManager = providerManager;
Constants = constants;
Recaptcha = recaptcha;
}
[Read("info")]
@ -421,9 +425,91 @@ namespace ASC.Employee.Core.Controllers
return users;
}
[AllowAnonymous]
[Create(@"register")]
public string RegisterUserOnPersonal(RegisterPersonalUserModel model)
{
if (!CoreBaseSettings.Personal) throw new MethodAccessException("Method is only available on personal.onlyoffice.com");
try
{
if (CoreBaseSettings.CustomMode) model.Lang = "ru-RU";
var cultureInfo = SetupInfo.GetPersonalCulture(model.Lang).Value;
if (cultureInfo != null)
{
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
model.Email.ThrowIfNull(new ArgumentException(Resource.ErrorEmailEmpty, "email"));
if (!model.Email.TestEmailRegex()) throw new ArgumentException(Resource.ErrorNotCorrectEmail, "email");
if (!SetupInfo.IsSecretEmail(model.Email)
&& !string.IsNullOrEmpty(SetupInfo.RecaptchaPublicKey) && !string.IsNullOrEmpty(SetupInfo.RecaptchaPrivateKey))
{
var ip = Request.Headers["X-Forwarded-For"].ToString() ?? Request.GetUserHostAddress();
if (string.IsNullOrEmpty(model.RecaptchaResponse)
|| !Recaptcha.ValidateRecaptcha(model.RecaptchaResponse, ip))
{
throw new RecaptchaException(Resource.RecaptchaInvalid);
}
}
var newUserInfo = UserManager.GetUserByEmail(model.Email);
if (UserManager.UserExists(newUserInfo.ID))
{
if (!SetupInfo.IsSecretEmail(model.Email) || SecurityContext.IsAuthenticated)
{
throw new Exception(CustomNamingPeople.Substitute<Resource>("ErrorEmailAlreadyExists"));
}
try
{
SecurityContext.AuthenticateMe(ASC.Core.Configuration.Constants.CoreSystem);
UserManager.DeleteUser(newUserInfo.ID);
}
finally
{
SecurityContext.Logout();
}
}
if (!model.Spam)
{
try
{
//TODO
//const string _databaseID = "com";
//using (var db = DbManager.FromHttpContext(_databaseID))
//{
// db.ExecuteNonQuery(new SqlInsert("template_unsubscribe", false)
// .InColumnValue("email", email.ToLowerInvariant())
// .InColumnValue("reason", "personal")
// );
// Log.Debug(String.Format("Write to template_unsubscribe {0}", email.ToLowerInvariant()));
//}
}
catch (Exception ex)
{
Log.Debug(String.Format("ERROR write to template_unsubscribe {0}, email:{1}", ex.Message, model.Email.ToLowerInvariant()));
}
}
StudioNotifyService.SendInvitePersonal(model.Email);
}
catch (Exception ex)
{
return ex.Message;
}
return string.Empty;
}
[Create]
[Authorize(AuthenticationSchemes = "confirm", Roles = "LinkInvite,Everyone")]
public EmployeeWraperFull AddMemberFromBody([FromBody]MemberModel memberModel)
public EmployeeWraperFull AddMemberFromBody([FromBody] MemberModel memberModel)
{
return AddMember(memberModel);
}
@ -431,7 +517,7 @@ namespace ASC.Employee.Core.Controllers
[Create]
[Authorize(AuthenticationSchemes = "confirm", Roles = "LinkInvite,Everyone")]
[Consumes("application/x-www-form-urlencoded")]
public EmployeeWraperFull AddMemberFromForm([FromForm]MemberModel memberModel)
public EmployeeWraperFull AddMemberFromForm([FromForm] MemberModel memberModel)
{
return AddMember(memberModel);
}
@ -495,7 +581,7 @@ namespace ASC.Employee.Core.Controllers
}
[Create("active")]
public EmployeeWraperFull AddMemberAsActivatedFromBody([FromBody]MemberModel memberModel)
public EmployeeWraperFull AddMemberAsActivatedFromBody([FromBody] MemberModel memberModel)
{
return AddMemberAsActivated(memberModel);
}
@ -563,7 +649,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update("{userid}/culture")]
public EmployeeWraperFull UpdateMemberCultureFromBody(string userid, [FromBody]UpdateMemberModel memberModel)
public EmployeeWraperFull UpdateMemberCultureFromBody(string userid, [FromBody] UpdateMemberModel memberModel)
{
return UpdateMemberCulture(userid, memberModel);
}
@ -611,7 +697,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update("{userid}")]
public EmployeeWraperFull UpdateMemberFromBody(string userid, [FromBody]UpdateMemberModel memberModel)
public EmployeeWraperFull UpdateMemberFromBody(string userid, [FromBody] UpdateMemberModel memberModel)
{
return UpdateMember(userid, memberModel);
}
@ -802,7 +888,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update("{userid}/contacts")]
public EmployeeWraperFull UpdateMemberContactsFromBody(string userid, [FromBody]UpdateMemberModel memberModel)
public EmployeeWraperFull UpdateMemberContactsFromBody(string userid, [FromBody] UpdateMemberModel memberModel)
{
return UpdateMemberContacts(userid, memberModel);
}
@ -827,7 +913,7 @@ namespace ASC.Employee.Core.Controllers
}
[Create("{userid}/contacts")]
public EmployeeWraperFull SetMemberContactsFromBody(string userid, [FromBody]UpdateMemberModel memberModel)
public EmployeeWraperFull SetMemberContactsFromBody(string userid, [FromBody] UpdateMemberModel memberModel)
{
return SetMemberContacts(userid, memberModel);
}
@ -839,7 +925,7 @@ namespace ASC.Employee.Core.Controllers
return SetMemberContacts(userid, memberModel);
}
private EmployeeWraperFull SetMemberContacts(string userid,UpdateMemberModel memberModel)
private EmployeeWraperFull SetMemberContacts(string userid, UpdateMemberModel memberModel)
{
var user = GetUserInfo(userid);
@ -852,14 +938,14 @@ namespace ASC.Employee.Core.Controllers
}
[Delete("{userid}/contacts")]
public EmployeeWraperFull DeleteMemberContactsFromBody(string userid, [FromBody]UpdateMemberModel memberModel)
public EmployeeWraperFull DeleteMemberContactsFromBody(string userid, [FromBody] UpdateMemberModel memberModel)
{
return DeleteMemberContacts(userid, memberModel);
}
[Delete("{userid}/contacts")]
[Consumes("application/x-www-form-urlencoded")]
public EmployeeWraperFull DeleteMemberContactsFromForm(string userid, [FromForm]UpdateMemberModel memberModel)
public EmployeeWraperFull DeleteMemberContactsFromForm(string userid, [FromForm] UpdateMemberModel memberModel)
{
return DeleteMemberContacts(userid, memberModel);
}
@ -984,7 +1070,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update("{userid}/photo")]
public ThumbnailsDataWrapper UpdateMemberPhotoFromBody(string userid, [FromBody]UpdateMemberModel model)
public ThumbnailsDataWrapper UpdateMemberPhotoFromBody(string userid, [FromBody] UpdateMemberModel model)
{
return UpdateMemberPhoto(userid, model);
}
@ -1034,7 +1120,7 @@ namespace ASC.Employee.Core.Controllers
[Create("{userid}/photo/thumbnails")]
public ThumbnailsDataWrapper CreateMemberPhotoThumbnailsFromBody(string userid, [FromBody]ThumbnailsModel thumbnailsModel)
public ThumbnailsDataWrapper CreateMemberPhotoThumbnailsFromBody(string userid, [FromBody] ThumbnailsModel thumbnailsModel)
{
return CreateMemberPhotoThumbnails(userid, thumbnailsModel);
}
@ -1081,7 +1167,7 @@ namespace ASC.Employee.Core.Controllers
[AllowAnonymous]
[Create("password", false)]
public object SendUserPasswordFromBody([FromBody]MemberModel memberModel)
public object SendUserPasswordFromBody([FromBody] MemberModel memberModel)
{
return SendUserPassword(memberModel);
}
@ -1107,7 +1193,7 @@ namespace ASC.Employee.Core.Controllers
[Update("{userid}/password")]
[Authorize(AuthenticationSchemes = "confirm", Roles = "PasswordChange,EmailChange,Activation,EmailActivation,Everyone")]
public EmployeeWraperFull ChangeUserPasswordFromBody(Guid userid, [FromBody]MemberModel memberModel)
public EmployeeWraperFull ChangeUserPasswordFromBody(Guid userid, [FromBody] MemberModel memberModel)
{
return ChangeUserPassword(userid, memberModel);
}
@ -1168,7 +1254,7 @@ namespace ASC.Employee.Core.Controllers
[Create("email", false)]
public object SendEmailChangeInstructionsFromBody([FromBody]UpdateMemberModel model)
public object SendEmailChangeInstructionsFromBody([FromBody] UpdateMemberModel model)
{
return SendEmailChangeInstructions(model);
}
@ -1245,7 +1331,7 @@ namespace ASC.Employee.Core.Controllers
[Update("activationstatus/{activationstatus}")]
[Authorize(AuthenticationSchemes = "confirm", Roles = "Activation,Everyone")]
public IEnumerable<EmployeeWraperFull> UpdateEmployeeActivationStatusFromBody(EmployeeActivationStatus activationstatus, [FromBody]UpdateMembersModel model)
public IEnumerable<EmployeeWraperFull> UpdateEmployeeActivationStatusFromBody(EmployeeActivationStatus activationstatus, [FromBody] UpdateMembersModel model)
{
return UpdateEmployeeActivationStatus(activationstatus, model);
}
@ -1278,7 +1364,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update("type/{type}")]
public IEnumerable<EmployeeWraperFull> UpdateUserTypeFromBody(EmployeeType type, [FromBody]UpdateMembersModel model)
public IEnumerable<EmployeeWraperFull> UpdateUserTypeFromBody(EmployeeType type, [FromBody] UpdateMembersModel model)
{
return UpdateUserType(type, model);
}
@ -1330,7 +1416,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update("status/{status}")]
public IEnumerable<EmployeeWraperFull> UpdateUserStatusFromBody(EmployeeStatus status, [FromBody]UpdateMembersModel model)
public IEnumerable<EmployeeWraperFull> UpdateUserStatusFromBody(EmployeeStatus status, [FromBody] UpdateMembersModel model)
{
return UpdateUserStatus(status, model);
}
@ -1384,7 +1470,7 @@ namespace ASC.Employee.Core.Controllers
[Update("invite")]
public IEnumerable<EmployeeWraperFull> ResendUserInvitesFromBody([FromBody]UpdateMembersModel model)
public IEnumerable<EmployeeWraperFull> ResendUserInvitesFromBody([FromBody] UpdateMembersModel model)
{
return ResendUserInvites(model);
}
@ -1448,7 +1534,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update("delete", Order = -1)]
public IEnumerable<EmployeeWraperFull> RemoveUsersFromBody([FromBody]UpdateMembersModel model)
public IEnumerable<EmployeeWraperFull> RemoveUsersFromBody([FromBody] UpdateMembersModel model)
{
return RemoveUsers(model);
}
@ -1547,14 +1633,14 @@ namespace ASC.Employee.Core.Controllers
[Update("thirdparty/linkaccount")]
public void LinkAccountFromBody([FromBody]LinkAccountModel model)
public void LinkAccountFromBody([FromBody] LinkAccountModel model)
{
LinkAccount(model);
}
[Update("thirdparty/linkaccount")]
[Consumes("application/x-www-form-urlencoded")]
public void LinkAccountFromForm([FromForm]LinkAccountModel model)
public void LinkAccountFromForm([FromForm] LinkAccountModel model)
{
LinkAccount(model);
}
@ -1827,7 +1913,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update(@"reassign/terminate")]
public void TerminateReassignFromBody([FromBody]TerminateModel model)
public void TerminateReassignFromBody([FromBody] TerminateModel model)
{
PermissionContext.DemandPermissions(Constants.Action_EditUser);
@ -1836,7 +1922,7 @@ namespace ASC.Employee.Core.Controllers
[Update(@"reassign/terminate")]
[Consumes("application/x-www-form-urlencoded")]
public void TerminateReassignFromForm([FromForm]TerminateModel model)
public void TerminateReassignFromForm([FromForm] TerminateModel model)
{
PermissionContext.DemandPermissions(Constants.Action_EditUser);
@ -1844,14 +1930,14 @@ namespace ASC.Employee.Core.Controllers
}
[Create(@"reassign/start")]
public ReassignProgressItem StartReassignFromBody([FromBody]StartReassignModel model)
public ReassignProgressItem StartReassignFromBody([FromBody] StartReassignModel model)
{
return StartReassign(model);
}
[Create(@"reassign/start")]
[Consumes("application/x-www-form-urlencoded")]
public ReassignProgressItem StartReassignFromForm([FromForm]StartReassignModel model)
public ReassignProgressItem StartReassignFromForm([FromForm] StartReassignModel model)
{
return StartReassign(model);
}
@ -1906,7 +1992,7 @@ namespace ASC.Employee.Core.Controllers
}
[Update(@"remove/terminate")]
public void TerminateRemoveFromBody([FromBody]TerminateModel model)
public void TerminateRemoveFromBody([FromBody] TerminateModel model)
{
PermissionContext.DemandPermissions(Constants.Action_EditUser);
@ -1915,7 +2001,7 @@ namespace ASC.Employee.Core.Controllers
[Update(@"remove/terminate")]
[Consumes("application/x-www-form-urlencoded")]
public void TerminateRemoveFromForm([FromForm]TerminateModel model)
public void TerminateRemoveFromForm([FromForm] TerminateModel model)
{
PermissionContext.DemandPermissions(Constants.Action_EditUser);
@ -1923,14 +2009,14 @@ namespace ASC.Employee.Core.Controllers
}
[Create(@"remove/start")]
public RemoveProgressItem StartRemoveFromBody([FromBody]TerminateModel model)
public RemoveProgressItem StartRemoveFromBody([FromBody] TerminateModel model)
{
return StartRemove(model);
}
[Create(@"remove/start")]
[Consumes("application/x-www-form-urlencoded")]
public RemoveProgressItem StartRemoveFromForm([FromForm]TerminateModel model)
public RemoveProgressItem StartRemoveFromForm([FromForm] TerminateModel model)
{
return StartRemove(model);
}

View File

@ -0,0 +1,10 @@
namespace ASC.People.Models
{
public class RegisterPersonalUserModel
{
public string Email { get; set; }
public string Lang { get; set; }
public bool Spam { get; set; }
public string RecaptchaResponse { get; set; }
}
}

File diff suppressed because it is too large Load Diff

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Das Feld mit dem Prüfcode darf nicht leer sein</value>
@ -210,7 +210,7 @@
<value>Facebook-Schlüssel</value>
</data>
<data name="ConsumersFacebookDescription" xml:space="preserve">
<value>Verbinden Sie die Anwendung, um sich ins Portal via Facebook anzumelden und Kontakte zu suchen.</value>
<value>Verbinden Sie die Anwendung, um sich ins Portal via Facebook anzumelden.</value>
</data>
<data name="ConsumersFacebookInstruction" xml:space="preserve">
<value>Wenn man die Anwendung des Facebook -Dienstes hinzufügt, kann man sein Facebook-Konto mit der Profilseite verknüpfen. So meldet man sich ins ONLYOFFICE™ Portal mit eigenen Facebook-Login-Daten an. Sie können auch ein Facebook-Konto des Kontakts im CRM-Modul finden und mit "Person / Firma bearbeiten" verknüpfen.
@ -698,6 +698,9 @@
<data name="ReassignDataRemoveUserError" xml:space="preserve">
<value>Die Neuzuweisung der Daten für {0} ist nicht abgeschlossen.</value>
</data>
<data name="RecaptchaInvalid" xml:space="preserve">
<value>Ungültiges Recaptcha</value>
</data>
<data name="SgServerRegion" xml:space="preserve">
<value>Asien-Pazifik (Singapur)</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Campo de código de validación no puede estar vacío</value>
@ -209,7 +209,7 @@
<value>Clave de Facebook</value>
</data>
<data name="ConsumersFacebookDescription" xml:space="preserve">
<value>Conectar la aplicación para acceder al portal usando la cuenta Facebook y buscar contactos.</value>
<value>Conectar la aplicación para acceder al portal usando la cuenta Facebook.</value>
</data>
<data name="ConsumersFacebookInstruction" xml:space="preserve">
<value>Si Usted añade la aplicación del servicio Facebook, Usted podrá conectar el acceso al portal ONLYOFFICE™ en la página de su perfil con ayuda de la cuenta Facebook. También Usted podrá encontrar y enlazar la cuenta de Facebook en la página de 'Editar persona/empresa' en el módulo CRM.</value>
@ -661,6 +661,9 @@
<data name="ReassignDataRemoveUserError" xml:space="preserve">
<value>El proceso de reasignación de datos para {0} no se ha completado.</value>
</data>
<data name="RecaptchaInvalid" xml:space="preserve">
<value>Recaptcha inválido</value>
</data>
<data name="SgServerRegion" xml:space="preserve">
<value>Asia Pacífico (Singapur)</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Le champ du code de validation ne peut pas être vide</value>
@ -209,7 +209,7 @@
<value>Clé de Facebook</value>
</data>
<data name="ConsumersFacebookDescription" xml:space="preserve">
<value>Connecter l'application pour accèder au portail en utilisant le compte Facebook et la recherche des contacts.</value>
<value>Connecter l'application pour accèder au portail en utilisant le compte Facebook.</value>
</data>
<data name="ConsumersFacebookInstruction" xml:space="preserve">
<value>Si vous ajoutez une application du service Facebook, vous pouvez connecter votre compte Facebook sur votre page de profil en vue de l'utiliser pour accéder au portail ONLYOFFICE™. Cela vous permet également trouver un compte Facebook dun contact dans le module CRM et le lier sur la page « Modifier personne/entreprise ».</value>
@ -696,6 +696,9 @@
<data name="ReassignDataRemoveUserError" xml:space="preserve">
<value>Le processus de réaffectation des données pour {0} n'est pas terminé.</value>
</data>
<data name="RecaptchaInvalid" xml:space="preserve">
<value>Recaptcha Invalide</value>
</data>
<data name="SgServerRegion" xml:space="preserve">
<value>Asie-Pacifique (Singapour)</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Il campo Valida codice non può essere vuoto</value>
@ -194,7 +194,7 @@
<value>Chiave di Facebook</value>
</data>
<data name="ConsumersFacebookDescription" xml:space="preserve">
<value>Collega l'applicazione per registrarsi al portale usando l'account Facebook e cercare contatti.</value>
<value>Collega l'applicazione per registrarsi al portale usando l'account Facebook.</value>
</data>
<data name="ConsumersFacebookInstruction" xml:space="preserve">
<value>Se aggiungi un'applicazione del servizio Facebook sarai in grado di collegare il tuo account Facebook al profilo così che tu possa entrare nel portale ONLYOFFICE® direttamente. Inoltre sarà possibile trovare il rispettivo profilo Facebook di un contatto nel modulo CRM e collegarlo alla pagina 'Modifica contatto/azienda'.</value>
@ -653,6 +653,9 @@
<data name="ReassignDataRemoveUserError" xml:space="preserve">
<value>La riassegnazione dei dati in corso per {0} non è completa.</value>
</data>
<data name="RecaptchaInvalid" xml:space="preserve">
<value>Recaptcha non valido</value>
</data>
<data name="SgServerRegion" xml:space="preserve">
<value>Asia Pacifico (Singapore)</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Validation code field cannot be empty</value>
@ -209,7 +209,7 @@
<value>Facebook Key</value>
</data>
<data name="ConsumersFacebookDescription" xml:space="preserve">
<value>Enable the application to sign in to the portal using a Facebook account and search for contacts.</value>
<value>Enable the application to sign in to the portal using a Facebook account.</value>
</data>
<data name="ConsumersFacebookInstruction" xml:space="preserve">
<value>If you add an application of the Facebook service you will be able to connect your Facebook account on your profile page so that you can sign in to the ONLYOFFICE™ portal using it. You will also be able to find a Facebook account of a contact in the CRM module and link it on the 'Edit person/company' page.</value>
@ -694,6 +694,9 @@
<data name="ReassignDataRemoveUserError" xml:space="preserve">
<value>Data reassign process for {0} is not complete.</value>
</data>
<data name="RecaptchaInvalid" xml:space="preserve">
<value>Invalid Recaptcha</value>
</data>
<data name="SgServerRegion" xml:space="preserve">
<value>Asia Pacific (Singapore)</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Поле кода подтверждения не может быть пустым</value>
@ -209,7 +209,7 @@
<value>Ключ Facebook</value>
</data>
<data name="ConsumersFacebookDescription" xml:space="preserve">
<value>Подключите приложение для входа на портал по учетной записи Facebook и поиска контактов.</value>
<value>Подключите приложение для входа на портал по учетной записи Facebook.</value>
</data>
<data name="ConsumersFacebookInstruction" xml:space="preserve">
<value>Добавив приложение сервиса Facebook, Вы сможете на странице своего профиля подключить вход на портал ONLYOFFICE™ с помощью аккаунта Facebook. Также Вы сможете на странице редактирования персоны или компании CRM находить и привязывать аккаунт Facebook.</value>
@ -694,6 +694,9 @@
<data name="ReassignDataRemoveUserError" xml:space="preserve">
<value>Процесс передачи данных для {0} не завершен.</value>
</data>
<data name="RecaptchaInvalid" xml:space="preserve">
<value>Неверный код Recaptcha</value>
</data>
<data name="SgServerRegion" xml:space="preserve">
<value>АТР (Сингапур)</value>
</data>

View File

@ -0,0 +1,72 @@
using System;
using System.IO;
using System.Net;
using System.Security.Authentication;
using ASC.Web.Studio.Core;
using Newtonsoft.Json.Linq;
namespace ASC.Web.Core
{
public class RecaptchaException : InvalidCredentialException
{
public RecaptchaException()
{
}
public RecaptchaException(string message)
: base(message)
{
}
}
public class Recaptcha
{
private SetupInfo SetupInfo { get; }
public Recaptcha(SetupInfo setupInfo)
{
SetupInfo = setupInfo;
}
public bool ValidateRecaptcha(string response, string ip)
{
try
{
var data = string.Format("secret={0}&remoteip={1}&response={2}", SetupInfo.RecaptchaPrivateKey, ip, response);
var webRequest = (HttpWebRequest)WebRequest.Create(SetupInfo.RecaptchaVerifyUrl);
webRequest.Method = WebRequestMethods.Http.Post;
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = data.Length;
using (var writer = new StreamWriter(webRequest.GetRequestStream()))
{
writer.Write(data);
}
using (var webResponse = webRequest.GetResponse())
using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
var resp = reader.ReadToEnd();
var resObj = JObject.Parse(resp);
if (resObj["success"] != null && resObj.Value<bool>("success"))
{
return true;
}
if (resObj["error-codes"] != null && resObj["error-codes"].HasValues)
{
return false;
}
}
}
catch (Exception)
{
}
return false;
}
}
}

View File

@ -53,7 +53,8 @@ namespace ASC.Web.Studio.Core
public string MainLogoURL { get; private set; }
public string MainLogoMailTmplURL { get; private set; }
public List<CultureInfo> EnabledCultures { get; private set; }
public List<CultureInfo> EnabledCulturesPersonal { get; private set; }
public List<CultureInfo> EnabledCulturesPersonal { get; set; }
public List<KeyValuePair<string, CultureInfo>> PersonalCultures { get; private set; }
public decimal ExchangeRateRuble { get; private set; }
public long MaxImageUploadSize { get; private set; }
@ -141,12 +142,15 @@ namespace ASC.Web.Studio.Core
.Select(l => CultureInfo.GetCultureInfo(l.Trim()))
.OrderBy(l => l.DisplayName)
.ToList();
EnabledCulturesPersonal = GetAppSettings("web.cultures.personal", GetAppSettings("web.cultures", "en-US"))
EnabledCulturesPersonal = GetAppSettings("web:cultures:personal", GetAppSettings("web:cultures", "en-US"))
.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(l => CultureInfo.GetCultureInfo(l.Trim()))
.OrderBy(l => l.DisplayName)
.ToList();
PersonalCultures = GetPersonalCultures();
ExchangeRateRuble = GetAppSettings("exchange-rate.ruble", 65);
MaxImageUploadSize = GetAppSettings<long>("web:max-upload-size", 1024 * 1024);
AvailableFileSize = GetAppSettings("web:available-file-size", 100L * 1024L * 1024L);
@ -247,5 +251,55 @@ namespace ASC.Web.Studio.Core
}
return defaultValue;
}
private List<KeyValuePair<string, CultureInfo>> GetPersonalCultures()
{
var result = new Dictionary<string, CultureInfo>();
foreach (var culture in EnabledCulturesPersonal)
{
if (result.ContainsKey(culture.TwoLetterISOLanguageName))
{
result.Add(culture.Name, culture);
}
else
{
result.Add(culture.TwoLetterISOLanguageName, culture);
}
}
return result.OrderBy(item => item.Value.DisplayName).ToList();
}
public KeyValuePair<string, CultureInfo> GetPersonalCulture(string lang)
{
foreach (var item in PersonalCultures)
{
if (string.Equals(item.Key, lang, StringComparison.InvariantCultureIgnoreCase))
{
return item;
}
}
var cultureInfo = EnabledCulturesPersonal.Find(c => string.Equals(c.Name, lang, StringComparison.InvariantCultureIgnoreCase));
if (cultureInfo == null)
{
cultureInfo = EnabledCulturesPersonal.Find(c => string.Equals(c.TwoLetterISOLanguageName, lang, StringComparison.InvariantCultureIgnoreCase));
}
if (cultureInfo != null)
{
foreach (var item in PersonalCultures)
{
if (item.Value == cultureInfo)
{
return item;
}
}
}
return new KeyValuePair<string, CultureInfo>(lang, cultureInfo);
}
}
}