1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 from datetime
import datetime
, timedelta
21 from sqlalchemy
import (
22 Column
, Unicode
, Integer
, DateTime
, ForeignKey
, Enum
)
23 from sqlalchemy
.orm
import relationship
, backref
24 from mediagoblin
.db
.base
import Base
25 from mediagoblin
.db
.models
import User
26 from mediagoblin
.plugins
.oauth
.tools
import generate_identifier
, \
27 generate_secret
, generate_token
, generate_code
, generate_refresh_token
29 # Don't remove this, I *think* it applies sqlalchemy-migrate functionality onto
31 from migrate
import changeset
34 class OAuthClient(Base
):
35 __tablename__
= 'oauth__client'
37 id = Column(Integer
, primary_key
=True)
38 created
= Column(DateTime
, nullable
=False,
41 name
= Column(Unicode
)
42 description
= Column(Unicode
)
44 identifier
= Column(Unicode
, unique
=True, index
=True,
45 default
=generate_identifier
)
46 secret
= Column(Unicode
, index
=True, default
=generate_secret
)
48 owner_id
= Column(Integer
, ForeignKey(User
.id))
51 backref
=backref('registered_clients', cascade
='all, delete-orphan'))
53 redirect_uri
= Column(Unicode
)
58 name
=u
'oauth__client_type'))
60 def update_secret(self
):
61 self
.secret
= generate_secret()
64 return '<{0} {1}:{2} ({3})>'.format(
65 self
.__class
__.__name
__,
67 self
.name
.encode('ascii', 'replace'),
68 self
.owner
.username
.encode('ascii', 'replace'))
71 class OAuthUserClient(Base
):
72 __tablename__
= 'oauth__user_client'
73 id = Column(Integer
, primary_key
=True)
75 user_id
= Column(Integer
, ForeignKey(User
.id))
78 backref
=backref('oauth_client_relations',
79 cascade
='all, delete-orphan'))
81 client_id
= Column(Integer
, ForeignKey(OAuthClient
.id))
82 client
= relationship(
84 backref
=backref('oauth_user_relations', cascade
='all, delete-orphan'))
89 name
=u
'oauth__relation_state'))
92 return '<{0} #{1} {2} [{3}, {4}]>'.format(
93 self
.__class
__.__name
__,
95 self
.state
.encode('ascii', 'replace'),
100 class OAuthToken(Base
):
101 __tablename__
= 'oauth__tokens'
103 id = Column(Integer
, primary_key
=True)
104 created
= Column(DateTime
, nullable
=False,
105 default
=datetime
.now
)
106 expires
= Column(DateTime
, nullable
=False,
107 default
=lambda: datetime
.now() + timedelta(days
=30))
108 token
= Column(Unicode
, index
=True, default
=generate_token
)
110 user_id
= Column(Integer
, ForeignKey(User
.id), nullable
=False,
114 backref
=backref('oauth_tokens', cascade
='all, delete-orphan'))
116 client_id
= Column(Integer
, ForeignKey(OAuthClient
.id), nullable
=False)
117 client
= relationship(
119 backref
=backref('oauth_tokens', cascade
='all, delete-orphan'))
122 return '<{0} #{1} expires {2} [{3}, {4}]>'.format(
123 self
.__class
__.__name
__,
125 self
.expires
.isoformat(),
129 class OAuthRefreshToken(Base
):
130 __tablename__
= 'oauth__refresh_tokens'
132 id = Column(Integer
, primary_key
=True)
133 created
= Column(DateTime
, nullable
=False,
134 default
=datetime
.now
)
136 token
= Column(Unicode
, index
=True,
137 default
=generate_refresh_token
)
139 user_id
= Column(Integer
, ForeignKey(User
.id), nullable
=False)
141 user
= relationship(User
, backref
=backref('oauth_refresh_tokens',
142 cascade
='all, delete-orphan'))
144 client_id
= Column(Integer
, ForeignKey(OAuthClient
.id), nullable
=False)
145 client
= relationship(OAuthClient
,
147 'oauth_refresh_tokens',
148 cascade
='all, delete-orphan'))
151 return '<{0} #{1} [{3}, {4}]>'.format(
152 self
.__class
__.__name
__,
158 class OAuthCode(Base
):
159 __tablename__
= 'oauth__codes'
161 id = Column(Integer
, primary_key
=True)
162 created
= Column(DateTime
, nullable
=False,
163 default
=datetime
.now
)
164 expires
= Column(DateTime
, nullable
=False,
165 default
=lambda: datetime
.now() + timedelta(minutes
=5))
166 code
= Column(Unicode
, index
=True, default
=generate_code
)
168 user_id
= Column(Integer
, ForeignKey(User
.id), nullable
=False,
170 user
= relationship(User
, backref
=backref('oauth_codes',
171 cascade
='all, delete-orphan'))
173 client_id
= Column(Integer
, ForeignKey(OAuthClient
.id), nullable
=False)
174 client
= relationship(OAuthClient
, backref
=backref(
176 cascade
='all, delete-orphan'))
179 return '<{0} #{1} expires {2} [{3}, {4}]>'.format(
180 self
.__class
__.__name
__,
182 self
.expires
.isoformat(),