diff --git a/.gitignore b/.gitignore index 35a670c..ff676ec 100755 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,8 @@ config/settings.local.yml config/settings/*.local.yml config/environments/*.local.yml -./redis/appendonly.aof \ No newline at end of file +# ignore redis temp files +appendonly.aof +/redis/appendonly.aof +# ignore uploaded package files +/app/public/* \ No newline at end of file diff --git a/Gemfile b/Gemfile index 1e38679..6bf7c2d 100755 --- a/Gemfile +++ b/Gemfile @@ -52,4 +52,5 @@ end gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] gem 'mock_redis' # Redis のモック。テスト実行時に使用。 -gem 'config' # 環境ごとに yml の設定ファイルを作成可能。 \ No newline at end of file +gem 'config' # 環境ごとに yml の設定ファイルを作成可能。 +gem 'rubyzip' # パッケージファイルを解凍して中のJsonをいじるために使うRailsでZipファイルを扱えるようにするGem。2009年の記事に載ってたGemなのにいま現役なのすごい。感動。 \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 6bfe6e3..3e603bb 100755 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,78 +1,78 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.0.4.1) - actionpack (= 6.0.4.1) + actioncable (6.0.4.7) + actionpack (= 6.0.4.7) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.0.4.1) - actionpack (= 6.0.4.1) - activejob (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) + actionmailbox (6.0.4.7) + actionpack (= 6.0.4.7) + activejob (= 6.0.4.7) + activerecord (= 6.0.4.7) + activestorage (= 6.0.4.7) + activesupport (= 6.0.4.7) mail (>= 2.7.1) - actionmailer (6.0.4.1) - actionpack (= 6.0.4.1) - actionview (= 6.0.4.1) - activejob (= 6.0.4.1) + actionmailer (6.0.4.7) + actionpack (= 6.0.4.7) + actionview (= 6.0.4.7) + activejob (= 6.0.4.7) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.0.4.1) - actionview (= 6.0.4.1) - activesupport (= 6.0.4.1) + actionpack (6.0.4.7) + actionview (= 6.0.4.7) + activesupport (= 6.0.4.7) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.0.4.1) - actionpack (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) + actiontext (6.0.4.7) + actionpack (= 6.0.4.7) + activerecord (= 6.0.4.7) + activestorage (= 6.0.4.7) + activesupport (= 6.0.4.7) nokogiri (>= 1.8.5) - actionview (6.0.4.1) - activesupport (= 6.0.4.1) + actionview (6.0.4.7) + activesupport (= 6.0.4.7) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.0.4.1) - activesupport (= 6.0.4.1) + activejob (6.0.4.7) + activesupport (= 6.0.4.7) globalid (>= 0.3.6) - activemodel (6.0.4.1) - activesupport (= 6.0.4.1) - activerecord (6.0.4.1) - activemodel (= 6.0.4.1) - activesupport (= 6.0.4.1) - activestorage (6.0.4.1) - actionpack (= 6.0.4.1) - activejob (= 6.0.4.1) - activerecord (= 6.0.4.1) + activemodel (6.0.4.7) + activesupport (= 6.0.4.7) + activerecord (6.0.4.7) + activemodel (= 6.0.4.7) + activesupport (= 6.0.4.7) + activestorage (6.0.4.7) + actionpack (= 6.0.4.7) + activejob (= 6.0.4.7) + activerecord (= 6.0.4.7) marcel (~> 1.0.0) - activesupport (6.0.4.1) + activesupport (6.0.4.7) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) zeitwerk (~> 2.2, >= 2.2.2) - bcrypt (3.1.16) - bootsnap (1.9.1) - msgpack (~> 1.0) + bcrypt (3.1.17) + bootsnap (1.11.1) + msgpack (~> 1.2) builder (3.2.4) byebug (11.1.3) cancancan (3.3.0) coderay (1.1.3) - concurrent-ruby (1.1.9) - config (3.1.0) + concurrent-ruby (1.1.10) + config (4.0.0) deep_merge (~> 1.2, >= 1.2.1) dry-validation (~> 1.0, >= 1.0.0) crass (1.0.6) debase (0.2.4.1) debase-ruby_core_source (>= 0.10.2) - debase-ruby_core_source (0.10.12) - deep_merge (1.2.1) - dry-configurable (0.13.0) + debase-ruby_core_source (0.10.14) + deep_merge (1.2.2) + dry-configurable (0.14.0) concurrent-ruby (~> 1.0) dry-core (~> 0.6) dry-container (0.9.0) @@ -81,11 +81,11 @@ GEM dry-core (0.7.1) concurrent-ruby (~> 1.0) dry-inflector (0.2.1) - dry-initializer (3.0.4) + dry-initializer (3.1.1) dry-logic (1.2.0) concurrent-ruby (~> 1.0) dry-core (~> 0.5, >= 0.5) - dry-schema (1.8.0) + dry-schema (1.9.1) concurrent-ruby (~> 1.0) dry-configurable (~> 0.13, >= 0.13.0) dry-core (~> 0.5, >= 0.5) @@ -98,41 +98,42 @@ GEM dry-core (~> 0.5, >= 0.5) dry-inflector (~> 0.1, >= 0.1.2) dry-logic (~> 1.0, >= 1.0.2) - dry-validation (1.7.0) + dry-validation (1.8.0) concurrent-ruby (~> 1.0) dry-container (~> 0.7, >= 0.7.1) dry-core (~> 0.5, >= 0.5) dry-initializer (~> 3.0) - dry-schema (~> 1.8, >= 1.8.0) + dry-schema (~> 1.9, >= 1.9.1) erubi (1.10.0) - ffi (1.15.4) - globalid (0.5.2) + ffi (1.15.5) + globalid (1.0.0) activesupport (>= 5.0) - i18n (1.8.10) + i18n (1.10.0) concurrent-ruby (~> 1.0) - jbuilder (2.11.2) + jbuilder (2.11.5) + actionview (>= 5.0.0) activesupport (>= 5.0.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) ruby_dep (~> 1.2) - loofah (2.12.0) + loofah (2.16.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) mini_mime (>= 0.1.1) marcel (1.0.2) method_source (1.0.0) - mini_mime (1.1.1) - mini_portile2 (2.6.1) - minitest (5.14.4) - mock_redis (0.29.0) + mini_mime (1.1.2) + mini_portile2 (2.8.0) + minitest (5.15.0) + mock_redis (0.30.0) ruby2_keywords - msgpack (1.4.2) + msgpack (1.4.5) mysql2 (0.5.3) nio4r (2.5.8) - nokogiri (1.12.5) - mini_portile2 (~> 2.6.1) + nokogiri (1.13.3) + mini_portile2 (~> 2.8.0) racc (~> 1.4) pry (0.13.1) coderay (~> 1.1) @@ -140,75 +141,76 @@ GEM pry-byebug (3.9.0) byebug (~> 11.0) pry (~> 0.13.0) - puma (5.5.0) + puma (5.6.4) nio4r (~> 2.0) - racc (1.5.2) + racc (1.6.0) rack (2.2.3) rack-test (1.1.0) rack (>= 1.0, < 3) - rails (6.0.4.1) - actioncable (= 6.0.4.1) - actionmailbox (= 6.0.4.1) - actionmailer (= 6.0.4.1) - actionpack (= 6.0.4.1) - actiontext (= 6.0.4.1) - actionview (= 6.0.4.1) - activejob (= 6.0.4.1) - activemodel (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) + rails (6.0.4.7) + actioncable (= 6.0.4.7) + actionmailbox (= 6.0.4.7) + actionmailer (= 6.0.4.7) + actionpack (= 6.0.4.7) + actiontext (= 6.0.4.7) + actionview (= 6.0.4.7) + activejob (= 6.0.4.7) + activemodel (= 6.0.4.7) + activerecord (= 6.0.4.7) + activestorage (= 6.0.4.7) + activesupport (= 6.0.4.7) bundler (>= 1.3.0) - railties (= 6.0.4.1) + railties (= 6.0.4.7) sprockets-rails (>= 2.0.0) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) rails-html-sanitizer (1.4.2) loofah (~> 2.3) - railties (6.0.4.1) - actionpack (= 6.0.4.1) - activesupport (= 6.0.4.1) + railties (6.0.4.7) + actionpack (= 6.0.4.7) + activesupport (= 6.0.4.7) method_source rake (>= 0.8.7) thor (>= 0.20.3, < 2.0) rake (13.0.6) - rb-fsevent (0.11.0) + rb-fsevent (0.11.1) rb-inotify (0.10.1) ffi (~> 1.0) - redis (4.4.0) - redis-actionpack (5.2.0) - actionpack (>= 5, < 7) + redis (4.6.0) + redis-actionpack (5.3.0) + actionpack (>= 5, < 8) redis-rack (>= 2.1.0, < 3) redis-store (>= 1.1.0, < 2) - redis-rack (2.1.3) + redis-rack (2.1.4) rack (>= 2.0.8, < 3) redis-store (>= 1.2, < 2) - redis-store (1.9.0) + redis-store (1.9.1) redis (>= 4, < 5) ruby-debug-ide (0.7.3) rake (>= 0.8.1) ruby2_keywords (0.0.5) ruby_dep (1.5.0) + rubyzip (2.3.2) spring (2.1.1) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (4.0.2) + sprockets (4.0.3) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.2) - actionpack (>= 4.0) - activesupport (>= 4.0) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) - thor (1.1.0) + thor (1.2.1) thread_safe (0.3.6) tzinfo (1.2.9) thread_safe (~> 0.1) websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.4.2) + zeitwerk (2.5.4) PLATFORMS ruby @@ -230,6 +232,7 @@ DEPENDENCIES rails (~> 6.0.2) redis-actionpack ruby-debug-ide + rubyzip spring spring-watcher-listen (~> 2.0.0) tzinfo-data diff --git a/README.md b/README.md index 6c457c5..e1efe88 100755 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ![License](https://img.shields.io/github/license/b-editor/BackendBEditor?style=for-the-badge&logo=appveyor) ![Size](https://img.shields.io/github/repo-size/b-editor/BackendBEditor?style=for-the-badge&logo=appveyor) ## 📖 ABOUT -BEditorの拡張機能ストア用バックエンドWebAPIです +BEditorの拡張機能ストア用バックエンドWebAPIです 開発中のためまだ使用できません ## 🌟 Feature diff --git a/app/controllers/concerns/zipper.rb b/app/controllers/concerns/zipper.rb new file mode 100644 index 0000000..4e89287 --- /dev/null +++ b/app/controllers/concerns/zipper.rb @@ -0,0 +1,32 @@ +require 'zip' +#アップロードされたパッケージファイルを解凍、パッケージ情報を読み取る +module Zipper + def self.unzipping(path, output) + entries = [] + new_directory = File.join(output, "tmp") + Dir.mkdir(new_directory) unless Dir.exist?(new_directory) + Zip::InputStream.open(path) do |input| + # get_next_entryするとinputのoffset(ポインタ)が動く + while (entry = input.get_next_entry) + # 書き出し先を作る + save_path = File.join(new_directory, entry.name) + # 確認したいのはPACKAGEINFOだけなのでそれだけ解凍。 + if entry.name == "PACKAGEINFO" + File.open(save_path, "w") do |wf| + # get_next_entryでポインタが動いているので、毎回input.readでOK + wf.puts(sjisfix(input.read.to_s).force_encoding('utf-8')) + end + end + entries << save_path + end + end + # 解凍されたファイルたちを返却する + entries + end + + # 強制的にS-JISにエンコードを切り替える + def self.sjisfix(str) + str.gsub(/([\x83-\xFB])\//n, "\\1\\".force_encoding('utf-8')) + end +end + diff --git a/app/controllers/packages_controller.rb b/app/controllers/packages_controller.rb index a1953fd..11471b1 100755 --- a/app/controllers/packages_controller.rb +++ b/app/controllers/packages_controller.rb @@ -1,3 +1,4 @@ +require 'json' class PackagesController < ApplicationController # 一覧表示 def index @@ -37,9 +38,45 @@ def destroy @state = :unauthorized end end + # パッケージをそのままアップロードする + def uploading + #アップロードされた.bepkgファイルを取得 + uploaded = params[:package] + # パッケージファイルの保存先パスを取得 + output_path = Rails.root.join('public/packages', params[:package].original_filename) + #上で指定した場所へパッケージファイルを保存する + File.open("." + output_path.to_s, 'w+b') do |fp| + fp.write(uploaded.read) + end + # 解凍してパースされたPKGINFOをpkginfoという変数に入れとく + pkginfo = unzip_and_parse_json(Rails.root.join('app/public/packages',uploaded.original_filename)) + # PKGINFOをもとにPackageを作成 (Mass Assignment脆弱性対策でとりあえずこんな感じで。) + Package.create( + name: pkginfo["name"], + main_assembly: pkginfo["main_assembly"], + homepage: pkginfo["homepage"], + description: pkginfo["description"], + description_short: pkginfo["description_short"], + tags: pkginfo["tags"], + uuid: pkginfo["id"], + license: pkginfo["license"], + user: current_user, + ) + end + private #ストロングパラメータ def package_params params.permit(:name,:main_assembly,:homepage,:description,:description_short,:tags,:uuid,:license) end + #Zipファイルを解凍してパースする + def unzip_and_parse_json(zip_path) + packages_path = Rails.root.join('app/public/packages') + Zipper.unzipping(zip_path,Rails.root.join('app/public/packages')) + File.open(Rails.root.join('app/public/packages/tmp/PACKAGEINFO')) do |j| + @pkginfo = JSON.load(j) + end + File.delete(Rails.root.join('app/public/packages/tmp/PACKAGEINFO')) + @pkginfo + end end diff --git a/config/routes.rb b/config/routes.rb index b481e84..fa26535 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,7 +6,8 @@ resources :auth, :only => [ :create, :update,:destroy ] resources :packages do resources :versions - end + end + post 'upload', to:'packages#uploading' post 'signin', to: 'auth#create' post 'signup', to: 'users#create' get 'getAccountInfo', to: 'users#me' diff --git a/redis/appendonly.aof b/redis/appendonly.aof deleted file mode 100755 index ff4d81e..0000000 --- a/redis/appendonly.aof +++ /dev/null @@ -1,975 +0,0 @@ -*2 -$6 -SELECT -$1 -0 -*6 -$5 -hmset -$128 -f0c27913550aaf90e01151cfab13d15086be85c8d14f1a43dbeb2e8dba7ef5981bea3f70a97574a1ede1985ad63d47cdd7a89599c17d632b6508e57ff348ce4d -$7 -user_id -$1 -4 -$9 -user_type -$4 -user -*3 -$9 -PEXPIREAT -$128 -f0c27913550aaf90e01151cfab13d15086be85c8d14f1a43dbeb2e8dba7ef5981bea3f70a97574a1ede1985ad63d47cdd7a89599c17d632b6508e57ff348ce4d -$13 -1625923255000 -*6 -$5 -hmset -$128 -a381c9c2553297433efaa06dcf25bc14bf0d67c72984bc083dc8f2523393bb2a1633a4a20fe05e5d694cb8faadc017490f740256476375acd76d051fefa69133 -$7 -user_id -$1 -4 -$9 -user_type -$4 -user -*3 -$9 -PEXPIREAT -$128 -a381c9c2553297433efaa06dcf25bc14bf0d67c72984bc083dc8f2523393bb2a1633a4a20fe05e5d694cb8faadc017490f740256476375acd76d051fefa69133 -$13 -1625923322713 -*6 -$5 -hmset -$128 -a9253da22f36eeb3deebfabd743215dbdfc79a831cb5f680096419812eca7edb695ef5d961cb9e34c7df8705102b446190ea311cec45cbbf93f033491021ee2c -$7 -user_id -$1 -4 -$9 -user_type -$4 -user -*3 -$9 -PEXPIREAT -$128 -a9253da22f36eeb3deebfabd743215dbdfc79a831cb5f680096419812eca7edb695ef5d961cb9e34c7df8705102b446190ea311cec45cbbf93f033491021ee2c -$13 -1625924685356 -*2 -$3 -DEL -$128 -f0c27913550aaf90e01151cfab13d15086be85c8d14f1a43dbeb2e8dba7ef5981bea3f70a97574a1ede1985ad63d47cdd7a89599c17d632b6508e57ff348ce4d -*2 -$3 -DEL -$128 -a381c9c2553297433efaa06dcf25bc14bf0d67c72984bc083dc8f2523393bb2a1633a4a20fe05e5d694cb8faadc017490f740256476375acd76d051fefa69133 -*2 -$3 -DEL -$128 -a9253da22f36eeb3deebfabd743215dbdfc79a831cb5f680096419812eca7edb695ef5d961cb9e34c7df8705102b446190ea311cec45cbbf93f033491021ee2c -*6 -$5 -hmset -$128 -a6d9160dc0bc2c8c7bfd0f6c35513ef954992137c9cfa7afa927491787805fd915e8e714ce4792cebe39091ea2868274e2606704b052e11d1c20999827b193f9 -$7 -user_id -$1 -4 -$9 -user_type -$4 -user -*3 -$9 -PEXPIREAT -$128 -a6d9160dc0bc2c8c7bfd0f6c35513ef954992137c9cfa7afa927491787805fd915e8e714ce4792cebe39091ea2868274e2606704b052e11d1c20999827b193f9 -$13 -1625933663774 -*2 -$3 -DEL -$128 -a6d9160dc0bc2c8c7bfd0f6c35513ef954992137c9cfa7afa927491787805fd915e8e714ce4792cebe39091ea2868274e2606704b052e11d1c20999827b193f9 -*2 -$6 -SELECT -$1 -0 -*6 -$5 -hmset -$128 -66d0c548b1369ea3a9f114b0ae637c2999d6fdf1e92d0dbe16060cfc1fa88904683bed7d37811a41a2e4600cdafa6f31b0933fda8c83b77ff8192cd08f6f7a93 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -66d0c548b1369ea3a9f114b0ae637c2999d6fdf1e92d0dbe16060cfc1fa88904683bed7d37811a41a2e4600cdafa6f31b0933fda8c83b77ff8192cd08f6f7a93 -$13 -1626302610786 -*2 -$3 -DEL -$128 -66d0c548b1369ea3a9f114b0ae637c2999d6fdf1e92d0dbe16060cfc1fa88904683bed7d37811a41a2e4600cdafa6f31b0933fda8c83b77ff8192cd08f6f7a93 -*6 -$5 -hmset -$128 -e83ecc38ae3c46dcdc3b7aaa62177bc4563d66bb6a8a262e1fc705b3e2d0191b5ef80b222b98d5189a06a17a8ee0546c8b83fa3a6d5d40ced509533a6507793b -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -e83ecc38ae3c46dcdc3b7aaa62177bc4563d66bb6a8a262e1fc705b3e2d0191b5ef80b222b98d5189a06a17a8ee0546c8b83fa3a6d5d40ced509533a6507793b -$13 -1626388989444 -*2 -$6 -SELECT -$1 -0 -*2 -$3 -DEL -$128 -e83ecc38ae3c46dcdc3b7aaa62177bc4563d66bb6a8a262e1fc705b3e2d0191b5ef80b222b98d5189a06a17a8ee0546c8b83fa3a6d5d40ced509533a6507793b -*6 -$5 -hmset -$128 -f19d1154355ef1d559be57fe2f65aa2d5c8a98835ffdd22185a7287117355b920b00f5035f989096854c544c1c23f61498db6a2475b6794e06637f8ef4368804 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -f19d1154355ef1d559be57fe2f65aa2d5c8a98835ffdd22185a7287117355b920b00f5035f989096854c544c1c23f61498db6a2475b6794e06637f8ef4368804 -$13 -1626616897999 -*6 -$5 -hmset -$128 -1d89c1388b906706f84d48e593ce643d7e813d564ccc2b83771cf8c66b40a7a06f8e00643ca712a2b44cecae8812c1f88df4d61b2b0a747e6ebe184bc539fa6c -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -1d89c1388b906706f84d48e593ce643d7e813d564ccc2b83771cf8c66b40a7a06f8e00643ca712a2b44cecae8812c1f88df4d61b2b0a747e6ebe184bc539fa6c -$13 -1626623940002 -*2 -$3 -DEL -$128 -f19d1154355ef1d559be57fe2f65aa2d5c8a98835ffdd22185a7287117355b920b00f5035f989096854c544c1c23f61498db6a2475b6794e06637f8ef4368804 -*2 -$3 -DEL -$128 -1d89c1388b906706f84d48e593ce643d7e813d564ccc2b83771cf8c66b40a7a06f8e00643ca712a2b44cecae8812c1f88df4d61b2b0a747e6ebe184bc539fa6c -*2 -$6 -SELECT -$1 -0 -*6 -$5 -hmset -$128 -009a14da71ae742bc8be0af543f45c72d168a44bcf15bcd8d32a974eb855cb0eff2d7560d4db60da122d893efdae5ba13fa42ede7137ed85e8ca0f8dd0843b19 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -009a14da71ae742bc8be0af543f45c72d168a44bcf15bcd8d32a974eb855cb0eff2d7560d4db60da122d893efdae5ba13fa42ede7137ed85e8ca0f8dd0843b19 -$13 -1626688106634 -*6 -$5 -hmset -$128 -1a7645dfad4e7b1831915d5d9bb1fb86997589c226e493218022ec5c10ff0075696878e6e46f28ff1159b398079445fb47ac56660c3f9614645f5f6d2ad4ddea -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -1a7645dfad4e7b1831915d5d9bb1fb86997589c226e493218022ec5c10ff0075696878e6e46f28ff1159b398079445fb47ac56660c3f9614645f5f6d2ad4ddea -$13 -1626692320946 -*6 -$5 -hmset -$128 -36b8a4f56924e480b6d551af7d28c659c1a450340d25eb8218588b1656d7b415a1cb500e36d029bed323e4c357d5a756034c6be5f103ccf00acb5a1b700d41aa -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -36b8a4f56924e480b6d551af7d28c659c1a450340d25eb8218588b1656d7b415a1cb500e36d029bed323e4c357d5a756034c6be5f103ccf00acb5a1b700d41aa -$13 -1626692641585 -*2 -$3 -DEL -$128 -009a14da71ae742bc8be0af543f45c72d168a44bcf15bcd8d32a974eb855cb0eff2d7560d4db60da122d893efdae5ba13fa42ede7137ed85e8ca0f8dd0843b19 -*2 -$3 -DEL -$128 -36b8a4f56924e480b6d551af7d28c659c1a450340d25eb8218588b1656d7b415a1cb500e36d029bed323e4c357d5a756034c6be5f103ccf00acb5a1b700d41aa -*2 -$3 -DEL -$128 -1a7645dfad4e7b1831915d5d9bb1fb86997589c226e493218022ec5c10ff0075696878e6e46f28ff1159b398079445fb47ac56660c3f9614645f5f6d2ad4ddea -*6 -$5 -hmset -$128 -ff8b5d7ccdd7b827bb37c5bb8252c5d37049a91f1ce61e6ae8867563712926b85cad0311f3c2da4965bff6c4c179e16aa736a8590911ac14fd9d4ac3fa4178f7 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -ff8b5d7ccdd7b827bb37c5bb8252c5d37049a91f1ce61e6ae8867563712926b85cad0311f3c2da4965bff6c4c179e16aa736a8590911ac14fd9d4ac3fa4178f7 -$13 -1626707542667 -*6 -$5 -hmset -$128 -c96f4ef6ea5e21f340bd362fbfbfd0fe194d37290dbdbb4bb65fa7ca34f1226da525151a466a22daa0f9b793e1640f883c25f8c0b4c684f844f7a7ca228ddf34 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -c96f4ef6ea5e21f340bd362fbfbfd0fe194d37290dbdbb4bb65fa7ca34f1226da525151a466a22daa0f9b793e1640f883c25f8c0b4c684f844f7a7ca228ddf34 -$13 -1626710340451 -*2 -$3 -DEL -$128 -ff8b5d7ccdd7b827bb37c5bb8252c5d37049a91f1ce61e6ae8867563712926b85cad0311f3c2da4965bff6c4c179e16aa736a8590911ac14fd9d4ac3fa4178f7 -*6 -$5 -hmset -$128 -2c6e50d61786d6b57942e93e3aa8ae08794ef1c2744eb23e176541bacd648066103ab9e90e39642a06b4dd684e052e4f7b66f154bf11d3134d65247e9ac2a4c5 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -2c6e50d61786d6b57942e93e3aa8ae08794ef1c2744eb23e176541bacd648066103ab9e90e39642a06b4dd684e052e4f7b66f154bf11d3134d65247e9ac2a4c5 -$13 -1626715185842 -*6 -$5 -hmset -$128 -13e92cc635489645818b81729a60fb7caeec616bfd9f0fc9a74e4072cc025160dd4b541f78d6ec3903c67736ff78f000c1972f6e2bef6b936715c77ee3c454e6 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -13e92cc635489645818b81729a60fb7caeec616bfd9f0fc9a74e4072cc025160dd4b541f78d6ec3903c67736ff78f000c1972f6e2bef6b936715c77ee3c454e6 -$13 -1626716307511 -*2 -$3 -DEL -$128 -c96f4ef6ea5e21f340bd362fbfbfd0fe194d37290dbdbb4bb65fa7ca34f1226da525151a466a22daa0f9b793e1640f883c25f8c0b4c684f844f7a7ca228ddf34 -*2 -$3 -DEL -$128 -13e92cc635489645818b81729a60fb7caeec616bfd9f0fc9a74e4072cc025160dd4b541f78d6ec3903c67736ff78f000c1972f6e2bef6b936715c77ee3c454e6 -*2 -$3 -DEL -$128 -2c6e50d61786d6b57942e93e3aa8ae08794ef1c2744eb23e176541bacd648066103ab9e90e39642a06b4dd684e052e4f7b66f154bf11d3134d65247e9ac2a4c5 -*2 -$6 -SELECT -$1 -0 -*6 -$5 -hmset -$128 -3210a823b647e6d2b67cf4e962faefa938977ba977c39f3697b27c1c9de212ee1a864f7b5b46aab8db7068ba98c801594ff9f694a1e583c7abaa4d8dc58434ec -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -3210a823b647e6d2b67cf4e962faefa938977ba977c39f3697b27c1c9de212ee1a864f7b5b46aab8db7068ba98c801594ff9f694a1e583c7abaa4d8dc58434ec -$13 -1627083987823 -*2 -$6 -SELECT -$1 -0 -*2 -$3 -DEL -$128 -3210a823b647e6d2b67cf4e962faefa938977ba977c39f3697b27c1c9de212ee1a864f7b5b46aab8db7068ba98c801594ff9f694a1e583c7abaa4d8dc58434ec -*6 -$5 -hmset -$128 -dd27abcdc2f19e5af8ca1b85a49e573c4f000ae461d81a21a8ea7e88c23a4a54f5cf4b7ca027cd9e080df328fb93f9a5f72bb07f6533a234af3a97e9698c5e9a -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -dd27abcdc2f19e5af8ca1b85a49e573c4f000ae461d81a21a8ea7e88c23a4a54f5cf4b7ca027cd9e080df328fb93f9a5f72bb07f6533a234af3a97e9698c5e9a -$13 -1627355403285 -*2 -$3 -DEL -$128 -dd27abcdc2f19e5af8ca1b85a49e573c4f000ae461d81a21a8ea7e88c23a4a54f5cf4b7ca027cd9e080df328fb93f9a5f72bb07f6533a234af3a97e9698c5e9a -*6 -$5 -hmset -$128 -409859ada10522cb4ae0df5d1c2ea25e3b7a4531649bd2a2535c56f0b404527dad0e91bbf438057b5fc502d9eef337b3e5b4839911c13be3c1809c7c9acb68b2 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -409859ada10522cb4ae0df5d1c2ea25e3b7a4531649bd2a2535c56f0b404527dad0e91bbf438057b5fc502d9eef337b3e5b4839911c13be3c1809c7c9acb68b2 -$13 -1627363570597 -*2 -$3 -DEL -$128 -409859ada10522cb4ae0df5d1c2ea25e3b7a4531649bd2a2535c56f0b404527dad0e91bbf438057b5fc502d9eef337b3e5b4839911c13be3c1809c7c9acb68b2 -*6 -$5 -hmset -$128 -c35ae486f4b62deb37167e87fc045c60ab955de1467a71a843f29b42f23db800a794143629431d77be549dcf7e5a2375e2b2f43ee3c9d1c6d2db35ccc53270bd -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -c35ae486f4b62deb37167e87fc045c60ab955de1467a71a843f29b42f23db800a794143629431d77be549dcf7e5a2375e2b2f43ee3c9d1c6d2db35ccc53270bd -$13 -1627374482395 -*2 -$6 -SELECT -$1 -0 -*6 -$5 -hmset -$128 -1f36e88e5f268f96651c48ec07535138443043c13b38612ecc636972d2bc79fb0db16e86781d1a85055d5e74711977afa7731f336a95f1c4399c54c236976010 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -1f36e88e5f268f96651c48ec07535138443043c13b38612ecc636972d2bc79fb0db16e86781d1a85055d5e74711977afa7731f336a95f1c4399c54c236976010 -$13 -1627375062930 -*6 -$5 -hmset -$128 -77cf412fd2e08c687e51d290467e84d1b0fc94708a528cce316526f2173285c17ec6db2f003d6a0c4ef493c17fd0a7e7854dc461fbf6ba7f278b1de00e6c0238 -$7 -user_id -$1 -2 -$9 -user_role -$6 -normal -*3 -$9 -PEXPIREAT -$128 -77cf412fd2e08c687e51d290467e84d1b0fc94708a528cce316526f2173285c17ec6db2f003d6a0c4ef493c17fd0a7e7854dc461fbf6ba7f278b1de00e6c0238 -$13 -1627375326612 -*6 -$5 -hmset -$128 -d14d502febff25f4f58dce19bc975ca149597ff9d65d562c777533d1668d1cf6fed31580b51a1ca4d45be266b497b461a430b844edaac3bc9723c9bb5cda1fa4 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -d14d502febff25f4f58dce19bc975ca149597ff9d65d562c777533d1668d1cf6fed31580b51a1ca4d45be266b497b461a430b844edaac3bc9723c9bb5cda1fa4 -$13 -1627376214570 -*6 -$5 -hmset -$128 -127680ffb09a54af0e1de8beea131f2e062a14d7622e2719c43a9e4a104fa6168a8f61e06663d059ef95b349e0cb3cd795d4ac7c8af7261d759e953dd9eacda6 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -127680ffb09a54af0e1de8beea131f2e062a14d7622e2719c43a9e4a104fa6168a8f61e06663d059ef95b349e0cb3cd795d4ac7c8af7261d759e953dd9eacda6 -$13 -1627377007585 -*6 -$5 -hmset -$128 -0413d7764ef55b7e45fbb0bc28fcfda6776b9532624685078b5b87b1a42431f981ebf509d0742c2c41b4e3df5fce9386b90bcefdbcde1758d3ed6f831c31c776 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -0413d7764ef55b7e45fbb0bc28fcfda6776b9532624685078b5b87b1a42431f981ebf509d0742c2c41b4e3df5fce9386b90bcefdbcde1758d3ed6f831c31c776 -$13 -1627379514943 -*6 -$5 -hmset -$128 -941f5f2b340d889c2c0ff4aebc0bad1d8293c98986619bb350c9a75b3ad5503cb3c23dafcc48838452588ae152fc49da12ffea4f3c94b8dbad0ea9dedbf81436 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -941f5f2b340d889c2c0ff4aebc0bad1d8293c98986619bb350c9a75b3ad5503cb3c23dafcc48838452588ae152fc49da12ffea4f3c94b8dbad0ea9dedbf81436 -$13 -1627380205725 -*2 -$3 -DEL -$128 -c35ae486f4b62deb37167e87fc045c60ab955de1467a71a843f29b42f23db800a794143629431d77be549dcf7e5a2375e2b2f43ee3c9d1c6d2db35ccc53270bd -*2 -$3 -DEL -$128 -1f36e88e5f268f96651c48ec07535138443043c13b38612ecc636972d2bc79fb0db16e86781d1a85055d5e74711977afa7731f336a95f1c4399c54c236976010 -*2 -$3 -DEL -$128 -77cf412fd2e08c687e51d290467e84d1b0fc94708a528cce316526f2173285c17ec6db2f003d6a0c4ef493c17fd0a7e7854dc461fbf6ba7f278b1de00e6c0238 -*2 -$6 -SELECT -$1 -0 -*2 -$3 -DEL -$128 -d14d502febff25f4f58dce19bc975ca149597ff9d65d562c777533d1668d1cf6fed31580b51a1ca4d45be266b497b461a430b844edaac3bc9723c9bb5cda1fa4 -*6 -$5 -hmset -$128 -7a0e1c421a771236d9053853a228256c639c3d21cadbbb97f379240c8c53e9bef0aa0e1475ec2699029d40af334b3443dc7c18ba349bcf1b30eba74b84bc1fd1 -$7 -user_id -$1 -2 -$9 -user_role -$6 -normal -*3 -$9 -PEXPIREAT -$128 -7a0e1c421a771236d9053853a228256c639c3d21cadbbb97f379240c8c53e9bef0aa0e1475ec2699029d40af334b3443dc7c18ba349bcf1b30eba74b84bc1fd1 -$13 -1627383790684 -*6 -$5 -hmset -$128 -988d6ad77896a555e336f0fc615b7f84e3562939d1fd61dd8dc42df81476dfc7058c357dec7a994a9f6477354026a996c012f015deea8338e4977da58e03b292 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -988d6ad77896a555e336f0fc615b7f84e3562939d1fd61dd8dc42df81476dfc7058c357dec7a994a9f6477354026a996c012f015deea8338e4977da58e03b292 -$13 -1627383843657 -*6 -$5 -hmset -$128 -51aaa8c3384061584513ce15e4e0f21d64348862bd79f0091bce1eab0cea15880e52fad48d346ee89f29449e7432abbd9d3a97ce30091397ab7f8ed85ff84ae1 -$7 -user_id -$1 -3 -$9 -user_role -$9 -developer -*3 -$9 -PEXPIREAT -$128 -51aaa8c3384061584513ce15e4e0f21d64348862bd79f0091bce1eab0cea15880e52fad48d346ee89f29449e7432abbd9d3a97ce30091397ab7f8ed85ff84ae1 -$13 -1627383902719 -*2 -$3 -DEL -$128 -127680ffb09a54af0e1de8beea131f2e062a14d7622e2719c43a9e4a104fa6168a8f61e06663d059ef95b349e0cb3cd795d4ac7c8af7261d759e953dd9eacda6 -*6 -$5 -hmset -$128 -afdfa528c7295b8789a98b679bee55c736180a0aaab0108c0375eb3d54e522edf2a3f42555c01daa5e3c6f858d4e9c9872ca77bfda1a3a508059a6450dd747e3 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -afdfa528c7295b8789a98b679bee55c736180a0aaab0108c0375eb3d54e522edf2a3f42555c01daa5e3c6f858d4e9c9872ca77bfda1a3a508059a6450dd747e3 -$13 -1627385300746 -*2 -$3 -DEL -$128 -0413d7764ef55b7e45fbb0bc28fcfda6776b9532624685078b5b87b1a42431f981ebf509d0742c2c41b4e3df5fce9386b90bcefdbcde1758d3ed6f831c31c776 -*2 -$3 -DEL -$128 -941f5f2b340d889c2c0ff4aebc0bad1d8293c98986619bb350c9a75b3ad5503cb3c23dafcc48838452588ae152fc49da12ffea4f3c94b8dbad0ea9dedbf81436 -*2 -$3 -DEL -$128 -7a0e1c421a771236d9053853a228256c639c3d21cadbbb97f379240c8c53e9bef0aa0e1475ec2699029d40af334b3443dc7c18ba349bcf1b30eba74b84bc1fd1 -*2 -$3 -DEL -$128 -988d6ad77896a555e336f0fc615b7f84e3562939d1fd61dd8dc42df81476dfc7058c357dec7a994a9f6477354026a996c012f015deea8338e4977da58e03b292 -*2 -$3 -DEL -$128 -51aaa8c3384061584513ce15e4e0f21d64348862bd79f0091bce1eab0cea15880e52fad48d346ee89f29449e7432abbd9d3a97ce30091397ab7f8ed85ff84ae1 -*2 -$3 -DEL -$128 -afdfa528c7295b8789a98b679bee55c736180a0aaab0108c0375eb3d54e522edf2a3f42555c01daa5e3c6f858d4e9c9872ca77bfda1a3a508059a6450dd747e3 -*2 -$6 -SELECT -$1 -0 -*6 -$5 -hmset -$128 -65781cc0e74876feb209868999d3d30ef3c717a455629b12ca681cc303a676d88317d7ff5abe0ed7c447ae335e5c1ef2b819f293709ade680e53bce08c0072e6 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -65781cc0e74876feb209868999d3d30ef3c717a455629b12ca681cc303a676d88317d7ff5abe0ed7c447ae335e5c1ef2b819f293709ade680e53bce08c0072e6 -$13 -1633831611908 -*6 -$5 -hmset -$128 -17a8b85972cb312569a7049f3ff3dc2b15198fe7bd4ef63973d88d161c5cd989c67dd1cfdf52d25b051a986a97a36139a2842e82c8371f60c2b64d85256d3216 -$7 -user_id -$1 -2 -$9 -user_role -$6 -normal -*3 -$9 -PEXPIREAT -$128 -17a8b85972cb312569a7049f3ff3dc2b15198fe7bd4ef63973d88d161c5cd989c67dd1cfdf52d25b051a986a97a36139a2842e82c8371f60c2b64d85256d3216 -$13 -1633835701657 -*6 -$5 -hmset -$128 -3becc50b8055815f6d13b3a4c077813ccb3e53c73fa8c885179ec8b910fbe878707ab5304fd7bafeca23f6fa6a5f6235afa257273b372c6c865f21081adab767 -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -3becc50b8055815f6d13b3a4c077813ccb3e53c73fa8c885179ec8b910fbe878707ab5304fd7bafeca23f6fa6a5f6235afa257273b372c6c865f21081adab767 -$13 -1633835724137 -*6 -$5 -hmset -$128 -5cdc383d526d75d4af252eae8c9b059dd209c2775a3efce1af18ff0e6d469939d0a7cc240229f2dd7ffb5184e911b4b68ed1b38c1285645c644769d191eda646 -$7 -user_id -$1 -2 -$9 -user_role -$6 -normal -*3 -$9 -PEXPIREAT -$128 -5cdc383d526d75d4af252eae8c9b059dd209c2775a3efce1af18ff0e6d469939d0a7cc240229f2dd7ffb5184e911b4b68ed1b38c1285645c644769d191eda646 -$13 -1633837583496 -*2 -$3 -DEL -$128 -65781cc0e74876feb209868999d3d30ef3c717a455629b12ca681cc303a676d88317d7ff5abe0ed7c447ae335e5c1ef2b819f293709ade680e53bce08c0072e6 -*6 -$5 -hmset -$128 -959bc7949e8f5559ed9f8d262d81d06771309790a601b11d5c2743df75b21e9e0a627ca567f853a846a054cf1d70e0d37292ee99ee19458d15476ad3a38547ed -$7 -user_id -$1 -1 -$9 -user_role -$5 -admin -*3 -$9 -PEXPIREAT -$128 -959bc7949e8f5559ed9f8d262d81d06771309790a601b11d5c2743df75b21e9e0a627ca567f853a846a054cf1d70e0d37292ee99ee19458d15476ad3a38547ed -$13 -1633839287223 -*6 -$5 -hmset -$128 -2a2dee66c20f8e416b1bfe4e0a2bd85577e1845ddb747a8de5fdac824d29b141577051a0ff57b915171aa4186e6611cd44087c1e7ff1ea34899beafec6565cb0 -$7 -user_id -$1 -4 -$9 -user_role -$6 -normal -*3 -$9 -PEXPIREAT -$128 -2a2dee66c20f8e416b1bfe4e0a2bd85577e1845ddb747a8de5fdac824d29b141577051a0ff57b915171aa4186e6611cd44087c1e7ff1ea34899beafec6565cb0 -$13 -1633839429706 -*2 -$6 -SELECT -$1 -0 -*6 -$5 -hmset -$128 -c168f7e5439f031ba7ca780fc628003d7a93d4f066cbb3e30c4c1071ef7881f89d2caef051ceb06239f52dd063843c69bdf3fa0e0dba3b4042dee97187f0d0be -$7 -user_id -$1 -4 -$9 -user_role -$9 -developer -*3 -$9 -PEXPIREAT -$128 -c168f7e5439f031ba7ca780fc628003d7a93d4f066cbb3e30c4c1071ef7881f89d2caef051ceb06239f52dd063843c69bdf3fa0e0dba3b4042dee97187f0d0be -$13 -1633840771244 -*6 -$5 -hmset -$128 -2bfa111e0d5d787ff23846649d71a84fc204396ea2cdec91a59ba21831ed83371c241f8edc564f8fb0ac8edcfdd823660722cad36457d437ae9ddc5fa45e9b1e -$7 -user_id -$1 -5 -$9 -user_role -$9 -developer -*3 -$9 -PEXPIREAT -$128 -2bfa111e0d5d787ff23846649d71a84fc204396ea2cdec91a59ba21831ed83371c241f8edc564f8fb0ac8edcfdd823660722cad36457d437ae9ddc5fa45e9b1e -$13 -1633842037142 -*2 -$3 -DEL -$128 -17a8b85972cb312569a7049f3ff3dc2b15198fe7bd4ef63973d88d161c5cd989c67dd1cfdf52d25b051a986a97a36139a2842e82c8371f60c2b64d85256d3216 -*2 -$3 -DEL -$128 -3becc50b8055815f6d13b3a4c077813ccb3e53c73fa8c885179ec8b910fbe878707ab5304fd7bafeca23f6fa6a5f6235afa257273b372c6c865f21081adab767 -*2 -$3 -DEL -$128 -5cdc383d526d75d4af252eae8c9b059dd209c2775a3efce1af18ff0e6d469939d0a7cc240229f2dd7ffb5184e911b4b68ed1b38c1285645c644769d191eda646 -*2 -$3 -DEL -$128 -959bc7949e8f5559ed9f8d262d81d06771309790a601b11d5c2743df75b21e9e0a627ca567f853a846a054cf1d70e0d37292ee99ee19458d15476ad3a38547ed -*2 -$3 -DEL -$128 -2a2dee66c20f8e416b1bfe4e0a2bd85577e1845ddb747a8de5fdac824d29b141577051a0ff57b915171aa4186e6611cd44087c1e7ff1ea34899beafec6565cb0 -*2 -$3 -DEL -$128 -c168f7e5439f031ba7ca780fc628003d7a93d4f066cbb3e30c4c1071ef7881f89d2caef051ceb06239f52dd063843c69bdf3fa0e0dba3b4042dee97187f0d0be -*2 -$3 -DEL -$128 -2bfa111e0d5d787ff23846649d71a84fc204396ea2cdec91a59ba21831ed83371c241f8edc564f8fb0ac8edcfdd823660722cad36457d437ae9ddc5fa45e9b1e