##// END OF EJS Templates
docs: don't use deprecated header for channelstream views
marcink -
r2164:c5a68adf default
parent child Browse files
Show More
@@ -1,176 +1,167 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
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/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 """
22 Channel Stream controller for rhodecode
23
24 :created_on: Oct 10, 2015
25 :author: marcinl
26 :copyright: (c) 2013-2015 RhodeCode GmbH.
27 :license: Commercial License, see LICENSE for more details.
28 """
29
30 import logging
21 import logging
31 import uuid
22 import uuid
32
23
33 from pyramid.view import view_config
24 from pyramid.view import view_config
34 from pyramid.httpexceptions import HTTPBadRequest, HTTPForbidden, HTTPBadGateway
25 from pyramid.httpexceptions import HTTPBadRequest, HTTPForbidden, HTTPBadGateway
35
26
36 from rhodecode.lib.channelstream import (
27 from rhodecode.lib.channelstream import (
37 channelstream_request,
28 channelstream_request,
38 ChannelstreamConnectionException,
29 ChannelstreamConnectionException,
39 ChannelstreamPermissionException,
30 ChannelstreamPermissionException,
40 check_channel_permissions,
31 check_channel_permissions,
41 get_connection_validators,
32 get_connection_validators,
42 get_user_data,
33 get_user_data,
43 parse_channels_info,
34 parse_channels_info,
44 update_history_from_logs,
35 update_history_from_logs,
45 STATE_PUBLIC_KEYS)
36 STATE_PUBLIC_KEYS)
46 from rhodecode.lib.auth import NotAnonymous
37 from rhodecode.lib.auth import NotAnonymous
47
38
48 log = logging.getLogger(__name__)
39 log = logging.getLogger(__name__)
49
40
50
41
51 class ChannelstreamView(object):
42 class ChannelstreamView(object):
52 def __init__(self, context, request):
43 def __init__(self, context, request):
53 self.context = context
44 self.context = context
54 self.request = request
45 self.request = request
55
46
56 # Some of the decorators rely on this attribute to be present
47 # Some of the decorators rely on this attribute to be present
57 # on the class of the decorated method.
48 # on the class of the decorated method.
58 self._rhodecode_user = request.user
49 self._rhodecode_user = request.user
59 registry = request.registry
50 registry = request.registry
60 self.channelstream_config = registry.rhodecode_plugins['channelstream']
51 self.channelstream_config = registry.rhodecode_plugins['channelstream']
61 if not self.channelstream_config.get('enabled'):
52 if not self.channelstream_config.get('enabled'):
62 log.error('Channelstream plugin is disabled')
53 log.error('Channelstream plugin is disabled')
63 raise HTTPBadRequest()
54 raise HTTPBadRequest()
64
55
65 @NotAnonymous()
56 @NotAnonymous()
66 @view_config(route_name='channelstream_connect', renderer='json')
57 @view_config(route_name='channelstream_connect', renderer='json')
67 def connect(self):
58 def connect(self):
68 """ handle authorization of users trying to connect """
59 """ handle authorization of users trying to connect """
69 try:
60 try:
70 json_body = self.request.json_body
61 json_body = self.request.json_body
71 except Exception:
62 except Exception:
72 log.exception('Failed to decode json from request')
63 log.exception('Failed to decode json from request')
73 raise HTTPBadRequest()
64 raise HTTPBadRequest()
74
65
75 try:
66 try:
76 channels = check_channel_permissions(
67 channels = check_channel_permissions(
77 json_body.get('channels'),
68 json_body.get('channels'),
78 get_connection_validators(self.request.registry))
69 get_connection_validators(self.request.registry))
79 except ChannelstreamPermissionException:
70 except ChannelstreamPermissionException:
80 log.error('Incorrect permissions for requested channels')
71 log.error('Incorrect permissions for requested channels')
81 raise HTTPForbidden()
72 raise HTTPForbidden()
82
73
83 user = self._rhodecode_user
74 user = self._rhodecode_user
84 if user.user_id:
75 if user.user_id:
85 user_data = get_user_data(user.user_id)
76 user_data = get_user_data(user.user_id)
86 else:
77 else:
87 user_data = {
78 user_data = {
88 'id': None,
79 'id': None,
89 'username': None,
80 'username': None,
90 'first_name': None,
81 'first_name': None,
91 'last_name': None,
82 'last_name': None,
92 'icon_link': None,
83 'icon_link': None,
93 'display_name': None,
84 'display_name': None,
94 'display_link': None,
85 'display_link': None,
95 }
86 }
96 user_data['permissions'] = self._rhodecode_user.permissions_safe
87 user_data['permissions'] = self._rhodecode_user.permissions_safe
97 payload = {
88 payload = {
98 'username': user.username,
89 'username': user.username,
99 'user_state': user_data,
90 'user_state': user_data,
100 'conn_id': str(uuid.uuid4()),
91 'conn_id': str(uuid.uuid4()),
101 'channels': channels,
92 'channels': channels,
102 'channel_configs': {},
93 'channel_configs': {},
103 'state_public_keys': STATE_PUBLIC_KEYS,
94 'state_public_keys': STATE_PUBLIC_KEYS,
104 'info': {
95 'info': {
105 'exclude_channels': ['broadcast']
96 'exclude_channels': ['broadcast']
106 }
97 }
107 }
98 }
108 filtered_channels = [channel for channel in channels
99 filtered_channels = [channel for channel in channels
109 if channel != 'broadcast']
100 if channel != 'broadcast']
110 for channel in filtered_channels:
101 for channel in filtered_channels:
111 payload['channel_configs'][channel] = {
102 payload['channel_configs'][channel] = {
112 'notify_presence': True,
103 'notify_presence': True,
113 'history_size': 100,
104 'history_size': 100,
114 'store_history': True,
105 'store_history': True,
115 'broadcast_presence_with_user_lists': True
106 'broadcast_presence_with_user_lists': True
116 }
107 }
117 # connect user to server
108 # connect user to server
118 try:
109 try:
119 connect_result = channelstream_request(self.channelstream_config,
110 connect_result = channelstream_request(self.channelstream_config,
120 payload, '/connect')
111 payload, '/connect')
121 except ChannelstreamConnectionException:
112 except ChannelstreamConnectionException:
122 log.exception('Channelstream service is down')
113 log.exception('Channelstream service is down')
123 return HTTPBadGateway()
114 return HTTPBadGateway()
124
115
125 connect_result['channels'] = channels
116 connect_result['channels'] = channels
126 connect_result['channels_info'] = parse_channels_info(
117 connect_result['channels_info'] = parse_channels_info(
127 connect_result['channels_info'],
118 connect_result['channels_info'],
128 include_channel_info=filtered_channels)
119 include_channel_info=filtered_channels)
129 update_history_from_logs(self.channelstream_config,
120 update_history_from_logs(self.channelstream_config,
130 filtered_channels, connect_result)
121 filtered_channels, connect_result)
131 return connect_result
122 return connect_result
132
123
133 @NotAnonymous()
124 @NotAnonymous()
134 @view_config(route_name='channelstream_subscribe', renderer='json')
125 @view_config(route_name='channelstream_subscribe', renderer='json')
135 def subscribe(self):
126 def subscribe(self):
136 """ can be used to subscribe specific connection to other channels """
127 """ can be used to subscribe specific connection to other channels """
137 try:
128 try:
138 json_body = self.request.json_body
129 json_body = self.request.json_body
139 except Exception:
130 except Exception:
140 log.exception('Failed to decode json from request')
131 log.exception('Failed to decode json from request')
141 raise HTTPBadRequest()
132 raise HTTPBadRequest()
142 try:
133 try:
143 channels = check_channel_permissions(
134 channels = check_channel_permissions(
144 json_body.get('channels'),
135 json_body.get('channels'),
145 get_connection_validators(self.request.registry))
136 get_connection_validators(self.request.registry))
146 except ChannelstreamPermissionException:
137 except ChannelstreamPermissionException:
147 log.error('Incorrect permissions for requested channels')
138 log.error('Incorrect permissions for requested channels')
148 raise HTTPForbidden()
139 raise HTTPForbidden()
149 payload = {'conn_id': json_body.get('conn_id', ''),
140 payload = {'conn_id': json_body.get('conn_id', ''),
150 'channels': channels,
141 'channels': channels,
151 'channel_configs': {},
142 'channel_configs': {},
152 'info': {
143 'info': {
153 'exclude_channels': ['broadcast']}
144 'exclude_channels': ['broadcast']}
154 }
145 }
155 filtered_channels = [chan for chan in channels if chan != 'broadcast']
146 filtered_channels = [chan for chan in channels if chan != 'broadcast']
156 for channel in filtered_channels:
147 for channel in filtered_channels:
157 payload['channel_configs'][channel] = {
148 payload['channel_configs'][channel] = {
158 'notify_presence': True,
149 'notify_presence': True,
159 'history_size': 100,
150 'history_size': 100,
160 'store_history': True,
151 'store_history': True,
161 'broadcast_presence_with_user_lists': True
152 'broadcast_presence_with_user_lists': True
162 }
153 }
163 try:
154 try:
164 connect_result = channelstream_request(
155 connect_result = channelstream_request(
165 self.channelstream_config, payload, '/subscribe')
156 self.channelstream_config, payload, '/subscribe')
166 except ChannelstreamConnectionException:
157 except ChannelstreamConnectionException:
167 log.exception('Channelstream service is down')
158 log.exception('Channelstream service is down')
168 return HTTPBadGateway()
159 return HTTPBadGateway()
169 # include_channel_info will limit history only to new channel
160 # include_channel_info will limit history only to new channel
170 # to not overwrite histories on other channels in client
161 # to not overwrite histories on other channels in client
171 connect_result['channels_info'] = parse_channels_info(
162 connect_result['channels_info'] = parse_channels_info(
172 connect_result['channels_info'],
163 connect_result['channels_info'],
173 include_channel_info=filtered_channels)
164 include_channel_info=filtered_channels)
174 update_history_from_logs(self.channelstream_config,
165 update_history_from_logs(self.channelstream_config,
175 filtered_channels, connect_result)
166 filtered_channels, connect_result)
176 return connect_result
167 return connect_result
General Comments 0
You need to be logged in to leave comments. Login now