Coder Social home page Coder Social logo

graduate-2's Introduction

graduate-2

Общее описание

  1. Протокол взаимодействия - REST (или что-то на него похожее)
  2. Хранение данных на стороне сервера: сейчас sqlite, в принципе, несложно перейти на другой вариант SQL БД.
  3. Аутентификация - basic + https
  4. сохраняемые данные - пароли (Account), текстовые записи (Note), данные платёжных карт (Card) и бинарные данные (Binary).
  5. Шифрование данных: на стороне клиента с помощью мастер-ключа алгоритмом AES. Данные шифруются перед отправкой на сервер и кэшированием. Шифруются поля Opaque и Meta структуры Record. В поле Opaque сохраняется содержимое Account, Card, Note или Binary.

Организация кода

  1. Внутренние модули:
    • internal/store/: код, работающий с БД
    • internal/server/: код, работающий в http-сервере
    • internal/client/: код, работающий в http-клиенте
    • cmd/server/: код для запуска сервера
    • cmd/client/: код для запуска клиента
    • cmd/server/internal/, cmd/client/internal` - внутренние модули команд сервера и клиента.

Кэширование на стороне клиента

  1. Сохранение и обновление: при успешной попытке сохранения или обновления на сервере, обновляется также запись в локальном кэше.
  2. Чтение: делается попытка чтения с сервера. Если не удаётся связаться с сервером - делается попытка чтения из кэша. При удачной попытке чтения с сервера - кэш обновляется. Операция list локального кэша не обновляет, но при недоступности сервера выводит содержимое локального кэша.
  3. Удаление: при успешном удалении с сервера запись из локального кэша удаляется.
  4. Предусмотрены операции очистки кэша и единовременного кэширования всех данных.

Ключи командрной строки клиента

Общая схема:

go run cmd/client/main.go MODE -a ACTION flags

гдеs

  • MODE - один из user, cache, acc, note, card или bin
  • ACTION
    • для режима user один из register, verify или password
    • для режима cache один из clean или sync
    • для режимов acc, note или card - один из list, store, get, update или delete
  • flags:
    • -h - получить справку по флагам
    • для режима acc:
      -i int
      	record ID
      -n string
      	account name
      -l string
      	account URL
      -p string
      	account password
      -u string
      	account user name
      -m string
      	account metainfo
      
    • для режима note:
      -i int
      	record ID
      -n string
      	note name
      -t string
      	note text
      -m string
      	note metainfo
      
    • для режима card:
      -i int
      	record ID
      -n string
      	card name
      -ch string
      	card holder
      -num string
      	card number
      -c string
      	card CVC code
      -em int
      	card expiry month
      -ey int
      	card expiry year
      -m string
      	card metainfo
      
    • для режима bin:
      -i int
      	binary record ID
      -n string
      	binary record name
      -f string
      	file name
      -m string
      	bin record metainfo
      

Использование

  1. Сделать конфигурационный файл сервера server.cfg (имя можно задать в переменной окружения SERVER_CFG):
    {
      "store_file": "server_storage.db",
      "listen_port": 8443,
      "server_key": "keys/server.key",
      "server_crt": "keys/server.crt"
    }
    
  2. Скопировать ключ и сертификат сервера в соответствующие файлы. Можно изготовить самоподписанный сертификат через команду make key.
  3. Записать секретную фразу в файл secret_phrase.txt или другой, назначить ему режим доступа 0400 или 0600.
  4. Сделать конфигурационный файл клиента gosecret.cfg (имя можно задать в переменной окружения GOSECRET_CFG). Если для сервера применяется самоподписанный сертификат, нужно выставить https_insecure в true. Режим доступа конфигурационного файла клиента должен быть 0400 или 0600.
    {
      "user_name": "user1",
      "password": "pass",
      "full_name": "Full Name",
      "server_address": "https://localhost:8443"
      "cache_file": "cache_store.db",
      "https_insecure": true,
      "key_phrase_file": "secret_phrase.txt"
    }
    
  5. Запустить сервер
    go run cmd/server/main.go
    
  6. Зарегистрироваться на сервере:
    $ go run cmd/client/main.go user -a register
    2022/04/30 09:17:26 user is registered with id 1
    
  7. Проверить регистрацию:
    $ go run cmd/client/main.go user -a verify
    2022/04/30 09:18:11 user is verified
    

Далее показаны действия по работе с аккаунтами (логин-пароль-url-мета). Для других типов данных (платёжные карты и текстовые записи) действия аналогичны. Для бинарных данных примеры приведены ниже - они отличаются заданием имени файла.

  1. Сохранить данные аккаунтов:

    $ go run cmd/client/main.go acc -a store \
        -n "My account" \
        -u user123 \
        -p pass987 \
        -l http://example.com \
        -m "test account, some info"
    accout record stored with id 1
    
    $ go run cmd/client/main.go acc -a store \
        -n "Another account" \
        -u user22 \
        -p passW0RD \
        -l http://example.org \
        -m "second account, metainfo"
    accout record stored with id 2
    
  2. Получить список сохранённых аккаунтов:

    $ go run cmd/client/main.go acc -a list
    
    Id: 2
      Type: account
      Name: Another account
    Id: 1
      Type: account
      Name: My account
    
  3. Обновить данные аккаунта по ID

    $ go run cmd/client/main.go acc -a update \
        -i 2 \
        -u user22 \
        -p passW0RD \
        -l https://example.org:4433 \
    record updated
    
  4. Обновить метаданные по ID

    $ go run cmd/client/main.go acc -a update \
        -i 2 \
        -m "second account, Meta Info: new info"
    record updated
    
  5. Обновить имя записи по ID

    $ go run cmd/client/main.go acc -a update \
        -i 2 \
        -n "Yet another account" \
    record updated
    
  6. Обновить аккаунт по имени

    $ go run cmd/client/main.go acc -a update \
        -n "Another account" \
        -u user22 \
        -p passW0RD \
        -l https://example.org:4433 \
        -m "second account, Meta Info"
    record updated
    
  7. Получить запись аккаунта по ID:

    $ go run cmd/client/main.go acc -a get -i 2
    
     Type: account
     Name: Another account
     Meta info: second account, Meta Info
     Data: {"url":"https://example.org:4433","user_name":"user22","password":"passW0RD"}
    
  8. Получить запись аккаунта по имени:

    $ go run cmd/client/main.go acc -a get -n "Another account"
    
     Type: account
     Name: Another account
     Meta info: second account, Meta Info
     Data: {"url":"https://example.org:4433","user_name":"user22","password":"passW0RD"}
    
  9. Удалить аккаунт по ID:

    $ go run cmd/client/main.go acc -a delete -i 1
    Record 1 deleted
    
  10. Удалить аккаунт по имени:

    $ go run cmd/client/main.go acc -a delete -n "Another account"
    Record 1 deleted
    
  11. Для бинарных данных использование предполагает задание имени файла для исходных данных или для их сохранения на локальной машине.

    • для сохранения содержимого файла FILE_NAME на сервере:
      go run cmd/client/main.go bin -a store -n REC_NAME -f FILE_NAME
      record stored with id 3
      
    • для получения с сервера и сохранения в файле FILE_NAME:
      go run cmd/client/main.go bin -a get -i 3 -f FILE_NAME
      
        Type: binary
        Name: REC_NAME
        File FILE_NAME is written
      
  12. Очистка локального кэша

    go run cmd/client/main.go cache -a clean
    2022/05/15 17:39:59 cache is cleaned
    
  13. Синхронизация кэша с данными сервера

    go run cmd/client/main.go cache -a sync
    2022/05/15 17:36:57 cache is synchronized
    
  14. Работа от другого пользователя: создать другой файл конфигурации, именить его параметры, указать через переменную окружения:

    GOSECRET_CFG=gosecret1.cfg go run cmd/client/main.go user -a register
    2022/05/13 22:52:40 user is registered with id 2
    
    GOSECRET_CFG=gosecret1.cfg go run cmd/client/main.go user -a verify
    2022/05/13 22:58:04 user is verified
    
  15. В случае утери секретной фразы, зная пароль учётной записи, можно получить список записей, но нельзя получить их секретную часть:

    echo "wrongphrase" > keys/secret_key_phrase_2.txt
    
    GOSECRET_CFG=gosecret1.cfg go run cmd/client/main.go user -a verify
    2022/05/13 23:01:04 user is verified
    
    GOSECRET_CFG=gosecret1.cfg go run cmd/client/main.go acc -a list
    
    Id: 4
      Type: account
      Name: rec1
    
    GOSECRET_CFG=gosecret1.cfg go run cmd/client/main.go acc -a get -i 4
    2022/05/13 23:01:46 cipher: message authentication failed
    
  16. Смена пароля учётной записи:

    go run cmd/client/main.go user -a password -p NEW_PASSWORD
    2022/05/15 20:26:23 password is changed
    

    После чего необходимо сменить пароль в файле gosecret.cfg.

Возможные улучшения

  • Вынести настройку тайм-аута клиента http в конфигурационный файл
  • Добавить ключ по принудительной работе с локальным кэшем, без обращения к серверу
  • Сделать сообщения об ошибках более user friendly. Например, при попытке создания записи с повторяющимся именем и типом, клиент сейчас пишет
    2022/05/13 22:48:15 storing account: http status 500: Cannot Store Record: UNIQUE constraint failed: records.user_id, records.name, records.type
    
    А при попытке получить несуществующую запись
    2022/05/13 22:54:58 get account: http status 404
    

graduate-2's People

Contributors

alexeymavrin-ocado avatar amavrin avatar alexey-mavrin avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.