opentox-server 0.0.1pre → 0.0.2pre
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/authorization-helper.rb +131 -0
- data/lib/file-store.rb +37 -0
- data/lib/opentox-server.rb +3 -0
- data/lib/opentox.rb +23 -20
- data/opentox-server.gemspec +1 -1
- metadata +20 -18
@@ -0,0 +1,131 @@
|
|
1
|
+
module OpenTox
|
2
|
+
# Base class for OpenTox services
|
3
|
+
class Application < Service
|
4
|
+
|
5
|
+
helpers do
|
6
|
+
|
7
|
+
# Login to get session for browser application(e.G.: ToxCreate)
|
8
|
+
#
|
9
|
+
# @param [String, String] username,password
|
10
|
+
# @return [String] subjectid from session or nil
|
11
|
+
def login(username, password)
|
12
|
+
logout
|
13
|
+
session[:subjectid] = OpenTox::Authorization.authenticate(username, password)
|
14
|
+
$logger.debug "ToxCreate login user #{username} with subjectid: " + session[:subjectid].to_s
|
15
|
+
if session[:subjectid] != nil
|
16
|
+
session[:username] = username
|
17
|
+
return session[:subjectid]
|
18
|
+
else
|
19
|
+
session[:username] = ""
|
20
|
+
return nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Logout to reset session
|
25
|
+
#
|
26
|
+
# @return [Boolean] true/false
|
27
|
+
def logout
|
28
|
+
if session[:subjectid] != nil
|
29
|
+
session[:subjectid] = nil
|
30
|
+
session[:username] = ""
|
31
|
+
return true
|
32
|
+
end
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
|
36
|
+
# Checks session and valid subjectid token.
|
37
|
+
# @return [Boolean] true/false
|
38
|
+
def logged_in()
|
39
|
+
return true if !$aa[:uri]
|
40
|
+
if session[:subjectid] != nil
|
41
|
+
return OpenTox::Authorization.is_token_valid(session[:subjectid])
|
42
|
+
end
|
43
|
+
return false
|
44
|
+
end
|
45
|
+
|
46
|
+
# Authorization for a browser/webservice request
|
47
|
+
# webapplication: redirects with flash[:notice] if unauthorized
|
48
|
+
# webservice: raises error if unauthorized
|
49
|
+
# @param [String]subjectid
|
50
|
+
def protected!(subjectid)
|
51
|
+
if env["session"]
|
52
|
+
unless authorized?(subjectid)
|
53
|
+
flash[:notice] = "You don't have access to this section: "
|
54
|
+
redirect back
|
55
|
+
end
|
56
|
+
elsif !env["session"] && subjectid
|
57
|
+
unless authorized?(subjectid)
|
58
|
+
$logger.debug "URI not authorized: clean: " + clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}").sub("http://","https://").to_s + " full: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']} with request: #{request.env['REQUEST_METHOD']}"
|
59
|
+
raise OpenTox::NotAuthorizedError.new "Not authorized"
|
60
|
+
end
|
61
|
+
else
|
62
|
+
raise OpenTox::NotAuthorizedError.new "Not authorized" unless authorized?(subjectid)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Check Authorization for URI with method and subjectid.
|
67
|
+
# @param [String]subjectid
|
68
|
+
def authorized?(subjectid)
|
69
|
+
request_method = request.env['REQUEST_METHOD']
|
70
|
+
uri = clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}").sub("http://","https://")
|
71
|
+
request_method = "GET" if request_method == "POST" && uri =~ /\/model\/\d+\/?$/
|
72
|
+
return OpenTox::Authorization.authorized?(uri, request_method, subjectid)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Cleans URI from querystring and file-extension. Sets port 80 to emptystring
|
76
|
+
# @param [String] uri
|
77
|
+
def clean_uri(uri)
|
78
|
+
uri = uri.sub(" ", "%20") #dirty hacks => to fix
|
79
|
+
uri = uri[0,uri.index("InChI=")] if uri.index("InChI=")
|
80
|
+
out = URI.parse(uri)
|
81
|
+
out.path = out.path[0, out.path.length - (out.path.reverse.rindex(/\/{1}\d+\/{1}/))] if out.path.index(/\/{1}\d+\/{1}/) #cuts after /id/ for a&a
|
82
|
+
out.path = out.path.split('.').first #cut extension
|
83
|
+
port = (out.scheme=="http" && out.port==80)||(out.scheme=="https" && out.port==443) ? "" : ":#{out.port.to_s}"
|
84
|
+
"#{out.scheme}://#{out.host}#{port}#{out.path.chomp("/")}" #"
|
85
|
+
end
|
86
|
+
|
87
|
+
# Unprotected uri for login
|
88
|
+
def login_request?
|
89
|
+
return env['REQUEST_URI'] =~ /\/login$/
|
90
|
+
end
|
91
|
+
|
92
|
+
# Check if URI returns code 200 //used in model/lazar.rb
|
93
|
+
# @param [String]URLString
|
94
|
+
# @return [Boolean] true/false
|
95
|
+
def uri_available?(urlStr)
|
96
|
+
url = URI.parse(urlStr)
|
97
|
+
subjectidstr = @subjectid ? "?subjectid=#{CGI.escape @subjectid}" : ""
|
98
|
+
http = Net::HTTP.new(url.host, url.port)
|
99
|
+
if url.is_a?(URI::HTTPS)
|
100
|
+
http.use_ssl = true
|
101
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
102
|
+
end
|
103
|
+
return http.head("#{url.request_uri}#{subjectidstr}").code == "200"
|
104
|
+
end
|
105
|
+
|
106
|
+
# Get subjectid out of session, params or rack-environment and unescape it if necessary
|
107
|
+
# @return [String] subjectid
|
108
|
+
def get_subjectid
|
109
|
+
begin
|
110
|
+
subjectid = nil
|
111
|
+
subjectid = session[:subjectid] if session[:subjectid]
|
112
|
+
subjectid = params[:subjectid] if params[:subjectid] and !subjectid
|
113
|
+
subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !subjectid
|
114
|
+
# see http://rack.rubyforge.org/doc/SPEC.html
|
115
|
+
subjectid = CGI.unescape(subjectid) if subjectid.include?("%23")
|
116
|
+
@subjectid = subjectid
|
117
|
+
rescue
|
118
|
+
@subjectid = nil
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
before do
|
125
|
+
get_subjectid()
|
126
|
+
unless !$aa[:uri] or login_request? or $aa[:free_request].include?(env['REQUEST_METHOD'].to_sym)
|
127
|
+
protected!(@subjectid)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
data/lib/file-store.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
FileUtils.mkdir_p File.join(File.dirname(__FILE__),"private")
|
2
|
+
|
3
|
+
module OpenTox
|
4
|
+
|
5
|
+
# Base class for OpenTox services
|
6
|
+
class FileStore < Service
|
7
|
+
|
8
|
+
helpers do
|
9
|
+
def next_id
|
10
|
+
id = Dir["./private/*.nt"].collect{|f| File.basename(f,"nt").to_i}.sort.last
|
11
|
+
id = 0 if id.nil?
|
12
|
+
id + 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def file id
|
16
|
+
File.join File.dirname(File.expand_path __FILE__), "private", "#{id.to_s}.nt"
|
17
|
+
end
|
18
|
+
|
19
|
+
def uri_list
|
20
|
+
Dir["./private/*.nt"].collect{|f| url_for File.basename(f,".nt")}.join("\n")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
get '/?' do
|
25
|
+
uri_list
|
26
|
+
end
|
27
|
+
|
28
|
+
post '/?' do
|
29
|
+
File.open(file(next_id),"w+"){|f| f.puts request.env["rack.input"].read}
|
30
|
+
end
|
31
|
+
|
32
|
+
get '/:id/?' do
|
33
|
+
send_file file(params[:id])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/opentox-server.rb
CHANGED
@@ -3,5 +3,8 @@ require 'rack'
|
|
3
3
|
require 'rack/contrib'
|
4
4
|
require 'sinatra'
|
5
5
|
require 'sinatra/url_for'
|
6
|
+
require 'roo'
|
6
7
|
require File.join(File.dirname(__FILE__),"environment.rb")
|
7
8
|
require File.join(File.dirname(__FILE__),"opentox.rb")
|
9
|
+
require File.join(File.dirname(__FILE__),"file-store.rb")
|
10
|
+
require File.join(File.dirname(__FILE__),"authorization-helper.rb")
|
data/lib/opentox.rb
CHANGED
@@ -2,9 +2,8 @@ require 'sinatra/base'
|
|
2
2
|
require "sinatra/reloader"
|
3
3
|
|
4
4
|
module OpenTox
|
5
|
+
|
5
6
|
# Base class for OpenTox services
|
6
|
-
# Errors are formated according to acccept-header
|
7
|
-
# Non OpenTox::Errors (defined in error.rb) are handled as internal error (500), stacktrace is logged
|
8
7
|
class Service < Sinatra::Base
|
9
8
|
|
10
9
|
helpers Sinatra::UrlForHelper
|
@@ -17,39 +16,43 @@ module OpenTox
|
|
17
16
|
register Sinatra::Reloader
|
18
17
|
end
|
19
18
|
|
19
|
+
helpers do
|
20
|
+
def uri
|
21
|
+
params[:id] ? url_for("/#{params[:id]}", :full) : "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
before do
|
26
|
+
@accept = request.env['HTTP_ACCEPT']
|
27
|
+
response['Content-Type'] = @accept
|
28
|
+
# TODO: A+A
|
29
|
+
end
|
30
|
+
|
20
31
|
error do
|
21
|
-
# TODO:
|
32
|
+
# TODO: convert to OpenTox::Error and set URI
|
22
33
|
error = request.env['sinatra.error']
|
23
|
-
#error.
|
24
|
-
case request.env['HTTP_ACCEPT']
|
25
|
-
when 'application/rdf+xml'
|
26
|
-
content_type 'application/rdf+xml'
|
27
|
-
when /html/
|
28
|
-
content_type 'text/html'
|
29
|
-
when "text/n3"
|
30
|
-
content_type "text/n3"
|
31
|
-
else
|
32
|
-
content_type "text/turtle"
|
33
|
-
end
|
34
|
+
#error.uri = uri
|
34
35
|
if error.respond_to? :report
|
35
|
-
|
36
|
+
# Errors are formated according to acccept-header
|
37
|
+
case @accept
|
36
38
|
when 'application/rdf+xml'
|
37
39
|
body = error.report.to_rdfxml
|
38
40
|
when /html/
|
39
|
-
|
41
|
+
# TODO
|
42
|
+
# body = error.report.to_html
|
43
|
+
body = error.report.to_turtle
|
40
44
|
when "text/n3"
|
41
45
|
body = error.report.to_ntriples
|
42
46
|
else
|
43
47
|
body = error.report.to_turtle
|
44
48
|
end
|
45
49
|
else
|
46
|
-
|
50
|
+
response['Content-Type'] = "text/plain"
|
47
51
|
body = error.message
|
48
52
|
body += "\n#{error.backtrace}"
|
49
53
|
end
|
50
|
-
code = error.http_code
|
51
|
-
code
|
52
|
-
halt code, error.report.to_turtle
|
54
|
+
error.respond_to?(:http_code) ? code = error.http_code : code = 500
|
55
|
+
halt code, body
|
53
56
|
end
|
54
57
|
end
|
55
58
|
end
|
data/opentox-server.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "opentox-server"
|
6
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.2pre"
|
7
7
|
s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"]
|
8
8
|
s.email = ["helma@in-silico.ch"]
|
9
9
|
s.homepage = "http://github.com/opentox/opentox-server"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opentox-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2pre
|
5
5
|
prerelease: 5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: opentox-client
|
16
|
-
requirement: &
|
16
|
+
requirement: &84856440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *84856440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rack
|
27
|
-
requirement: &
|
27
|
+
requirement: &84855790 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *84855790
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rack-contrib
|
38
|
-
requirement: &
|
38
|
+
requirement: &84855290 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *84855290
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: sinatra
|
49
|
-
requirement: &
|
49
|
+
requirement: &84854680 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *84854680
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: sinatra-contrib
|
60
|
-
requirement: &
|
60
|
+
requirement: &84853820 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *84853820
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: emk-sinatra-url-for
|
71
|
-
requirement: &
|
71
|
+
requirement: &84852960 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *84852960
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: roo
|
82
|
-
requirement: &
|
82
|
+
requirement: &84851990 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *84851990
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: unicorn
|
93
|
-
requirement: &
|
93
|
+
requirement: &84851710 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :runtime
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *84851710
|
102
102
|
description: Ruby library for opentox services
|
103
103
|
email:
|
104
104
|
- helma@in-silico.ch
|
@@ -111,7 +111,9 @@ files:
|
|
111
111
|
- LICENSE
|
112
112
|
- README
|
113
113
|
- Rakefile
|
114
|
+
- lib/authorization-helper.rb
|
114
115
|
- lib/environment.rb
|
116
|
+
- lib/file-store.rb
|
115
117
|
- lib/opentox-server.rb
|
116
118
|
- lib/opentox.rb
|
117
119
|
- opentox-server.gemspec
|