Сообщение администратору
Имя:
Почта:
Сообщение:
Вход на сайт
Логин:
Пароль:

Поддержка  •  Дневник  •  О сайте  •  Реклама  •  Поставить баннер  •  Прислать  •  Хроника  •  Translate  •  Рекомендованное  •  Написать администратору Гости: 8    Участники: 0 Авторизация Авторизация   Регистрация 
Метод Научного Тыка
RULVEN
Поиск  
О сайте, обо всём что меня окружает, интересует, волнует, касается. Поддержать
«« Следующая Вернуться в список Предыдущая »»

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
Нет ни одного комментария.
Поделиться ссылкой:
Последние комментарии

месяц назад, 21:25
Спасибо, денёк сегодня был непростой, но какие-то вопросы получилось успешно разрулить.
месяц назад, 07:47
Мяч на твоей половине поля. Продуктивного и безгеморройного дня!...
месяц назад, 18:23
Хелова! С задуванием альбомов всё не так беспечно, есть несколько технических решений которые нужно реализовать. Но это не так просто и быстро, многое надо спланировать. Всё это занимает много времени, а у меня сейчас есть делишки поважнее. Я сегодня подумал,...
Пт 22.11.2024 22:03
Ты уже несколько лет грозишь тем, что дашь возможность ортодоксам Черномяча заливать альбомы самостийно, но воз и ныне там. Повторюсь, что шесть концертников представителей города-антигероя Быдлограда(с) уже пару лет готовы пролиться золотым дождём, но всё как-то не срастается... Тэги, уровень звука,...
Чт 19.09.2024 11:57
"Гражданин, вы задаёте слишком много лишних вопросов. Дайте мне рот, я расскажу как могу говорить."...
Чт 19.09.2024 11:18
Интересно как Dalle может говорить, если она просто генерирует картинки ))...
полгода назад, 10:02
Вот и я смотрю, что мрак, вроде все ищут, но при этом никому не нужен и не важно какой опыт работы и уровень работ...
Сб 29.06.2024 07:37
С поиском работы просто мрак. За прошедшие 2 недели у меня 17 пустышек. Сколько посылал заявок везде даже не считаю уже.
Пт 28.06.2024 07:14
Как с поиском работы? Сейчас тоже пытаюсь найти дополнительную подработку по дизайну и скажу это большой челлендж, не смотря на опыт и портфолио.
Ср 19.06.2024 19:50
Спасибо, нелегко всё-таки терять тех кто дорог. Она ушла как-то быстро, меньше чем за неделю. То носилась, была активная, и как-то стало ей плохеть и всё. Ну ей сейчас уже не жарко, не холодно, ни весело ни скучно.
Вт 18.06.2024 09:43
Соболезную...
Сб 15.06.2024 04:11
Два раза подумал и всё оказалось не так просто и однозначно. Идея моего поста в том что в последнее время у меня вынужденно уходит очень много времени на то что не даёт результата. Полезная работа может превратиться в бесполезную. Вот...
Чт 13.06.2024 12:42
А-а-а... Точно! Верно подмечено, самый мой случай. И я вот к контексте поиска работы думал что может со мной что не так... А не, почитал статьи, видео посмотрел на эту тему - у большинства 1:1 как со мной. И работу...
Чт 13.06.2024 08:08
Как раз Ты внизу приподнял статью про "Бесполезную работу". Краткая выдержка оттуда: >> Работа должна служить какой-то цели. Если человек убеждается, что она бессмысленна, что он работает ради самой работы, это вызывает у него чувство беспомощности, никчемности, несвободы. Он будто...
Чт 11.04.2024 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
Имею два десятка "Сеповских" бутлегов, помимо официальных релизов. Как откроешь шлюзы на заказчку, можно думать над тем, когда пополнить ими "Черномяч".
Разработано на основе BlackNight CMS
Release v.2024-12-19
© 2000–2025 Blackball
Дизайн & программирование:
О сайтеРеклама
Visitors
Web-site performed by Sergey Drozdov