piwigo: Remove possibly_add_cookie.
[mediagoblin.git] / mediagoblin / plugins / oauth / models.py
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
3 #
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.
8 #
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.
13 #
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/>.
16
17
18 from datetime import datetime, timedelta
19
20
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
28
29 # Don't remove this, I *think* it applies sqlalchemy-migrate functionality onto
30 # the models.
31 from migrate import changeset
32
33
34 class OAuthClient(Base):
35 __tablename__ = 'oauth__client'
36
37 id = Column(Integer, primary_key=True)
38 created = Column(DateTime, nullable=False,
39 default=datetime.now)
40
41 name = Column(Unicode)
42 description = Column(Unicode)
43
44 identifier = Column(Unicode, unique=True, index=True,
45 default=generate_identifier)
46 secret = Column(Unicode, index=True, default=generate_secret)
47
48 owner_id = Column(Integer, ForeignKey(User.id))
49 owner = relationship(
50 User,
51 backref=backref('registered_clients', cascade='all, delete-orphan'))
52
53 redirect_uri = Column(Unicode)
54
55 type = Column(Enum(
56 u'confidential',
57 u'public',
58 name=u'oauth__client_type'))
59
60 def update_secret(self):
61 self.secret = generate_secret()
62
63 def __repr__(self):
64 return '<{0} {1}:{2} ({3})>'.format(
65 self.__class__.__name__,
66 self.id,
67 self.name.encode('ascii', 'replace'),
68 self.owner.username.encode('ascii', 'replace'))
69
70
71 class OAuthUserClient(Base):
72 __tablename__ = 'oauth__user_client'
73 id = Column(Integer, primary_key=True)
74
75 user_id = Column(Integer, ForeignKey(User.id))
76 user = relationship(
77 User,
78 backref=backref('oauth_client_relations',
79 cascade='all, delete-orphan'))
80
81 client_id = Column(Integer, ForeignKey(OAuthClient.id))
82 client = relationship(
83 OAuthClient,
84 backref=backref('oauth_user_relations', cascade='all, delete-orphan'))
85
86 state = Column(Enum(
87 u'approved',
88 u'rejected',
89 name=u'oauth__relation_state'))
90
91 def __repr__(self):
92 return '<{0} #{1} {2} [{3}, {4}]>'.format(
93 self.__class__.__name__,
94 self.id,
95 self.state.encode('ascii', 'replace'),
96 self.user,
97 self.client)
98
99
100 class OAuthToken(Base):
101 __tablename__ = 'oauth__tokens'
102
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)
109
110 user_id = Column(Integer, ForeignKey(User.id), nullable=False,
111 index=True)
112 user = relationship(
113 User,
114 backref=backref('oauth_tokens', cascade='all, delete-orphan'))
115
116 client_id = Column(Integer, ForeignKey(OAuthClient.id), nullable=False)
117 client = relationship(
118 OAuthClient,
119 backref=backref('oauth_tokens', cascade='all, delete-orphan'))
120
121 def __repr__(self):
122 return '<{0} #{1} expires {2} [{3}, {4}]>'.format(
123 self.__class__.__name__,
124 self.id,
125 self.expires.isoformat(),
126 self.user,
127 self.client)
128
129 class OAuthRefreshToken(Base):
130 __tablename__ = 'oauth__refresh_tokens'
131
132 id = Column(Integer, primary_key=True)
133 created = Column(DateTime, nullable=False,
134 default=datetime.now)
135
136 token = Column(Unicode, index=True,
137 default=generate_refresh_token)
138
139 user_id = Column(Integer, ForeignKey(User.id), nullable=False)
140
141 user = relationship(User, backref=backref('oauth_refresh_tokens',
142 cascade='all, delete-orphan'))
143
144 client_id = Column(Integer, ForeignKey(OAuthClient.id), nullable=False)
145 client = relationship(OAuthClient,
146 backref=backref(
147 'oauth_refresh_tokens',
148 cascade='all, delete-orphan'))
149
150 def __repr__(self):
151 return '<{0} #{1} [{3}, {4}]>'.format(
152 self.__class__.__name__,
153 self.id,
154 self.user,
155 self.client)
156
157
158 class OAuthCode(Base):
159 __tablename__ = 'oauth__codes'
160
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)
167
168 user_id = Column(Integer, ForeignKey(User.id), nullable=False,
169 index=True)
170 user = relationship(User, backref=backref('oauth_codes',
171 cascade='all, delete-orphan'))
172
173 client_id = Column(Integer, ForeignKey(OAuthClient.id), nullable=False)
174 client = relationship(OAuthClient, backref=backref(
175 'oauth_codes',
176 cascade='all, delete-orphan'))
177
178 def __repr__(self):
179 return '<{0} #{1} expires {2} [{3}, {4}]>'.format(
180 self.__class__.__name__,
181 self.id,
182 self.expires.isoformat(),
183 self.user,
184 self.client)
185
186
187 MODELS = [
188 OAuthToken,
189 OAuthRefreshToken,
190 OAuthCode,
191 OAuthClient,
192 OAuthUserClient]