Compare commits
	
		
			2 Commits
		
	
	
		
			master
			...
			feature/gi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a5da2fbd40 | |||
| df1a3e6512 | 
							
								
								
									
										11
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								.drone.yml
									
									
									
									
									
								
							@ -2,15 +2,8 @@ kind: pipeline
 | 
				
			|||||||
name: default
 | 
					name: default
 | 
				
			||||||
 | 
					
 | 
				
			||||||
steps:
 | 
					steps:
 | 
				
			||||||
- name: specs
 | 
					- name: test
 | 
				
			||||||
  image: ruby
 | 
					  image: ruby
 | 
				
			||||||
  environment:
 | 
					 | 
				
			||||||
    REDIS_HOST: redis
 | 
					 | 
				
			||||||
  commands:
 | 
					  commands:
 | 
				
			||||||
  - cp config.yml.erb.example config.yml.erb
 | 
					 | 
				
			||||||
  - bundle install --jobs=3 --retry=3
 | 
					  - bundle install --jobs=3 --retry=3
 | 
				
			||||||
  - bundle exec rake test
 | 
					  - rake test
 | 
				
			||||||
 | 
					 | 
				
			||||||
services:
 | 
					 | 
				
			||||||
  - name: redis
 | 
					 | 
				
			||||||
    image: redis
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										33
									
								
								.gitea/workflows/ruby.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								.gitea/workflows/ruby.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					name: Tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    branches: [ master ]
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    branches: [ master ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  test:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        ruby-version: ['2.7', '3.0', '3.1']
 | 
				
			||||||
 | 
					        redis-version: [6, 7]
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					    - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					    - name: Set up Ruby
 | 
				
			||||||
 | 
					      uses: ruby/setup-ruby@v1
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        ruby-version: ${{ matrix.ruby-version }}
 | 
				
			||||||
 | 
					        bundler-cache: true # runs 'bundle install' and caches installed gems automatically
 | 
				
			||||||
 | 
					    - name: Start Redis
 | 
				
			||||||
 | 
					      uses: supercharge/redis-github-action@1.4.0
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        redis-version: ${{ matrix.redis-version }}
 | 
				
			||||||
 | 
					    - name: Configure
 | 
				
			||||||
 | 
					      run: cp config.yml.erb.example config.yml.erb
 | 
				
			||||||
 | 
					    - name: Run tests
 | 
				
			||||||
 | 
					      run: bundle exec rake test
 | 
				
			||||||
							
								
								
									
										33
									
								
								.github/workflows/ruby.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								.github/workflows/ruby.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					name: Tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    branches: [ master ]
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    branches: [ master ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  test:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        ruby-version: ['2.7', '3.0', '3.1']
 | 
				
			||||||
 | 
					        redis-version: [6, 7]
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					    - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					    - name: Set up Ruby
 | 
				
			||||||
 | 
					      uses: ruby/setup-ruby@v1
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        ruby-version: ${{ matrix.ruby-version }}
 | 
				
			||||||
 | 
					        bundler-cache: true # runs 'bundle install' and caches installed gems automatically
 | 
				
			||||||
 | 
					    - name: Start Redis
 | 
				
			||||||
 | 
					      uses: supercharge/redis-github-action@1.4.0
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        redis-version: ${{ matrix.redis-version }}
 | 
				
			||||||
 | 
					    - name: Configure
 | 
				
			||||||
 | 
					      run: cp config.yml.erb.example config.yml.erb
 | 
				
			||||||
 | 
					    - name: Run tests
 | 
				
			||||||
 | 
					      run: bundle exec rake test
 | 
				
			||||||
							
								
								
									
										4
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Gemfile
									
									
									
									
									
								
							@ -6,8 +6,9 @@ gem "activesupport", "~> 6.1.0"
 | 
				
			|||||||
gem "redis", "~> 4.6.0"
 | 
					gem "redis", "~> 4.6.0"
 | 
				
			||||||
gem "rest-client", "~> 2.1.0"
 | 
					gem "rest-client", "~> 2.1.0"
 | 
				
			||||||
gem "aws-sigv4", "~> 1.0.0"
 | 
					gem "aws-sigv4", "~> 1.0.0"
 | 
				
			||||||
 | 
					# Remove require when we can update to 3.0, which sets the new storage
 | 
				
			||||||
 | 
					# format to columnar by default. Increases performance
 | 
				
			||||||
gem "mime-types"
 | 
					gem "mime-types"
 | 
				
			||||||
gem "rainbows"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
group :test do
 | 
					group :test do
 | 
				
			||||||
  gem 'rake'
 | 
					  gem 'rake'
 | 
				
			||||||
@ -19,5 +20,6 @@ group :test do
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
group :staging, :production do
 | 
					group :staging, :production do
 | 
				
			||||||
 | 
					  gem "rainbows"
 | 
				
			||||||
  gem "sentry-raven", require: false
 | 
					  gem "sentry-raven", require: false
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										40
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								README.md
									
									
									
									
									
								
							@ -1,55 +1,21 @@
 | 
				
			|||||||
[](https://drone.kosmos.org/5apps/liquor-cabinet)
 | 
					[](https://github.com/5apps/liquor-cabinet/actions/workflows/ruby.yml)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Liquor Cabinet
 | 
					# Liquor Cabinet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Liquor Cabinet is where Frank stores all his stuff. It's a
 | 
					Liquor Cabinet is where Frank stores all his stuff. It's a
 | 
				
			||||||
[remoteStorage](https://remotestorage.io) HTTP API, based on Sinatra. The
 | 
					[remoteStorage](https://remotestorage.io) HTTP API, based on Sinatra. The
 | 
				
			||||||
metadata and OAuth tokens are stored in Redis, and
 | 
					metadata and OAuth tokens are stored in Redis, and documents can be stored in
 | 
				
			||||||
documents/files can be stored in anything that supports
 | 
					anything that supports the storage API of either Openstack Swift or Amazon S3.
 | 
				
			||||||
the S3 object storage API.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Liquor Cabinet only implements the storage API part of the remoteStorage
 | 
					Liquor Cabinet only implements the storage API part of the remoteStorage
 | 
				
			||||||
protocol, but does not include the Webfinger and OAuth parts. It is meant to be
 | 
					protocol, but does not include the Webfinger and OAuth parts. It is meant to be
 | 
				
			||||||
added to existing systems and user accounts, so you will have to add your own
 | 
					added to existing systems and user accounts, so you will have to add your own
 | 
				
			||||||
OAuth dialog for remoteStorage authorizations and persist the tokens in Redis.
 | 
					OAuth dialog for remoteStorage authorizations and persist the tokens in Redis.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There is an [open-source accounts management
 | 
					 | 
				
			||||||
app](https://gitea.kosmos.org/kosmos/akkounts/) by the Kosmos project, which
 | 
					 | 
				
			||||||
comes with a built-in remoteStorage dashboard and is compatible with Liquor
 | 
					 | 
				
			||||||
Cabinet.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
If you have any questions about this program, please [post to the RS
 | 
					If you have any questions about this program, please [post to the RS
 | 
				
			||||||
forums](https://community.remotestorage.io/c/server-development), and we'll
 | 
					forums](https://community.remotestorage.io/c/server-development), and we'll
 | 
				
			||||||
gladly answer them.
 | 
					gladly answer them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## System requirements
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* [Ruby](https://www.ruby-lang.org/en/) and [Bundler](https://bundler.io/)
 | 
					 | 
				
			||||||
* [Redis](https://redis.io/)
 | 
					 | 
				
			||||||
* S3-compatible object storage (e.g. [Garage](https://garagehq.deuxfleurs.fr/)
 | 
					 | 
				
			||||||
  or [MinIO](https://min.io/) for self-hosting)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Setup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1. Check the `config.yml.erb.example` file. Either copy it to `config.yml.erb`
 | 
					 | 
				
			||||||
   and use the enviroment variables it contains, or create/deploy your own
 | 
					 | 
				
			||||||
   config YAML file with custom values.
 | 
					 | 
				
			||||||
2. Install dependencies: `bundle install`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Development
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Running the test suite:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bundle exec rake test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Running the app:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bundle exec rainbows
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Deployment
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_TODO document options_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Contributing
 | 
					## Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
We love pull requests. If you want to submit a patch:
 | 
					We love pull requests. If you want to submit a patch:
 | 
				
			||||||
 | 
				
			|||||||
@ -431,9 +431,9 @@ module RemoteStorage
 | 
				
			|||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def escape(str)
 | 
					    def escape(url)
 | 
				
			||||||
      # We want spaces to turn into %20 and slashes to stay slashes
 | 
					      # We want spaces to turn into %20 and slashes to stay slashes
 | 
				
			||||||
      CGI::escape(str).gsub('+', '%20').gsub('%2F', '/')
 | 
					      CGI::escape(url).gsub('+', '%20').gsub('%2F', '/')
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def redis
 | 
					    def redis
 | 
				
			||||||
 | 
				
			|||||||
@ -15,8 +15,7 @@ module RemoteStorage
 | 
				
			|||||||
        service: 's3',
 | 
					        service: 's3',
 | 
				
			||||||
        region: settings.s3["region"],
 | 
					        region: settings.s3["region"],
 | 
				
			||||||
        access_key_id: settings.s3["access_key_id"].to_s,
 | 
					        access_key_id: settings.s3["access_key_id"].to_s,
 | 
				
			||||||
        secret_access_key: settings.s3["secret_key_id"].to_s,
 | 
					        secret_access_key: settings.s3["secret_key_id"].to_s
 | 
				
			||||||
        uri_escape_path: false
 | 
					 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -30,8 +29,6 @@ module RemoteStorage
 | 
				
			|||||||
        headers = { "Content-Type" => content_type }
 | 
					        headers = { "Content-Type" => content_type }
 | 
				
			||||||
        auth_headers = auth_headers_for("PUT", url, headers, data)
 | 
					        auth_headers = auth_headers_for("PUT", url, headers, data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # TODO check if put was successful, e.g. it's returning a 413 directly
 | 
					 | 
				
			||||||
        # if the back-end does, too (missing CORS headers in that case)
 | 
					 | 
				
			||||||
        res = RestClient.put(url, data, headers.merge(auth_headers))
 | 
					        res = RestClient.put(url, data, headers.merge(auth_headers))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return [
 | 
					        return [
 | 
				
			||||||
@ -85,6 +82,10 @@ module RemoteStorage
 | 
				
			|||||||
      signature.headers
 | 
					      signature.headers
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def uri_escape(s)
 | 
				
			||||||
 | 
					      CGI.escape(s).gsub('%5B', '[').gsub('%5D', ']')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def base_url
 | 
					    def base_url
 | 
				
			||||||
      @base_url ||= settings.s3["endpoint"]
 | 
					      @base_url ||= settings.s3["endpoint"]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								run-dev.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								run-dev.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RACK_ENV=development \
 | 
				
			||||||
 | 
					REDIS_HOST=localhost \
 | 
				
			||||||
 | 
					REDIS_PORT=6379 \
 | 
				
			||||||
 | 
					REDIS_DB=1 \
 | 
				
			||||||
 | 
					S3_ENDPOINT='http://localhost:9000' \
 | 
				
			||||||
 | 
					S3_ACCESS_KEY='dev-key' \
 | 
				
			||||||
 | 
					S3_SECRET_KEY='123456789' \
 | 
				
			||||||
 | 
					S3_BUCKET=remotestorage \
 | 
				
			||||||
 | 
					bundle exec rackup -p 4567
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user