501. Защита пользовательских данных

Не решаласьСредняя

Вы — сотрудник отдела безопасности. Ваша задача — сохранить в целостности пользовательские данные. У вас имеются личные данные пользователя. Какие-то из них — публичные, какие-то — приватные. Пользователь может менять данные, но вы должны следить за их целостностью.

Формат данных:

  • Приватные поля начинаются с _.
  • Каждое поле имеет значение и тип этого значения.
  • Имеется метод phone, который имеет доступ для чтения приватного поля _phone и позволяет выводить его в шифрованном виде.
{
    publicName: {value: 'User80lvl', type: 'string'},
    _phone: {value: 79990000011, type: 'number'},
    phone () {
        let phoneValue = this._phone.value.toString();
        return '+' + phoneValue.slice(0,4) + '*****' + phoneValue.slice(-2);
    },
}

Правила работы с данными

  • Приватные поля нельзя читать, удалять или перезаписывать, никто не должен догадываться об их наличии.
  • Методы нельзя изменять или удалять, иначе доступ к приватным данным будет утерян.
  • Обращение к phone должно быть для пользователя такое же, как к публичному полю.
  • При чтении, записи или удалении несуществующего или приватного поля возвращаем false.
  • При чтении публичного поля возвращаем только его значение.
  • Изменение публичных полей допустимо, если новое значение соответствует типу поля.

Требования к решению

Личные данные обёрнуты Proxy, который сейчас не имеет никаких ловушек. Вам нужно написать такой объект-обработчик (handler), который будет перехватывать действия над оригинальным объектом и соблюдать перечисленные правила.

Пример простого решения:

module.exports = {}

Ограничения

Ограничение времени

10 с

Ограничение памяти

18 МБ

Пример 1

Ввод
module.exports = {
    publicName: {value: 'User80lvl', type: 'string'},
    age: {value: 22, type: 'number'},
    _firstName: {value: 'Вася', type: 'string'},
};
Вывод
Чтение приватного поля: false
Чтение публичного: User80lvl
Удаление приватного поля: false
Удаление публичного поля: true
Вызов метода: false
Удаление метода: true
Изменение данных пользователя: User90lvl

Пример 2

Ввод
module.exports = {
    publicName: {value: 'User80lvl', type: 'string'},
    age: {value: 22, type: 'number'},
	sex: {value: 'male', type: 'string'},
    _firstName: {value: 'Вася', type: 'string'},
    _lastName: {value: 'Пупкин', type: 'string'},
    _phone: {value: 79990000011, type: 'number'},
    phone () {
        let phoneValue = this._phone.value.toString();
        return '+' + phoneValue.slice(0,4) + '*****' + phoneValue.slice(-2);
    },
};
Вывод
Чтение приватного поля: false
Чтение публичного: User80lvl
Удаление приватного поля: false
Удаление публичного поля: true
Вызов метода: +7999*****11
Удаление метода: false
Изменение данных пользователя: User90lvl,male,+7999*****11

Теги

JavaScript Node.js 20.14
Нужно войти, чтобы отправить решение.Войти