Поддержка  •  Дневник  •  Без рекламы  •  О сайте  •  Реклама  •  Поставить баннер  •  Прислать  •  Хроника  •  Translate Гости: 5    Участники: 0 Авторизация Авторизация   Регистрация 
Метод Научного Тыка
RULVEN
Поиск  
О сайте, обо всём что меня окружает, интересует, волнует, касается.   Размещение рекламы
Содержание
Поиск
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011
2010
2009
2008
2007
2006
2005
2004
2003
2002
2001
«« Следующая Вернуться в список Предыдущая »»

30 января 2023 года, понедельник, 00:50

Заметка #149732

Во дела, в нормальной обстановке, без спешки сделал тест по вакансии как белый человек. Вчера на этот тест после 37 теоретических вопросов оставалось всего 30 минут. Это не дело.

В таком состоянии отослал:

Сегодня всё по красоте:

BankController.cs

using InternetBankingRESTfulService.Api;
using InternetBankingRESTfulService.Api.Core;
using Microsoft.AspNetCore.Mvc;

namespace InternetBankingRESTfulService.Web.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class BankController : ControllerBase
    {
        private InternetBankingApi BankingApi { get; }

        public BankController()
        {
            BankingApi = new InternetBankingApi();
        }

        [HttpGet("api/version")]
        public IActionResult GetApiVersion()
        {
            return Ok(BankingApi.GetApiVersion());
        }

        [HttpGet("api-version")]
        public IActionResult GetApiVersionSecond()
        {
            return Ok(BankingApi.GetApiVersion());
        }

        [HttpGet("api/calc/MD5/{value}")]
        public IActionResult CalculateMD5(string value)
        {
            return Ok(BankingApi.CalculateMD5(Helper.ReplaceDigitsByString(value)));
        }

        [HttpGet("api/calc/{value}/MD5")]
        public IActionResult CalculateMD5Second(string value)
        {
            return Ok(BankingApi.CalculateMD5(Helper.ReplaceDigitsByString(value)));
        }

        [HttpGet("api/password/strong/{value}")]
        public IActionResult PasswordStrong(string value)
        {
            return Ok(BankingApi.IsPasswordStrong(value));
        }

        [HttpGet("api/is-password-strong/{value}")]
        public IActionResult IsPasswordStrong(string value)
        {
            return Ok(BankingApi.IsPasswordStrong(value));
        }
    }
}

InternetBankingApi.cs

using InternetBankingRESTfulService.Api.Core;
using System;

namespace InternetBankingRESTfulService.Api
{
    public class InternetBankingApi : IInternetBankingApi
    {
        private readonly string _apiVersion = $"{DateTime.UtcNow:yyyy.MM.dd}.1.0";

        public string GetApiVersion()
        {
            return _apiVersion;
        }

        public string CalculateMD5(string value)
        {
            return Security.MD5Encode(value);
        }

        public bool IsPasswordStrong(string password)
        {
            return Security.IsPasswordStrong(password);
        }
    }
}

Security.cs

using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Text;
using System;
using System.Linq;

namespace InternetBankingRESTfulService.Api.Core
{
    public static class Security
    {
        /// <summary>
        /// Returns MD5 hash string.
        /// </summary>
        /// <param name="plainText"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static string MD5Encode(string plainText)
        {
            if (string.IsNullOrEmpty(plainText))
                throw new ArgumentException("Text cannot be empty.");

            return string.Concat(MD5.HashData(Encoding.UTF8.GetBytes(plainText)).Select(x => x.ToString("x2"))).ToUpper();
        }

        /// <summary>
        /// Validate password strength.
        /// </summary>
        /// <param name="plainPassword"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static bool IsPasswordStrong(string plainPassword)
        {
            if (string.IsNullOrEmpty(plainPassword))
                throw new ArgumentException("Password cannot be empty.");

            return new Regex(@"(?=^.{12,}$)(?=.*\d)(?=.*[!@#$%^&*]+)(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$").IsMatch(plainPassword);
        }
    }
}

Helper.cs

using System.Text.RegularExpressions;

namespace InternetBankingRESTfulService.Api.Core
{
    public static class Helper
    {
        /// <summary>
        /// Replace all digits in value parameter by char.
        /// </summary>
        /// <param name="value"></param>
        /// <param name="replaceNumberBy">Default char value is 'X'.</param>
        /// <returns></returns>
        public static string ReplaceDigitsByString(string value, string replaceDigitBy = "X")
        {
            return Regex.Replace(value, @"\d", replaceDigitBy);
        }
    }
}

ApiTest.cs

using Microsoft.AspNetCore.Mvc.Testing;
using NUnit.Framework;
using System;
using System.Globalization;
using System.Threading.Tasks;

namespace InternetBankingRESTfulService.Tests
{
    public class ApiTest
    {
        [Test]
        public async Task TestApiVersion()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync("/bank/api/version");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual($"{DateTime.UtcNow.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture)}.1.0", data);
        }

        [Test]
        public async Task TestApiVersion_Second()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync("/bank/api-version");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual($"{DateTime.UtcNow.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture)}.1.0", data);
        }

        [Test]
        public async Task TestPasswordStrongIsFalse()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync($"/bank/api/password/strong/123");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual("false", data);
        }

        [Test]
        public async Task TestPasswordStrongIsTrue()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync($"/bank/api/password/strong/ALhj89*19896");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual("true", data);
        }

        [Test]
        public async Task CalculateMD5()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync($"/bank/api/calc/MD5/test-string-ABC");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual("79C8DC4F3BAEBF0A4F40517225F41A86", data);
        }

        [Test]
        public async Task CalculateMD5_SecondURL()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync($"/bank/api/calc/test-string-ABC/MD5");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual("79C8DC4F3BAEBF0A4F40517225F41A86", data);
        }
    }
}

Мне нравится 0    Мне не нравится 0
Писать комментарии могут только зарегистрированные пользователи.

Логин
Пароль
 
 
новые комментарии сверху

Комментарии: 0
Нет ни одного комментария.
Поделиться ссылкой:
Последние комментарии

2 недели назад, 21:40
Истинную причину всего этого не...
Только для сосайтников. Для просмотра нужно пройти авторизацию.
Ср 10.04.2024 19:41
Не, тут другой имело ввиду....
Только для сосайтников. Для просмотра нужно пройти авторизацию.
Чт 14.03.2024 00:20
Спасибо! У сайта уже есть какая никакая история, надеюсь этот спектакль продолжится без приключений. Интересно посмотреть что тут будет к декабрю 2024. Здесь уже достаточно интересного контента, и хотелось бы его больше. Больше всякого разного. И вообще работы по развитию...
Пн 26.02.2024 15:33
Мои поздравления!
Вт 26.12.2023 09:33
В декабре планирую закончить всякое разное по всему сайту и в январе начать работу над местной микросоциалкой и управлением контентом для пользователей. Надо будет решить, использовать FTP или что-то более модное.
Пн 18.12.2023 23:15
Имею два десятка "Сеповских" бутлегов, помимо официальных релизов. Как откроешь шлюзы на заказчку, можно думать над тем, когда пополнить ими "Черномяч".
Пн 18.12.2023 23:13
Даже как-то неудобно должно быть - давать ссылку на пустую дискографию... =)
Вт 05.12.2023 10:31
Про гороскоп это конечно сильно. Походу у них там HR какая-то девочка в розовом летающая в облаках.
Вс 03.12.2023 02:55
Приветы! Зима выдалась нажористая, снеговиков лепить самое время. Когда буду в Риге, наверное напрошусь затусить в Lido, картоха с шашлыком там моё почтение. И было бы интересно обкашлять будущее блекболыча, проект ведь пиздат. И человеки.
Сб 02.12.2023 14:44
Ждём-с... С наступлением календарной зимы Тебя, Серж! С заснеженным приветом из Кенгарагса!
Вт 21.11.2023 17:40
Насчёт AI это конечно хороший вопрос, ChatGPT мощная штука. И скорее всего можно использовать какие-то плагины для автоматического перевода сайта, а не написания текстов... Но у меня тут другой интерес, написать свою обновлённую версию локализации. JSON, мой маленький технический друг,...
Чт 16.11.2023 15:05
Нельзя ли на перевод подключить какой-нибудь AI? ) Чтобы автоматом переводило не коряво ))
Чт 05.10.2023 10:50
@ Gotfrid666 : да, это нужно сделать, самому надо аж не могу. Но есть куча потусторонних делишек (по другим проектам и вообще), постараюсь на этой неделе их закрыть и заняться сайтом музла. Там будет непросто, надо всё чётко продумать. Потом...
Чт 05.10.2023 10:11
Правильно! Шли их всех!
Чт 05.10.2023 10:11
Правильно! Шли их всех!
Чт 05.10.2023 08:45
В дискографии КМ у Тебя нету ни одного концертника. Открывай шлюзы для залива авторизированным пользователям! Мы об этом уже внушительное время назад говорили на примере ОН.
Пн 02.10.2023 11:24
А то есть это письмо пришло от провайдера? Просто в связи с последними геополитическими ситуациями, Россия сама отказалась от наказывания за пираство и т.д. Так что они теперь хотят от нас? :))
Пт 29.09.2023 17:40
А вот как раз могут. Они пожаловались моему провайдеру. Год назад у меня было предупреждение, чтобы убрал некий говнофильм. Условие следующее: если выебнусь - отключат Инет вообще без возможности подключения по этому адресу. Требование выполнил конечно, нах мне страдать из-за...
Пт 29.09.2023 09:05
судя по всему с какого-то российского ресурса этот запрос пришел, можно забить, т.к. ничего они здесь сделать не могут )))
Вс 16.07.2023 10:52
Андрей, спасибо! За 12 лет с ним такое впервые, а коте выжил в жутком пожаре. Люциферу уже получше. Точим когти!
Разработано на основе BlackNight CMS
Release v.2024-04-15
© 2000–2024 Blackball
Дизайн & программирование:
О сайтеРеклама
Visitors
Web-site performed by Sergey Drozdov