51 lines
2.1 KiB
Python
51 lines
2.1 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from odoo import fields, models
|
||
|
from odoo.addons.mail.tools.discuss import get_twilio_credentials
|
||
|
import requests
|
||
|
|
||
|
|
||
|
class MailIceServer(models.Model):
|
||
|
_name = 'mail.ice.server'
|
||
|
_description = 'ICE server'
|
||
|
|
||
|
server_type = fields.Selection([('stun', 'stun:'), ('turn', 'turn:')], string='Type', required=True, default='stun')
|
||
|
uri = fields.Char('URI', required=True)
|
||
|
username = fields.Char()
|
||
|
credential = fields.Char()
|
||
|
|
||
|
def _get_local_ice_servers(self):
|
||
|
"""
|
||
|
:return: List of up to 5 dict, each of which representing a stun or turn server
|
||
|
"""
|
||
|
# firefox has a hard cap of 5 ice servers
|
||
|
ice_servers = self.sudo().search([], limit=5)
|
||
|
formatted_ice_servers = []
|
||
|
for ice_server in ice_servers:
|
||
|
formatted_ice_server = {
|
||
|
'urls': '%s:%s' % (ice_server.server_type, ice_server.uri),
|
||
|
}
|
||
|
if ice_server.username:
|
||
|
formatted_ice_server['username'] = ice_server.username
|
||
|
if ice_server.credential:
|
||
|
formatted_ice_server['credential'] = ice_server.credential
|
||
|
formatted_ice_servers.append(formatted_ice_server)
|
||
|
return formatted_ice_servers
|
||
|
|
||
|
def _get_ice_servers(self):
|
||
|
"""
|
||
|
:return: List of dict, each of which representing a stun or turn server,
|
||
|
formatted as expected by the specifications of RTCConfiguration.iceServers
|
||
|
"""
|
||
|
if self.env['ir.config_parameter'].sudo().get_param('mail.use_twilio_rtc_servers'):
|
||
|
(account_sid, auth_token) = get_twilio_credentials(self.env)
|
||
|
if account_sid and auth_token:
|
||
|
url = f'https://api.twilio.com/2010-04-01/Accounts/{account_sid}/Tokens.json'
|
||
|
response = requests.post(url, auth=(account_sid, auth_token), timeout=60)
|
||
|
if response.ok:
|
||
|
response_content = response.json()
|
||
|
if response_content:
|
||
|
return response_content['ice_servers']
|
||
|
return self._get_local_ice_servers()
|